diff --git a/tests/commands_test.rs b/tests/commands_test.rs new file mode 100644 index 0000000000..8e74b74350 --- /dev/null +++ b/tests/commands_test.rs @@ -0,0 +1,87 @@ +mod helpers; + +use helpers::in_directory as cwd; + +#[test] +fn enter() { + nu!(output, + cwd("tests/fixtures/formats"), + r#" + enter sgml_description.json + cd glossary + cd GlossDiv + cd GlossList + cd GlossEntry + cd GlossSee + ls | echo $it + exit + "#); + + assert_eq!(output, "markup"); +} + +#[test] +fn lines() { + nu!(output, + cwd("tests/fixtures/formats"), + "open cargo_sample.toml --raw | lines | skip-while $it != \"[dependencies]\" | skip 1 | first 1 | split-column \"=\" | get Column1 | trim | echo $it"); + + assert_eq!(output, "rustyline"); +} + +#[test] +fn open_toml() { + nu!(output, + cwd("tests/fixtures/formats"), + "open cargo_sample.toml | get package.edition | echo $it"); + + assert_eq!(output, "2018"); +} + +#[test] +fn open_json() { + nu!(output, + cwd("tests/fixtures/formats"), + "open sgml_description.json | get glossary.GlossDiv.GlossList.GlossEntry.GlossSee | echo $it"); + + assert_eq!(output, "markup") +} + +#[test] +fn open_xml() { + nu!(output, + cwd("tests/fixtures/formats"), + "open jonathan.xml | get rss.channel.item.link | echo $it"); + + assert_eq!(output, "http://www.jonathanturner.org/2015/10/off-to-new-adventures.html") +} + +#[test] +fn open_ini() { + nu!(output, + cwd("tests/fixtures/formats"), + "open sample.ini | get SectionOne.integer | echo $it"); + + assert_eq!(output, "1234") +} + +//fn open_unknown_format_as_raw_single_value() { + //nu!(output, + // cwd("tests/fixtures/formats"), + // "open skinfolds.unsupported | echo $it"); + + // does not pass on Windows + // left: `"\"\\\"ABS:3.0-PEC:3.0\\\""`, + // right: `"ABS:3.0-PEC:3.0"`' + //assert_eq!(output, "ABS:3.0-PEC:3.0") +//} + +#[test] +fn open_error_if_file_not_found() { + nu_error!(output, + cwd("tests/fixtures/formats"), + "open i_dont_exist.txt | echo $it"); + + assert!(output.contains("File cound not be opened")); +} + diff --git a/tests/external_num.out b/tests/external_num.out deleted file mode 100644 index f599e28b8a..0000000000 --- a/tests/external_num.out +++ /dev/null @@ -1 +0,0 @@ -10 diff --git a/tests/external_num.txt b/tests/external_num.txt deleted file mode 100644 index b7a3d149dd..0000000000 --- a/tests/external_num.txt +++ /dev/null @@ -1,3 +0,0 @@ -cd tests -open test.json | get glossary.GlossDiv.GlossList.GlossEntry.Height | echo $it -exit diff --git a/tests/filters_test.rs b/tests/filters_test.rs new file mode 100644 index 0000000000..a4f8d639c5 --- /dev/null +++ b/tests/filters_test.rs @@ -0,0 +1,48 @@ +mod helpers; + +use helpers::in_directory as cwd; + +#[test] +fn can_convert_table_to_json_text_and_from_json_text_back_into_table() { + nu!(output, + cwd("tests/fixtures/formats"), + "open sgml_description.json | to-json | from-json | get glossary.GlossDiv.GlossList.GlossEntry.GlossSee | echo $it"); + + assert_eq!(output, "markup"); +} + +#[test] +fn can_convert_table_to_toml_text_and_from_toml_text_back_into_table() { + nu!(output, + cwd("tests/fixtures/formats"), + "open cargo_sample.toml | to-toml | from-toml | get package.name | echo $it"); + + assert_eq!(output, "nu"); +} + +#[test] +fn can_sort_by_column() { + nu!(output, + cwd("tests/fixtures/formats"), + "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!(output, "description"); +} + +#[test] +fn can_split_by_column() { + nu!(output, + cwd("tests/fixtures/formats"), + "open cargo_sample.toml --raw | lines | skip 1 | first 1 | split-column \"=\" | get Column1 | trim | echo $it"); + + assert_eq!(output, "name"); +} + +#[test] +fn can_filter_by_unit_size_comparison() { + nu!(output, + cwd("tests/fixtures/formats"), + "ls | where size > 1kb | get name | trim | echo $it"); + + assert_eq!(output, "cargo_sample.toml"); +} diff --git a/tests/dirtest/test.toml b/tests/fixtures/formats/cargo_sample.toml similarity index 100% rename from tests/dirtest/test.toml rename to tests/fixtures/formats/cargo_sample.toml diff --git a/tests/test.xml b/tests/fixtures/formats/jonathan.xml similarity index 100% rename from tests/test.xml rename to tests/fixtures/formats/jonathan.xml diff --git a/tests/test.ini b/tests/fixtures/formats/sample.ini similarity index 100% rename from tests/test.ini rename to tests/fixtures/formats/sample.ini diff --git a/tests/dirtest/test.json b/tests/fixtures/formats/sgml_description.json similarity index 100% rename from tests/dirtest/test.json rename to tests/fixtures/formats/sgml_description.json diff --git a/tests/fixtures/formats/skinfolds.unsupported b/tests/fixtures/formats/skinfolds.unsupported new file mode 100644 index 0000000000..b1e49fd9f9 --- /dev/null +++ b/tests/fixtures/formats/skinfolds.unsupported @@ -0,0 +1 @@ +"ABS:3.0-PEC:3.0" diff --git a/tests/helpers/mod.rs b/tests/helpers/mod.rs new file mode 100644 index 0000000000..9af9b8ac1d --- /dev/null +++ b/tests/helpers/mod.rs @@ -0,0 +1,83 @@ +use std::path::PathBuf; + +#[macro_export] +macro_rules! nu { + ($out:ident, $cwd:expr, $commands:expr) => { + use std::error::Error; + use std::io::prelude::*; + use std::process::{Command, Stdio}; + + let commands = &*format!(" + cd {} + {} + exit", + $cwd, + $commands); + + let process = match Command::new(helpers::executable_path()) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn() { + Ok(child) => child, + Err(why) => panic!("Can't run test {}", why.description()), + }; + + match process.stdin.unwrap().write_all(commands.as_bytes()) { + Err(why) => panic!("couldn't write to wc stdin: {}", why.description()), + Ok(_) => {} + } + + let mut _s = String::new(); + + match process.stdout.unwrap().read_to_string(&mut _s) { + Err(why) => panic!("couldn't read stdout: {}", why.description()), + Ok(_) => { + let _s = _s.replace("\r\n", "\n"); + } + } + + let _s = _s.replace("\r\n", ""); + let $out = _s.replace("\n", ""); + }; +} + +#[macro_export] +macro_rules! nu_error { + ($out:ident, $cwd:expr, $commands:expr) => { + use std::error::Error; + use std::io::prelude::*; + use std::process::{Command, Stdio}; + + let commands = &*format!(" + cd {} + {} + exit", + $cwd, + $commands); + + let mut process = Command::new(helpers::executable_path()) + .stdin(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .expect("couldn't run test"); + + let stdin = process.stdin.as_mut().expect("couldn't open stdin"); + stdin.write_all(commands.as_bytes()).expect("couldn't write to stdin"); + + + let output = process.wait_with_output().expect("couldn't read from stderr"); + let $out = String::from_utf8_lossy(&output.stderr); + }; +} + +pub fn executable_path() -> PathBuf { + let mut buf = PathBuf::new(); + buf.push("target"); + buf.push("debug"); + buf.push("nu"); + buf +} + +pub fn in_directory(str: &str) -> &str { + str +} diff --git a/tests/inc_plugin.out b/tests/inc_plugin.out deleted file mode 100644 index b4de394767..0000000000 --- a/tests/inc_plugin.out +++ /dev/null @@ -1 +0,0 @@ -11 diff --git a/tests/inc_plugin.txt b/tests/inc_plugin.txt deleted file mode 100644 index 111eb6e42f..0000000000 --- a/tests/inc_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -cd tests -open test.json | get glossary.GlossDiv.GlossList.GlossEntry.Height | inc | echo $it -exit \ No newline at end of file diff --git a/tests/json_roundtrip.out b/tests/json_roundtrip.out deleted file mode 100644 index 10a6a46d7a..0000000000 --- a/tests/json_roundtrip.out +++ /dev/null @@ -1 +0,0 @@ -markup diff --git a/tests/json_roundtrip.txt b/tests/json_roundtrip.txt deleted file mode 100644 index 505c2a98db..0000000000 --- a/tests/json_roundtrip.txt +++ /dev/null @@ -1,3 +0,0 @@ -cd tests -open test.json | get glossary.GlossDiv.GlossList.GlossEntry.GlossSee | echo $it -exit diff --git a/tests/lines.out b/tests/lines.out deleted file mode 100644 index 9abbdf551d..0000000000 --- a/tests/lines.out +++ /dev/null @@ -1 +0,0 @@ -rustyline diff --git a/tests/lines.txt b/tests/lines.txt deleted file mode 100644 index 0fbcac891c..0000000000 --- a/tests/lines.txt +++ /dev/null @@ -1,3 +0,0 @@ -cd tests -open test.toml --raw | lines | skip-while $it != "[dependencies]" | skip 1 | first 1 | split-column "=" | get Column1 | trim | echo $it -exit diff --git a/tests/open_ini.out b/tests/open_ini.out deleted file mode 100644 index 81c545efeb..0000000000 --- a/tests/open_ini.out +++ /dev/null @@ -1 +0,0 @@ -1234 diff --git a/tests/open_ini.txt b/tests/open_ini.txt deleted file mode 100644 index ebb8dd5b4c..0000000000 --- a/tests/open_ini.txt +++ /dev/null @@ -1,3 +0,0 @@ -cd tests -open test.ini | get SectionOne.integer | echo $it -exit diff --git a/tests/open_json.out b/tests/open_json.out deleted file mode 100644 index 10a6a46d7a..0000000000 --- a/tests/open_json.out +++ /dev/null @@ -1 +0,0 @@ -markup diff --git a/tests/open_json.txt b/tests/open_json.txt deleted file mode 100644 index 505c2a98db..0000000000 --- a/tests/open_json.txt +++ /dev/null @@ -1,3 +0,0 @@ -cd tests -open test.json | get glossary.GlossDiv.GlossList.GlossEntry.GlossSee | echo $it -exit diff --git a/tests/open_toml.out b/tests/open_toml.out deleted file mode 100644 index b39a36a7c1..0000000000 --- a/tests/open_toml.out +++ /dev/null @@ -1 +0,0 @@ -2018 diff --git a/tests/open_toml.txt b/tests/open_toml.txt deleted file mode 100644 index 4e0345a61e..0000000000 --- a/tests/open_toml.txt +++ /dev/null @@ -1,3 +0,0 @@ -cd tests -open test.toml | get package.edition | echo $it -exit diff --git a/tests/open_xml.out b/tests/open_xml.out deleted file mode 100644 index 3cfcfc2e62..0000000000 --- a/tests/open_xml.out +++ /dev/null @@ -1 +0,0 @@ -http://www.jonathanturner.org/2015/10/off-to-new-adventures.html diff --git a/tests/open_xml.txt b/tests/open_xml.txt deleted file mode 100644 index e3d0fa78e9..0000000000 --- a/tests/open_xml.txt +++ /dev/null @@ -1,3 +0,0 @@ -cd tests -open test.xml | get rss.channel.item.link | echo $it -exit diff --git a/tests/sort_by.out b/tests/sort_by.out deleted file mode 100644 index e1b39b006c..0000000000 --- a/tests/sort_by.out +++ /dev/null @@ -1 +0,0 @@ -description diff --git a/tests/sort_by.txt b/tests/sort_by.txt deleted file mode 100644 index aa933f8a2d..0000000000 --- a/tests/sort_by.txt +++ /dev/null @@ -1,3 +0,0 @@ -cd tests -open test.toml --raw | lines | skip 1 | first 4 | split-column "=" | sort-by Column1 | skip 1 | first 1 | get Column1 | trim | echo $it -exit diff --git a/tests/split.out b/tests/split.out deleted file mode 100644 index f121bdbff4..0000000000 --- a/tests/split.out +++ /dev/null @@ -1 +0,0 @@ -name diff --git a/tests/split.txt b/tests/split.txt deleted file mode 100644 index 68713c675f..0000000000 --- a/tests/split.txt +++ /dev/null @@ -1,3 +0,0 @@ -cd tests -open test.toml --raw | lines | skip 1 | first 1 | split-column "=" | get Column1 | trim | echo $it -exit diff --git a/tests/test.json b/tests/test.json deleted file mode 100644 index 8feebaa0ab..0000000000 --- a/tests/test.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "glossary": { - "title": "example glossary", - "GlossDiv": { - "title": "S", - "GlossList": { - "GlossEntry": { - "ID": "SGML", - "SortAs": "SGML", - "GlossTerm": "Standard Generalized Markup Language", - "Acronym": "SGML", - "Abbrev": "ISO 8879:1986", - "Height": 10, - "GlossDef": { - "para": "A meta-markup language, used to create markup languages such as DocBook.", - "GlossSeeAlso": [ - "GML", - "XML" - ] - }, - "GlossSee": "markup" - } - } - } - } -} \ No newline at end of file diff --git a/tests/test.toml b/tests/test.toml deleted file mode 100644 index f845705179..0000000000 --- a/tests/test.toml +++ /dev/null @@ -1,58 +0,0 @@ -[package] -name = "nu" -version = "0.1.1" -authors = ["Yehuda Katz "] -description = "A shell for the GitHub era" -license = "ISC" -edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -rustyline = "4.1.0" -sysinfo = "0.8.4" -chrono = { version = "0.4.6", features = ["serde"] } -chrono-tz = "0.5.1" -derive-new = "0.5.6" -prettytable-rs = "0.8.0" -itertools = "0.8.0" -ansi_term = "0.11.0" -conch-parser = "0.1.1" -nom = "5.0.0-beta1" -subprocess = "0.1.18" -dunce = "1.0.0" -indexmap = { version = "1.0.2", features = ["serde-1"] } -chrono-humanize = "0.0.11" -byte-unit = "2.1.0" -ordered-float = "1.0.2" -prettyprint = "0.6.0" -cursive = { version = "0.12.0", features = ["pancurses-backend"], default-features = false } -futures-preview = { version = "0.3.0-alpha.16", features = ["compat", "io-compat"] } -futures-sink-preview = "0.3.0-alpha.16" -tokio-fs = "0.1.6" -futures_codec = "0.2.2" -term = "0.5.2" -bytes = "0.4.12" -log = "0.4.6" -pretty_env_logger = "0.3.0" -lalrpop-util = "0.17.0" -regex = "1.1.6" -serde = "1.0.91" -serde_json = "1.0.39" -serde_derive = "1.0.91" -getset = "0.0.7" -logos = "0.10.0-rc2" -logos-derive = "0.10.0-rc2" -language-reporting = "0.3.0" -app_dirs = "1.2.1" -toml = "0.5.1" -toml-query = "0.9.0" -clap = "2.33.0" -git2 = "0.8.0" - -[dependencies.pancurses] -version = "0.16" -features = ["win32a"] - -[dev-dependencies] -pretty_assertions = "0.6.1" diff --git a/tests/tests.rs b/tests/tests.rs index 4147fad94d..8fd540088e 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -1,114 +1,21 @@ -#[cfg(test)] -mod tests { - use std::error::Error; - use std::io::prelude::*; - use std::path::PathBuf; - use std::process::{Command, Stdio}; +mod helpers; - fn test_helper(test_name: &str) { - let mut baseline_path = PathBuf::new(); - baseline_path.push("tests"); - baseline_path.push(test_name); - baseline_path.set_extension("out"); +use helpers::in_directory as cwd; - let mut txt_path = PathBuf::new(); - txt_path.push("tests"); - txt_path.push(test_name); - txt_path.set_extension("txt"); - - let executable = { - let mut buf = PathBuf::new(); - buf.push("target"); - buf.push("debug"); - buf.push("nu"); - buf - }; - - let process = match Command::new(executable) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .spawn() - { - Ok(process) => process, - Err(why) => panic!("Can't run test {}", why.description()), - }; - - let baseline_out = std::fs::read_to_string(baseline_path).unwrap(); - let baseline_out = baseline_out.replace("\r\n", "\n"); - let input_commands = std::fs::read_to_string(txt_path).unwrap(); - - match process.stdin.unwrap().write_all(input_commands.as_bytes()) { - Err(why) => panic!("couldn't write to wc stdin: {}", why.description()), - Ok(_) => {} - } - - let mut s = String::new(); - match process.stdout.unwrap().read_to_string(&mut s) { - Err(why) => panic!("couldn't read stdout: {}", why.description()), - Ok(_) => { - let s = s.replace("\r\n", "\n"); - assert_eq!(s, baseline_out); - } - } - } - - #[test] - fn open_toml() { - test_helper("open_toml"); - } - - #[test] - fn open_json() { - test_helper("open_json"); - } - - #[test] - fn open_xml() { - test_helper("open_xml"); - } - - #[test] - fn open_ini() { - test_helper("open_ini"); - } - - #[test] - fn json_roundtrip() { - test_helper("json_roundtrip"); - } - - #[test] - fn toml_roundtrip() { - test_helper("toml_roundtrip"); - } - - #[test] - fn sort_by() { - test_helper("sort_by"); - } - - #[test] - fn split() { - test_helper("split"); - } - - #[test] - fn lines() { - test_helper("lines"); - } - - #[test] - fn external_num() { - test_helper("external_num"); - } - - #[test] - fn unit() { - test_helper("unit"); - } - - #[test] - fn inc_plugin() { - test_helper("inc_plugin"); - } +#[test] +fn external_num() { + nu!(output, + cwd("tests/fixtures/formats"), + "open sgml_description.json | get glossary.GlossDiv.GlossList.GlossEntry.Height | echo $it"); + + assert_eq!(output, "10"); +} + +#[test] +fn inc_plugin() { + nu!(output, + cwd("tests/fixtures/formats"), + "open sgml_description.json | get glossary.GlossDiv.GlossList.GlossEntry.Height | inc | echo $it"); + + assert_eq!(output, "11"); } diff --git a/tests/toml_roundtrip.out b/tests/toml_roundtrip.out deleted file mode 100644 index f5f171aac7..0000000000 --- a/tests/toml_roundtrip.out +++ /dev/null @@ -1 +0,0 @@ -nu diff --git a/tests/toml_roundtrip.txt b/tests/toml_roundtrip.txt deleted file mode 100644 index 959483fc27..0000000000 --- a/tests/toml_roundtrip.txt +++ /dev/null @@ -1,3 +0,0 @@ -cd tests -open test.toml | to-toml | from-toml | get package.name | echo $it -exit diff --git a/tests/unit.out b/tests/unit.out deleted file mode 100644 index cacefde74f..0000000000 --- a/tests/unit.out +++ /dev/null @@ -1 +0,0 @@ -test.toml diff --git a/tests/unit.txt b/tests/unit.txt deleted file mode 100644 index e4b9829114..0000000000 --- a/tests/unit.txt +++ /dev/null @@ -1,4 +0,0 @@ -cd tests -cd dirtest -ls | where size > 1kb | get name | trim | echo $it -exit \ No newline at end of file