Skip to main content

sil_policy/
lib.rs

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}