matrix_sdk_ui/room_list_service/filters/
any.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 `true` if at
18/// least one of the filter returns `true`.
19pub fn new_filter(filters: Vec<BoxedFilterFn>) -> impl Filter {
20    move |room| -> bool { filters.iter().any(|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_is_true() {
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        let filter = |_: &_| true;
39        let any = new_filter(vec![Box::new(filter)]);
40
41        assert!(any(&room));
42    }
43
44    #[async_test]
45    async fn test_one_filter_is_false() {
46        let (client, server) = logged_in_client_with_server().await;
47        let [room] = new_rooms([room_id!("!a:b.c")], &client, &server).await;
48
49        let filter = |_: &_| false;
50        let any = new_filter(vec![Box::new(filter)]);
51
52        assert!(any(&room).not());
53    }
54
55    #[async_test]
56    async fn test_two_filters_with_true_true() {
57        let (client, server) = logged_in_client_with_server().await;
58        let [room] = new_rooms([room_id!("!a:b.c")], &client, &server).await;
59
60        let filter1 = |_: &_| true;
61        let filter2 = |_: &_| true;
62        let any = new_filter(vec![Box::new(filter1), Box::new(filter2)]);
63
64        assert!(any(&room));
65    }
66
67    #[async_test]
68    async fn test_two_filters_with_true_false() {
69        let (client, server) = logged_in_client_with_server().await;
70        let [room] = new_rooms([room_id!("!a:b.c")], &client, &server).await;
71
72        let filter1 = |_: &_| true;
73        let filter2 = |_: &_| false;
74        let any = new_filter(vec![Box::new(filter1), Box::new(filter2)]);
75
76        assert!(any(&room));
77    }
78
79    #[async_test]
80    async fn test_two_filters_with_false_true() {
81        let (client, server) = logged_in_client_with_server().await;
82        let [room] = new_rooms([room_id!("!a:b.c")], &client, &server).await;
83
84        let filter1 = |_: &_| false;
85        let filter2 = |_: &_| true;
86        let any = new_filter(vec![Box::new(filter1), Box::new(filter2)]);
87
88        assert!(any(&room));
89    }
90
91    #[async_test]
92    async fn test_two_filters_with_false_false() {
93        let (client, server) = logged_in_client_with_server().await;
94        let [room] = new_rooms([room_id!("!a:b.c")], &client, &server).await;
95
96        let filter1 = |_: &_| false;
97        let filter2 = |_: &_| false;
98        let any = new_filter(vec![Box::new(filter1), Box::new(filter2)]);
99
100        assert!(any(&room).not());
101    }
102}