Files
sausage/userland/jaq/tests/golden.rs
T
surma b9e3e3677d userland: search and exec tools, spawn library (T14)
rg (ripgrep 15.2), grep (ours, on ripgrep's regex crates), find and xargs
(ours), sed (uutils 0.3 wrapper), diff and cmp (uutils diffutils 0.6 with -r),
fd 10.5, jaq 2.3, env and timeout. userland/spawn is a small Command-like
client of the process interface. search-test.nu: 42 cases match native tools.
2026-11-06 17:21:51 +00:00

158 lines
2.8 KiB
Rust
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
use std::{env, io, process, str};
fn golden_test(args: &[&str], input: &str, out_ex: &str) -> io::Result<()> {
let mut child = process::Command::new(env!("CARGO_BIN_EXE_jaq"))
.args(args)
.stdin(process::Stdio::piped())
.stdout(process::Stdio::piped())
.spawn()?;
use io::Write;
child.stdin.take().unwrap().write_all(input.as_bytes())?;
let output = child.wait_with_output()?;
assert!(output.status.success());
let out_act = str::from_utf8(&output.stdout).expect("invalid UTF-8 in output");
// remove '\r' from output for compatibility with Windows
let out_act = out_act.replace('\r', "");
if out_ex.trim() != out_act.trim() {
println!("Expected output:\n{}\n---", out_ex);
println!("Actual output:\n{}\n---", out_act);
process::exit(2);
}
Ok(())
}
macro_rules! test {
($name:ident, $args:expr, $input:expr, $output:expr) => {
#[test]
fn $name() -> io::Result<()> {
golden_test($args, $input, $output)
}
};
}
test!(no_args, &[], "[0, 1]", "[\n 0,\n 1\n]");
test!(one, &["1"], "0", "1");
test!(sparse, &["."], "[2,3]", "[\n 2,\n 3\n]");
test!(
arg,
&["--arg", "x", "y", "--arg", "a", "b", "$x + $a"],
"0",
"\"yb\""
);
test!(
argjson,
&[
"--argjson",
"a",
"[1,2,3]",
"--argjson",
"b",
r#""abc""#,
"$a,$b"
],
"0",
r#"[
1,
2,
3
]
"abc""#
);
test!(
args,
&["-c", "--args", "--arg", "x", "y", "$ARGS", "a", "--", "--test", "--"],
"0",
r#"{"positional":["a","--test","--"],"named":{"x":"y"}}"#
);
test!(
join_output,
&["-j", "."],
r#"[] "foo" "bar" 1 2 {}"#,
"[]foobar12{}"
);
test!(
raw_output,
&["-r", "."],
r#""foo" "bar" ["baz"]"#,
r#"foo
bar
[
"baz"
]"#
);
test!(
compact,
&["-c", "."],
r#"[2,3]
{"a":1, "b":["c" ]}"#,
r#"[2,3]
{"a":1,"b":["c"]}"#
);
test!(
sort_keys,
&["-Sc", "."],
r#"{"b": 1, "a": 2}"#,
r#"{"a":2,"b":1}"#
);
test!(
inputs,
&["-c", r#"{".": .}, {input: input}"#],
"0\n1\n2\n3",
r#"{".":0}
{"input":1}
{".":2}
{"input":3}"#
);
test!(
null_input,
&["-nc", r#"{".": .}, {inputs: [inputs]}"#],
"0\n1\n2\n3",
r#"{".":null}
{"inputs":[0,1,2,3]}"#
);
const ONE23: &str = "One\nTwo\nThree\n";
test!(raw_input_slurp, &["-Rs"], ONE23, r#""One\nTwo\nThree\n""#);
test!(
raw_input,
&["-R"],
ONE23,
r#""One"
"Two"
"Three""#
);
test!(
fmt_str,
&[],
r#""\u0000\u200b\r\t\n asdf""#,
r#""\u0000​\r\t\n asdf""#
);
test!(
fmt_obj_key,
&["-c"],
r#"{"विश\u094dव": 1}"#,
r#"{"विश्व":1}"#
);
test!(
mods,
&["-c", "-L", "tests", r#"include "a"; [a, data, d]"#],
"0",
r#"["bcddd",[1,2],3]"#
);