modde-games 0.2.1

Game plugin implementations for modde
Documentation
use std::collections::HashSet;

use modde_games::{SUPPORTED_GAME_IDS, all_games, normalize_wabbajack_game};

#[test]
fn registry_game_ids_are_unique() {
    let ids: Vec<_> = all_games().iter().map(|game| game.game_id).collect();
    let unique: HashSet<_> = ids.iter().copied().collect();

    assert_eq!(ids.len(), unique.len(), "registry has duplicate game IDs");
}

#[test]
fn supported_game_ids_are_registry_order() {
    let registry_ids: Vec<_> = all_games().iter().map(|game| game.game_id).collect();

    assert_eq!(SUPPORTED_GAME_IDS, registry_ids.as_slice());
}

#[test]
fn registry_resolves_public_components_consistently() {
    for game in all_games() {
        let plugin = modde_games::resolve_game_plugin(game.game_id).unwrap();
        assert_eq!(plugin.game_id(), game.game_id);
        assert_eq!(plugin.display_name(), game.display_name);
        assert_eq!(
            modde_games::resolve_mod_scanner(game.game_id).is_some(),
            game.scanner.is_some(),
            "{} scanner mismatch",
            game.game_id
        );
        assert_eq!(
            modde_games::resolve_save_tracker(game.game_id).is_some(),
            game.save_tracker.is_some(),
            "{} save tracker mismatch",
            game.game_id
        );
        assert_eq!(
            modde_games::resolve_collision_classifier(game.game_id).is_some(),
            game.collision_classifier.is_some(),
            "{} collision classifier mismatch",
            game.game_id
        );
        assert_eq!(
            modde_games::supports_save_profiles(game.game_id),
            game.supports_save_profiles,
            "{} save support mismatch",
            game.game_id
        );
    }
}

#[test]
fn registry_preserves_known_nexus_metadata() {
    let expected = [
        ("skyrim-se", Some("skyrimspecialedition"), Some(1704)),
        ("skyrim-ae", Some("skyrimspecialedition"), Some(1704)),
        ("fallout4", Some("fallout4"), Some(1151)),
        ("fallout76", Some("fallout76"), Some(2590)),
        ("starfield", Some("starfield"), Some(4187)),
        ("cyberpunk2077", Some("cyberpunk2077"), Some(3333)),
        ("stellar-blade", Some("stellarblade"), None),
    ];

    for (game_id, domain, numeric_id) in expected {
        let game = modde_games::resolve_game(game_id).unwrap();
        assert_eq!(game.nexus_domain, domain, "{game_id} Nexus domain");
        assert_eq!(game.nexus_game_id, numeric_id, "{game_id} Nexus numeric ID");
    }
}

#[test]
fn registry_preserves_wabbajack_normalization() {
    assert_eq!(
        normalize_wabbajack_game("Cyberpunk2077"),
        Some("cyberpunk2077")
    );
    assert_eq!(
        normalize_wabbajack_game("SkyrimSpecialEdition"),
        Some("skyrim-se")
    );
    assert_eq!(normalize_wabbajack_game("SkyrimAE"), Some("skyrim-ae"));
    assert_eq!(normalize_wabbajack_game("Fallout4"), Some("fallout4"));
    assert_eq!(normalize_wabbajack_game("Fallout76"), Some("fallout76"));
    assert_eq!(normalize_wabbajack_game("Starfield"), Some("starfield"));
    assert_eq!(
        normalize_wabbajack_game("StellarBlade"),
        Some("stellar-blade")
    );
}