use xshell::{cmd, Shell}; #[track_caller] fn check(code: &str, err_msg: &str) { let sh = Shell::new().unwrap(); let xshell_dir = sh.current_dir(); let temp_dir = sh.create_temp_dir().unwrap(); sh.change_dir(temp_dir.path()); let manifest = format!( r#" [package] name = "cftest" version = "0.0.0" edition = "2018" [workspace] [lib] path = "main.rs" [dependencies] xshell = {{ path = {xshell_dir:?} }} "#, ); let snip = format!( " use xshell::*; pub fn f() {{ let sh = Shell::new().unwrap(); {code}; }} " ); sh.write_file("Cargo.toml", manifest).unwrap(); sh.write_file("main.rs", snip).unwrap(); let stderr = cmd!(sh, "cargo build").ignore_status().read_stderr().unwrap(); assert!( stderr.contains(err_msg), "\n\nCompile fail fail!\n\nExpected:\n{}\n\nActual:\n{}\n", err_msg, stderr ); } #[test] fn not_a_string_literal() { check("cmd!(sh, 92)", "expected a plain string literal"); } #[test] fn not_raw_string_literal() { check(r#"cmd!(sh, r"raw")"#, "expected a plain string literal"); } #[test] fn interpolate_complex_expression() { check( r#"cmd!(sh, "{echo.as_str()}")"#, "error: can only interpolate simple variables, got this expression instead: `echo.as_str()`", ); } #[test] fn interpolate_splat_concat_prefix() { check( r#"cmd!(sh, "echo a{args...}")"#, "error: can't combine splat with concatenation, add spaces around `{args...}`", ); } #[test] fn interpolate_splat_concat_suffix() { check( r#"cmd!(sh, "echo {args...}b")"#, "error: can't combine splat with concatenation, add spaces around `{args...}`", ); } #[test] fn interpolate_splat_concat_mixfix() { check( r#"cmd!(sh, "echo a{args...}b")"#, "error: can't combine splat with concatenation, add spaces around `{args...}`", ); } #[test] fn empty_command() { check(r#"cmd!(sh, "")"#, "error: command can't be empty"); } #[test] fn spalt_program() { check(r#"cmd!(sh, "{cmd...}")"#, "error: can't splat program name"); } #[test] fn unclosed_quote() { check(r#"cmd!(sh, "echo 'hello world")"#, "error: unclosed `'` in command"); } #[test] fn unclosed_curly() { check(r#"cmd!(sh, "echo {hello world")"#, "error: unclosed `{` in command"); } #[test] fn interpolate_integer() { check( r#" let x = 92; cmd!(sh, "make -j {x}")"#, r#"is not implemented"#, ); } #[test] fn splat_fn_pointer() { check( r#" let dry_run: fn() -> Option<&'static str> = || None; cmd!(sh, "make -j {dry_run...}")"#, r#"is not implemented"#, ); }