nushell/crates/nu-command/tests/commands/compact.rs
hardfault e9b677a9e9
fix compact to handle empty list or record in column (#15213)
If a table contains an empty list or record in one column and both column
and -e flags are used, then skip that row.

`compact -e` now skips empty values in a column where as before they were
ignored. Example:

 ```nu
[["a", "b"]; ["c", "d"], ["h", []]] 
| compact -e b
```
before

```plain
 #   a         b
────────────────────────
 0   c   d
 1   h   [list 0 items]
```
after
```plain
 #   a   b
───────────
 0   c   d
```
2025-03-01 07:47:55 -05:00

95 lines
2.0 KiB
Rust

use nu_test_support::{nu, pipeline};
#[test]
fn discards_rows_where_given_column_is_empty() {
let sample_json = r#"
{
"amigos": [
{"name": "Yehuda", "rusty_luck": 1},
{"name": "JT", "rusty_luck": 1},
{"name": "Andres", "rusty_luck": 1},
{"name":"GorbyPuff"}
]
}
"#;
let actual = nu!(pipeline(&format!(
"
{sample_json}
| get amigos
| compact rusty_luck
| length
"
)));
assert_eq!(actual.out, "3");
}
#[test]
fn discards_empty_rows_by_default() {
let actual = nu!(pipeline(
r#"
echo "[1,2,3,14,null]"
| from json
| compact
| length
"#
));
assert_eq!(actual.out, "4");
}
#[test]
fn discard_empty_list_in_table() {
let actual = nu!(pipeline(
r#"
[["a", "b"]; ["c", "d"], ["h", []]] | compact -e b | length
"#
));
assert_eq!(actual.out, "1");
}
#[test]
fn discard_empty_record_in_table() {
let actual = nu!(pipeline(
r#"
[["a", "b"]; ["c", "d"], ["h", {}]] | compact -e b | length
"#
));
assert_eq!(actual.out, "1");
}
#[test]
fn dont_discard_empty_record_in_table_if_column_not_set() {
let actual = nu!(pipeline(
r#"
[["a", "b"]; ["c", "d"], ["h", {}]] | compact -e | length
"#
));
assert_eq!(actual.out, "2");
}
#[test]
fn dont_discard_empty_list_in_table_if_column_not_set() {
let actual = nu!(pipeline(
r#"
[["a", "b"]; ["c", "d"], ["h", []]] | compact -e | length
"#
));
assert_eq!(actual.out, "2");
}
#[test]
fn dont_discard_null_in_table_if_column_not_set() {
let actual = nu!(pipeline(
r#"
[["a", "b"]; ["c", "d"], ["h", null]] | compact -e | length
"#
));
assert_eq!(actual.out, "2");
}