1mod graph;
2mod misc;
3mod parser;
4mod template;
5mod token_filter;
6mod token_record;
7mod tokenizer;
8mod traits;
9pub use misc::compile_into_regex;
10pub use parser::Parser;
11pub use template::{parameter_masks, shared_slices};
12pub use tokenizer::Tokenizer;
13pub use traits::Tokenize;
14
15#[cfg(test)]
16mod tests {
17 use super::*;
18 use std::collections::{HashMap, HashSet};
19
20 #[test]
21 fn trivial_test() {
22 let msgs = [
23 "a x1 x2 b",
24 "a x2 b",
25 "a x3 b",
26 "a x4 b",
27 "c x1 d",
28 "c x2 d",
29 "c x3 d",
30 "c x4 d",
31 ];
32 let (clus, temps, masks) = Parser::default()
33 .compute_templates()
34 .compute_masks()
35 .parse(&msgs);
36 let s1 = clus[..4]
37 .iter()
38 .map(|item| item.unwrap())
39 .collect::<HashSet<_>>();
40 let s2 = clus[4..]
41 .iter()
42 .map(|item| item.unwrap())
43 .collect::<HashSet<_>>();
44 assert_eq!(s1.len(), 1);
45 assert_eq!(s2.len(), 1);
46
47 let exp_all_temps = ["a <*> b", "a <*> <*> b", "c <*> d"]
51 .into_iter()
52 .map(ToOwned::to_owned)
53 .collect::<HashSet<String>>();
54 let all_temps = temps
55 .into_iter()
56 .flat_map(|t| t.into_iter())
57 .collect::<HashSet<String>>();
58 assert_eq!(all_temps, exp_all_temps);
59
60 let exp_masks = [
61 ("a x1 x2 b", "001101100"),
62 ("a x2 b", "001100"),
63 ("a x3 b", "001100"),
64 ("a x4 b", "001100"),
65 ("c x1 d", "001100"),
66 ("c x2 d", "001100"),
67 ("c x3 d", "001100"),
68 ("c x4 d", "001100"),
69 ]
70 .into_iter()
71 .map(|(k, v)| (k.to_owned(), v.to_owned()))
72 .collect::<HashMap<String, String>>();
73 assert_eq!(masks, exp_masks);
74 }
75}