ciranda 0.1.0

A deterministic password generator
Documentation
use ciranda::{Argon2Profile, CharacterSets, PasswordSettings, enhance};

#[test]
fn enhance_produces_known_password() {
    let settings = Argon2Profile::Development.settings();
    let password_settings = PasswordSettings::new(32, CharacterSets::ALL);
    let password = enhance(b"seed", b"context", &password_settings, &settings);
    assert_eq!(password, "n&C7WAOp5vg!mx0vLHLhu^eDxd1PDQgK");
}

#[test]
fn enhance_is_deterministic() {
    let settings = Argon2Profile::Development.settings();
    let password_settings = PasswordSettings::new(32, CharacterSets::ALL);
    let password1 = enhance(b"seed", b"context", &password_settings, &settings);
    let password2 = enhance(b"seed", b"context", &password_settings, &settings);
    assert_eq!(password1, password2);
}

#[test]
fn enhance_includes_each_character_group() {
    let settings = Argon2Profile::Development.settings();
    let password_settings = PasswordSettings::new(32, CharacterSets::ALL);
    let password = enhance(b"seed", b"context", &password_settings, &settings);
    assert!(password.chars().any(|c| c.is_ascii_uppercase()));
    assert!(password.chars().any(|c| c.is_ascii_lowercase()));
    assert!(password.chars().any(|c| c.is_ascii_digit()));
    assert!(password.chars().any(|c| "!@#$%^&*".contains(c)));
}

#[test]
fn enhance_respects_selected_character_sets() {
    let settings = Argon2Profile::Development.settings();
    let password_settings = PasswordSettings::new(32, CharacterSets::new(false, true, true, false));
    let password = enhance(b"seed", b"context", &password_settings, &settings);

    assert!(password.chars().any(|c| c.is_ascii_lowercase()));
    assert!(password.chars().any(|c| c.is_ascii_digit()));
    assert!(!password.chars().any(|c| c.is_ascii_uppercase()));
    assert!(!password.chars().any(|c| "!@#$%^&*".contains(c)));
}