Skip to content

Commit c9f8b8a

Browse files
committed
test: external completion tests for windows
1 parent 475c0d7 commit c9f8b8a

File tree

4 files changed

+48
-36
lines changed

4 files changed

+48
-36
lines changed

crates/nu-cli/tests/completions/mod.rs

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ use nu_engine::eval_block;
1111
use nu_parser::parse;
1212
use nu_path::expand_tilde;
1313
use nu_protocol::{debugger::WithoutDebug, engine::StateWorkingSet, PipelineData};
14-
#[cfg(not(windows))]
15-
use nu_protocol::{Span, Value};
1614
use reedline::{Completer, Suggestion};
1715
use rstest::{fixture, rstest};
1816
use support::{
19-
completions_helpers::{new_dotnu_engine, new_partial_engine, new_quote_engine},
17+
completions_helpers::{
18+
new_dotnu_engine, new_external_engine, new_partial_engine, new_quote_engine,
19+
},
2020
file, folder, match_suggestions, new_engine,
2121
};
2222

@@ -347,47 +347,37 @@ fn custom_arguments_vs_subcommands() {
347347

348348
/// External command only if starts with `^`
349349
#[test]
350-
#[cfg(not(windows))]
351350
fn external_commands_only() {
352-
let (_, _, mut engine, stack) = new_engine();
353-
engine.add_env_var(
354-
"PATH".into(),
355-
Value::List {
356-
vals: vec![Value::String {
357-
val: "/bin/".into(),
358-
internal_span: Span::unknown(),
359-
}],
360-
internal_span: Span::unknown(),
361-
},
351+
let engine = new_external_engine();
352+
let mut completer = NuCompleter::new(
353+
Arc::new(engine),
354+
Arc::new(nu_protocol::engine::Stack::new()),
362355
);
363-
let mut completer = NuCompleter::new(Arc::new(engine), Arc::new(stack));
364356
let completion_str = "^sleep";
365357
let suggestions = completer.complete(completion_str, completion_str.len());
358+
#[cfg(windows)]
359+
let expected: Vec<String> = vec!["sleep.exe".into()];
360+
#[cfg(not(windows))]
366361
let expected: Vec<String> = vec!["sleep".into()];
367362
match_suggestions(&expected, &suggestions);
368363

369364
let completion_str = "sleep";
370365
let suggestions = completer.complete(completion_str, completion_str.len());
366+
#[cfg(windows)]
367+
let expected: Vec<String> = vec!["sleep".into(), "sleep.exe".into()];
368+
#[cfg(not(windows))]
371369
let expected: Vec<String> = vec!["sleep".into(), "^sleep".into()];
372370
match_suggestions(&expected, &suggestions);
373371
}
374372

375373
/// Which completes both internals and externals
376374
#[test]
377-
#[cfg(not(windows))]
378375
fn which_command_completions() {
379-
let (_, _, mut engine, stack) = new_engine();
380-
engine.add_env_var(
381-
"PATH".into(),
382-
Value::List {
383-
vals: vec![Value::String {
384-
val: "/bin/".into(),
385-
internal_span: Span::unknown(),
386-
}],
387-
internal_span: Span::unknown(),
388-
},
376+
let engine = new_external_engine();
377+
let mut completer = NuCompleter::new(
378+
Arc::new(engine),
379+
Arc::new(nu_protocol::engine::Stack::new()),
389380
);
390-
let mut completer = NuCompleter::new(Arc::new(engine), Arc::new(stack));
391381
// flags
392382
let completion_str = "which --all";
393383
let suggestions = completer.complete(completion_str, completion_str.len());
@@ -396,6 +386,9 @@ fn which_command_completions() {
396386
// commands
397387
let completion_str = "which sleep";
398388
let suggestions = completer.complete(completion_str, completion_str.len());
389+
#[cfg(windows)]
390+
let expected: Vec<String> = vec!["sleep".into(), "sleep.exe".into()];
391+
#[cfg(not(windows))]
399392
let expected: Vec<String> = vec!["sleep".into(), "^sleep".into()];
400393
match_suggestions(&expected, &suggestions);
401394
}

crates/nu-cli/tests/completions/support/completions_helpers.rs

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ fn create_default_context() -> EngineState {
1414
nu_command::add_shell_command_context(nu_cmd_lang::create_default_context())
1515
}
1616

17-
// creates a new engine with the current path into the completions fixtures folder
17+
/// creates a new engine with the current path into the completions fixtures folder
1818
pub fn new_engine() -> (AbsolutePathBuf, String, EngineState, Stack) {
1919
// Target folder inside assets
2020
let dir = fs::fixtures().join("completions");
@@ -69,7 +69,26 @@ pub fn new_engine() -> (AbsolutePathBuf, String, EngineState, Stack) {
6969
(dir, dir_str, engine_state, stack)
7070
}
7171

72-
// creates a new engine with the current path into the completions fixtures folder
72+
/// Adds pseudo PATH env for external completion tests
73+
pub fn new_external_engine() -> EngineState {
74+
let mut engine = create_default_context();
75+
let dir = fs::fixtures().join("external_completions").join("path");
76+
let dir_str = dir.to_string_lossy().to_string();
77+
let internal_span = nu_protocol::Span::new(0, dir_str.len());
78+
engine.add_env_var(
79+
"PATH".to_string(),
80+
Value::List {
81+
vals: vec![Value::String {
82+
val: dir_str,
83+
internal_span,
84+
}],
85+
internal_span,
86+
},
87+
);
88+
engine
89+
}
90+
91+
/// creates a new engine with the current path into the completions fixtures folder
7392
pub fn new_dotnu_engine() -> (AbsolutePathBuf, String, EngineState, Stack) {
7493
// Target folder inside assets
7594
let dir = fs::fixtures().join("dotnu_completions");
@@ -197,7 +216,7 @@ pub fn new_partial_engine() -> (AbsolutePathBuf, String, EngineState, Stack) {
197216
(dir, dir_str, engine_state, stack)
198217
}
199218

200-
// match a list of suggestions with the expected values
219+
/// match a list of suggestions with the expected values
201220
pub fn match_suggestions(expected: &Vec<String>, suggestions: &Vec<Suggestion>) {
202221
let expected_len = expected.len();
203222
let suggestions_len = suggestions.len();
@@ -209,28 +228,28 @@ pub fn match_suggestions(expected: &Vec<String>, suggestions: &Vec<Suggestion>)
209228
)
210229
}
211230

212-
let suggestoins_str = suggestions
231+
let suggestions_str = suggestions
213232
.iter()
214233
.map(|it| it.value.clone())
215234
.collect::<Vec<_>>();
216235

217-
assert_eq!(expected, &suggestoins_str);
236+
assert_eq!(expected, &suggestions_str);
218237
}
219238

220-
// append the separator to the converted path
239+
/// append the separator to the converted path
221240
pub fn folder(path: impl Into<PathBuf>) -> String {
222241
let mut converted_path = file(path);
223242
converted_path.push(MAIN_SEPARATOR);
224243
converted_path
225244
}
226245

227-
// convert a given path to string
246+
/// convert a given path to string
228247
pub fn file(path: impl Into<PathBuf>) -> String {
229248
path.into().into_os_string().into_string().unwrap()
230249
}
231250

232-
// merge_input executes the given input into the engine
233-
// and merges the state
251+
/// merge_input executes the given input into the engine
252+
/// and merges the state
234253
pub fn merge_input(
235254
input: &[u8],
236255
engine_state: &mut EngineState,

tests/fixtures/external_completions/path/sleep

Whitespace-only changes.

tests/fixtures/external_completions/path/sleep.exe

Whitespace-only changes.

0 commit comments

Comments
 (0)