rmcl 0.4.0

A fully featured Minecraft TUI launcher
use std::io::Write;

use flate2::{Compression, write::GzEncoder};

use super::*;

#[test]
fn world_scan_uses_level_dat_metadata_and_falls_back_cleanly() {
    let temp = tempfile::tempdir().unwrap();
    let world = temp.path().join("world-folder");
    std::fs::create_dir_all(world.join("region")).unwrap();
    std::fs::write(world.join("region/r.0.0.mca"), vec![0; 2048]).unwrap();

    let nbt = fastnbt::nbt!({
        "Data": {
            "LevelName": "Display World",
            "GameType": 0,
            "hardcore": 1_i8,
            "Difficulty": 3_i8,
            "allowCommands": 0_i8,
            "LastPlayed": 1_700_000_000_000_i64,
            "Version": { "Name": "1.21.1" },
            "DataVersion": 3955,
        }
    });
    let mut encoder = GzEncoder::new(Vec::new(), Compression::default());
    encoder
        .write_all(&fastnbt::to_bytes(&nbt).unwrap())
        .unwrap();
    std::fs::write(world.join("level.dat"), encoder.finish().unwrap()).unwrap();

    let entry = scan_one_world(&world, "world-folder", true);
    assert_eq!(entry.name, "Display World");
    let details = entry.world_details.as_ref().unwrap();
    assert_eq!(details.game_mode, Some(WorldGameMode::Hardcore));
    assert_eq!(
        details.last_played,
        chrono::DateTime::from_timestamp(1_700_000_000, 0)
    );
    assert_eq!(details.minecraft_version.as_deref(), Some("1.21.1"));
    assert_eq!(details.size.as_deref(), Some("2.2 KB"));
    assert!(entry.description.is_empty());

    std::fs::write(world.join("level.dat"), b"not nbt").unwrap();
    let fallback = scan_one_world(&world, "world-folder", true);
    assert_eq!(fallback.name, "world-folder");
    assert_eq!(fallback.title_suffix, None);
    assert_eq!(
        fallback
            .world_details
            .as_ref()
            .and_then(|details| details.size.as_deref()),
        Some("2.0 KB")
    );
}

#[test]
fn world_scan_lists_directory_and_zip_datapacks() {
    let temp = tempfile::tempdir().unwrap();
    let world = temp.path().join("world");
    std::fs::create_dir_all(world.join("datapacks/folder-pack")).unwrap();
    std::fs::write(world.join("datapacks/zipped-pack.zip"), b"zip").unwrap();
    std::fs::write(world.join("datapacks/disabled-pack.zip.disabled"), b"zip").unwrap();

    let details = scan_one_world(&world, "world", true).world_details.unwrap();

    assert_eq!(
        details.datapacks,
        ["disabled-pack", "folder-pack", "zipped-pack"]
    );
}