use crate::cmd;
use std::env;
#[test]
fn test_environment_variable() {
let output = cmd!("printenv", "TEST_VAR")
.env("TEST_VAR", "test_value")
.no_echo()
.output()
.unwrap();
assert_eq!(output.trim(), "test_value");
}
#[test]
fn test_multiple_environment_variables() {
let output = cmd!("sh", "-c", "echo $VAR1 $VAR2 $VAR3")
.env("VAR1", "value1")
.env("VAR2", "value2")
.env("VAR3", "value3")
.no_echo()
.output()
.unwrap();
assert_eq!(output.trim(), "value1 value2 value3");
}
#[test]
fn test_environment_inheritance() {
unsafe {
env::set_var("SCRIPTY_TEST_VAR", "original_value");
}
let output = cmd!("printenv", "SCRIPTY_TEST_VAR")
.no_echo()
.output()
.unwrap();
assert_eq!(output.trim(), "original_value");
let output = cmd!("printenv", "SCRIPTY_TEST_VAR")
.env("SCRIPTY_TEST_VAR", "overridden_value")
.no_echo()
.output()
.unwrap();
assert_eq!(output.trim(), "overridden_value");
unsafe {
env::remove_var("SCRIPTY_TEST_VAR");
}
}
#[test]
fn test_working_directory() {
let temp_dir = env::temp_dir();
let output = cmd!("pwd")
.current_dir(&temp_dir)
.no_echo()
.output()
.unwrap();
let pwd_output = output.trim();
let expected_canonical = temp_dir.canonicalize().unwrap_or_else(|_| temp_dir.clone());
let actual_path = std::path::PathBuf::from(pwd_output);
let actual_canonical = actual_path.canonicalize().unwrap_or(actual_path);
assert_eq!(
actual_canonical,
expected_canonical,
"Working directory should be '{}', but pwd returned '{}'",
expected_canonical.display(),
actual_canonical.display()
);
}
#[test]
fn test_environment_special_characters() {
let special_values = [
"value with spaces",
"value\nwith\nnewlines",
"value\twith\ttabs",
"value\"with\"quotes",
"value'with'quotes",
"value$with$dollars",
"value=with=equals",
"value;with;semicolons",
];
for (i, value) in special_values.iter().enumerate() {
let var_name = format!("SPECIAL_VAR_{}", i);
let output = cmd!("printenv", &var_name)
.env(&var_name, value)
.no_echo()
.output()
.unwrap();
assert_eq!(output.trim(), *value);
}
}
#[test]
fn test_empty_environment_variables() {
let output = cmd!("printenv", "EMPTY_VAR")
.env("EMPTY_VAR", "")
.no_echo()
.output()
.unwrap();
assert_eq!(output.trim(), "");
let result = cmd!("printenv", "UNSET_VAR").no_echo().output();
assert!(result.is_err());
}