password_strength/analyzer/
length.rs1use crate::analyzer::Analyzer;
2
3#[derive(Default)]
24pub struct LengthAnalyzer;
25
26impl Analyzer for LengthAnalyzer {
27 fn analyze(&self, password: &str) -> f32 {
28 if password.len() < 8 {
29 return 0.0;
30 }
31
32 if password.len() >= 16 {
33 return 1.0;
34 }
35
36 ((password.len() as f32 - 8.0) / 8.0).clamp(0.0, 1.0)
37 }
38}
39
40#[cfg(test)]
41mod tests {
42 use super::*;
43
44 #[test]
45 fn test_analyze_with_short_password() {
46 let analyzer = LengthAnalyzer;
47 let score = analyzer.analyze("short");
48
49 assert_eq!(
50 score, 0.0,
51 "Expected score 0.0 for passwords shorter than 8 characters"
52 );
53 }
54
55 #[test]
56 fn test_analyze_with_exactly_8_characters() {
57 let analyzer = LengthAnalyzer;
58 let score = analyzer.analyze("12345678");
59
60 assert_eq!(score, 0.0, "Expected score 0.0 for exactly 8 characters");
61 }
62
63 #[test]
64 fn test_analyze_with_long_password() {
65 let analyzer = LengthAnalyzer;
66 let score = analyzer.analyze("thisisaverylongpassword");
67
68 assert_eq!(
69 score, 1.0,
70 "Expected score 1.0 for passwords with 16 or more characters"
71 );
72 }
73
74 #[test]
75 fn test_analyze_with_max_length() {
76 let analyzer = LengthAnalyzer;
77 let score = analyzer.analyze("thisisexactly16chars");
78
79 assert_eq!(score, 1.0, "Expected score 1.0 for exactly 16 characters");
80 }
81}