diff --git a/src/commands/table.rs b/src/commands/table.rs index 795879d95b..5c1818bff3 100644 --- a/src/commands/table.rs +++ b/src/commands/table.rs @@ -72,13 +72,21 @@ fn table(args: CommandArgs, registry: &CommandRegistry) -> Result { if !new_input.is_empty() { if let Some(descs) = new_input.get(0) { + let descs = descs.data_descriptors(); - let compare = a.data_descriptors(); - if descs != compare { + let descs_size = descs.len(); + + let a_descs = a.data_descriptors(); + + let mut compare = a_descs; + compare.extend(descs.into_iter()); + compare.dedup(); + + if !compare.is_empty() { + new_input.push_back(a); + } else { delay_slot = Some(a); break; - } else { - new_input.push_back(a); } } else { new_input.push_back(a); diff --git a/tests/shell/pipeline/mod.rs b/tests/shell/pipeline/mod.rs index 6fc8a40177..6522a99b19 100644 --- a/tests/shell/pipeline/mod.rs +++ b/tests/shell/pipeline/mod.rs @@ -1,6 +1,8 @@ mod commands; +use nu_test_support::fs::Stub::FileWithContentToBeTrimmed; use nu_test_support::nu; +use nu_test_support::playground::Playground; #[test] fn doesnt_break_on_utf8() { @@ -8,3 +10,31 @@ fn doesnt_break_on_utf8() { assert_eq!(actual, "ö", "'{}' should contain ö", actual); } + +#[test] +fn visualize_one_table_given_rows_with_same_columns_regardless_of_their_order_per_row() { + Playground::setup("visualize_table_test_1", |dirs, sandbox| { + sandbox.with_files(vec![FileWithContentToBeTrimmed( + "unordered_columns.txt", + r#" + [ + {"name":"Andrés", "rusty_luck": 1 }, + {"rusty_luck": 1, "name": "Jonathan"}, + ] + "#, + )]); + + let actual = nu!( + cwd: dirs.test(), "open unordered_columns.txt | from-json" + ); + + let name_column_indices: Vec<_> = actual.match_indices("name").collect(); + let rusty_luck_column_indices: Vec<_> = actual.match_indices("rusty_luck").collect(); + + for (index, (name_index, _)) in name_column_indices.iter().enumerate() { + let (rusty_luck_index, _) = rusty_luck_column_indices[index]; + + assert!(name_index < &rusty_luck_index); + } + }) +}