Skip to main content

faker_rust/default/
id_number.rs

1//! ID Number generator
2
3use crate::config::FakerConfig;
4
5/// Generate a random Spanish DNI (Documento Nacional de Identidad)
6pub fn spanish() -> String {
7    let config = FakerConfig::current();
8    let number = config.rand_range(10000000, 99999999);
9    let letters = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'];
10    let letter = letters[(number % 23) as usize];
11    format!("{}{}", number, letter)
12}
13
14/// Generate a random US Social Security Number
15pub fn ssn() -> String {
16    let config = FakerConfig::current();
17    let area = config.rand_range(1, 900);
18    let group = config.rand_range(1, 100);
19    let serial = config.rand_range(1, 10000);
20    format!("{:03}-{:02}-{:04}", area, group, serial)
21}
22
23/// Generate a random valid ID number
24pub fn valid() -> String {
25    spanish()
26}
27
28/// Generate a random invalid ID number
29pub fn invalid() -> String {
30    let config = FakerConfig::current();
31    let number = config.rand_range(10000000, 99999999);
32    let wrong_letter = config.rand_char(&['I', 'O', 'U', 'Ñ']);
33    format!("{}{}", number, wrong_letter)
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    #[test]
41    fn test_spanish() {
42        let dni = spanish();
43        assert_eq!(dni.len(), 9);
44    }
45
46    #[test]
47    fn test_ssn() {
48        let ssn_num = ssn();
49        assert_eq!(ssn_num.len(), 11);
50        assert!(ssn_num.contains('-'));
51    }
52
53    #[test]
54    fn test_valid() {
55        assert!(!valid().is_empty());
56    }
57
58    #[test]
59    fn test_invalid() {
60        assert!(!invalid().is_empty());
61    }
62}