use super::*;
#[test]
fn per_app_overlay_takes_precedence() {
let mut cfg = Config::default();
cfg.set_binding(
"2b042",
ButtonId::Back,
Binding::Single(Action::BrowserBack),
);
cfg.set_binding(
"2b042",
ButtonId::Forward,
Binding::Single(Action::BrowserForward),
);
cfg.set_per_app_binding(
"2b042",
"com.microsoft.VSCode",
ButtonId::Back,
Some(Action::Undo),
);
let global = cfg.effective_bindings("2b042", None);
assert_eq!(
global.get(&ButtonId::Back),
Some(&Binding::Single(Action::BrowserBack))
);
assert_eq!(
global.get(&ButtonId::Forward),
Some(&Binding::Single(Action::BrowserForward))
);
let vscode = cfg.effective_bindings("2b042", Some("com.microsoft.VSCode"));
assert_eq!(
vscode.get(&ButtonId::Back),
Some(&Binding::Single(Action::Undo))
);
assert_eq!(
vscode.get(&ButtonId::Forward),
Some(&Binding::Single(Action::BrowserForward))
);
let other = cfg.effective_bindings("2b042", Some("com.apple.Safari"));
assert_eq!(
other.get(&ButtonId::Back),
Some(&Binding::Single(Action::BrowserBack))
);
}
#[test]
fn per_app_binding_removal_prunes_empty_app() {
let mut cfg = Config::default();
cfg.set_per_app_binding(
"2b042",
"com.example.App",
ButtonId::Back,
Some(Action::Copy),
);
cfg.set_per_app_binding("2b042", "com.example.App", ButtonId::Back, None);
assert!(
cfg.devices["2b042"].per_app_bindings.is_empty(),
"removing last override should prune the app entry"
);
}
#[test]
fn windows_exe_selector_matches_versioned_path() {
let mut cfg = Config::default();
cfg.set_binding(
"2b042",
ButtonId::Back,
Binding::Single(Action::BrowserBack),
);
cfg.set_per_app_binding(
"2b042",
"exe:sharex.exe",
ButtonId::Back,
Some(Action::Copy),
);
cfg.set_per_app_binding(
"2b042",
"exe:sharex.exe",
ButtonId::Forward,
Some(Action::Paste),
);
let store_path = r"c:\program files\windowsapps\sharex_14.0.0.0_x64__abc\sharex.exe";
let effective = cfg.effective_bindings("2b042", Some(store_path));
assert_eq!(
effective.get(&ButtonId::Back),
Some(&Binding::Single(Action::Copy))
);
assert_eq!(
effective.get(&ButtonId::Forward),
Some(&Binding::Single(Action::Paste))
);
assert!(cfg.has_app_override("2b042", store_path));
let unixish = r"c:/tools/sharex/sharex.exe";
assert_eq!(
cfg.effective_bindings("2b042", Some(unixish))
.get(&ButtonId::Back),
Some(&Binding::Single(Action::Copy))
);
let mixed = r"C:\Tools\ShareX\ShareX.EXE";
assert_eq!(
cfg.effective_bindings("2b042", Some(mixed))
.get(&ButtonId::Back),
Some(&Binding::Single(Action::Copy))
);
}
#[test]
fn windows_exe_selector_exact_path_takes_precedence() {
let mut cfg = Config::default();
let exact = r"c:\program files\windowsapps\sharex_14.0.0.0_x64__abc\sharex.exe";
cfg.set_per_app_binding(
"2b042",
"exe:sharex.exe",
ButtonId::Back,
Some(Action::Copy),
);
cfg.set_per_app_binding("2b042", exact, ButtonId::Back, Some(Action::Undo));
assert_eq!(
cfg.effective_bindings("2b042", Some(exact))
.get(&ButtonId::Back),
Some(&Binding::Single(Action::Undo))
);
let other = r"c:\program files\windowsapps\sharex_15.0.0.0_x64__abc\sharex.exe";
assert_eq!(
cfg.effective_bindings("2b042", Some(other))
.get(&ButtonId::Back),
Some(&Binding::Single(Action::Copy))
);
}
#[test]
fn windows_exe_selector_ignores_non_exe_identifiers() {
let mut cfg = Config::default();
cfg.set_binding(
"2b042",
ButtonId::Back,
Binding::Single(Action::BrowserBack),
);
cfg.set_per_app_binding("2b042", "exe:code.exe", ButtonId::Back, Some(Action::Undo));
assert_eq!(
cfg.effective_bindings("2b042", Some("com.microsoft.VSCode"))
.get(&ButtonId::Back),
Some(&Binding::Single(Action::BrowserBack))
);
assert!(!cfg.has_app_override("2b042", "com.microsoft.VSCode"));
}