use super::sanitize_terminal_body;
#[test]
fn preserves_readable_multiline_unicode_and_literal_escape_prose() {
assert_eq!(
sanitize_terminal_body("first\t行\nliteral \\u{000A}"),
"first\t行\nliteral \\u{000A}"
);
}
#[test]
fn removes_complete_csi_sequences_without_parameter_fragments() {
let rendered = sanitize_terminal_body("plain\u{001B}[31mred\u{001B}[0mplain");
assert_eq!(rendered, "plainredplain");
assert!(!rendered.contains("[31m"));
assert_eq!(sanitize_terminal_body("left\u{009B}31mright"), "leftright");
assert_eq!(sanitize_terminal_body("left\u{001B}(0right"), "leftright");
}
#[test]
fn removes_complete_osc_and_string_control_sequences() {
for control in [
"\u{001B}]8;;https://example.invalid\u{0007}",
"\u{001B}]title\u{001B}\\",
"\u{009D}title\u{009C}",
"\u{001B}Ppayload\u{001B}\\",
"\u{001B}Xpayload\u{001B}\\",
"\u{001B}^payload\u{001B}\\",
"\u{001B}_payload\u{001B}\\",
"\u{0090}payload\u{009C}",
"\u{0098}payload\u{009C}",
"\u{009E}payload\u{009C}",
"\u{009F}payload\u{009C}",
] {
assert_eq!(
sanitize_terminal_body(&format!("left{control}right")),
"leftright"
);
}
}
#[test]
fn retains_payload_after_incomplete_terminal_prefixes() {
assert_eq!(sanitize_terminal_body("a\u{001B}[31"), "a�");
assert_eq!(
sanitize_terminal_body("a\u{001B}]unterminated"),
"a�unterminated"
);
assert_eq!(
sanitize_terminal_body("a\u{001B}Punterminated"),
"a�unterminated"
);
assert_eq!(sanitize_terminal_body("a\u{001B}"), "a�");
}
#[test]
fn preserves_boundaries_while_omitting_nonrendering_characters() {
assert_eq!(
sanitize_terminal_body("\0start\u{000D}\nend\u{007F}"),
"start\nend"
);
assert_eq!(sanitize_terminal_body("a\0b"), "a�b");
assert_eq!(sanitize_terminal_body("a\u{202E}b"), "a�b");
assert_eq!(sanitize_terminal_body("a\u{200B}b"), "a�b");
assert_eq!(sanitize_terminal_body("👩\u{200D}💻"), "👩�💻");
for format in ['\u{0600}', '\u{070F}', '\u{0890}', '\u{FFF9}'] {
assert_eq!(sanitize_terminal_body(&format!("a{format}b")), "a�b");
}
}
#[test]
fn remains_bounded_without_truncating_visible_text() {
let input = "x\0".repeat(65_536);
let rendered = sanitize_terminal_body(&input);
assert_eq!(rendered.matches('x').count(), 65_536);
assert!(rendered.len() <= input.len() * 3);
}
#[test]
fn repeated_unterminated_string_controls_do_not_rescan_the_suffix() {
let input = "\u{001B}]".repeat(65_536);
let rendered = sanitize_terminal_body(&input);
assert_eq!(rendered, "�".repeat(65_536));
}