Zsh: add regression test for duplicate completions (#491)
With the `format` and `group-name` completion styles enabled, `z <prefix>` tab completion used to render local directories twice because the completer called `_files -/`. This was fixed by switching to `_cd -/`, but there was no test guarding against a regression. Add a pseudo-terminal test that drives `z foobar<TAB>` with those styles enabled and asserts that exactly one completion group is displayed. The test fails if the template ever reverts to `_files -/`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012yztUa4XwUt7U9sHKENhXn
This commit is contained in:
parent
670bdf21b9
commit
c3100c4117
61
src/shell.rs
61
src/shell.rs
|
|
@ -343,4 +343,65 @@ mod tests {
|
|||
.stdout("")
|
||||
.stderr("");
|
||||
}
|
||||
|
||||
// Regression test for https://github.com/ajeetdsouza/zoxide/issues/491.
|
||||
//
|
||||
// With the `format` and `group-name` completion styles enabled, tab
|
||||
// completion for a local directory prefix must render a single completion
|
||||
// group. The old `_files -/` completer rendered the matches twice; `_cd -/`
|
||||
// renders them once.
|
||||
#[test]
|
||||
fn zsh_completion_no_duplicate_groups() {
|
||||
let opts =
|
||||
Opts { cmd: Some("z"), hook: InitHook::Pwd, echo: false, resolve_symlinks: false };
|
||||
let source = Zsh(&opts).render().unwrap();
|
||||
|
||||
let tempdir = tempfile::tempdir().unwrap();
|
||||
let dir = tempdir.path();
|
||||
std::fs::write(dir.join("init.zsh"), source).unwrap();
|
||||
std::fs::create_dir(dir.join("foobar1")).unwrap();
|
||||
std::fs::create_dir(dir.join("foobar2")).unwrap();
|
||||
|
||||
// Drive `z foobar<TAB>` inside a pseudo-terminal and count how many
|
||||
// completion group headers (rendered by the `format` style) appear.
|
||||
let script = "\
|
||||
emulate -LR zsh
|
||||
zmodload zsh/zpty
|
||||
dir=$1
|
||||
cat >$dir/.zshrc <<RC
|
||||
autoload -Uz compinit
|
||||
compinit -u -d $dir/zcompdump
|
||||
source $dir/init.zsh
|
||||
zstyle ':completion:*' format '-- %d --'
|
||||
zstyle ':completion:*' group-name ''
|
||||
cd $dir
|
||||
RC
|
||||
export ZDOTDIR=$dir HOME=$dir
|
||||
zpty ZP zsh -f -i
|
||||
zpty -w ZP \"source $dir/.zshrc\"
|
||||
local chunk out=
|
||||
integer quiet=0
|
||||
while (( quiet < 15 )); do
|
||||
if zpty -r -t ZP chunk 2>/dev/null; then quiet=0; else sleep 0.1; (( quiet++ )); fi
|
||||
done
|
||||
zpty -w ZP $'z foobar\\t'
|
||||
quiet=0
|
||||
while (( quiet < 20 )); do
|
||||
if zpty -r -t ZP chunk 2>/dev/null; then out+=$chunk; quiet=0; else sleep 0.1; (( quiet++ )); fi
|
||||
done
|
||||
zpty -d ZP
|
||||
integer groups
|
||||
groups=$(print -r -- $out | grep -aoE -- '-- [a-z ]+ --' | wc -l)
|
||||
if (( groups != 1 )); then
|
||||
print -r -- \"expected 1 completion group, got $groups\"
|
||||
print -r -- $out | cat -v
|
||||
exit 1
|
||||
fi
|
||||
";
|
||||
|
||||
Command::new("zsh")
|
||||
.args(["-f", "-c", script, "zoxide-test", dir.to_str().unwrap()])
|
||||
.assert()
|
||||
.success();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue