use dismael::disassemble;
use hephasm::assemble_source;
#[test]
fn test_complex_program_with_labels() {
let machine_code = vec![
(0b00100 << 11) | 5, (0b00110 << 11) | 4, (0b00001 << 11) | 6, (0b00101 << 11) | 0, (0b00111 << 11) | 0, 100, 50, ];
let result = disassemble(&machine_code).unwrap();
let disasm_text = result.join("\n");
assert!(disasm_text.contains("L_0004:")); assert!(disasm_text.contains("L_0000:"));
assert!(disasm_text.contains("DATA_0005:")); assert!(disasm_text.contains("DATA_0006:"));
assert!(disasm_text.contains("SOM L_0004"));
assert!(disasm_text.contains("SOB L_0000"));
assert!(disasm_text.contains("POB DATA_0005"));
assert!(disasm_text.contains("DOD DATA_0006"));
}
#[test]
fn test_roundtrip_simple_program() {
let source = r#"
start:
DOD data
STP
data: RST 42
"#;
let machine_code = assemble_source(source).unwrap();
let disassembled = disassemble(&machine_code).unwrap();
let disasm_text = disassembled.join("\n");
assert!(disasm_text.contains("DOD"));
assert!(disasm_text.contains("STP"));
assert!(disasm_text.contains("42")); }
#[test]
fn test_roundtrip_with_jumps() {
let source = r#"
start:
SOB end
DOD 100
end:
STP
"#;
let machine_code = assemble_source(source).unwrap();
let disassembled = disassemble(&machine_code).unwrap();
let disasm_text = disassembled.join("\n");
assert!(disasm_text.contains("SOB"));
assert!(disasm_text.contains("STP"));
assert!(disasm_text.contains("L_"));
}
#[test]
fn test_address_comments() {
let machine_code = vec![
(0b00001 << 11) | 100, (0b00111 << 11) | 0, ];
let result = disassemble(&machine_code).unwrap();
assert_eq!(result.len(), 2);
assert!(result[0].contains("DOD"));
assert!(result[1].contains("STP"));
}