triplers 0.1.0

library for parsing, manipulating, and serializing target triples.
Documentation
use crate::Canonicalizable;
use crate::Parsable;
use crate::arch::*;

#[test]
fn test_x86() {
    let cases = [
        ("x86", x86::X86::X86, 3),
        ("i386", x86::X86::I386, 4),
        ("i486", x86::X86::I486, 4),
        ("i586", x86::X86::I586, 4),
        ("i686", x86::X86::I686, 4),
    ];
    for (input, expected_variant, expected_len) in cases {
        let (variant, len) = x86::X86::reduce(input).unwrap();
        assert_eq!(variant, expected_variant);
        assert_eq!(len, expected_len);
    }
}

#[test]
fn test_amd64() {
    let cases = [
        ("x86_64", amd64::Amd64::X86_64, 6),
        ("amd64", amd64::Amd64::Amd64, 5),
        ("em64t", amd64::Amd64::Em64t, 5),
        ("x64", amd64::Amd64::X64, 3),
    ];
    for (input, expected_variant, expected_len) in cases {
        let (variant, len) = amd64::Amd64::reduce(input).unwrap();
        assert_eq!(variant, expected_variant);
        assert_eq!(len, expected_len);
        assert_eq!(variant.canonicalize(), "x86_64");
    }
}

#[test]
fn test_arm() {
    let cases = [
        ("arm", arm::Arm::Arm, 3),
        ("armv4t", arm::Arm::V4t, 6),
        ("armv5", arm::Arm::V5, 5),
        ("armv5te", arm::Arm::V5te, 7),
        ("armv6", arm::Arm::V6, 5),
        ("armv6m", arm::Arm::V6m, 6),
        ("armv6k", arm::Arm::V6k, 6),
        ("armv6t2", arm::Arm::V6t2, 7),
        ("armv7", arm::Arm::V7, 5),
        ("armv7em", arm::Arm::V7em, 7),
        ("armv7m", arm::Arm::V7m, 6),
        ("armv7s", arm::Arm::V7s, 6),
        ("armv7k", arm::Arm::V7k, 6),
        ("armv7ve", arm::Arm::V7ve, 7),
        ("armv8a", arm::Arm::V8, 6),
        ("armv8.1a", arm::Arm::V8_1a, 8),
        ("armv8.2a", arm::Arm::V8_2a, 8),
        ("armv8.3a", arm::Arm::V8_3a, 8),
        ("armv8.4a", arm::Arm::V8_4a, 8),
        ("armv8.5a", arm::Arm::V8_5a, 8),
        ("armv8.6a", arm::Arm::V8_6a, 8),
        ("armv8.7a", arm::Arm::V8_7a, 8),
        ("armv8.8a", arm::Arm::V8_8a, 8),
        ("armv8.9a", arm::Arm::V8_9a, 8),
        ("armv8r", arm::Arm::V8r, 6),
        ("armv9a", arm::Arm::V9, 6),
        ("armv9.1a", arm::Arm::V9_1a, 8),
        ("armv9.2a", arm::Arm::V9_2a, 8),
        ("armv9.3a", arm::Arm::V9_3a, 8),
        ("armv9.4a", arm::Arm::V9_4a, 8),
        ("armv9.5a", arm::Arm::V9_5a, 8),
        ("armv9.6a", arm::Arm::V9_6a, 8),
        ("armv9.7a", arm::Arm::V9_7a, 8),
    ];
    for (input, expected_variant, expected_len) in cases {
        let (variant, len) = arm::Arm::reduce(input).unwrap();
        assert_eq!(variant, expected_variant);
        assert_eq!(len, expected_len);
        let canonical = variant.canonicalize();
        if expected_variant != arm::Arm::Arm {
            assert!(canonical.starts_with("armv"));
        }
        if matches!(variant, arm::Arm::Arm) {
            assert_eq!(canonical, "arm");
        } else {
            assert!(canonical.len() > 3);
        }
    }
}

#[test]
fn test_aarch64() {
    let cases = [
        ("aarch64", aarch64::Aarch64::Aarch64, 7),
        ("arm64", aarch64::Aarch64::Arm64, 5),
        ("arm64e", aarch64::Aarch64::Arm64e, 6),
        ("arm64ec", aarch64::Aarch64::Arm64ec, 7),
    ];
    for (input, expected_variant, expected_len) in cases {
        let (variant, len) = aarch64::Aarch64::reduce(input).unwrap();
        assert_eq!(variant, expected_variant);
        assert_eq!(len, expected_len);
        let canonical = variant.canonicalize();
        if matches!(variant, aarch64::Aarch64::Arm64 | aarch64::Aarch64::Aarch64) {
            assert_eq!(canonical, "aarch64");
        } else {
            assert_eq!(
                canonical,
                match variant {
                    aarch64::Aarch64::Arm64e => "arm64e",
                    aarch64::Aarch64::Arm64ec => "arm64ec",
                    _ => unreachable!(),
                }
            );
        }
    }
}

