mirror of https://github.com/helix-editor/helix
test: add tests for MouseClicks
parent
7694517d0f
commit
c4672ed902
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue