forked from extern/nushell
4d7b86f278
* nu-cli: added tests for file completions * test adding extra sort * Feature/refactor completion options (#5228) * Copy completion filter to custom completions * Remove filter function from completer This function was a no-op for FileCompletion and CommandCompletion. Flag- and VariableCompletion just filters with `starts_with` which happens in both completers anyway and should therefore also be a no-op. The remaining use case in CustomCompletion was moved into the CustomCompletion source file. Filtering should probably happen immediately while fetching completions to avoid unnecessary memory allocations. * Add get_sort_by() to Completer trait * Remove CompletionOptions from Completer::fetch() * Fix clippy lints * Apply Completer changes to DotNuCompletion * add os to $nu based on rust's understanding (#5243) * add os to $nu based on rust's understanding * add a few more constants Co-authored-by: Richard <Tropid@users.noreply.github.com> Co-authored-by: Darren Schroeder <343840+fdncred@users.noreply.github.com>
85 lines
2.5 KiB
Rust
85 lines
2.5 KiB
Rust
use std::path::PathBuf;
|
|
|
|
use nu_cli::NuCompleter;
|
|
use nu_command::create_default_context;
|
|
use nu_protocol::engine::{EngineState, Stack};
|
|
use nu_test_support::fs;
|
|
use reedline::{Completer, Suggestion};
|
|
const SEP: char = std::path::MAIN_SEPARATOR;
|
|
|
|
#[test]
|
|
fn file_completions() {
|
|
// Create a new engine
|
|
let (dir, dir_str, engine) = new_engine();
|
|
|
|
let stack = Stack::new();
|
|
|
|
// Instatiate a new completer
|
|
let mut completer = NuCompleter::new(std::sync::Arc::new(engine), stack.clone());
|
|
|
|
// Test completions for the current folder
|
|
let target_dir = format!("cd {}", dir_str);
|
|
let suggestions = completer.complete(&target_dir, target_dir.len());
|
|
|
|
// Create the expected values
|
|
let expected_paths: Vec<String> = vec![
|
|
file(dir.clone().join("nushell")),
|
|
folder(dir.clone().join("test_a")),
|
|
folder(dir.clone().join("test_b")),
|
|
folder(dir.clone().join("another")),
|
|
file(dir.clone().join(".hidden_file")),
|
|
folder(dir.clone().join(".hidden_folder")),
|
|
];
|
|
|
|
// Match the results
|
|
match_suggestions(expected_paths, suggestions);
|
|
|
|
// Test completions for the completions/another folder
|
|
let target_dir = format!("cd {}", folder(dir.clone().join("another")));
|
|
let suggestions = completer.complete(&target_dir, target_dir.len());
|
|
|
|
// Create the expected values
|
|
let expected_paths: Vec<String> = vec![file(dir.clone().join("another").join("newfile"))];
|
|
|
|
// Match the results
|
|
match_suggestions(expected_paths, suggestions);
|
|
}
|
|
|
|
// creates a new engine with the current path into the completions fixtures folder
|
|
fn new_engine() -> (PathBuf, String, EngineState) {
|
|
// Target folder inside assets
|
|
let dir = fs::fixtures().join("completions");
|
|
let mut dir_str = dir
|
|
.clone()
|
|
.into_os_string()
|
|
.into_string()
|
|
.unwrap_or("".to_string());
|
|
dir_str.push(SEP);
|
|
|
|
// Create a default engine
|
|
(dir.clone(), dir_str, create_default_context(dir))
|
|
}
|
|
|
|
// match a list of suggestions with the expected values
|
|
fn match_suggestions(expected: Vec<String>, suggestions: Vec<Suggestion>) {
|
|
expected.iter().zip(suggestions).for_each(|it| {
|
|
assert_eq!(it.0, &it.1.value);
|
|
});
|
|
}
|
|
|
|
// append the separator to the converted path
|
|
fn folder(path: PathBuf) -> String {
|
|
let mut converted_path = file(path);
|
|
converted_path.push(SEP);
|
|
|
|
converted_path
|
|
}
|
|
|
|
// convert a given path to string
|
|
fn file(path: PathBuf) -> String {
|
|
path.clone()
|
|
.into_os_string()
|
|
.into_string()
|
|
.unwrap_or("".to_string())
|
|
}
|