1mod filter;
4mod processor;
5
6pub use filter::{NotSupportedLanguage, ProfanityFilter};
7pub use processor::TextProcessor;
8
9pub fn default_resource_dir() -> std::path::PathBuf {
11 std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../python/badwords/resource")
12}
13
14#[cfg(test)]
15mod tests {
16 use super::*;
17 use std::collections::HashMap;
18
19 fn make_test_filter() -> ProfanityFilter {
20 let words_by_lang: HashMap<String, String> = [
21 ("en".to_string(), "bad\nword\ntest".to_string()),
22 ("ru".to_string(), "плохо\nслово".to_string()),
23 ]
24 .into();
25
26 ProfanityFilter::new_from_embedded(
27 "{}",
28 "{}",
29 "{}",
30 &words_by_lang,
31 vec!["en".to_string(), "ru".to_string()],
32 true,
33 true,
34 false,
35 false,
36 )
37 .unwrap()
38 }
39
40 #[test]
41 fn test_clean_text_returns_false() {
42 let filter = make_test_filter();
43 let (found, _) = filter.filter_text("hello world", 1.0, None);
44 assert!(!found);
45 }
46
47 #[test]
48 fn test_bad_text_returns_true() {
49 let filter = make_test_filter();
50 let (found, _) = filter.filter_text("bad", 1.0, None);
51 assert!(found);
52 }
53
54 #[test]
55 fn test_add_words_detection() {
56 let mut filter = make_test_filter();
57 filter.add_words(&["custombad".to_string()]);
58 let (found, _) = filter.filter_text("custombad", 1.0, None);
59 assert!(found);
60 }
61
62 #[test]
63 fn test_censor_replaces_word() {
64 let mut filter = make_test_filter();
65 filter.add_words(&["bad".to_string()]);
66 let (found, result) = filter.filter_text("a bad thing", 1.0, Some('*'));
67 assert!(found);
68 assert_eq!(result, Some("a *** thing".to_string()));
69 }
70
71 #[test]
72 fn test_get_all_languages() {
73 let filter = make_test_filter();
74 let langs = filter.get_all_languages();
75 assert_eq!(langs, &["en", "ru"]);
76 }
77
78 #[test]
79 fn test_similar() {
80 let filter = make_test_filter();
81 assert!((filter.similar("hello", "hello") - 1.0).abs() < 0.001);
82 assert!(filter.similar("abc", "xyz") < 1.0);
83 }
84}