keyhog 0.5.84

GPU-accelerated secret scanner for code, Git history, cloud, containers, browser assets, and live credential verification
use super::value_enum_expected;
use clap::ValueEnum;
use std::collections::HashSet;

fn assert_expected_lists_every_canonical_value_once<T: ValueEnum>() {
    let diagnostic = value_enum_expected::<T>();
    let listed: Vec<_> = match diagnostic.strip_prefix("expected one of ") {
        Some(values) => values.split(", ").collect(),
        None => panic!("config enum diagnostic prefix is missing"),
    };
    let canonical: Vec<_> = T::value_variants()
        .iter()
        .map(|variant| match variant.to_possible_value() {
            Some(possible) => possible.get_name().to_owned(),
            None => panic!("config enum variant must have a clap spelling"),
        })
        .collect();
    let unique: HashSet<_> = listed.iter().copied().collect();

    assert_eq!(listed, canonical);
    assert_eq!(
        unique.len(),
        listed.len(),
        "accepted-value diagnostic contains duplicates: {diagnostic}"
    );
}

#[test]
fn config_enum_diagnostics_cover_every_canonical_value_uniquely() {
    assert_expected_lists_every_canonical_value_once::<crate::args::SeverityFilter>();
    assert_expected_lists_every_canonical_value_once::<crate::args::OutputFormat>();
    assert_expected_lists_every_canonical_value_once::<crate::args::CliDedupScope>();
}

#[test]
fn parse_decode_size_limit_rejects_empty_and_sub_4b() {
    use super::parse_decode_size_limit;
    assert!(parse_decode_size_limit("").is_err());
    assert!(parse_decode_size_limit("   ").is_err());
    assert!(parse_decode_size_limit("0B").is_err());
    assert!(parse_decode_size_limit("1B").is_err());
    assert!(parse_decode_size_limit("3B").is_err());

    assert_eq!(parse_decode_size_limit("4B").unwrap(), 4);
    assert_eq!(parse_decode_size_limit("512KB").unwrap(), 512 * 1024);
    assert_eq!(parse_decode_size_limit("1MB").unwrap(), 1024 * 1024);
}