2019-12-31 05:05:02 +01:00
|
|
|
use nu_test_support::fs::Stub::FileWithContentToBeTrimmed;
|
|
|
|
use nu_test_support::playground::Playground;
|
|
|
|
use nu_test_support::{nu, pipeline};
|
|
|
|
|
|
|
|
#[test]
|
2020-01-10 16:44:24 +01:00
|
|
|
fn removes_duplicate_rows() {
|
2019-12-31 05:05:02 +01:00
|
|
|
Playground::setup("uniq_test_1", |dirs, sandbox| {
|
|
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
|
|
"los_tres_caballeros.csv",
|
|
|
|
r#"
|
|
|
|
first_name,last_name,rusty_at,type
|
|
|
|
Andrés,Robalino,10/11/2013,A
|
|
|
|
Jonathan,Turner,10/12/2013,B
|
|
|
|
Yehuda,Katz,10/11/2013,A
|
|
|
|
Jonathan,Turner,10/12/2013,B
|
|
|
|
Yehuda,Katz,10/11/2013,A
|
|
|
|
"#,
|
|
|
|
)]);
|
|
|
|
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test(), pipeline(
|
|
|
|
r#"
|
|
|
|
open los_tres_caballeros.csv
|
|
|
|
| uniq
|
2021-03-13 22:46:40 +01:00
|
|
|
| length
|
2022-02-16 19:24:45 +01:00
|
|
|
|
2019-12-31 05:05:02 +01:00
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
2020-05-07 13:03:43 +02:00
|
|
|
assert_eq!(actual.out, "3");
|
2019-12-31 05:05:02 +01:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2020-01-10 16:44:24 +01:00
|
|
|
fn uniq_values() {
|
2019-12-31 05:05:02 +01:00
|
|
|
Playground::setup("uniq_test_2", |dirs, sandbox| {
|
|
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
|
|
"los_tres_caballeros.csv",
|
|
|
|
r#"
|
|
|
|
first_name,last_name,rusty_at,type
|
|
|
|
Andrés,Robalino,10/11/2013,A
|
|
|
|
Jonathan,Turner,10/12/2013,B
|
|
|
|
Yehuda,Katz,10/11/2013,A
|
|
|
|
Jonathan,Turner,10/12/2013,B
|
|
|
|
Yehuda,Katz,10/11/2013,A
|
|
|
|
"#,
|
|
|
|
)]);
|
|
|
|
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test(), pipeline(
|
|
|
|
r#"
|
|
|
|
open los_tres_caballeros.csv
|
2020-05-07 13:03:43 +02:00
|
|
|
| select type
|
2019-12-31 05:05:02 +01:00
|
|
|
| uniq
|
2021-03-13 22:46:40 +01:00
|
|
|
| length
|
2022-02-16 19:24:45 +01:00
|
|
|
|
2019-12-31 05:05:02 +01:00
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
2020-05-07 13:03:43 +02:00
|
|
|
assert_eq!(actual.out, "2");
|
2019-12-31 05:05:02 +01:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2020-01-10 16:44:24 +01:00
|
|
|
fn nested_json_structures() {
|
2019-12-31 05:05:02 +01:00
|
|
|
Playground::setup("uniq_test_3", |dirs, sandbox| {
|
|
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
2020-01-10 16:44:24 +01:00
|
|
|
"nested_json_structures.json",
|
2019-12-31 05:05:02 +01:00
|
|
|
r#"
|
2020-03-13 18:23:41 +01:00
|
|
|
[
|
2020-01-10 16:44:24 +01:00
|
|
|
{
|
|
|
|
"name": "this is duplicated",
|
|
|
|
"nesting": [ { "a": "a", "b": "b" },
|
|
|
|
{ "c": "c", "d": "d" }
|
|
|
|
],
|
|
|
|
"can_be_ordered_differently": {
|
|
|
|
"array": [1, 2, 3, 4, 5],
|
|
|
|
"something": { "else": "works" }
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"can_be_ordered_differently": {
|
|
|
|
"something": { "else": "works" },
|
|
|
|
"array": [1, 2, 3, 4, 5]
|
|
|
|
},
|
|
|
|
"nesting": [ { "b": "b", "a": "a" },
|
|
|
|
{ "d": "d", "c": "c" }
|
|
|
|
],
|
|
|
|
"name": "this is duplicated"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"name": "this is unique",
|
|
|
|
"nesting": [ { "a": "b", "b": "a" },
|
|
|
|
{ "c": "d", "d": "c" }
|
|
|
|
],
|
|
|
|
"can_be_ordered_differently": {
|
|
|
|
"array": [],
|
|
|
|
"something": { "else": "does not work" }
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"name": "this is unique",
|
|
|
|
"nesting": [ { "a": "a", "b": "b", "c": "c" },
|
|
|
|
{ "d": "d", "e": "e", "f": "f" }
|
|
|
|
],
|
|
|
|
"can_be_ordered_differently": {
|
|
|
|
"array": [],
|
|
|
|
"something": { "else": "works" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
2019-12-31 05:05:02 +01:00
|
|
|
"#,
|
|
|
|
)]);
|
|
|
|
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: dirs.test(), pipeline(
|
|
|
|
r#"
|
2020-01-10 16:44:24 +01:00
|
|
|
open nested_json_structures.json
|
2019-12-31 05:05:02 +01:00
|
|
|
| uniq
|
2021-03-13 22:46:40 +01:00
|
|
|
| length
|
2022-02-16 19:24:45 +01:00
|
|
|
|
2019-12-31 05:05:02 +01:00
|
|
|
"#
|
|
|
|
));
|
2020-05-07 13:03:43 +02:00
|
|
|
assert_eq!(actual.out, "3");
|
2019-12-31 05:05:02 +01:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn uniq_when_keys_out_of_order() {
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
2022-02-04 03:01:45 +01:00
|
|
|
[{"a": "a", "b": [1,2,3]}, {"b": [1,2,3], "a": "a"}]
|
2019-12-31 05:05:02 +01:00
|
|
|
| uniq
|
2021-03-13 22:46:40 +01:00
|
|
|
| length
|
2022-02-16 19:24:45 +01:00
|
|
|
|
2019-12-31 05:05:02 +01:00
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
2020-05-07 13:03:43 +02:00
|
|
|
assert_eq!(actual.out, "1");
|
2019-12-31 05:05:02 +01:00
|
|
|
}
|
2020-06-21 02:22:06 +02:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn uniq_counting() {
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
2022-02-04 03:01:45 +01:00
|
|
|
["A", "B", "A"]
|
2020-06-21 02:22:06 +02:00
|
|
|
| wrap item
|
|
|
|
| uniq --count
|
2022-02-16 19:24:45 +01:00
|
|
|
| flatten
|
2020-11-22 01:37:16 +01:00
|
|
|
| where item == A
|
|
|
|
| get count
|
2022-02-16 19:24:45 +01:00
|
|
|
| get 0
|
2020-06-21 02:22:06 +02:00
|
|
|
"#
|
|
|
|
));
|
2020-11-22 01:37:16 +01:00
|
|
|
assert_eq!(actual.out, "2");
|
|
|
|
|
|
|
|
let actual = nu!(
|
2020-06-21 02:22:06 +02:00
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
2022-02-04 03:01:45 +01:00
|
|
|
echo ["A", "B", "A"]
|
2020-11-22 01:37:16 +01:00
|
|
|
| wrap item
|
|
|
|
| uniq --count
|
2022-02-16 19:24:45 +01:00
|
|
|
| flatten
|
2020-11-22 01:37:16 +01:00
|
|
|
| where item == B
|
|
|
|
| get count
|
2022-02-16 19:24:45 +01:00
|
|
|
| get 0
|
2020-06-21 02:22:06 +02:00
|
|
|
"#
|
|
|
|
));
|
2020-11-22 01:37:16 +01:00
|
|
|
assert_eq!(actual.out, "1");
|
2020-06-21 02:22:06 +02:00
|
|
|
}
|
2020-07-18 19:19:03 +02:00
|
|
|
|
2021-07-09 21:27:35 +02:00
|
|
|
#[test]
|
|
|
|
fn uniq_unique() {
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
|
|
|
echo [1 2 3 4 1 5]
|
|
|
|
| uniq --unique
|
|
|
|
"#
|
|
|
|
));
|
|
|
|
let expected = nu!(
|
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
|
|
|
echo [2 3 4 5]
|
|
|
|
"#
|
|
|
|
));
|
|
|
|
print!("{}", actual.out);
|
|
|
|
print!("{}", expected.out);
|
|
|
|
assert_eq!(actual.out, expected.out);
|
|
|
|
}
|
|
|
|
|
2020-07-18 19:19:03 +02:00
|
|
|
#[test]
|
|
|
|
fn uniq_simple_vals_ints() {
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
|
|
|
echo [1 2 3 4 1 5]
|
|
|
|
| uniq
|
|
|
|
"#
|
|
|
|
));
|
|
|
|
let expected = nu!(
|
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
|
|
|
echo [1 2 3 4 5]
|
|
|
|
"#
|
|
|
|
));
|
|
|
|
print!("{}", actual.out);
|
|
|
|
print!("{}", expected.out);
|
|
|
|
assert_eq!(actual.out, expected.out);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn uniq_simple_vals_strs() {
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
|
|
|
echo [A B C A]
|
|
|
|
| uniq
|
|
|
|
"#
|
|
|
|
));
|
|
|
|
let expected = nu!(
|
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
|
|
|
echo [A B C]
|
|
|
|
"#
|
|
|
|
));
|
|
|
|
print!("{}", actual.out);
|
|
|
|
print!("{}", expected.out);
|
|
|
|
assert_eq!(actual.out, expected.out);
|
|
|
|
}
|
2022-11-23 11:18:13 +01:00
|
|
|
|
|
|
|
#[test]
|
`uniq -i` does not convert to lowercase (#7192) (#7209)
# Description
`uniq -i` does not convert output strings to lowercase.
Also, `uniq -i` did not ignore case in strings below the first level of
Tables and Records. Now all strings case are ignored for all children
Values for tables, Records, and List.
Fixes https://github.com/nushell/nushell/issues/7192
# Tests + Formatting
About the issue https://github.com/nushell/nushell/issues/7192, the
output will be:
```
〉[AAA BBB CCC] | uniq -i
╭───┬─────╮
│ 0 │ AAA │
│ 1 │ BBB │
│ 2 │ CCC │
╰───┴─────╯
```
About ignoring case for all children string, I expect this to be true:
```
([[origin, people];
[World, (
[[name, meal];
['Geremias', {plate: 'bitoque', carbs: 100}]
]
)],
[World, (
[[name, meal];
['Martin', {plate: 'bitoque', carbs: 100}]
]
)],
[World, (
[[name, meal];
['Geremias', {plate: 'Bitoque', carbs: 100}]
]
)],
] | uniq -i
) == ([[origin, people];
[World, (
[[name, meal];
['Geremias', {plate: 'bitoque', carbs: 100}]
]
)],
[World, (
[[name, meal];
['Martin', {plate: 'bitoque', carbs: 100}]
]
)]
])
```
2022-11-24 00:46:20 +01:00
|
|
|
fn table() {
|
2022-11-23 11:18:13 +01:00
|
|
|
let actual = nu!(
|
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
`uniq -i` does not convert to lowercase (#7192) (#7209)
# Description
`uniq -i` does not convert output strings to lowercase.
Also, `uniq -i` did not ignore case in strings below the first level of
Tables and Records. Now all strings case are ignored for all children
Values for tables, Records, and List.
Fixes https://github.com/nushell/nushell/issues/7192
# Tests + Formatting
About the issue https://github.com/nushell/nushell/issues/7192, the
output will be:
```
〉[AAA BBB CCC] | uniq -i
╭───┬─────╮
│ 0 │ AAA │
│ 1 │ BBB │
│ 2 │ CCC │
╰───┴─────╯
```
About ignoring case for all children string, I expect this to be true:
```
([[origin, people];
[World, (
[[name, meal];
['Geremias', {plate: 'bitoque', carbs: 100}]
]
)],
[World, (
[[name, meal];
['Martin', {plate: 'bitoque', carbs: 100}]
]
)],
[World, (
[[name, meal];
['Geremias', {plate: 'Bitoque', carbs: 100}]
]
)],
] | uniq -i
) == ([[origin, people];
[World, (
[[name, meal];
['Geremias', {plate: 'bitoque', carbs: 100}]
]
)],
[World, (
[[name, meal];
['Martin', {plate: 'bitoque', carbs: 100}]
]
)]
])
```
2022-11-24 00:46:20 +01:00
|
|
|
[[fruit day]; [apple monday] [apple friday] [Apple friday] [apple monday] [pear monday] [orange tuesday]]
|
2022-11-23 11:18:13 +01:00
|
|
|
| uniq
|
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
|
|
|
let expected = nu!(
|
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
`uniq -i` does not convert to lowercase (#7192) (#7209)
# Description
`uniq -i` does not convert output strings to lowercase.
Also, `uniq -i` did not ignore case in strings below the first level of
Tables and Records. Now all strings case are ignored for all children
Values for tables, Records, and List.
Fixes https://github.com/nushell/nushell/issues/7192
# Tests + Formatting
About the issue https://github.com/nushell/nushell/issues/7192, the
output will be:
```
〉[AAA BBB CCC] | uniq -i
╭───┬─────╮
│ 0 │ AAA │
│ 1 │ BBB │
│ 2 │ CCC │
╰───┴─────╯
```
About ignoring case for all children string, I expect this to be true:
```
([[origin, people];
[World, (
[[name, meal];
['Geremias', {plate: 'bitoque', carbs: 100}]
]
)],
[World, (
[[name, meal];
['Martin', {plate: 'bitoque', carbs: 100}]
]
)],
[World, (
[[name, meal];
['Geremias', {plate: 'Bitoque', carbs: 100}]
]
)],
] | uniq -i
) == ([[origin, people];
[World, (
[[name, meal];
['Geremias', {plate: 'bitoque', carbs: 100}]
]
)],
[World, (
[[name, meal];
['Martin', {plate: 'bitoque', carbs: 100}]
]
)]
])
```
2022-11-24 00:46:20 +01:00
|
|
|
echo [[fruit day]; [apple monday] [apple friday] [Apple friday] [pear monday] [orange tuesday]]
|
2022-11-23 11:18:13 +01:00
|
|
|
"#
|
|
|
|
));
|
|
|
|
print!("{}", actual.out);
|
|
|
|
print!("{}", expected.out);
|
|
|
|
assert_eq!(actual.out, expected.out);
|
|
|
|
}
|
`uniq -i` does not convert to lowercase (#7192) (#7209)
# Description
`uniq -i` does not convert output strings to lowercase.
Also, `uniq -i` did not ignore case in strings below the first level of
Tables and Records. Now all strings case are ignored for all children
Values for tables, Records, and List.
Fixes https://github.com/nushell/nushell/issues/7192
# Tests + Formatting
About the issue https://github.com/nushell/nushell/issues/7192, the
output will be:
```
〉[AAA BBB CCC] | uniq -i
╭───┬─────╮
│ 0 │ AAA │
│ 1 │ BBB │
│ 2 │ CCC │
╰───┴─────╯
```
About ignoring case for all children string, I expect this to be true:
```
([[origin, people];
[World, (
[[name, meal];
['Geremias', {plate: 'bitoque', carbs: 100}]
]
)],
[World, (
[[name, meal];
['Martin', {plate: 'bitoque', carbs: 100}]
]
)],
[World, (
[[name, meal];
['Geremias', {plate: 'Bitoque', carbs: 100}]
]
)],
] | uniq -i
) == ([[origin, people];
[World, (
[[name, meal];
['Geremias', {plate: 'bitoque', carbs: 100}]
]
)],
[World, (
[[name, meal];
['Martin', {plate: 'bitoque', carbs: 100}]
]
)]
])
```
2022-11-24 00:46:20 +01:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn table_with_ignore_case() {
|
|
|
|
let actual = nu!(
|
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
|
|
|
[[origin, people];
|
|
|
|
[World, (
|
|
|
|
[[name, meal];
|
|
|
|
['Geremias', {plate: 'bitoque', carbs: 100}]
|
|
|
|
]
|
|
|
|
)],
|
|
|
|
[World, (
|
|
|
|
[[name, meal];
|
|
|
|
['Martin', {plate: 'bitoque', carbs: 100}]
|
|
|
|
]
|
|
|
|
)],
|
|
|
|
[World, (
|
|
|
|
[[name, meal];
|
|
|
|
['Geremias', {plate: 'Bitoque', carbs: 100}]
|
|
|
|
]
|
|
|
|
)],
|
|
|
|
] | uniq -i
|
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
|
|
|
let expected = nu!(
|
|
|
|
cwd: "tests/fixtures/formats", pipeline(
|
|
|
|
r#"
|
|
|
|
echo [[origin, people];
|
|
|
|
[World, (
|
|
|
|
[[name, meal];
|
|
|
|
['Geremias', {plate: 'bitoque', carbs: 100}]
|
|
|
|
]
|
|
|
|
)],
|
|
|
|
[World, (
|
|
|
|
[[name, meal];
|
|
|
|
['Martin', {plate: 'bitoque', carbs: 100}]
|
|
|
|
]
|
|
|
|
)],
|
|
|
|
]
|
|
|
|
"#
|
|
|
|
));
|
|
|
|
|
|
|
|
print!("{}", actual.out);
|
|
|
|
print!("{}", expected.out);
|
|
|
|
assert_eq!(actual.out, expected.out);
|
|
|
|
assert_eq!(actual.out, expected.out);
|
|
|
|
}
|