mirror of
https://github.com/nushell/nushell
synced 2025-01-04 17:28:59 +00:00
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())
|
||
|
}
|