#[test]
fn test_kalimba() {
    let cases = [
        ("kalimba", kalimba::Kalimba::Kalimba, 7),
        ("kalimba3", kalimba::Kalimba::V3, 8),
        ("kalimba4", kalimba::Kalimba::V4, 8),
        ("kalimba5", kalimba::Kalimba::V5, 8),
    ];
    for (input, expected_variant, expected_len) in cases {
        let (variant, len) = kalimba::Kalimba::reduce(input).unwrap();
        assert_eq!(variant, expected_variant);
        assert_eq!(len, expected_len);
        assert_eq!(variant.canonicalize(), input);
    }
}

#[test]
fn test_mips() {
    let cases = [
        ("mips", mips::Mips::Mips, 4),
        ("mipsel", mips::Mips::MipsEL, 6),
        ("mips64", mips::Mips::Mips64, 6),
        ("mips64el", mips::Mips::Mips64EL, 8),
        ("mips32r6", mips::Mips::Mips32R6, 8),
        ("mips64r6", mips::Mips::Mips64R6, 8),
    ];
    for (input, expected_variant, expected_len) in cases {
        let (variant, len) = mips::Mips::reduce(input).unwrap();
        assert_eq!(variant, expected_variant);
        assert_eq!(len, expected_len);
        assert_eq!(variant.canonicalize(), input);
    }
}

#[test]
fn test_ppc() {
    let cases = [
        ("ppc", ppc::Ppc::Ppc, 3),
        ("ppc64", ppc::Ppc::Ppc64, 5),
        ("ppcel", ppc::Ppc::PpcEL, 5),
        ("ppc64el", ppc::Ppc::Ppc64EL, 7),
        ("ppcspe", ppc::Ppc::PpcSPE, 6),
        ("powerpc", ppc::Ppc::Ppc, 7),
        ("powerpc64", ppc::Ppc::Ppc64, 9),
        ("powerpcel", ppc::Ppc::PpcEL, 9),
        ("powerpc64el", ppc::Ppc::Ppc64EL, 11),
        ("powerpcspe", ppc::Ppc::PpcSPE, 10),
    ];
    for (input, expected_variant, expected_len) in cases {
        let (variant, len) = ppc::Ppc::reduce(input).unwrap();
        assert_eq!(variant, expected_variant);
        assert_eq!(len, expected_len);
        let canonical = variant.canonicalize();
        assert!(canonical.starts_with("powerpc"));
    }
}

#[test]
fn test_spirv() {
    let cases = [
        ("spirv", spirv::SpirV::SpirV, 5),
        ("spirv1.0", spirv::SpirV::V10, 8),
        ("spirv1.1", spirv::SpirV::V11, 8),
        ("spirv1.2", spirv::SpirV::V12, 8),
        ("spirv1.3", spirv::SpirV::V13, 8),
        ("spirv1.4", spirv::SpirV::V14, 8),
        ("spirv1.5", spirv::SpirV::V15, 8),
        ("spirv1.6", spirv::SpirV::V16, 8),
    ];
    for (input, expected_variant, expected_len) in cases {
        let (variant, len) = spirv::SpirV::reduce(input).unwrap();
        assert_eq!(variant, expected_variant);
        assert_eq!(len, expected_len);
        assert_eq!(variant.canonicalize(), input);
    }
}

#[test]
fn test_dxil() {
    let cases = [
        ("dxil", dxil::Dxil::Dxil, 4),
        ("dxil1.0", dxil::Dxil::V1_0, 7),
        ("dxil1.1", dxil::Dxil::V1_1, 7),
        ("dxil1.2", dxil::Dxil::V1_2, 7),
        ("dxil1.3", dxil::Dxil::V1_3, 7),
        ("dxil1.4", dxil::Dxil::V1_4, 7),
        ("dxil1.5", dxil::Dxil::V1_5, 7),
        ("dxil1.6", dxil::Dxil::V1_6, 7),
        ("dxil1.7", dxil::Dxil::V1_7, 7),
        ("dxil1.8", dxil::Dxil::V1_8, 7),
        ("dxil1.9", dxil::Dxil::V1_9, 7),
    ];
    for (input, expected_variant, expected_len) in cases {
        let (variant, len) = dxil::Dxil::reduce(input).unwrap();
        assert_eq!(variant, expected_variant);
        assert_eq!(len, expected_len);
        assert_eq!(variant.canonicalize(), input);
    }
}

#[test]
fn test_arch_part() {
    let (arch, len) = ArchPart::reduce("arm64ec-unknown-linux-gnu").unwrap();
    assert!(matches!(arch, ArchPart::Aarch64(aarch64::Aarch64::Arm64ec)));
    assert_eq!(len, 7);

    let (arch, len) = ArchPart::reduce("arm64-unknown-linux-gnu").unwrap();
    assert!(matches!(arch, ArchPart::Aarch64(aarch64::Aarch64::Arm64)));
    assert_eq!(len, 5);

    let (arch, len) = ArchPart::reduce("x86_64-unknown-linux-gnu").unwrap();
    assert!(matches!(arch, ArchPart::Amd64(amd64::Amd64::X86_64)));
    assert_eq!(len, 6);

    let (arch, len) = ArchPart::reduce("powerpc64el").unwrap();
    assert!(matches!(arch, ArchPart::Ppc(ppc::Ppc::Ppc64EL)));
    assert_eq!(len, 11);
}