Skip to main content

password_strength/analyzer/
length.rs

1use crate::analyzer::Analyzer;
2
3/// `LengthAnalyzer` is an analyzer that evaluates the strength of a password based on its length.
4///
5/// It assigns a score between 0.0 and 1.0, where:
6/// - Passwords shorter than 8 characters receive a score of 0.0.
7/// - Passwords with 16 or more characters receive a score of 1.0.
8/// - Passwords between 8 and 16 characters receive a score linearly interpolated between 0.0 and 1.0.
9///
10/// # Examples
11///
12/// ```
13/// use password_strength::analyzer;
14/// use password_strength::analyzer::Analyzer;
15/// use password_strength::analyzer::length::LengthAnalyzer;
16///
17/// let analyzer = LengthAnalyzer::default();
18///
19/// assert_eq!(analyzer.analyze("short"), 0.0);
20/// assert_eq!(analyzer.analyze("verylongpassword"), 1.0);
21/// assert_eq!(analyzer.analyze("mediumpass"), 0.25);
22/// ```
23#[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}