min_infmachine_lltk 0.1.0

The MinInfMachine Low Level Toolkit.
Documentation
use min_infmachine_lltk::*;

#[test]
fn test_try_into_from_pair() {
    for bits in 8..32 {
        for i0 in 0..16u8 {
            for i1 in 0..16u8 {
                let instr =
                    MinInfInstr::new(i0.try_into().unwrap(), i1.try_into().unwrap(), 121, 237);
                let pair = (((i0 as u64) << bits) | 121, ((i1 as u64) << bits) | 237);
                assert_eq!(
                    Ok(pair),
                    instr.try_into_pair(bits).map_err(|e| e.to_string()),
                );
                assert_eq!(
                    Ok(instr),
                    MinInfInstr::try_from_pair(pair, bits).map_err(|e| e.to_string()),
                );
            }
        }
    }
    for bits in 8..16 {
        for i0 in 0..16u8 {
            for i1 in 0..16u8 {
                let instr = MinInfInstr::new(
                    i0.try_into().unwrap(),
                    i1.try_into().unwrap(),
                    133121,
                    1441237,
                );
                assert_eq!(
                    Err("NextFr0 overflow: 133121".to_string()),
                    instr.try_into_pair::<u64>(bits).map_err(|e| e.to_string()),
                );
            }
        }
    }
    for bits in 8..16 {
        for i0 in 0..16u8 {
            for i1 in 0..16u8 {
                let instr =
                    MinInfInstr::new(i0.try_into().unwrap(), i1.try_into().unwrap(), 17, 1441237);
                assert_eq!(
                    Err("NextFr1 overflow: 1441237".to_string()),
                    instr.try_into_pair::<u64>(bits).map_err(|e| e.to_string()),
                );
            }
        }
    }
}

#[test]
fn test_try_to_table() {
    assert_eq!(
        Ok(vec![
            ((MACH_MARF as u64) << 3) | 1,
            ((MACH_TBRF as u64) << 3) | 1,
            ((MACH_TBRF as u64) << 3) | 2,
            ((MACH_MRW0 as u64) << 3) | 4,
            ((MACH_MARW0 as u64) << 3) | 1,
            0,
            0,
            0,
            ((MACH_MARF as u64) << 3) | 2,
            ((MACH_TBRF as u64) << 3) | 2,
            ((MACH_TBB as u64) << 3) | 3,
            ((MACH_MRW0 as u64) << 3) | 4,
            ((MACH_MARW0 as u64) << 3) | 0,
            0,
            0,
            0,
        ]),
        try_to_table::<u64>(vec![
            MinInfInstr::new_func01(MINF_MARF, 1, 2),
            MinInfInstr::new_func01(MINF_TBRF, 1, 2),
            MinInfInstr::new(MINF_TBRF, MINF_TBB, 2, 3),
            MinInfInstr::new_func01(MINF_MRW0, 4, 4),
            MinInfInstr::new_func01(MINF_MARW0, 1, 0),
        ])
        .map_err(|e| e.to_string())
    );
}

#[test]
fn test_try_from_table() {
    assert_eq!(
        Ok(vec![
            MinInfInstr::new_func01(MINF_MARF, 1, 2),
            MinInfInstr::new_func01(MINF_TBRF, 1, 2),
            MinInfInstr::new(MINF_TBRF, MINF_TBB, 2, 3),
            MinInfInstr::new_func01(MINF_MRW0, 4, 4),
            MinInfInstr::new_func01(MINF_MARW0, 1, 0),
            MinInfInstr::default(),
            MinInfInstr::default(),
            MinInfInstr::default(),
        ]),
        try_from_table::<u64>(vec![
            ((MACH_MARF as u64) << 3) | 1,
            ((MACH_TBRF as u64) << 3) | 1,
            ((MACH_TBRF as u64) << 3) | 2,
            ((MACH_MRW0 as u64) << 3) | 4,
            ((MACH_MARW0 as u64) << 3) | 1,
            0,
            0,
            0,
            ((MACH_MARF as u64) << 3) | 2,
            ((MACH_TBRF as u64) << 3) | 2,
            ((MACH_TBB as u64) << 3) | 3,
            ((MACH_MRW0 as u64) << 3) | 4,
            ((MACH_MARW0 as u64) << 3) | 0,
            0,
            0,
            0,
        ])
        .map_err(|e| e.to_string())
    );
}