test: add tests for MouseClicks

pull/12514/head
Nikita Revenco 2025-01-16 16:59:53 +00:00
parent 7694517d0f
commit c4672ed902
1 changed files with 66 additions and 10 deletions

View File

@ -73,6 +73,7 @@ pub struct MouseClicks {
count: u8, count: u8,
} }
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum MouseClick { pub enum MouseClick {
/// A click where the pressed character is different to the character previously pressed /// A click where the pressed character is different to the character previously pressed
Single, Single,
@ -94,15 +95,15 @@ impl MouseClicks {
} }
/// Registers a click for a certain character index, and returns the type of this click /// Registers a click for a certain character index, and returns the type of this click
pub fn register_click(&mut self, char_idx: usize, view_id: ViewId) -> MouseClick { pub fn register_click(&mut self, click: usize, view_id: ViewId) -> MouseClick {
let click_type = if self.is_triple_click(char_idx, view_id) { let click_type = if self.is_triple_click(click, view_id) {
// Clicking 4th time on the same character should be the same as clicking for the 1st time // Clicking 4th time on the same character should be the same as clicking for the 1st time
// So we reset the state // So we reset the state
self.clicks = [None, None]; self.clicks = [None, None];
self.count = 0; self.count = 0;
return MouseClick::Triple; return MouseClick::Triple;
} else if self.is_double_click(char_idx, view_id) { } else if self.is_double_click(click, view_id) {
MouseClick::Double MouseClick::Double
} else { } else {
MouseClick::Single MouseClick::Single
@ -110,16 +111,16 @@ impl MouseClicks {
match self.count { match self.count {
0 => { 0 => {
self.clicks[0] = Some((char_idx, view_id)); self.clicks[0] = Some((click, view_id));
self.count = 1; self.count = 1;
} }
1 => { 1 => {
self.clicks[1] = Some((char_idx, view_id)); self.clicks[1] = Some((click, view_id));
self.count = 2; self.count = 2;
} }
2 => { 2 => {
self.clicks[1] = self.clicks[0]; self.clicks[1] = self.clicks[0];
self.clicks[0] = Some((char_idx, view_id)); self.clicks[0] = Some((click, view_id));
} }
_ => unreachable!(), _ => unreachable!(),
}; };
@ -128,13 +129,18 @@ impl MouseClicks {
} }
/// If we click this character, would that be a triple click? /// If we click this character, would that be a triple click?
fn is_triple_click(&mut self, char_idx: usize, view_id: ViewId) -> bool { fn is_triple_click(&mut self, click: usize, view_id: ViewId) -> bool {
Some((char_idx, view_id)) == self.clicks[0] && Some((char_idx, view_id)) == self.clicks[1] Some((click, view_id)) == self.clicks[0] && Some((click, view_id)) == self.clicks[1]
} }
/// If we click this character, would that be a double click? /// If we click this character, would that be a double click?
fn is_double_click(&mut self, char_idx: usize, view_id: ViewId) -> bool { fn is_double_click(&mut self, click: usize, view_id: ViewId) -> bool {
Some((char_idx, view_id)) == self.clicks[0] && Some((char_idx, view_id)) != self.clicks[1] dbg!(self.clicks, click, view_id);
Some((click, view_id)) == self.clicks[0]
&& self.clicks[1].map_or(true, |(prev_click, prev_view_id)| {
(click != prev_click && prev_view_id == view_id)
|| (click == prev_click && prev_view_id != view_id)
})
} }
} }
@ -690,6 +696,8 @@ pub fn parse_macro(keys_str: &str) -> anyhow::Result<Vec<KeyEvent>> {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use slotmap::HopSlotMap;
use super::*; use super::*;
#[test] #[test]
@ -1046,4 +1054,52 @@ mod test {
assert!(parse_macro("abc>123").is_err()); assert!(parse_macro("abc>123").is_err());
assert!(parse_macro("wd<foo>").is_err()); assert!(parse_macro("wd<foo>").is_err());
} }
#[test]
fn clicking_4th_time_resets_mouse_clicks() {
let mut mouse_clicks = MouseClicks::new();
let view = ViewId::default();
assert_eq!(mouse_clicks.register_click(4, view), MouseClick::Single);
assert_eq!(mouse_clicks.register_click(4, view), MouseClick::Double);
assert_eq!(mouse_clicks.register_click(4, view), MouseClick::Triple);
assert_eq!(mouse_clicks.register_click(4, view), MouseClick::Single);
}
#[test]
fn clicking_different_characters_resets_mouse_clicks() {
let mut mouse_clicks = MouseClicks::new();
let view = ViewId::default();
assert_eq!(mouse_clicks.register_click(4, view), MouseClick::Single);
assert_eq!(mouse_clicks.register_click(4, view), MouseClick::Double);
assert_eq!(mouse_clicks.register_click(8, view), MouseClick::Single);
assert_eq!(mouse_clicks.register_click(1, view), MouseClick::Single);
assert_eq!(mouse_clicks.register_click(1, view), MouseClick::Double);
assert_eq!(mouse_clicks.register_click(1, view), MouseClick::Triple);
}
#[test]
fn switching_views_resets_mouse_clicks() {
let mut mouse_clicks = MouseClicks::new();
let mut view_ids: HopSlotMap<ViewId, ()> = HopSlotMap::with_key();
let view1 = view_ids.insert(());
let view2 = view_ids.insert(());
assert_eq!(mouse_clicks.register_click(4, view1), MouseClick::Single);
assert_eq!(mouse_clicks.register_click(4, view2), MouseClick::Single);
assert_eq!(mouse_clicks.register_click(4, view1), MouseClick::Single);
assert_eq!(mouse_clicks.register_click(4, view2), MouseClick::Single);
assert_eq!(mouse_clicks.register_click(4, view2), MouseClick::Double);
// assert_eq!(mouse_clicks.register_click(4, view1), MouseClick::Single);
// assert_eq!(mouse_clicks.register_click(4, view1), MouseClick::Double);
// assert_eq!(mouse_clicks.register_click(4, view1), MouseClick::Triple);
}
} }