nushell/crates/nu-command/tests/commands/which.rs
Antoine Stevan a1f989caf9
change the output of which to be more explicit (#9646)
related to
- https://github.com/nushell/nushell/issues/9637#issuecomment-1629387548

# Description
this PR changes the output of `which` from `table<arg: string, path:
string, built-in: bool> (stream)` to `table<command: string, path:
string, type: string> (stream)`.
- `command`: same as `arg` but more explicit name
- `path`: same as before, `null` when built-in
- `type`: instead of `buil-in: bool` says if it's a `built-in` a
`custom` command, an `alias` or an `external`

# User-Facing Changes
the output of `which` has changed

## some examples
```nushell
> which open
╭───┬─────────┬──────┬──────────╮
│ # │ command │ path │   type   │
├───┼─────────┼──────┼──────────┤
│ 0 │ open    │      │ built-in │
╰───┴─────────┴──────┴──────────╯
```
```nushell
> alias foo = print "foo"
> which foo
╭───┬─────────┬──────┬───────╮
│ # │ command │ path │ type  │
├───┼─────────┼──────┼───────┤
│ 0 │ foo     │      │ alias │
╰───┴─────────┴──────┴───────╯
```
```nushell
> def bar [] {}
> which bar
╭───┬─────────┬──────┬────────╮
│ # │ command │ path │  type  │
├───┼─────────┼──────┼────────┤
│ 0 │ bar     │      │ custom │
╰───┴─────────┴──────┴────────╯
```
```nushell
> which git
╭───┬─────────┬──────────────┬──────────╮
│ # │ command │     path     │   type   │
├───┼─────────┼──────────────┼──────────┤
│ 0 │ git     │ /usr/bin/git │ external │
╰───┴─────────┴──────────────┴──────────╯
```
```nushell
> which open git foo bar
╭───┬─────────┬──────────────┬──────────╮
│ # │ command │     path     │   type   │
├───┼─────────┼──────────────┼──────────┤
│ 0 │ open    │              │ built-in │
│ 1 │ git     │ /usr/bin/git │ external │
│ 2 │ foo     │              │ alias    │
│ 3 │ bar     │              │ custom   │
╰───┴─────────┴──────────────┴──────────╯
```

# Tests + Formatting
- 🟢 `toolkit fmt`
- 🟢 `toolkit clippy`
-  `toolkit test`
-  `toolkit test stdlib`

# After Submitting
mention that in the release note
2023-07-20 19:10:53 -05:00

107 lines
2.7 KiB
Rust

use nu_test_support::nu;
#[test]
fn which_ls() {
let actual = nu!("which ls | get type.0");
assert_eq!(actual.out, "built-in");
}
#[ignore = "TODO: Can't have alias recursion"]
#[test]
fn which_alias_ls() {
let actual = nu!("alias ls = ls -a; which ls | get path.0 | str trim");
assert_eq!(actual.out, "Nushell alias: ls -a");
}
#[test]
fn which_custom_alias() {
let actual = nu!(r#"alias foo = print "foo!"; which foo | to nuon"#);
assert_eq!(actual.out, r#"[[command, path, type]; [foo, "", alias]]"#);
}
#[test]
fn which_def_ls() {
let actual = nu!("def ls [] {echo def}; which ls | get type.0");
assert_eq!(actual.out, "custom");
}
#[ignore = "TODO: Can't have alias with the same name as command"]
#[test]
fn correct_precedence_alias_def_custom() {
let actual =
nu!("def ls [] {echo def}; alias ls = echo alias; which ls | get path.0 | str trim");
assert_eq!(actual.out, "Nushell alias: echo alias");
}
#[ignore = "TODO: Can't have alias with the same name as command"]
#[test]
fn multiple_reports_for_alias_def_custom() {
let actual = nu!("def ls [] {echo def}; alias ls = echo alias; which -a ls | length");
let length: i32 = actual.out.parse().unwrap();
assert!(length >= 2);
}
// `get_aliases_with_name` and `get_custom_commands_with_name` don't return the correct count of
// values
// I suspect this is due to the ScopeFrame getting discarded at '}' and the command is then
// executed in the parent scope
// See: parse_definition, line 2187 for reference.
#[ignore]
#[test]
fn correctly_report_of_shadowed_alias() {
let actual = nu!("alias xaz = echo alias1
def helper [] {
alias xaz = echo alias2
which -a xaz
}
helper | get path | str contains alias2");
assert_eq!(actual.out, "true");
}
#[test]
fn one_report_of_multiple_defs() {
let actual = nu!("def xaz [] { echo def1 }
def helper [] {
def xaz [] { echo def2 }
which -a xaz
}
helper | length");
let length: i32 = actual.out.parse().unwrap();
assert_eq!(length, 1);
}
#[test]
fn def_only_seen_once() {
let actual = nu!("def xaz [] {echo def1}; which -a xaz | length");
let length: i32 = actual.out.parse().unwrap();
assert_eq!(length, 1);
}
#[test]
fn do_not_show_hidden_aliases() {
let actual = nu!("alias foo = echo foo
hide foo
which foo | length");
let length: i32 = actual.out.parse().unwrap();
assert_eq!(length, 0);
}
#[test]
fn do_not_show_hidden_commands() {
let actual = nu!("def foo [] { echo foo }
hide foo
which foo | length");
let length: i32 = actual.out.parse().unwrap();
assert_eq!(length, 0);
}