use xqvm::bytecode::{InstructionBuilder, Register};
use xqvm::{TextTracer, Vm};
#[test]
fn text_tracer_produces_header_and_rows() {
let mut b = InstructionBuilder::new();
let _ = b
.emit_push(3)
.emit_push(4)
.emit_add()
.emit_stow(Register(0))
.emit_halt();
let program = b.build().unwrap();
let mut buf = Vec::new();
let mut tracer = TextTracer::new(&mut buf);
let mut vm = Vm::new();
vm.run_trace(&mut tracer, &program).unwrap();
let output = String::from_utf8(buf).unwrap();
let lines: Vec<&str> = output.lines().collect();
let header = lines.first().expect("should have header");
assert!(header.contains("step"));
assert!(header.contains("instruction"));
assert_eq!(lines.len(), 6, "header + 5 steps, got:\n{output}");
let stow_row = lines.get(4).expect("should have row 4");
assert!(
stow_row.contains("r0=7"),
"STOW r0 row should show r0=7, got: {stow_row}",
);
}
#[test]
fn text_tracer_large_stack_is_truncated() {
let mut b = InstructionBuilder::new();
for i in 0..12 {
let _ = b.emit_push(i);
}
let _ = b.emit_halt();
let program = b.build().unwrap();
let mut buf = Vec::new();
let mut tracer = TextTracer::new(&mut buf);
let mut vm = Vm::new();
vm.run_trace(&mut tracer, &program).unwrap();
let output = String::from_utf8(buf).unwrap();
let last_data = output.lines().last().unwrap();
assert!(
last_data.contains("..."),
"12-element stack should be truncated, got: {last_data}"
);
}