Skip to main content

badwords_core/
lib.rs

1//! BadWords core - profanity filter logic.
2
3mod filter;
4mod processor;
5
6pub use filter::{NotSupportedLanguage, ProfanityFilter};
7pub use processor::TextProcessor;
8
9/// Resource directory path when running from workspace (for examples).
10pub 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}