use std::{ io::Write, process::{Command, Output, Stdio}, }; #[test] fn should_resolve_args() { let output = execute_with(&["-d", "echo", "{2}-{1}-{0}"], "a b c\nd e f"); assert_eq!(output, vec!("echo c-b-a", "echo f-e-d")); } #[test] fn should_allow_to_change_args_separator() { let output = execute_with(&["-d", "-a=;", "echo", "{}"], "a;b;c\nd;e;f"); assert_eq!(output, vec!("echo a b c", "echo d e f")); } #[test] fn should_allow_to_change_entries_separator() { let output = execute_with(&["-d", "-e=|", "echo", "{}"], "a b c|d e f"); assert_eq!(output, vec!("echo a b c", "echo d e f")); } #[test] fn should_allow_to_read_input_as_single_entry() { let output = execute_with(&["-d", "-0", "echo", "{}"], "a b c\nd e f"); assert_eq!(output, vec!("echo a b c d e f")); } #[test] fn should_allow_to_read_input_as_entries_with_size() { let output = execute_with(&["-d", "-s", "2", "echo", "{}"], "a b c\nd e f"); assert_eq!(output, vec!("echo a b", "echo c d", "echo e f")); } #[test] fn should_print_debug_instead_of_running_command() { let output = execute_with(&["-d", "echo", "{}"], "a b c\nd e f"); assert_eq!(output, vec!("echo a b c", "echo d e f")); } #[test] fn should_run_echo_with_all_input_when_no_command_provided() { let output = execute_with(&["-d"], "a b c\nd e f"); assert_eq!(output, vec!("echo a b c", "echo d e f")); } #[test] fn should_pass_all_input_to_commnd_when_no_placeholder_used() { let output = execute_with(&["-d", "cat"], "a b c\nd e f"); assert_eq!(output, vec!("cat a b c", "cat d e f")); } #[test] fn should_use_arg_file_instead_of_stdin() { let output = Command::new("cargo") .args([ "run", "-q", "--", "-f", "tests/test_arg_file.txt", "echo", "{}", ]) .output() .expect("Failed to execute cargo run"); assert_eq!(read_output_lines(output), vec!["a b c", "d e f"]); } fn execute_with(args: &[&str], input: &str) -> Vec { let mut cargo_handle = Command::new("cargo") .args(["run", "-q", "--"]) .args(args) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .spawn() .expect("Failed to execute cargo run"); cargo_handle .stdin .take() .expect("Cannot get stdin for cargo process") .write_all(input.as_bytes()) .expect("Failed to write to cargo process stdin"); let output = cargo_handle .wait_with_output() .expect("Failed to wait for cargo process"); read_output_lines(output) } fn read_output_lines(output: Output) -> Vec { String::from_utf8(output.stdout) .expect("Failed to convert output to string") .trim() .to_string() .lines() .map(|line| line.to_string()) .collect() }