mirror of
https://github.com/nushell/nushell.git
synced 2024-12-23 07:30:13 +01:00
ca0c6eaf58
with the `help` command to explore and list all commands available. Enter will also try to see if the location to be entered is an existing Nu command, if it is it will let you inspect the command under `help`. This provides baseline needed so we can iterate on it.
511 lines
13 KiB
Rust
511 lines
13 KiB
Rust
mod helpers;
|
|
|
|
use helpers as h;
|
|
use helpers::{Playground, Stub::*};
|
|
|
|
#[test]
|
|
fn can_convert_table_to_csv_text_and_from_csv_text_back_into_table() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats",
|
|
"open caco3_plastics.csv | to-csv | from-csv | first 1 | get origin | echo $it"
|
|
);
|
|
|
|
assert_eq!(actual, "SPAIN");
|
|
}
|
|
|
|
#[test]
|
|
fn converts_structured_table_to_csv_text() {
|
|
Playground::setup("filter_to_csv_test_1", |dirs, sandbox| {
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
"csv_text_sample.txt",
|
|
r#"
|
|
importer,shipper,tariff_item,name,origin
|
|
Plasticos Rival,Reverte,2509000000,Calcium carbonate,Spain
|
|
Tigre Ecuador,OMYA Andina,3824909999,Calcium carbonate,Colombia
|
|
"#,
|
|
)]);
|
|
|
|
let actual = nu!(
|
|
cwd: dirs.test(), h::pipeline(
|
|
r#"
|
|
open csv_text_sample.txt
|
|
| lines
|
|
| split-column "," a b c d origin
|
|
| last 1
|
|
| to-csv
|
|
| lines
|
|
| nth 1
|
|
| echo "$it"
|
|
"#
|
|
));
|
|
|
|
assert!(actual.contains("Tigre Ecuador,OMYA Andina,3824909999,Calcium carbonate,Colombia"));
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn converts_structured_table_to_csv_text_skipping_headers_after_conversion() {
|
|
Playground::setup("filter_to_csv_test_2", |dirs, sandbox| {
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
"csv_text_sample.txt",
|
|
r#"
|
|
importer,shipper,tariff_item,name,origin
|
|
Plasticos Rival,Reverte,2509000000,Calcium carbonate,Spain
|
|
Tigre Ecuador,OMYA Andina,3824909999,Calcium carbonate,Colombia
|
|
"#,
|
|
)]);
|
|
|
|
let actual = nu!(
|
|
cwd: dirs.test(), h::pipeline(
|
|
r#"
|
|
open csv_text_sample.txt
|
|
| lines
|
|
| split-column "," a b c d origin
|
|
| last 1
|
|
| to-csv --headerless
|
|
| echo "$it"
|
|
"#
|
|
));
|
|
|
|
assert!(actual.contains("Tigre Ecuador,OMYA Andina,3824909999,Calcium carbonate,Colombia"));
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn converts_from_csv_text_to_structured_table() {
|
|
Playground::setup("filter_from_csv_test_1", |dirs, sandbox| {
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
"los_tres_caballeros.txt",
|
|
r#"
|
|
first_name,last_name,rusty_luck
|
|
Andrés,Robalino,1
|
|
Jonathan,Turner,1
|
|
Yehuda,Katz,1
|
|
"#,
|
|
)]);
|
|
|
|
let actual = nu!(
|
|
cwd: dirs.test(), h::pipeline(
|
|
r#"
|
|
open los_tres_caballeros.txt
|
|
| from-csv
|
|
| get rusty_luck
|
|
| str --to-int
|
|
| sum
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "3");
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn converts_from_csv_text_skipping_headers_to_structured_table() {
|
|
Playground::setup("filter_from_csv_test_2", |dirs, sandbox| {
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
"los_tres_amigos.txt",
|
|
r#"
|
|
first_name,last_name,rusty_luck
|
|
Andrés,Robalino,1
|
|
Jonathan,Turner,1
|
|
Yehuda,Katz,1
|
|
"#,
|
|
)]);
|
|
|
|
let actual = nu!(
|
|
cwd: dirs.test(), h::pipeline(
|
|
r#"
|
|
open los_tres_amigos.txt
|
|
| from-csv --headerless
|
|
| get Column3
|
|
| str --to-int
|
|
| sum
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "3");
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn can_convert_table_to_json_text_and_from_json_text_back_into_table() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats", h::pipeline(
|
|
r#"
|
|
open sgml_description.json
|
|
| to-json
|
|
| from-json
|
|
| get glossary.GlossDiv.GlossList.GlossEntry.GlossSee
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "markup");
|
|
}
|
|
|
|
#[test]
|
|
fn converts_from_json_text_to_structured_table() {
|
|
Playground::setup("filter_from_json_test_1", |dirs, sandbox| {
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
"katz.txt",
|
|
r#"
|
|
{
|
|
"katz": [
|
|
{"name": "Yehuda", "rusty_luck": 1},
|
|
{"name": "Jonathan", "rusty_luck": 1},
|
|
{"name": "Andres", "rusty_luck": 1},
|
|
{"name":"GorbyPuff", "rusty_luck": 1}
|
|
]
|
|
}
|
|
"#,
|
|
)]);
|
|
|
|
let actual = nu!(
|
|
cwd: dirs.test(),
|
|
"open katz.txt | from-json | get katz | get rusty_luck | sum | echo $it"
|
|
);
|
|
|
|
assert_eq!(actual, "4");
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn converts_from_json_text_recognizing_objects_independendtly_to_structured_table() {
|
|
Playground::setup("filter_from_json_test_2", |dirs, sandbox| {
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
"katz.txt",
|
|
r#"
|
|
{"name": "Yehuda", "rusty_luck": 1}
|
|
{"name": "Jonathan", "rusty_luck": 1}
|
|
{"name": "Andres", "rusty_luck": 1}
|
|
{"name":"GorbyPuff", "rusty_luck": 3}
|
|
"#,
|
|
)]);
|
|
|
|
let actual = nu!(
|
|
cwd: dirs.test(), h::pipeline(
|
|
r#"
|
|
open katz.txt
|
|
| from-json --objects
|
|
| where name == "GorbyPuff"
|
|
| get rusty_luck
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "3");
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn converts_structured_table_to_json_text() {
|
|
Playground::setup("filter_to_json_test", |dirs, sandbox| {
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
"sample.txt",
|
|
r#"
|
|
JonAndrehudaTZ,3
|
|
GorbyPuff,100
|
|
"#,
|
|
)]);
|
|
|
|
let actual = nu!(
|
|
cwd: dirs.test(), h::pipeline(
|
|
r#"
|
|
open sample.txt
|
|
| lines
|
|
| split-column "," name luck
|
|
| pick name
|
|
| to-json
|
|
| nth 0
|
|
| from-json
|
|
| get name
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "JonAndrehudaTZ");
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn can_convert_table_to_tsv_text_and_from_tsv_text_back_into_table() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats",
|
|
"open caco3_plastics.tsv | to-tsv | from-tsv | first 1 | get origin | echo $it"
|
|
);
|
|
|
|
assert_eq!(actual, "SPAIN");
|
|
}
|
|
|
|
#[test]
|
|
fn converts_structured_table_to_tsv_text() {
|
|
Playground::setup("filter_to_tsv_test_1", |dirs, sandbox| {
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
"tsv_text_sample.txt",
|
|
r#"
|
|
importer shipper tariff_item name origin
|
|
Plasticos Rival Reverte 2509000000 Calcium carbonate Spain
|
|
Tigre Ecuador OMYA Andina 3824909999 Calcium carbonate Colombia
|
|
"#,
|
|
)]);
|
|
|
|
let actual = nu!(
|
|
cwd: dirs.test(), h::pipeline(
|
|
r#"
|
|
open tsv_text_sample.txt
|
|
| lines
|
|
| split-column "\t" a b c d origin
|
|
| last 1
|
|
| to-tsv
|
|
| lines
|
|
| nth 1
|
|
| echo "$it"
|
|
"#
|
|
));
|
|
|
|
assert!(actual.contains("Colombia"));
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn converts_structured_table_to_tsv_text_skipping_headers_after_conversion() {
|
|
Playground::setup("filter_to_tsv_test_2", |dirs, sandbox| {
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
"tsv_text_sample.txt",
|
|
r#"
|
|
importer shipper tariff_item name origin
|
|
Plasticos Rival Reverte 2509000000 Calcium carbonate Spain
|
|
Tigre Ecuador OMYA Andina 3824909999 Calcium carbonate Colombia
|
|
"#,
|
|
)]);
|
|
|
|
let actual = nu!(
|
|
cwd: dirs.test(), h::pipeline(
|
|
r#"
|
|
open tsv_text_sample.txt
|
|
| lines
|
|
| split-column "\t" a b c d origin
|
|
| last 1
|
|
| to-tsv --headerless
|
|
| echo "$it"
|
|
"#
|
|
));
|
|
|
|
assert!(actual.contains("Colombia"));
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn converts_from_tsv_text_to_structured_table() {
|
|
Playground::setup("filter_from_tsv_test_1", |dirs, sandbox| {
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
"los_tres_amigos.txt",
|
|
r#"
|
|
first Name Last Name rusty_luck
|
|
Andrés Robalino 1
|
|
Jonathan Turner 1
|
|
Yehuda Katz 1
|
|
"#,
|
|
)]);
|
|
|
|
let actual = nu!(
|
|
cwd: dirs.test(), h::pipeline(
|
|
r#"
|
|
open los_tres_amigos.txt
|
|
| from-tsv
|
|
| get rusty_luck
|
|
| str --to-int
|
|
| sum
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "3");
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn converts_from_tsv_text_skipping_headers_to_structured_table() {
|
|
Playground::setup("filter_from_tsv_test_2", |dirs, sandbox| {
|
|
sandbox.with_files(vec![FileWithContentToBeTrimmed(
|
|
"los_tres_amigos.txt",
|
|
r#"
|
|
first Name Last Name rusty_luck
|
|
Andrés Robalino 1
|
|
Jonathan Turner 1
|
|
Yehuda Katz 1
|
|
"#,
|
|
)]);
|
|
|
|
let actual = nu!(
|
|
cwd: dirs.test(), h::pipeline(
|
|
r#"
|
|
open los_tres_amigos.txt
|
|
| from-tsv --headerless
|
|
| get Column3
|
|
| str --to-int
|
|
| sum
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "3");
|
|
})
|
|
}
|
|
|
|
#[test]
|
|
fn can_convert_table_to_bson_and_back_into_table() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats", h::pipeline(
|
|
r#"
|
|
open sample.bson
|
|
| to-bson
|
|
| from-bson
|
|
| get root
|
|
| nth 1
|
|
| get b
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "whel");
|
|
}
|
|
|
|
#[test]
|
|
fn can_convert_table_to_sqlite_and_back_into_table() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats", h::pipeline(
|
|
r#"
|
|
open sample.db
|
|
| to-sqlite
|
|
| from-sqlite
|
|
| get table_values
|
|
| nth 2
|
|
| get x
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "hello");
|
|
}
|
|
|
|
#[test]
|
|
fn can_convert_table_to_toml_text_and_from_toml_text_back_into_table() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats", h::pipeline(
|
|
r#"
|
|
open cargo_sample.toml
|
|
| to-toml
|
|
| from-toml
|
|
| get package.name
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "nu");
|
|
}
|
|
|
|
#[test]
|
|
fn can_convert_table_to_yaml_text_and_from_yaml_text_back_into_table() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats", h::pipeline(
|
|
r#"
|
|
open appveyor.yml
|
|
| to-yaml
|
|
| from-yaml
|
|
| get environment.global.PROJECT_NAME
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "nushell");
|
|
}
|
|
|
|
#[test]
|
|
fn can_sort_by_column() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats", h::pipeline(
|
|
r#"
|
|
open cargo_sample.toml --raw
|
|
| lines
|
|
| skip 1
|
|
| first 4
|
|
| split-column "="
|
|
| sort-by Column1
|
|
| skip 1
|
|
| first 1
|
|
| get Column1
|
|
| trim
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "description");
|
|
}
|
|
|
|
#[test]
|
|
fn can_split_by_column() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats", h::pipeline(
|
|
r#"
|
|
open cargo_sample.toml --raw
|
|
| lines
|
|
| skip 1
|
|
| first 1
|
|
| split-column "="
|
|
| get Column1
|
|
| trim
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "name");
|
|
}
|
|
|
|
#[test]
|
|
fn can_sum() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats", h::pipeline(
|
|
r#"
|
|
open sgml_description.json
|
|
| get glossary.GlossDiv.GlossList.GlossEntry.Sections
|
|
| sum
|
|
| echo $it
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual, "203")
|
|
}
|
|
|
|
#[test]
|
|
fn can_filter_by_unit_size_comparison() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats",
|
|
"ls | where size > 1kb | sort-by size | get name | first 1 | trim | echo $it"
|
|
);
|
|
|
|
assert_eq!(actual, "cargo_sample.toml");
|
|
}
|
|
|
|
#[test]
|
|
fn can_get_last() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats",
|
|
"ls | sort-by name | last 1 | get name | trim | echo $it"
|
|
);
|
|
|
|
assert_eq!(actual, "utf16.ini");
|
|
}
|
|
|
|
#[test]
|
|
fn can_get_reverse_first() {
|
|
let actual = nu!(
|
|
cwd: "tests/fixtures/formats",
|
|
"ls | sort-by name | reverse | first 1 | get name | trim | echo $it"
|
|
);
|
|
|
|
assert_eq!(actual, "utf16.ini");
|
|
}
|