macho-core 0.5.6

Byte-safe structural Mach-O parsing and validation
Documentation
use macho_core::format::constants::{
    CPU_SUBTYPE_ARM64_ALL, CPU_SUBTYPE_ARM64E, CPU_TYPE_ARM64, CPU_TYPE_X86_64,
};
use macho_core::model::header::{ArchSpec, CpuSubtype, CpuType};

fn spec(cpu_type: i32, cpu_subtype: i32) -> ArchSpec {
    ArchSpec {
        cpu_type: CpuType(cpu_type),
        cpu_subtype: CpuSubtype(cpu_subtype),
    }
}

#[test]
fn family_and_qualified_architecture_selectors_have_distinct_scope() {
    let arm64 = spec(CPU_TYPE_ARM64, CPU_SUBTYPE_ARM64_ALL);
    let arm64e = spec(CPU_TYPE_ARM64, CPU_SUBTYPE_ARM64E);
    let x86_64 = spec(CPU_TYPE_X86_64, 3);

    assert!(arm64.matches_selector("arm64"));
    assert!(!arm64.matches_selector("arm64e"));
    assert!(arm64e.matches_selector("arm64"));
    assert!(arm64e.matches_selector("arm64e"));
    assert!(arm64e.matches_selector("ARM64E"));
    assert!(!x86_64.matches_selector("arm64"));

    let x86_64h = spec(
        CPU_TYPE_X86_64,
        macho_core::format::constants::CPU_SUBTYPE_X86_64_H,
    );
    assert_eq!(x86_64h.name(), "x86_64h");
    assert!(x86_64h.matches_selector("x86_64"));
    assert!(x86_64h.matches_selector("x86_64h"));
    assert!(!x86_64.matches_selector("x86_64h"));
}