mod graph;
mod misc;
mod parser;
mod template;
mod token_filter;
mod token_record;
mod tokenizer;
mod traits;
pub use misc::compile_into_regex;
pub use parser::Parser;
pub use template::{parameter_masks, shared_slices};
pub use tokenizer::Tokenizer;
pub use traits::Tokenize;
#[cfg(test)]
mod tests {
use super::*;
use std::collections::{HashMap, HashSet};
#[test]
fn trivial_test() {
let msgs = [
"a x1 x2 b",
"a x2 b",
"a x3 b",
"a x4 b",
"c x1 d",
"c x2 d",
"c x3 d",
"c x4 d",
];
let (clus, temps, masks) = Parser::default()
.compute_templates()
.compute_masks()
.parse(&msgs);
let s1 = clus[..4]
.iter()
.map(|item| item.unwrap())
.collect::<HashSet<_>>();
let s2 = clus[4..]
.iter()
.map(|item| item.unwrap())
.collect::<HashSet<_>>();
assert_eq!(s1.len(), 1);
assert_eq!(s2.len(), 1);
let exp_all_temps = ["a <*> b", "a <*> <*> b", "c <*> d"]
.into_iter()
.map(ToOwned::to_owned)
.collect::<HashSet<String>>();
let all_temps = temps
.into_iter()
.flat_map(|t| t.into_iter())
.collect::<HashSet<String>>();
assert_eq!(all_temps, exp_all_temps);
let exp_masks = [
("a x1 x2 b", "001101100"),
("a x2 b", "001100"),
("a x3 b", "001100"),
("a x4 b", "001100"),
("c x1 d", "001100"),
("c x2 d", "001100"),
("c x3 d", "001100"),
("c x4 d", "001100"),
]
.into_iter()
.map(|(k, v)| (k.to_owned(), v.to_owned()))
.collect::<HashMap<String, String>>();
assert_eq!(masks, exp_masks);
}
}