Lines
100 %
Functions
Branches
//! Tests for command-line Tab completion.
use super::make_app;
use crate::event::{Intent, apply};
#[test]
fn tab_in_cmdline_completes_single_candidate() {
let mut app = make_app();
apply(&mut app, Intent::OpenCommandLine);
for c in "acc".chars() {
apply(&mut app, Intent::InsertChar(c));
}
apply(&mut app, Intent::CompleteCommandLine);
assert_eq!(
app.cmdline.editor.buffer(),
"account ",
"single match should complete and append space"
);
assert!(app.cmdline.completions.contains(&"account".to_string()));
fn tab_in_cmdline_shows_multiple_candidates() {
for c in "account ".chars() {
assert!(
app.cmdline.completions.len() > 1,
"after 'account ' multiple children should be candidates"
assert!(app.cmdline.completions.contains(&"create".to_string()));
assert!(app.cmdline.completions.contains(&"list".to_string()));
fn tab_in_cmdline_applies_lcp_for_ambiguous() {
// "co" matches "commodity" and "config"
for c in "co".chars() {
let buf = app.cmdline.editor.buffer();
buf.starts_with("co"),
"buffer must retain common prefix: got {buf:?}"
app.cmdline.completions.contains(&"commodity".to_string()),
"commodity must be a candidate"
app.cmdline.completions.contains(&"config".to_string()),
"config must be a candidate"
!buf.ends_with(' '),
"ambiguous completion must not append a space"
fn tab_in_cmdline_does_nothing_on_no_match() {
for c in "zzznomatch".chars() {
assert_eq!(app.cmdline.editor.buffer(), "zzznomatch");
assert!(app.cmdline.completions.is_empty());
fn editing_after_completion_clears_stale_candidates() {
!app.cmdline.completions.is_empty(),
"candidates should be shown right after Tab"
apply(&mut app, Intent::InsertChar('c'));
app.cmdline.completions.is_empty(),
"a normal edit must clear stale candidates"