use justerm_core::{Engine, Modifiers, MouseAction, MouseButton, MouseEvent, MouseEvents};
#[test]
fn frame_carries_mouse_wanted_events_for_normal_tracking() {
let mut term = Engine::new(80, 24);
term.feed(b"\x1b[?1000h");
assert_eq!(
term.frame().mouse_events,
MouseEvents::DOWN | MouseEvents::UP | MouseEvents::WHEEL
);
}
#[test]
fn frame_mouse_events_empty_without_tracking() {
let mut term = Engine::new(80, 24);
term.feed(b"hello");
assert_eq!(term.frame().mouse_events, MouseEvents::empty());
}
#[test]
fn frame_mouse_events_x10_is_down_only() {
let mut term = Engine::new(80, 24);
term.feed(b"\x1b[?9h");
assert_eq!(term.frame().mouse_events, MouseEvents::DOWN);
}
#[test]
fn frame_mouse_events_any_includes_bare_motion() {
let mut term = Engine::new(80, 24);
term.feed(b"\x1b[?1003h");
assert_eq!(
term.frame().mouse_events,
MouseEvents::DOWN
| MouseEvents::UP
| MouseEvents::WHEEL
| MouseEvents::DRAG
| MouseEvents::MOVE
);
}
#[test]
fn encode_gate_matches_the_frame_mask_for_every_combination() {
let modes: &[&[u8]] = &[
b"",
b"\x1b[?9h",
b"\x1b[?1000h",
b"\x1b[?1002h",
b"\x1b[?1003h",
];
let actions = [
MouseAction::Press,
MouseAction::Release,
MouseAction::Motion,
];
let buttons = [Some(MouseButton::Left), Some(MouseButton::WheelUp), None];
for set in modes {
for action in actions {
for button in buttons {
let mut t = Engine::new(80, 24);
if !set.is_empty() {
t.feed(set);
}
let mask = t.frame().mouse_events;
let ev = MouseEvent {
button,
action,
col: 5,
row: 5,
px: 0,
py: 0,
mods: Modifiers::empty(),
};
let is_wheel = matches!(button, Some(MouseButton::WheelUp));
let category = match (action, button.is_some()) {
(MouseAction::Press, _) if is_wheel => MouseEvents::WHEEL,
(MouseAction::Press, _) => MouseEvents::DOWN,
(MouseAction::Release, _) => MouseEvents::UP,
(MouseAction::Motion, true) => MouseEvents::DRAG,
(MouseAction::Motion, false) => MouseEvents::MOVE,
};
let wheel_release = action == MouseAction::Release && is_wheel;
let expected = !wheel_release && mask.contains(category);
assert_eq!(
t.encode_mouse(ev).is_some(),
expected,
"set={set:?} action={action:?} button={button:?}"
);
}
}
}
}