matrix_sdk_ui/room_list_service/filters/
all.rs

1// Copyright 2024 The Matrix.org Foundation C.I.C.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use super::{BoxedFilterFn, Filter};
16
17/// Create a new filter that will run multiple filters. It returns `false` if at
18/// least one of the filter returns `false`.
19pub fn new_filter(filters: Vec<BoxedFilterFn>) -> impl Filter {
20    move |room| -> bool { filters.iter().all(|filter| filter(room)) }
21}
22
23#[cfg(test)]
24mod tests {
25    use std::ops::Not;
26
27    use matrix_sdk::test_utils::logged_in_client_with_server;
28    use matrix_sdk_test::async_test;
29    use ruma::room_id;
30
31    use super::{super::new_rooms, *};
32
33    #[async_test]
34    async fn test_one_filter() {
35        let (client, server) = logged_in_client_with_server().await;
36        let [room] = new_rooms([room_id!("!a:b.c")], &client, &server).await;
37
38        {
39            let filter = |_: &_| true;
40            let all = new_filter(vec![Box::new(filter)]);
41
42            assert!(all(&room));
43        }
44
45        {
46            let filter = |_: &_| false;
47            let all = new_filter(vec![Box::new(filter)]);
48
49            assert!(all(&room).not());
50        }
51    }
52
53    #[async_test]
54    async fn test_two_filters() {
55        let (client, server) = logged_in_client_with_server().await;
56        let [room] = new_rooms([room_id!("!a:b.c")], &client, &server).await;
57
58        {
59            let filter1 = |_: &_| true;
60            let filter2 = |_: &_| true;
61            let all = new_filter(vec![Box::new(filter1), Box::new(filter2)]);
62
63            assert!(all(&room));
64        }
65
66        {
67            let filter1 = |_: &_| true;
68            let filter2 = |_: &_| false;
69            let all = new_filter(vec![Box::new(filter1), Box::new(filter2)]);
70
71            assert!(all(&room).not());
72        }
73
74        {
75            let filter1 = |_: &_| false;
76            let filter2 = |_: &_| true;
77            let all = new_filter(vec![Box::new(filter1), Box::new(filter2)]);
78
79            assert!(all(&room).not());
80        }
81
82        {
83            let filter1 = |_: &_| false;
84            let filter2 = |_: &_| false;
85            let all = new_filter(vec![Box::new(filter1), Box::new(filter2)]);
86
87            assert!(all(&room).not());
88        }
89    }
90}