1pub fn stub_sub(a: usize, b: usize) -> usize {
10 a - b
11}
12
13#[cfg(test)]
14mod 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}