validify/validation/
contains.rs

1use crate::traits::Contains;
2
3/// Validates whether the value contains the needle
4///
5/// See [Contains] for more details.
6pub fn validate_contains<T: Contains<C>, C>(haystack: T, needle: &C, not: bool) -> bool {
7    if not {
8        !haystack.has_element(needle)
9    } else {
10        haystack.has_element(needle)
11    }
12}
13
14#[cfg(test)]
15mod contains_tests {
16    use std::borrow::Cow;
17    use std::collections::HashMap;
18
19    use super::*;
20
21    #[test]
22    fn test_validate_contains_string() {
23        assert!(validate_contains("hey", &"e", false));
24    }
25
26    #[test]
27    fn test_validate_contains_string_can_fail() {
28        assert!(!validate_contains("hey", &"o", false));
29    }
30
31    #[test]
32    fn test_validate_contains_hashmap_key() {
33        let mut map = HashMap::new();
34        map.insert("hey", 1);
35        assert!(validate_contains(map, &"hey", false));
36    }
37
38    #[test]
39    fn test_validate_contains_hashmap_key_can_fail() {
40        let mut map = HashMap::new();
41        map.insert("hey", 1);
42        assert!(!validate_contains(map, &"bob", false));
43    }
44
45    #[test]
46    fn test_validate_contains_cow() {
47        let test: Cow<'static, str> = "hey".into();
48        assert!(validate_contains(test, &"e", false));
49        let test: Cow<'static, str> = String::from("hey").into();
50        assert!(validate_contains(test, &"e", false));
51    }
52
53    #[test]
54    fn test_validate_contains_cow_can_fail() {
55        let test: Cow<'static, str> = "hey".into();
56        assert!(!validate_contains(test, &"o", false));
57        let test: Cow<'static, str> = String::from("hey").into();
58        assert!(!validate_contains(test, &"o", false));
59    }
60
61    #[test]
62    fn test_validate_does_not_contain_string() {
63        assert!(!validate_contains("hey", &"e", true));
64    }
65
66    #[test]
67    fn test_validate_does_not_contain_string_can_fail() {
68        assert!(validate_contains("hey", &"o", true));
69    }
70
71    #[test]
72    fn test_validate_does_not_contain_hashmap_key() {
73        let mut map = HashMap::new();
74        map.insert("hey", 1);
75        assert!(!validate_contains(map, &"hey", true));
76    }
77
78    #[test]
79    fn test_validate_does_not_contain_hashmap_key_can_fail() {
80        let mut map = HashMap::new();
81        map.insert("hey", 1);
82        assert!(validate_contains(map, &"bob", true));
83    }
84
85    #[test]
86    fn test_validate_does_not_contain_cow() {
87        let test: Cow<'static, str> = "hey".into();
88        assert!(!validate_contains(test, &"e", true));
89        let test: Cow<'static, str> = String::from("hey").into();
90        assert!(!validate_contains(test, &"e", true));
91    }
92
93    #[test]
94    fn test_validate_does_not_contain_cow_can_fail() {
95        let test: Cow<'static, str> = "hey".into();
96        assert!(validate_contains(test, &"o", true));
97        let test: Cow<'static, str> = String::from("hey").into();
98        assert!(validate_contains(test, &"o", true));
99    }
100}
101
102#[cfg(test)]
103mod in_notin_tests {
104    use super::*;
105
106    #[derive(Debug, PartialEq)]
107    struct A {
108        a: usize,
109    }
110
111    #[test]
112    fn _in() {
113        const STRUCTS: [A; 3] = [A { a: 1 }, A { a: 2 }, A { a: 3 }];
114
115        let a = A { a: 2 };
116        assert!(validate_contains(STRUCTS, &a, false));
117
118        let a = A { a: 4 };
119        assert!(!validate_contains(STRUCTS, &a, false));
120    }
121
122    #[test]
123    fn not_in() {
124        const STRUCTS: [A; 3] = [A { a: 1 }, A { a: 2 }, A { a: 3 }];
125
126        let a = A { a: 4 };
127        assert!(validate_contains(STRUCTS, &a, true));
128
129        let a = A { a: 2 };
130        assert!(!validate_contains(STRUCTS, &a, true));
131    }
132}