use super::*;
type Case = (
fn(&Env) -> PathBuf,
&'static [(&'static str, &'static str)],
&'static str,
);
fn run(cases: &[Case]) {
for &(fold, vars, expect) in cases {
let env = Env::from_pairs(vars.iter().copied());
assert_eq!(fold(&env), PathBuf::from(expect), "vars={vars:?}");
}
}
#[test]
fn xdg_folds_set_unset_and_missing_home() {
run(&[
(
Env::balls_state_root,
&[("XDG_STATE_HOME", "/x")],
"/x/balls",
),
(
Env::balls_state_root,
&[("HOME", "/h")],
"/h/.local/state/balls",
),
(Env::balls_state_root, &[], ".local/state/balls"),
(
Env::balls_clones_dir,
&[("XDG_STATE_HOME", "/x")],
"/x/balls/clones",
),
(
Env::balls_clones_dir,
&[("HOME", "/h")],
"/h/.local/state/balls/clones",
),
(Env::yog_data_root, &[("XDG_DATA_HOME", "/d")], "/d/yog"),
(Env::yog_data_root, &[("HOME", "/h")], "/h/.local/share/yog"),
(Env::yog_data_root, &[], ".local/share/yog"),
(Env::yog_state_root, &[("XDG_STATE_HOME", "/x")], "/x/yog"),
(
Env::yog_state_root,
&[("HOME", "/h")],
"/h/.local/state/yog",
),
(
Env::yog_stage_root,
&[("XDG_STATE_HOME", "/x")],
"/x/yog/stage",
),
(
Env::yog_stage_root,
&[("HOME", "/h")],
"/h/.local/state/yog/stage",
),
(Env::home_dir, &[("HOME", "/h")], "/h"),
(Env::home_dir, &[], "/"),
]);
}
#[test]
fn lernie_roots_home_collapse_set_empty_unset() {
run(&[
(
Env::lernie_config_root,
&[("LERNIE_HOME", "/L"), ("XDG_CONFIG_HOME", "/c")],
"/L",
),
(
Env::lernie_data_root,
&[("LERNIE_HOME", "/L"), ("XDG_DATA_HOME", "/d")],
"/L",
),
(
Env::lernie_config_root,
&[("LERNIE_HOME", ""), ("XDG_CONFIG_HOME", "/c")],
"/c/lernie",
),
(
Env::lernie_data_root,
&[("LERNIE_HOME", ""), ("XDG_DATA_HOME", "/d")],
"/d/lernie",
),
(
Env::lernie_config_root,
&[("XDG_CONFIG_HOME", "/c")],
"/c/lernie",
),
(
Env::lernie_config_root,
&[("HOME", "/h")],
"/h/.config/lernie",
),
(Env::lernie_config_root, &[], ".config/lernie"),
(
Env::lernie_data_root,
&[("HOME", "/h")],
"/h/.local/share/lernie",
),
(Env::lernie_data_root, &[], ".local/share/lernie"),
]);
}
#[test]
fn brazen_config_fold() {
run(&[
(
Env::brazen_config_path,
&[("BRAZEN_CONFIG", "/b.toml"), ("XDG_CONFIG_HOME", "/c")],
"/b.toml",
),
(
Env::brazen_config_path,
&[("BRAZEN_CONFIG", ""), ("XDG_CONFIG_HOME", "/c")],
"/c/brazen/config.toml",
),
(
Env::brazen_config_path,
&[("HOME", "/h")],
"/h/.config/brazen/config.toml",
),
(Env::brazen_config_path, &[], ".config/brazen/config.toml"),
]);
}
#[test]
fn brazen_per_os_credentials_and_cache() {
run(&[
(
|e| e.brazen_credentials_dir(Os::Linux),
&[("XDG_DATA_HOME", "/d")],
"/d/brazen/credentials",
),
(
|e| e.brazen_credentials_dir(Os::Linux),
&[("HOME", "/h")],
"/h/.local/share/brazen/credentials",
),
(
|e| e.brazen_models_cache_dir(Os::Linux),
&[("XDG_CACHE_HOME", "/k")],
"/k/brazen/models",
),
(
|e| e.brazen_models_cache_dir(Os::Linux),
&[("HOME", "/h")],
"/h/.cache/brazen/models",
),
(
|e| e.brazen_credentials_dir(Os::MacOs),
&[("HOME", "/h"), ("XDG_DATA_HOME", "/d")],
"/h/Library/Application Support/brazen/credentials",
),
(
|e| e.brazen_models_cache_dir(Os::MacOs),
&[("HOME", "/h"), ("XDG_CACHE_HOME", "/k")],
"/h/Library/Caches/brazen/models",
),
(
|e| e.brazen_credentials_dir(Os::MacOs),
&[],
"Library/Application Support/brazen/credentials",
),
]);
}
#[test]
fn percent_decode_table() {
let cases = [
("home%2Fmark", "home/mark"), ("home%2fmark", "home/mark"), ("a%20b", "a b"), ("plain", "plain"), ("", ""), ("%GG", "%GG"), ("tail%", "tail%"), ("x%4", "x%4"), ("%41%42", "AB"), ];
for (input, expect) in cases {
assert_eq!(percent_decode(input), expect, "input={input:?}");
}
}
#[test]
fn user_reads_the_snapshot_and_empty_is_absent() {
assert_eq!(
Env::from_pairs([("USER", "orion")]).user().as_deref(),
Some("orion"),
);
assert_eq!(Env::from_pairs([("USER", "")]).user(), None);
assert_eq!(
Env::from_pairs(std::iter::empty::<(&str, &str)>()).user(),
None
);
}
#[test]
fn current_os_is_the_compiled_target() {
let os = current_os();
#[cfg(target_os = "macos")]
assert_eq!(os, Os::MacOs);
#[cfg(not(target_os = "macos"))]
assert_eq!(os, Os::Linux);
}
#[test]
fn from_env_snapshots_process_env() {
let env = Env::from_env();
let _ = env.yog_state_root();
}