stdbr-core 0.3.8

Standard library for Brazil
Documentation
use stdbr_core::rand::{RandomSource, SeededRng};
use stdbr_core::{cep, cnpj, cpf, rg, uf};

#[derive(Clone)]
struct TestRng(u64);

impl RandomSource for TestRng {
    fn next_u64(&mut self) -> u64 {
        self.0 = self
            .0
            .wrapping_mul(6_364_136_223_846_793_005)
            .wrapping_add(1_442_695_040_888_963_407);
        self.0
    }
}

#[test]
fn seeded_rng_makes_all_generators_deterministic() {
    let mut first = SeededRng::new(42);
    let mut second = SeededRng::new(42);

    assert_eq!(
        cpf::generate_with_rng(&mut first),
        cpf::generate_with_rng(&mut second)
    );
    assert_eq!(
        cnpj::generate_with_rng(&mut first, cnpj::CnpjKind::Alphanumeric),
        cnpj::generate_with_rng(&mut second, cnpj::CnpjKind::Alphanumeric)
    );
    assert_eq!(
        cep::generate_cep_with_rng(&mut first),
        cep::generate_cep_with_rng(&mut second)
    );
    assert_eq!(
        rg::generate_with_rng(&mut first, uf::State::SP),
        rg::generate_with_rng(&mut second, uf::State::SP)
    );
}

#[test]
fn generators_accept_an_application_random_source() {
    let mut first = TestRng(7);
    let mut second = first.clone();

    let cpf = cpf::generate_for_region_with_rng(&mut first, cpf::FiscalRegion::Sp);
    assert_eq!(
        cpf,
        cpf::generate_for_region_with_rng(&mut second, cpf::FiscalRegion::Sp)
    );
    assert_eq!(cpf.fiscal_region(), cpf::FiscalRegion::Sp);

    let cep = cep::generate_for_state_with_rng(&mut first, uf::State::GO);
    assert_eq!(
        cep,
        cep::generate_for_state_with_rng(&mut second, uf::State::GO)
    );
    assert_eq!(cep.state(), Some(uf::State::GO));
}

#[test]
fn public_errors_implement_core_error() {
    fn assert_error<E: core::error::Error>() {}

    assert_error::<cpf::CpfError>();
    assert_error::<cnpj::CnpjError>();
    assert_error::<cep::CepError>();
    assert_error::<rg::RgError>();
}

#[test]
fn explicit_lenient_names_preserve_compatibility_aliases() {
    assert_eq!(cpf::normalize("529.982.247-25"), "52998224725");
    assert_eq!(
        cpf::is_valid_lenient("529$982#247!25"),
        cpf::is_valid("529$982#247!25")
    );

    assert_eq!(cnpj::normalize("11.222.333/0001-81"), "11222333000181");
    assert_eq!(
        cnpj::is_valid_lenient("11$222#333!0001@81"),
        cnpj::is_valid("11$222#333!0001@81")
    );

    assert_eq!(cep::normalize("01310-100"), "01310100");
    assert_eq!(
        cep::is_valid_lenient("01310$100"),
        cep::is_valid("01310$100")
    );

    assert_eq!(rg::normalize("29.465.327-2", uf::State::SP), "294653272");
    assert_eq!(
        rg::is_valid_lenient("29$465#327!2", uf::State::SP),
        rg::is_valid("29$465#327!2", uf::State::SP)
    );
}