You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

113 lines
3.0 KiB

mod call;
mod die_on_errors;
mod eval_fnm_env;
mod expect_command_output;
mod expression;
mod get_stderr;
mod ignore_errors;
mod line_separated_expressions;
mod nothing;
mod output_contains;
mod raw;
mod shell;
mod sub_shell;
mod test_node_version;
mod write_file;
#[allow(unused)]
pub use call::*;
#[allow(unused)]
pub use die_on_errors::*;
#[allow(unused)]
pub use eval_fnm_env::*;
#[allow(unused)]
pub use expect_command_output::*;
#[allow(unused)]
pub use expression::*;
#[allow(unused)]
pub use get_stderr::*;
#[allow(unused)]
pub use ignore_errors::*;
#[allow(unused)]
#[allow(unused)]
pub use line_separated_expressions::*;
#[allow(unused)]
pub use nothing::*;
#[allow(unused)]
pub use output_contains::*;
#[allow(unused)]
pub use raw::*;
#[allow(unused)]
pub use shell::*;
#[allow(unused)]
pub use sub_shell::*;
#[allow(unused)]
pub use test_node_version::*;
#[allow(unused)]
pub use write_file::*;
use std::path::Path;
pub(crate) fn run_test_file(dir: &Path, shell: &impl Shell, code: &str) {
let fnm_dir = tempfile::tempdir().unwrap();
let target_dir = std::path::PathBuf::from(env!("CARGO_BIN_EXE_fnm"))
.parent()
.unwrap()
.to_path_buf();
let path_str = {
let path_env = std::env::var("PATH").unwrap();
let mut path_split: Vec<_> = std::env::split_paths(&path_env).collect();
path_split.insert(0, target_dir);
path_split.insert(0, dir.join("bin")); // for custom binaries
std::env::join_paths(path_split).unwrap()
};
duct::cmd(shell.binary_name(), shell.launch_args())
.env("PATH", path_str)
.env("FNM_DIR", fnm_dir.path())
.env("HOME", tempfile::tempdir().unwrap().path())
.env_remove("FNM_MULTISHELL_PATH")
.dir(dir)
.stdin_bytes(code)
.run()
.unwrap();
}
#[macro_export]
macro_rules! test_shell {
($($shell:ident),+; $block:block) => {
test_shell!($($shell),+; |_path| $block);
};
($($shell:ident),+; $f:expr) => {
$(
#[test]
#[serial_test::serial]
#[allow(non_snake_case, clippy::redundant_closure_call)]
fn $shell() {
use super::*;
#[allow(unused)]
use pretty_assertions::assert_eq;
let current_dir = tempfile::tempdir().expect("Can't create a temp dir");
let shell = $crate::shellcode::$shell;
let mut source = String::new();
empty_shell_script(&shell)
.then($crate::shellcode::DieOnErrors)
.then(($f)(current_dir.path()))
.write_shell(&mut source)
.expect("Can't create shell script");
insta::assert_snapshot!(&source.trim());
if !shell.currently_supported() {
return;
}
$crate::shellcode::run_test_file(
current_dir.path(),
&shell,
&source.trim()
);
}
)+
};
}