parent
fb37a9cb55
commit
c42df41332
|
@ -198,10 +198,21 @@ impl<T: Eq> Binding<T> {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn triggers_match(&self, binding: &Binding<T>) -> bool {
|
pub fn triggers_match(&self, binding: &Binding<T>) -> bool {
|
||||||
self.trigger == binding.trigger
|
// Check the binding's key and modifiers
|
||||||
&& self.mods == binding.mods
|
if self.trigger != binding.trigger || self.mods != binding.mods {
|
||||||
&& (self.mode.contains(binding.mode) || binding.mode.contains(self.mode))
|
return false;
|
||||||
&& (self.notmode.contains(binding.notmode) || binding.notmode.contains(self.notmode))
|
}
|
||||||
|
|
||||||
|
// Completely empty modes match all modes
|
||||||
|
if (self.mode.is_empty() && self.notmode.is_empty())
|
||||||
|
|| (binding.mode.is_empty() && binding.notmode.is_empty())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for intersection (equality is required since empty does not intersect itself)
|
||||||
|
(self.mode == binding.mode || self.mode.intersects(binding.mode))
|
||||||
|
&& (self.notmode == binding.notmode || self.notmode.intersects(binding.notmode))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1074,28 +1085,6 @@ mod tests {
|
||||||
assert!(different_action.triggers_match(&binding));
|
assert!(different_action.triggers_match(&binding));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn subset_mode_binding_matches_superset() {
|
|
||||||
let mut superset_mode = MockBinding::default();
|
|
||||||
superset_mode.mode = TermMode::ALT_SCREEN | TermMode::INSERT | TermMode::ORIGIN;
|
|
||||||
let mut subset_mode = MockBinding::default();
|
|
||||||
subset_mode.mode = TermMode::ALT_SCREEN | TermMode::ORIGIN;
|
|
||||||
|
|
||||||
assert!(superset_mode.triggers_match(&subset_mode));
|
|
||||||
assert!(subset_mode.triggers_match(&superset_mode));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn subset_notmode_binding_matches_superset() {
|
|
||||||
let mut superset_notmode = MockBinding::default();
|
|
||||||
superset_notmode.notmode = TermMode::ALT_SCREEN | TermMode::INSERT | TermMode::ORIGIN;
|
|
||||||
let mut subset_notmode = MockBinding::default();
|
|
||||||
subset_notmode.notmode = TermMode::ALT_SCREEN | TermMode::ORIGIN;
|
|
||||||
|
|
||||||
assert!(superset_notmode.triggers_match(&subset_notmode));
|
|
||||||
assert!(subset_notmode.triggers_match(&superset_notmode));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn mods_binding_requires_strict_match() {
|
fn mods_binding_requires_strict_match() {
|
||||||
let mut superset_mods = MockBinding::default();
|
let mut superset_mods = MockBinding::default();
|
||||||
|
@ -1107,6 +1096,86 @@ mod tests {
|
||||||
assert!(!subset_mods.triggers_match(&superset_mods));
|
assert!(!subset_mods.triggers_match(&superset_mods));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn binding_matches_identical_mode() {
|
||||||
|
let mut b1 = MockBinding::default();
|
||||||
|
b1.mode = TermMode::ALT_SCREEN;
|
||||||
|
let mut b2 = MockBinding::default();
|
||||||
|
b2.mode = TermMode::ALT_SCREEN;
|
||||||
|
|
||||||
|
assert!(b1.triggers_match(&b2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn binding_without_mode_matches_any_mode() {
|
||||||
|
let b1 = MockBinding::default();
|
||||||
|
let mut b2 = MockBinding::default();
|
||||||
|
b2.mode = TermMode::APP_KEYPAD;
|
||||||
|
b2.notmode = TermMode::ALT_SCREEN;
|
||||||
|
|
||||||
|
assert!(b1.triggers_match(&b2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn binding_with_mode_matches_empty_mode() {
|
||||||
|
let mut b1 = MockBinding::default();
|
||||||
|
b1.mode = TermMode::APP_KEYPAD;
|
||||||
|
b1.notmode = TermMode::ALT_SCREEN;
|
||||||
|
let b2 = MockBinding::default();
|
||||||
|
|
||||||
|
assert!(b1.triggers_match(&b2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn binding_matches_superset_mode() {
|
||||||
|
let mut b1 = MockBinding::default();
|
||||||
|
b1.mode = TermMode::APP_KEYPAD;
|
||||||
|
let mut b2 = MockBinding::default();
|
||||||
|
b2.mode = TermMode::ALT_SCREEN | TermMode::APP_KEYPAD;
|
||||||
|
|
||||||
|
assert!(b1.triggers_match(&b2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn binding_matches_subset_mode() {
|
||||||
|
let mut b1 = MockBinding::default();
|
||||||
|
b1.mode = TermMode::ALT_SCREEN | TermMode::APP_KEYPAD;
|
||||||
|
let mut b2 = MockBinding::default();
|
||||||
|
b2.mode = TermMode::APP_KEYPAD;
|
||||||
|
|
||||||
|
assert!(b1.triggers_match(&b2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn binding_matches_partial_intersection() {
|
||||||
|
let mut b1 = MockBinding::default();
|
||||||
|
b1.mode = TermMode::ALT_SCREEN | TermMode::APP_KEYPAD;
|
||||||
|
let mut b2 = MockBinding::default();
|
||||||
|
b2.mode = TermMode::APP_KEYPAD | TermMode::APP_CURSOR;
|
||||||
|
|
||||||
|
assert!(b1.triggers_match(&b2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn binding_mismatches_notmode() {
|
||||||
|
let mut b1 = MockBinding::default();
|
||||||
|
b1.mode = TermMode::ALT_SCREEN;
|
||||||
|
let mut b2 = MockBinding::default();
|
||||||
|
b2.notmode = TermMode::ALT_SCREEN;
|
||||||
|
|
||||||
|
assert!(!b1.triggers_match(&b2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn binding_mismatches_unrelated() {
|
||||||
|
let mut b1 = MockBinding::default();
|
||||||
|
b1.mode = TermMode::ALT_SCREEN;
|
||||||
|
let mut b2 = MockBinding::default();
|
||||||
|
b2.mode = TermMode::APP_KEYPAD;
|
||||||
|
|
||||||
|
assert!(!b1.triggers_match(&b2));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn binding_trigger_input() {
|
fn binding_trigger_input() {
|
||||||
let mut binding = MockBinding::default();
|
let mut binding = MockBinding::default();
|
||||||
|
|
Loading…
Reference in New Issue