xll-utils 0.1.0

PE/COFF parsing and export verification utilities for Excel XLL development
Documentation
use xll_utils::types::Architecture;

#[test]
fn architecture_from_machine_type_x86() {
    let arch = Architecture::from_machine_type(0x014c);
    assert_eq!(arch, Architecture::X86);
    assert!(arch.is_x86());
    assert!(!arch.is_x64());
    assert!(!arch.is_arm());
}

#[test]
fn architecture_from_machine_type_x64() {
    let arch = Architecture::from_machine_type(0x8664);
    assert_eq!(arch, Architecture::X64);
    assert!(arch.is_x64());
    assert!(!arch.is_x86());
    assert!(!arch.is_arm());
}

#[test]
fn architecture_from_machine_type_arm() {
    let arch = Architecture::from_machine_type(0x01c0);
    assert_eq!(arch, Architecture::Arm);
    assert!(arch.is_arm());
    assert!(!arch.is_x86());
    assert!(!arch.is_x64());
}

#[test]
fn architecture_from_machine_type_arm64() {
    let arch = Architecture::from_machine_type(0xaa64);
    assert_eq!(arch, Architecture::Arm64);
    assert!(arch.is_arm());
}

#[test]
fn architecture_from_machine_type_unknown() {
    let arch = Architecture::from_machine_type(0xFFFF);
    assert_eq!(arch, Architecture::Unknown(0xFFFF));
    assert!(!arch.is_x86());
    assert!(!arch.is_x64());
    assert!(!arch.is_arm());
}

#[test]
fn architecture_display() {
    assert_eq!(Architecture::X86.to_string(), "x86");
    assert_eq!(Architecture::X64.to_string(), "x64");
    assert_eq!(Architecture::Arm.to_string(), "ARM");
    assert_eq!(Architecture::Arm64.to_string(), "ARM64");
    assert_eq!(Architecture::Unknown(0x1234).to_string(), "Unknown(0x1234)");
}

#[test]
fn architecture_roundtrip() {
    for machine in [0x014c_u16, 0x8664, 0x01c0, 0xaa64] {
        let arch = Architecture::from_machine_type(machine);
        assert_eq!(arch.as_image_file_machine(), Some(machine));
    }
    assert_eq!(Architecture::Unknown(0x9999).as_image_file_machine(), None);
}

#[test]
fn architecture_equality() {
    assert_eq!(Architecture::X64, Architecture::X64);
    assert_ne!(Architecture::X86, Architecture::X64);
    assert_eq!(Architecture::Unknown(42), Architecture::Unknown(42));
    assert_ne!(Architecture::Unknown(42), Architecture::Unknown(43));
}

#[test]
fn fixture_xll_exists() {
    let manifest_dir = env!("CARGO_MANIFEST_DIR");
    let fixture_path = std::path::Path::new(manifest_dir)
        .join("tests")
        .join("fixtures")
        .join("test_xll.xll");
    assert!(
        fixture_path.exists(),
        "Test fixture XLL not found at {}. Run: cargo build --release --manifest-path tests/fixtures/test_xll_src/Cargo.toml",
        fixture_path.display()
    );
}