use vtty::{
ColorId, DEFAULT_BG_ID, DEFAULT_FG_ID, MouseButton, MouseTracking, Reply, SgrFlags, TermFlags,
hex_decode, hex_encode,
};
#[test]
fn mode_private_param_roundtrip() {
assert_eq!(TermFlags::from_private_param(1), TermFlags::CURSOR_KEYS);
assert_eq!(TermFlags::from_private_param(6), TermFlags::ORIGIN);
assert_eq!(TermFlags::from_private_param(25), TermFlags::CURSOR_VISIBLE);
assert_eq!(TermFlags::from_private_param(12), TermFlags::CURSOR_BLINK);
assert_eq!(TermFlags::from_private_param(1000), TermFlags::MOUSE_NORMAL);
assert_eq!(TermFlags::from_private_param(1006), TermFlags::MOUSE_SGR);
assert_eq!(
TermFlags::from_private_param(1047),
TermFlags::ALT_SCREEN_1047
);
assert_eq!(
TermFlags::from_private_param(1049),
TermFlags::ALT_SCREEN_1049
);
assert_eq!(TermFlags::from_private_param(4), TermFlags::NONE);
assert_eq!(TermFlags::from_private_param(999), TermFlags::NONE);
}
#[test]
fn mode_private_param_values() {
assert_eq!(TermFlags::CURSOR_KEYS.private_param(), 1);
assert_eq!(TermFlags::CURSOR_VISIBLE.private_param(), 25);
assert_eq!(TermFlags::CURSOR_BLINK.private_param(), 12);
assert_eq!(TermFlags::SYNC_OUTPUT.private_param(), 2026);
assert_eq!(TermFlags::INSERT.private_param(), 0);
assert_eq!(TermFlags::LINEFEED.private_param(), 0);
assert_eq!(TermFlags::NONE.private_param(), 0);
}
#[test]
fn mode_line_mouse_paste_table() {
assert_eq!(TermFlags::from_private_param(9), TermFlags::MOUSE_X10);
assert_eq!(
TermFlags::from_private_param(2004),
TermFlags::BRACKETED_PASTE
);
assert_eq!(TermFlags::MOUSE_X10.private_param(), 9);
assert_eq!(TermFlags::BRACKETED_PASTE.private_param(), 2004);
}
#[test]
fn mode_code_ansi_vs_private() {
assert_eq!(TermFlags::from_mode_code(4, false), TermFlags::INSERT);
assert_eq!(TermFlags::from_mode_code(20, false), TermFlags::LINEFEED);
assert_eq!(TermFlags::from_mode_code(4, true), TermFlags::NONE);
assert_eq!(TermFlags::from_mode_code(20, true), TermFlags::NONE);
assert_eq!(
TermFlags::from_mode_code(25, true),
TermFlags::CURSOR_VISIBLE
);
assert_eq!(TermFlags::from_mode_code(25, false), TermFlags::NONE);
assert_eq!(TermFlags::from_mode_code(1006, true), TermFlags::MOUSE_SGR);
assert_eq!(TermFlags::from_mode_code(1006, false), TermFlags::NONE);
assert_eq!(TermFlags::from_mode_code(999, false), TermFlags::NONE);
assert_eq!(TermFlags::from_mode_code(999, true), TermFlags::NONE);
}
#[test]
fn mode_code_any_lookup() {
assert_eq!(TermFlags::from_any_mode_code(4), TermFlags::INSERT);
assert_eq!(TermFlags::from_any_mode_code(20), TermFlags::LINEFEED);
assert_eq!(TermFlags::from_any_mode_code(25), TermFlags::CURSOR_VISIBLE);
assert_eq!(TermFlags::from_any_mode_code(1006), TermFlags::MOUSE_SGR);
assert_eq!(TermFlags::from_any_mode_code(999), TermFlags::NONE);
}
#[test]
fn mouse_sgr_encoding() {
assert_eq!(MouseButton::Left.encode_sgr(3, 4, true), "\x1b[<0;4;5M");
assert_eq!(MouseButton::Left.encode_sgr(3, 4, false), "\x1b[<0;4;5m");
assert_eq!(MouseButton::Right.encode_sgr(4, 9, false), "\x1b[<2;5;10m");
assert_eq!(
MouseButton::WheelUp.encode_sgr(10, 20, true),
"\x1b[<64;11;21M"
);
assert_eq!(
MouseButton::MotionNoButton.encode_sgr(3, 4, true),
"\x1b[<35;4;5M"
);
assert_eq!(MouseButton::Motion.encode_sgr(3, 4, true), "\x1b[<32;4;5M");
assert_eq!(MouseButton::Left.encode_utf8(0, 0), "\x1b[M !!");
assert_eq!(MouseButton::Left.encode_utf8(95, 95), "\x1b[M \u{80}\u{80}");
}
#[test]
fn mouse_x10_encoding() {
assert_eq!(
MouseButton::Left.encode_x10(0, 0).as_slice(),
&b"\x1b[M !!"[..]
);
assert_eq!(
MouseButton::Left.encode_x10(95, 95).as_slice(),
&[0x1b, b'[', b'M', b' ', 0x80, 0x80]
);
}
#[test]
fn mouse_encode_shared_encoder() {
let off = MouseTracking::empty();
assert_eq!(MouseButton::Left.encode(off, 0, 0, true), None);
let sgr = MouseTracking::ENABLED | MouseTracking::SGR;
assert_eq!(
MouseButton::Left.encode(sgr, 3, 4, true).as_deref(),
Some(&b"\x1b[<0;4;5M"[..])
);
assert_eq!(
MouseButton::Left.encode(sgr, 3, 4, false).as_deref(),
Some(&b"\x1b[<0;4;5m"[..])
);
let x10 = MouseTracking::ENABLED;
assert_eq!(
MouseButton::Left.encode(x10, 0, 0, true).as_deref(),
Some(&b"\x1b[M !!"[..])
);
assert_eq!(
MouseButton::Left.encode(x10, 0, 0, false).as_deref(),
Some(&b"\x1b[M#!!"[..])
);
let x10_mode = MouseTracking::ENABLED | MouseTracking::X10;
assert_eq!(
MouseButton::Left.encode(x10_mode, 0, 0, true).as_deref(),
Some(&b"\x1b[M !!"[..])
);
assert_eq!(
MouseButton::Left.encode(x10_mode, 0, 0, false),
None,
"DEC 9 reports no releases"
);
let px = MouseTracking::ENABLED | MouseTracking::PIXEL;
assert_eq!(
MouseButton::Left.encode(px, 27, 72, true).as_deref(),
Some(&b"\x1b[<0;28;73M"[..])
);
assert_eq!(MouseButton::Motion.encode(x10, 0, 0, true), None);
let x10_any = MouseTracking::ENABLED | MouseTracking::ANY_MOTION;
assert_eq!(
MouseButton::Motion.encode(x10_any, 0, 0, true).as_deref(),
Some(&b"\x1b[M@!!"[..])
);
assert_eq!(
MouseButton::Left.encode(x10, 222, 0, true).as_deref(),
Some(&b"\x1b[M \xff!"[..])
);
assert_eq!(MouseButton::Left.encode(x10, 223, 0, true), None);
assert_eq!(MouseButton::Left.encode(x10, 0, 223, true), None);
}
#[test]
fn decrqm_reply_format() {
assert_eq!(Reply::new().decrqm(25, true, 1).finish(), "\x1b[?25;1$y");
assert_eq!(Reply::new().decrqm(25, true, 2).finish(), "\x1b[?25;2$y");
assert_eq!(Reply::new().decrqm(25, true, 0).finish(), "\x1b[?25;0$y");
assert_eq!(Reply::new().decrqm(4, false, 2).finish(), "\x1b[4;2$y");
}
#[test]
fn decrqss_reply_format() {
assert_eq!(Reply::new().decrqss(true, "m").finish(), "\x1bP1$rm\x1b\\");
assert_eq!(Reply::new().decrqss(false, "x").finish(), "\x1bP0$rx\x1b\\");
}
#[test]
fn hex_decode_pairs() {
assert_eq!(hex_decode(b"4d6f"), b"Mo");
assert_eq!(hex_decode(b"7273"), b"rs");
assert_eq!(hex_decode(b""), b"");
assert_eq!(hex_decode(b"414"), b"A");
assert_eq!(hex_decode(b"414z"), b"A");
}
#[test]
fn hex_encode_round_trip() {
assert_eq!(hex_encode(b"Mo"), "4d6f");
assert_eq!(hex_encode(b"\x00\xff\x7f"), "00ff7f");
assert_eq!(hex_encode(b""), "");
for bytes in [b"hello".as_slice(), b"\x00\x01\xfe\xff", b""] {
assert_eq!(hex_decode(hex_encode(bytes).as_bytes()), bytes);
}
}
#[test]
fn sgr_reply_format() {
let pal = [0_u32; 256];
assert_eq!(
Reply::new()
.sgr(DEFAULT_FG_ID, DEFAULT_BG_ID, SgrFlags::empty(), &pal,)
.finish(),
"0;39;49"
);
assert_eq!(
Reply::new()
.sgr(DEFAULT_FG_ID, DEFAULT_BG_ID, SgrFlags::BOLD, &pal)
.finish(),
"0;1;39;49"
);
let mut pal = [0_u32; 259];
pal[258] = 0x112233;
assert_eq!(
Reply::new()
.sgr(ColorId(5), ColorId(258), SgrFlags::empty(), &pal)
.finish(),
"0;38;5;5;48;2;17;34;51"
);
}