use super::*;
fn completions_for(sh: &Shell) -> String {
let mut buf = Vec::new();
generate_completions(sh, &mut buf);
String::from_utf8(buf).expect("completion output is valid UTF-8")
}
#[test]
fn completions_bash_contains_sk() {
let out = completions_for(&Shell::Bash);
assert!(out.contains("sk"), "bash completion should reference 'sk'");
assert!(
out.contains("--query") || out.contains("query"),
"bash completion should include --query"
);
}
#[test]
fn completions_zsh_contains_sk() {
let out = completions_for(&Shell::Zsh);
assert!(out.contains("sk"), "zsh completion should reference 'sk'");
assert!(
out.contains("--multi") || out.contains("multi"),
"zsh completion should include --multi"
);
}
#[test]
fn completions_fish_contains_sk() {
let out = completions_for(&Shell::Fish);
assert!(out.contains("sk"), "fish completion should reference 'sk'");
}
#[test]
fn completions_nushell_is_non_empty() {
let out = completions_for(&Shell::Nushell);
assert!(!out.is_empty(), "nushell completion should not be empty");
}
#[test]
fn completions_elvish_is_non_empty() {
let out = completions_for(&Shell::Elvish);
assert!(!out.is_empty(), "elvish completion should not be empty");
}
#[test]
fn completions_powershell_is_non_empty() {
let out = completions_for(&Shell::PowerShell);
assert!(!out.is_empty(), "powershell completion should not be empty");
}
fn key_bindings_for(sh: &Shell) -> String {
let mut buf = Vec::new();
generate_key_bindings(sh, &mut buf).expect("key-bindings generation failed");
String::from_utf8(buf).expect("key-bindings output is valid UTF-8")
}
#[test]
fn key_bindings_bash() {
let out = key_bindings_for(&Shell::Bash);
assert!(
out.starts_with("# skim key bindings for bash"),
"unexpected bash header"
);
assert!(out.contains("__skim_select__()"), "missing __skim_select__ function");
}
#[test]
fn key_bindings_zsh() {
let out = key_bindings_for(&Shell::Zsh);
assert!(out.starts_with("# skim key bindings for zsh"), "unexpected zsh header");
for func in [
"__skimcmd()",
"__skim_comprun()",
"__skim_extract_command()",
"__skim_generic_path_completion()",
"_skim_complete()",
"_skim_complete_kill()",
] {
assert!(out.contains(func), "missing zsh function {func}");
}
}
#[test]
fn key_bindings_fish() {
let out = key_bindings_for(&Shell::Fish);
assert!(
out.starts_with("#!/bin/fish"),
"fish key-bindings should start with shebang"
);
for func in [
"function __skimcmd",
"function __skim_parse_commandline",
"function __skim_get_dir",
] {
assert!(out.contains(func), "missing fish function '{func}'");
}
}
#[test]
fn key_bindings_unsupported_shells_are_empty() {
for sh in [Shell::Elvish, Shell::Nushell, Shell::PowerShell] {
assert!(
key_bindings_for(&sh).is_empty(),
"{sh:?} should produce no key-bindings output"
);
}
}