Skip to content

Commit 497bb91

Browse files
authored
Adds CLI tests for pest2ion (#45)
Uses `assert_cmd` and `rstest` to test the different permutations of the `pest2ion` command with real arguments. This includes testing STDIN/STDOUT defaults as well as file arguments using a temporary directory per test case. Each format mode is also permuted. Note that this does not test the "long" argument names, if we care to, we can always add that for completeness. Resolves #42.
1 parent 5da7928 commit 497bb91

File tree

2 files changed

+97
-3
lines changed

2 files changed

+97
-3
lines changed

pest-ion/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ anyhow = "~1.0.40"
3131

3232
[dev-dependencies]
3333
rstest = "~0.10.0"
34+
assert_cmd = "~1.0.5"
35+
tempfile = "~3.2.0"
3436

3537
[[bin]]
36-
name = "pest2ion"
37-
test = false
38-
bench = false
38+
name = "pest2ion"

pest-ion/tests/cli.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Copyright Amazon.com, Inc. or its affiliates.
2+
3+
use anyhow::Result;
4+
use assert_cmd::Command;
5+
use ion_rs::value::reader::*;
6+
use rstest::*;
7+
use std::fs::File;
8+
use std::io::{Read, Write};
9+
use tempfile::TempDir;
10+
11+
/// The input or output mode of the CLI.
12+
enum FileMode {
13+
/// Use `STDIN` or `STDOUT`
14+
Default,
15+
/// Use a named file.
16+
Named,
17+
}
18+
19+
#[rstest]
20+
#[case::simple(
21+
r#"
22+
a = { "a" ~ "b" }
23+
"#,
24+
r#"
25+
{
26+
a: {
27+
type: normal,
28+
expression: (sequence (string exact "a") (string exact "b")),
29+
}
30+
}
31+
"#
32+
)]
33+
fn run_it(
34+
#[case] pest_src: &str,
35+
#[case] ion_text: &str,
36+
#[values("", "-t", "-p", "-b")] format_flag: &str,
37+
#[values(FileMode::Default, FileMode::Named)] input_mode: FileMode,
38+
#[values(FileMode::Default, FileMode::Named)] output_mode: FileMode,
39+
) -> Result<()> {
40+
// working space for our tests when they need files
41+
let temp_dir = TempDir::new()?;
42+
let input_path = temp_dir.path().join("INPUT.pest");
43+
let output_path = temp_dir.path().join("OUTPUT.ion");
44+
45+
let mut cmd = Command::cargo_bin("pest2ion")?;
46+
if format_flag != "" {
47+
cmd.arg(format_flag);
48+
}
49+
match output_mode {
50+
FileMode::Default => {
51+
// do nothing
52+
}
53+
FileMode::Named => {
54+
// tell our driver to output to a file
55+
cmd.arg("-o");
56+
cmd.arg(&output_path);
57+
}
58+
}
59+
match input_mode {
60+
FileMode::Default => {
61+
// do nothing
62+
}
63+
FileMode::Named => {
64+
// dump our test data to input file
65+
let mut input_file = File::create(&input_path)?;
66+
input_file.write(pest_src.as_bytes())?;
67+
input_file.flush()?;
68+
69+
// make this the input for our driver
70+
cmd.arg(input_path.to_str().unwrap());
71+
}
72+
};
73+
println!("{:?}", cmd);
74+
let assert = cmd.write_stdin(pest_src).assert();
75+
76+
let actual = match output_mode {
77+
FileMode::Default => {
78+
let output = assert.get_output();
79+
element_reader().read_one(&output.stdout)?
80+
}
81+
FileMode::Named => {
82+
let mut output_file = File::open(output_path)?;
83+
let mut output_buffer = vec![];
84+
output_file.read_to_end(&mut output_buffer)?;
85+
element_reader().read_one(&output_buffer)?
86+
}
87+
};
88+
let expected = element_reader().read_one(ion_text.as_bytes())?;
89+
assert_eq!(expected, actual);
90+
91+
assert.success();
92+
93+
Ok(())
94+
}

0 commit comments

Comments
 (0)