forked from extern/nushell
Integration tests refactoring and visibility in them.
This commit is contained in:
commit
652de43ead
87
tests/commands_test.rs
Normal file
87
tests/commands_test.rs
Normal file
@ -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"));
|
||||||
|
}
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
10
|
|
@ -1,3 +0,0 @@
|
|||||||
cd tests
|
|
||||||
open test.json | get glossary.GlossDiv.GlossList.GlossEntry.Height | echo $it
|
|
||||||
exit
|
|
48
tests/filters_test.rs
Normal file
48
tests/filters_test.rs
Normal file
@ -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");
|
||||||
|
}
|
1
tests/fixtures/formats/skinfolds.unsupported
vendored
Normal file
1
tests/fixtures/formats/skinfolds.unsupported
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
"ABS:3.0-PEC:3.0"
|
83
tests/helpers/mod.rs
Normal file
83
tests/helpers/mod.rs
Normal file
@ -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
|
||||||
|
}
|
@ -1 +0,0 @@
|
|||||||
11
|
|
@ -1,3 +0,0 @@
|
|||||||
cd tests
|
|
||||||
open test.json | get glossary.GlossDiv.GlossList.GlossEntry.Height | inc | echo $it
|
|
||||||
exit
|
|
@ -1 +0,0 @@
|
|||||||
markup
|
|
@ -1,3 +0,0 @@
|
|||||||
cd tests
|
|
||||||
open test.json | get glossary.GlossDiv.GlossList.GlossEntry.GlossSee | echo $it
|
|
||||||
exit
|
|
@ -1 +0,0 @@
|
|||||||
rustyline
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||||||
1234
|
|
@ -1,3 +0,0 @@
|
|||||||
cd tests
|
|
||||||
open test.ini | get SectionOne.integer | echo $it
|
|
||||||
exit
|
|
@ -1 +0,0 @@
|
|||||||
markup
|
|
@ -1,3 +0,0 @@
|
|||||||
cd tests
|
|
||||||
open test.json | get glossary.GlossDiv.GlossList.GlossEntry.GlossSee | echo $it
|
|
||||||
exit
|
|
@ -1 +0,0 @@
|
|||||||
2018
|
|
@ -1,3 +0,0 @@
|
|||||||
cd tests
|
|
||||||
open test.toml | get package.edition | echo $it
|
|
||||||
exit
|
|
@ -1 +0,0 @@
|
|||||||
http://www.jonathanturner.org/2015/10/off-to-new-adventures.html
|
|
@ -1,3 +0,0 @@
|
|||||||
cd tests
|
|
||||||
open test.xml | get rss.channel.item.link | echo $it
|
|
||||||
exit
|
|
@ -1 +0,0 @@
|
|||||||
description
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||||||
name
|
|
@ -1,3 +0,0 @@
|
|||||||
cd tests
|
|
||||||
open test.toml --raw | lines | skip 1 | first 1 | split-column "=" | get Column1 | trim | echo $it
|
|
||||||
exit
|
|
@ -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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "nu"
|
|
||||||
version = "0.1.1"
|
|
||||||
authors = ["Yehuda Katz <wycats@gmail.com>"]
|
|
||||||
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"
|
|
129
tests/tests.rs
129
tests/tests.rs
@ -1,114 +1,21 @@
|
|||||||
#[cfg(test)]
|
mod helpers;
|
||||||
mod tests {
|
|
||||||
use std::error::Error;
|
|
||||||
use std::io::prelude::*;
|
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::process::{Command, Stdio};
|
|
||||||
|
|
||||||
fn test_helper(test_name: &str) {
|
use helpers::in_directory as cwd;
|
||||||
let mut baseline_path = PathBuf::new();
|
|
||||||
baseline_path.push("tests");
|
|
||||||
baseline_path.push(test_name);
|
|
||||||
baseline_path.set_extension("out");
|
|
||||||
|
|
||||||
let mut txt_path = PathBuf::new();
|
#[test]
|
||||||
txt_path.push("tests");
|
fn external_num() {
|
||||||
txt_path.push(test_name);
|
nu!(output,
|
||||||
txt_path.set_extension("txt");
|
cwd("tests/fixtures/formats"),
|
||||||
|
"open sgml_description.json | get glossary.GlossDiv.GlossList.GlossEntry.Height | echo $it");
|
||||||
let executable = {
|
|
||||||
let mut buf = PathBuf::new();
|
assert_eq!(output, "10");
|
||||||
buf.push("target");
|
}
|
||||||
buf.push("debug");
|
|
||||||
buf.push("nu");
|
#[test]
|
||||||
buf
|
fn inc_plugin() {
|
||||||
};
|
nu!(output,
|
||||||
|
cwd("tests/fixtures/formats"),
|
||||||
let process = match Command::new(executable)
|
"open sgml_description.json | get glossary.GlossDiv.GlossList.GlossEntry.Height | inc | echo $it");
|
||||||
.stdin(Stdio::piped())
|
|
||||||
.stdout(Stdio::piped())
|
assert_eq!(output, "11");
|
||||||
.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");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1 +0,0 @@
|
|||||||
nu
|
|
@ -1,3 +0,0 @@
|
|||||||
cd tests
|
|
||||||
open test.toml | to-toml | from-toml | get package.name | echo $it
|
|
||||||
exit
|
|
@ -1 +0,0 @@
|
|||||||
test.toml
|
|
@ -1,4 +0,0 @@
|
|||||||
cd tests
|
|
||||||
cd dirtest
|
|
||||||
ls | where size > 1kb | get name | trim | echo $it
|
|
||||||
exit
|
|
Loading…
Reference in New Issue
Block a user