diff --git a/crates/nu-command/src/filters/empty.rs b/crates/nu-command/src/filters/empty.rs index e7a3e38e0..007ff77d6 100644 --- a/crates/nu-command/src/filters/empty.rs +++ b/crates/nu-command/src/filters/empty.rs @@ -56,6 +56,7 @@ impl Command for Empty { }), }, Example { + // TODO: revisit empty cell path semantics for a record. description: "Check if more than one column are empty", example: "[[meal size]; [arepa small] [taco '']] | empty? meal size", result: Some(Value::Bool { @@ -125,30 +126,15 @@ fn empty( span: head, } .into_pipeline_data()), - PipelineData::Value(value, ..) => { - let answer = is_empty(value); - - Ok(Value::Bool { - val: answer, - span: head, - } - .into_pipeline_data()) + PipelineData::Value(value, ..) => Ok(Value::Bool { + val: value.is_empty(), + span: head, } + .into_pipeline_data()), } } } -pub fn is_empty(value: Value) -> bool { - match value { - Value::List { vals, .. } => vals.is_empty(), - Value::String { val, .. } => val.is_empty(), - Value::Binary { val, .. } => val.is_empty(), - Value::Nothing { .. } => true, - Value::Record { cols, .. } => cols.is_empty(), - _ => false, - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/crates/nu-command/tests/commands/empty.rs b/crates/nu-command/tests/commands/empty.rs index 1ff9c2bd4..5c8c09e5d 100644 --- a/crates/nu-command/tests/commands/empty.rs +++ b/crates/nu-command/tests/commands/empty.rs @@ -1,7 +1,5 @@ use nu_test_support::{nu, pipeline}; -// FIXME: jt: needs more work -#[ignore] #[test] fn reports_emptiness() { let actual = nu!( @@ -10,85 +8,14 @@ fn reports_emptiness() { echo [[are_empty]; [([[check]; [[]] ])] [([[check]; [""] ])] - [([[check]; [(wrap)] ])] + [([[check]; [{}] ])] ] | get are_empty - | empty? check - | where check - | length + | all? { + empty? check + } "# )); - assert_eq!(actual.out, "3"); -} - -// FIXME: jt: needs more work -#[ignore] -#[test] -fn sets_block_run_value_for_an_empty_column() { - let actual = nu!( - cwd: ".", pipeline( - r#" - echo [ - [ first_name, last_name, rusty_at, likes ]; - [ Andrés, Robalino, 10/11/2013, 1 ] - [ Jonathan, Turner, 10/12/2013, 1 ] - [ Jason, Gedge, 10/11/2013, 1 ] - [ Yehuda, Katz, 10/11/2013, '' ] - ] - | empty? likes -b {|_| 1 } - | get likes - | math sum - "# - )); - - assert_eq!(actual.out, "4"); -} - -// FIXME: jt: needs more work -#[ignore] -#[test] -fn sets_block_run_value_for_many_empty_columns() { - let actual = nu!( - cwd: ".", pipeline( - r#" - echo [ - [ boost check ]; - [ 1, [] ] - [ 1, "" ] - [ 1, (wrap) ] - ] - | empty? boost check -b { 1 } - | get boost check - | math sum - "# - )); - - assert_eq!(actual.out, "6"); -} - -// FIXME: jt: needs more work -#[ignore] -#[test] -fn passing_a_block_will_set_contents_on_empty_cells_and_leave_non_empty_ones_untouched() { - let actual = nu!( - cwd: ".", pipeline( - r#" - echo [ - [ NAME, LVL, HP ]; - [ Andrés, 30, 3000 ] - [ Alistair, 29, 2900 ] - [ Arepas, "", "" ] - [ Jorge, 30, 3000 ] - ] - | empty? LVL -b { 9 } - | empty? HP -b { - $it.LVL * 1000 - } - | math sum - | get HP - "# - )); - - assert_eq!(actual.out, "17900"); + assert_eq!(actual.out, "true"); } diff --git a/crates/nu-protocol/src/span.rs b/crates/nu-protocol/src/span.rs index 391b8d753..a6106599d 100644 --- a/crates/nu-protocol/src/span.rs +++ b/crates/nu-protocol/src/span.rs @@ -31,6 +31,10 @@ impl Span { Span { start, end } } + pub fn unknown() -> Self { + Self::new(0, 0) + } + /// Note: Only use this for test data, *not* live data, as it will point into unknown source /// when used in errors. pub fn test_data() -> Span { diff --git a/crates/nu-protocol/src/value/mod.rs b/crates/nu-protocol/src/value/mod.rs index 68a6fa3fd..0aa79152f 100644 --- a/crates/nu-protocol/src/value/mod.rs +++ b/crates/nu-protocol/src/value/mod.rs @@ -586,12 +586,9 @@ impl Value { pub fn is_empty(&self) -> bool { match self { Value::String { val, .. } => val.is_empty(), - Value::List { vals, .. } => { - vals.is_empty() && vals.iter().all(|v| v.clone().is_empty()) - } - Value::Record { cols, vals, .. } => { - cols.iter().all(|v| v.is_empty()) && vals.iter().all(|v| v.clone().is_empty()) - } + Value::List { vals, .. } => vals.is_empty(), + Value::Record { cols, .. } => cols.is_empty(), + Value::Binary { val, .. } => val.is_empty(), Value::Nothing { .. } => true, _ => false, } @@ -2421,3 +2418,63 @@ fn get_config_filesize_format(config: &Config) -> (ByteUnit, &str) { filesize_format } + +#[cfg(test)] +mod tests { + + use super::{Span, Value}; + + mod is_empty { + use super::*; + + #[test] + fn test_string() { + let value = Value::string("", Span::unknown()); + assert!(value.is_empty()); + } + + #[test] + fn test_list() { + let list_with_no_values = Value::List { + vals: vec![], + span: Span::unknown(), + }; + let list_with_one_empty_string = Value::List { + vals: vec![Value::string("", Span::unknown())], + span: Span::unknown(), + }; + + assert!(list_with_no_values.is_empty()); + assert!(!list_with_one_empty_string.is_empty()); + } + + #[test] + fn test_record() { + let no_columns_nor_cell_values = Value::Record { + cols: vec![], + vals: vec![], + span: Span::unknown(), + }; + let one_column_and_one_cell_value_with_empty_strings = Value::Record { + cols: vec![String::from("")], + vals: vec![Value::string("", Span::unknown())], + span: Span::unknown(), + }; + let one_column_with_a_string_and_one_cell_value_with_empty_string = Value::Record { + cols: vec![String::from("column")], + vals: vec![Value::string("", Span::unknown())], + span: Span::unknown(), + }; + let one_column_with_empty_string_and_one_value_with_a_string = Value::Record { + cols: vec![String::from("")], + vals: vec![Value::string("text", Span::unknown())], + span: Span::unknown(), + }; + + assert!(no_columns_nor_cell_values.is_empty()); + assert!(!one_column_and_one_cell_value_with_empty_strings.is_empty()); + assert!(!one_column_with_a_string_and_one_cell_value_with_empty_string.is_empty()); + assert!(!one_column_with_empty_string_and_one_value_with_a_string.is_empty()); + } + } +}