claude-print/tests/terminal.rs
2026-06-08 09:25:54 -04:00

68 lines
1.7 KiB
Rust

use claude_print::terminal::TerminalEmu;
fn emu() -> TerminalEmu {
TerminalEmu::new(50, 220)
}
#[test]
fn da1_responds_with_csi_6c() {
let mut e = emu();
assert_eq!(e.feed(b"\x1b[c"), b"\x1b[?6c");
}
#[test]
fn da2_responds_with_secondary_attrs() {
let mut e = emu();
assert_eq!(e.feed(b"\x1b[>c"), b"\x1b[>0;0;0c");
}
#[test]
fn dsr_responds_with_cursor_pos() {
let mut e = emu();
assert_eq!(e.feed(b"\x1b[6n"), b"\x1b[1;1R");
}
#[test]
fn xtversion_responds_with_dcs_string() {
let mut e = emu();
assert_eq!(e.feed(b"\x1b[>q"), b"\x1bP>|claude-print\x1b\\");
}
#[test]
fn window_size_responds_with_configured_dimensions() {
let mut e = emu();
// rows=50, cols=220 → ESC[8;50;220t
assert_eq!(e.feed(b"\x1b[18t"), b"\x1b[8;50;220t");
}
#[test]
fn multiple_probes_in_one_chunk_answered_in_order() {
let mut e = emu();
let resp = e.feed(b"\x1b[c\x1b[6n\x1b[>c");
assert_eq!(resp, b"\x1b[?6c\x1b[1;1R\x1b[>0;0;0c");
}
#[test]
fn probe_dedup_da1_answered_only_once() {
let mut e = emu();
let first = e.feed(b"\x1b[c");
let second = e.feed(b"\x1b[c");
assert_eq!(first, b"\x1b[?6c", "first DA1 should be answered");
assert_eq!(second, b"", "second DA1 should be suppressed by dedup");
}
#[test]
fn unknown_probe_ignored_no_response_no_panic() {
let mut e = emu();
let resp = e.feed(b"\x1b[99t");
assert_eq!(resp, b"", "unknown escape sequence must produce no response");
}
#[test]
fn split_chunk_probe_answered_on_second_read() {
let mut e = emu();
let first = e.feed(b"\x1b[");
let second = e.feed(b"c");
assert_eq!(first, b"", "partial probe should produce no response yet");
assert_eq!(second, b"\x1b[?6c", "probe completed on second read should be answered");
}