goglob_serde_tests/
lib.rs

1//! # Do not use this crate!
2//!
3//! See the `goglob` crate instead.
4//!
5//! (This crate facilitates testing `goglob`'s serde deserialization
6//! functionality with `cargo test`. It offers no functionality to the
7//! end user)
8
9pub fn stub_sub(a: usize, b: usize) -> usize {
10    a - b
11}
12
13#[cfg(test)]
14//noinspection DuplicatedCode
15mod tests {
16    mod aux {
17        use goglob::{GlobPattern, Result as GlobPatternResult};
18        use serde::{Deserialize, Serialize};
19        use std::fmt::{Display, Formatter};
20
21        #[derive(Deserialize)]
22        pub struct DeserializedPattern {
23            pub pattern: GlobPattern,
24        }
25
26        #[derive(Serialize)]
27        pub struct SerializedPattern {
28            pub pattern: String,
29        }
30
31        #[derive(Clone)]
32        pub struct MatchTest {
33            pattern: String,
34            name: String,
35            expect_match: Option<bool>,
36        }
37        impl MatchTest {
38            const fn _new(pattern: String, name: String, expect_match: Option<bool>) -> Self {
39                Self {
40                    pattern,
41                    name,
42                    expect_match,
43                }
44            }
45
46            pub fn display(&self) -> TestDisplay {
47                let clone = self.clone();
48                TestDisplay { test: clone }
49            }
50
51            pub fn test(&self) -> Option<bool> {
52                let pattern1: GlobPatternResult<GlobPattern> =
53                    GlobPattern::new(self.pattern.clone());
54                let pattern2: Option<GlobPattern> = serde_json::from_str::<DeserializedPattern>(
55                    &*serde_json::to_string(&SerializedPattern {
56                        pattern: self.pattern.clone(),
57                    })
58                    .unwrap(),
59                )
60                .ok()
61                .map(|p| p.pattern);
62
63                if pattern1.is_ok() == pattern2.is_some() {
64                    pattern1
65                        .map(|p| p.matches(self.name.clone()))
66                        .ok()
67                        .filter(|r| *r == pattern2.unwrap().matches(self.name.clone()))
68                } else {
69                    None
70                }
71            }
72
73            pub fn succeed(self, result: Option<bool>) -> bool {
74                result == self.expect_match
75            }
76        }
77        #[inline]
78        pub fn make_test<S1: Into<String>, S2: Into<String>>(
79            pattern: S1,
80            name: S2,
81            expect_match: Option<bool>,
82        ) -> MatchTest {
83            MatchTest::_new(pattern.into(), name.into(), expect_match)
84        }
85
86        pub struct TestDisplay {
87            test: MatchTest,
88        }
89        impl Display for TestDisplay {
90            fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
91                write!(
92                    f,
93                    "({}, {}) expected {:?}",
94                    self.test.pattern, self.test.name, self.test.expect_match,
95                )
96            }
97        }
98    }
99
100    use aux::*;
101
102    #[test]
103    fn serde_go_match_test() {
104        let tests = [
105            make_test("abc", "abc", Some(true)),
106            make_test("*", "abc", Some(true)),
107            make_test("*c", "abc", Some(true)),
108            make_test("a*", "a", Some(true)),
109            make_test("a*", "abc", Some(true)),
110            make_test("a*", "ab/c", Some(false)),
111            make_test("a*/b", "abc/b", Some(true)),
112            make_test("a*/b", "a/c/b", Some(false)),
113            make_test("a*b*c*d*e*/f", "axbxcxdxe/f", Some(true)),
114            make_test("a*b*c*d*e*/f", "axbxcxdxexxx/f", Some(true)),
115            make_test("a*b*c*d*e*/f", "axbxcxdxe/xxx/f", Some(false)),
116            make_test("a*b*c*d*e*/f", "axbxcxdxexxx/fff", Some(false)),
117            make_test("a*b?c*x", "abxbbxdbxebxczzx", Some(true)),
118            make_test("a*b?c*x", "abxbbxdbxebxczzy", Some(false)),
119            make_test("ab[c]", "abc", Some(true)),
120            make_test("ab[b-d]", "abc", Some(true)),
121            make_test("ab[e-g]", "abc", Some(false)),
122            make_test("ab[^c]", "abc", Some(false)),
123            make_test("ab[^b-d]", "abc", Some(false)),
124            make_test("ab[^e-g]", "abc", Some(true)),
125            make_test("a\\*b", "a*b", Some(true)),
126            make_test("a\\*b", "ab", Some(false)),
127            make_test("a?b", "a☺b", Some(true)),
128            make_test("a[^a]b", "a☺b", Some(true)),
129            make_test("a???b", "a☺b", Some(false)),
130            make_test("a[^a][^a][^a]b", "a☺b", Some(false)),
131            make_test("[a-ζ]*", "α", Some(true)),
132            make_test("*[a-ζ]", "A", Some(false)),
133            make_test("a?b", "a/b", Some(false)),
134            make_test("a*b", "a/b", Some(false)),
135            make_test("[\\]a]", "]", Some(true)),
136            make_test("[\\-]", "-", Some(true)),
137            make_test("[x\\-]", "x", Some(true)),
138            make_test("[x\\-]", "-", Some(true)),
139            make_test("[x\\-]", "z", Some(false)),
140            make_test("[\\-x]", "x", Some(true)),
141            make_test("[\\-x]", "-", Some(true)),
142            make_test("[\\-x]", "a", Some(false)),
143            make_test("[]a]", "]", None),
144            make_test("[-]", "-", None),
145            make_test("[x-]", "x", None),
146            make_test("[x-]", "-", None),
147            make_test("[x-]", "z", None),
148            make_test("[-x]", "x", None),
149            make_test("[-x]", "-", None),
150            make_test("[-x]", "a", None),
151            make_test("\\", "a", None),
152            make_test("[a-b-c]", "a", None),
153            make_test("[", "a", None),
154            make_test("[^", "a", None),
155            make_test("[^bc", "a", None),
156            make_test("a[", "a", None),
157            make_test("a[", "ab", None),
158            make_test("a[", "x", None),
159            make_test("a/b[", "x", None),
160            make_test("*x", "xxx", Some(true)),
161        ];
162
163        for (i, test) in tests.into_iter().enumerate() {
164            let display = test.display();
165            let result = test.test();
166            let result_display = format!("{:?}", result);
167            assert!(
168                test.succeed(result),
169                "[Test {i}]: {display}, got {result_display}"
170            )
171        }
172    }
173}