just/tests/invocation_directory.rs
Casey Rodarmor 74e45e7c05
Remove dependency on brev (#462)
Just's dependency on brev was the cause of a
fairly deep branch of the transitive dependency
tree. To decrease build time and make the life of
packagers easier, this diff moves the functionality
that Just was using in Brev into Just itself, and
removes the dependency on Brev.

Fortunately, the only functionality that Just was
using was the output function and OutputError
enum, so this was easily done.
2019-07-13 01:55:06 -07:00

97 lines
2.2 KiB
Rust

mod tempdir;
use std::{fs, path::Path, process, str};
use executable_path::executable_path;
use tempdir::tempdir;
#[cfg(unix)]
fn to_shell_path(path: &Path) -> String {
fs::canonicalize(path)
.expect("canonicalize failed")
.to_str()
.map(str::to_string)
.expect("unicode decode failed")
}
#[cfg(windows)]
fn to_shell_path(path: &Path) -> String {
// Translate path from windows style to unix style
let mut cygpath = process::Command::new("cygpath");
cygpath.arg("--unix");
cygpath.arg(path);
let output = cygpath.output().expect("executing cygpath failed");
assert!(output.status.success());
let stdout = str::from_utf8(&output.stdout).expect("cygpath output was not utf8");
if stdout.ends_with('\n') {
&stdout[0..stdout.len() - 1]
} else if stdout.ends_with("\r\n") {
&stdout[0..stdout.len() - 2]
} else {
stdout
}
.to_owned()
}
#[test]
fn test_invocation_directory() {
let tmp = tempdir();
let mut justfile_path = tmp.path().to_path_buf();
justfile_path.push("justfile");
fs::write(
justfile_path,
"default:\n @cd {{invocation_directory()}}\n @echo {{invocation_directory()}}",
)
.unwrap();
let mut subdir = tmp.path().to_path_buf();
subdir.push("subdir");
fs::create_dir(&subdir).unwrap();
let output = process::Command::new(&executable_path("just"))
.current_dir(&subdir)
.args(&["--shell", "sh"])
.output()
.expect("just invocation failed");
let mut failure = false;
let expected_status = 0;
let expected_stdout = to_shell_path(&subdir) + "\n";
let expected_stderr = "";
let status = output.status.code().unwrap();
if status != expected_status {
println!("bad status: {} != {}", status, expected_status);
failure = true;
}
let stdout = str::from_utf8(&output.stdout).unwrap();
if stdout != expected_stdout {
println!(
"bad stdout:\ngot:\n{:?}\n\nexpected:\n{:?}",
stdout, expected_stdout
);
failure = true;
}
let stderr = str::from_utf8(&output.stderr).unwrap();
if stderr != expected_stderr {
println!(
"bad stderr:\ngot:\n{:?}\n\nexpected:\n{:?}",
stderr, expected_stderr
);
failure = true;
}
if failure {
panic!("test failed");
}
}