use crate::secondary_validation::{Validator, validate_mod11_weighted_checksum};
pub struct PortugueseTaxIdChecksum;
const WEIGHTS: &[u32; 8] = &[9, 8, 7, 6, 5, 4, 3, 2];
impl Validator for PortugueseTaxIdChecksum {
fn is_valid_match(&self, regex_match: &str) -> bool {
validate_mod11_weighted_checksum(regex_match, WEIGHTS, |remainder| match remainder {
0 | 1 => Some(0), _ => Some(11 - remainder),
})
}
}
#[cfg(test)]
mod test {
use crate::secondary_validation::*;
#[test]
fn test_valid_nif() {
let valid_ids = vec![
"581348915",
"581 348 915",
"389982482",
"389 982 482",
"248915967",
"248 915 967",
];
for id in valid_ids {
assert!(PortugueseTaxIdChecksum.is_valid_match(id));
}
}
#[test]
fn test_invalid_nif() {
let invalid_ids = vec![
"581348910",
"581 348 910",
"389982489",
"389 982 489",
"5813489150",
"58134891",
];
for id in invalid_ids {
assert!(!PortugueseTaxIdChecksum.is_valid_match(id));
}
}
}