use dismael::disassemble;
#[test]
fn test_disassemble_extended_instructions() {
let machine_code = vec![
(0b10001 << 11) | 100, (0b10010 << 11) | 200, (0b10011 << 11) | 50, (0b00111 << 11) | 0, ];
let result = disassemble(&machine_code).unwrap();
let disasm_text = result.join("\n");
assert!(disasm_text.contains("MNO"));
assert!(disasm_text.contains("DZI"));
assert!(disasm_text.contains("MOD"));
assert!(disasm_text.contains("100"));
assert!(disasm_text.contains("200"));
assert!(disasm_text.contains("50"));
}
#[test]
fn test_disassemble_extended_immediate_addressing() {
let machine_code = vec![
(0b10001 << 11) | (0b001 << 8) | 42, (0b10010 << 11) | (0b001 << 8) | 7, (0b10011 << 11) | (0b001 << 8) | 5, ];
let result = disassemble(&machine_code).unwrap();
let disasm_text = result.join("\n");
assert!(disasm_text.contains("MNO"));
assert!(disasm_text.contains("#42"));
assert!(disasm_text.contains("DZI"));
assert!(disasm_text.contains("#7"));
assert!(disasm_text.contains("MOD"));
assert!(disasm_text.contains("#5"));
}
#[test]
fn test_disassemble_extended_indirect_addressing() {
let machine_code = vec![
(0b10001 << 11) | (0b010 << 8) | 100, (0b10010 << 11) | (0b010 << 8) | 200, (0b10011 << 11) | (0b010 << 8) | 50, ];
let result = disassemble(&machine_code).unwrap();
let disasm_text = result.join("\n");
assert!(disasm_text.contains("MNO"));
assert!(disasm_text.contains("[100]"));
assert!(disasm_text.contains("DZI"));
assert!(disasm_text.contains("[200]"));
assert!(disasm_text.contains("MOD"));
assert!(disasm_text.contains("[50]"));
}
#[test]
fn test_disassemble_mixed_instructions() {
let machine_code = vec![
(0b00001 << 11) | 10, (0b10001 << 11) | (0b001 << 8) | 5, (0b00010 << 11) | 20, (0b10010 << 11) | (0b001 << 8) | 2, (0b10011 << 11) | (0b001 << 8) | 7, (0b00111 << 11) | 0, ];
let result = disassemble(&machine_code).unwrap();
let disasm_text = result.join("\n");
assert!(disasm_text.contains("DOD"));
assert!(disasm_text.contains("MNO"));
assert!(disasm_text.contains("ODE"));
assert!(disasm_text.contains("DZI"));
assert!(disasm_text.contains("MOD"));
assert!(disasm_text.contains("STP"));
assert!(disasm_text.contains("#5"));
assert!(disasm_text.contains("#2"));
assert!(disasm_text.contains("#7"));
}
#[test]
fn test_roundtrip_extended_instructions() {
use hephasm::assemble_program_extended;
let source = r#"
; Extended arithmetic operations
MNO #6 ; multiply by 6
DZI #2 ; divide by 2
MOD #5 ; modulo 5
STP ; stop
"#;
let machine_code = assemble_program_extended(source).unwrap();
let disassembled = disassemble(&machine_code).unwrap();
let disasm_text = disassembled.join("\n");
assert!(disasm_text.contains("MNO"));
assert!(disasm_text.contains("#6"));
assert!(disasm_text.contains("DZI"));
assert!(disasm_text.contains("#2"));
assert!(disasm_text.contains("MOD"));
assert!(disasm_text.contains("#5"));
assert!(disasm_text.contains("STP"));
}