1#![warn(clippy::pedantic)]
2
3pub mod decision;
4pub mod engine;
5pub mod rules;
6
7pub use decision::Decision;
8pub use engine::evaluate;
9
10#[cfg(test)]
11mod tests {
12 use super::*;
13 use crate::rules::RiskInput;
14
15 #[test]
16 fn test_allow_low_risk() {
17 let input = RiskInput {
18 unicode_risk: 0.1,
19 confusable_risk: 0.1,
20 semantic_risk: 0.1,
21 };
22 assert_eq!(evaluate(input, "hello"), Decision::Allow);
23 }
24
25 #[test]
26 fn test_warn_medium_risk() {
27 let input = RiskInput {
28 unicode_risk: 0.7,
29 confusable_risk: 0.7,
30 semantic_risk: 0.0,
31 };
32 let decision = evaluate(input, "userdev");
33 assert!(matches!(decision, Decision::Warn));
34 }
35
36 #[test]
37 fn test_block_high_risk() {
38 let input = RiskInput {
39 unicode_risk: 0.9,
40 confusable_risk: 0.9,
41 semantic_risk: 0.5,
42 };
43 assert_eq!(evaluate(input, "раypal"), Decision::Block);
44 }
45
46 #[test]
47 fn test_rewrite_repairable() {
48 let input = RiskInput {
49 unicode_risk: 0.1,
50 confusable_risk: 0.1,
51 semantic_risk: 0.1,
52 };
53 let decision = evaluate(input, "ƒdev");
54 assert_eq!(decision, Decision::Rewrite("fdev".to_string()));
55 }
56
57 #[test]
58 fn test_score_above_08_is_block() {
59 let input = RiskInput {
60 unicode_risk: 1.0,
61 confusable_risk: 1.0,
62 semantic_risk: 1.0,
63 };
64 let score = rules::evaluate_risk(input);
65 assert!(score > 0.8);
66 }
67
68 #[test]
69 fn test_score_weighted_correctly() {
70 let input = RiskInput {
71 unicode_risk: 1.0,
72 confusable_risk: 0.0,
73 semantic_risk: 0.0,
74 };
75 let score = rules::evaluate_risk(input);
76 assert_eq!(score, 0.4);
77 }
78}