1#![cfg_attr(feature = "unstable", feature(libc, convert))]
2
3#[cfg(feature = "unstable")]
23extern crate libc;
24
25pub mod dirs;
26pub mod error;
27
28#[cfg(feature = "unstable")]
29pub mod unstable;
30
31mod env_path;
32
33pub use dirs::*;
34pub use error::*;
35
36#[cfg(feature = "unstable")]
37pub use unstable::*;
38
39#[cfg(test)]
40mod tests {
41 use super::*;
42
43 use std::collections::HashMap;
44 use std::env::{self, home_dir, join_paths, split_paths};
45 use std::ffi::OsString;
46 use std::path::PathBuf;
47
48 #[test]
49 fn test_env_with_no_xdg_vars() {
50 let mut custom_env = HashMap::new();
51 custom_env.insert("dummy", "");
52
53 let f = &|var: &str| { custom_env.get(var).map(OsString::from) };
54
55 assert!(get_data_home_from_env(f).unwrap() == home_dir().unwrap().join(".local/share"));
56 assert!(get_data_dirs_from_env(f) == vec![PathBuf::from("/usr/local/share"), PathBuf::from("/usr/share")]);
57 assert!(get_config_home_from_env(f).unwrap() == home_dir().unwrap().join(".config"));
58 assert!(get_config_dirs_from_env(f) == vec![PathBuf::from("/etc/xdg")]);
59 assert!(get_cache_home_from_env(f).unwrap() == home_dir().unwrap().join(".cache"));
60 assert!(get_runtime_dir_from_env(f) == None);
61 }
62
63 #[test]
64 fn test_env_with_empty_xdg_vars() {
65 let mut custom_env = HashMap::new();
66 custom_env.insert("XDG_DATA_HOME", "");
67 custom_env.insert("XDG_DATA_DIRS", "");
68 custom_env.insert("XDG_CONFIG_HOME", "");
69 custom_env.insert("XDG_CONFIG_DIRS", "");
70 custom_env.insert("XDG_CACHE_HOME", "");
71
72 let f = &|var: &str| { custom_env.get(var).map(OsString::from) };
73
74 assert!(get_data_home_from_env(f).unwrap() == home_dir().unwrap().join(".local/share"));
75 assert!(get_data_dirs_from_env(f) == vec![PathBuf::from("/usr/local/share"), PathBuf::from("/usr/share")]);
76 assert!(get_config_home_from_env(f).unwrap() == home_dir().unwrap().join(".config"));
77 assert!(get_config_dirs_from_env(f) == vec![PathBuf::from("/etc/xdg")]);
78 assert!(get_cache_home_from_env(f).unwrap() == home_dir().unwrap().join(".cache"));
79 assert!(get_runtime_dir_from_env(f) == None);
80 }
81
82 #[test]
83 fn test_env_with_xdg_vars() {
84 let cwd = PathBuf::from(&env::current_dir().unwrap());
85 let mut custom_env = HashMap::new();
86
87 custom_env.insert("XDG_DATA_HOME", cwd.join("user/data").into_os_string());
88 custom_env.insert("XDG_DATA_DIRS", join_paths(vec![cwd.join("share/data"), cwd.join("local/data")]).unwrap());
89 custom_env.insert("XDG_CONFIG_HOME", cwd.join("user/config").into_os_string());
90 custom_env.insert("XDG_CONFIG_DIRS", join_paths(vec![cwd.join("config"), cwd.join("local/config")]).unwrap());
91 custom_env.insert("XDG_CACHE_HOME", cwd.join("user/cache").into_os_string());
92
93 let f = &|var: &str| { custom_env.get(var).map(OsString::from) };
94
95 assert!(get_data_home_from_env(f).unwrap() == custom_env.get("XDG_DATA_HOME").map(PathBuf::from).unwrap());
96 assert!(get_data_dirs_from_env(f) == split_paths(&custom_env["XDG_DATA_DIRS"]).collect::<Vec<PathBuf>>());
97 assert!(get_config_home_from_env(f).unwrap() == custom_env.get("XDG_CONFIG_HOME").map(PathBuf::from).unwrap());
98 assert!(get_config_dirs_from_env(f) == split_paths(&custom_env["XDG_CONFIG_DIRS"]).collect::<Vec<PathBuf>>());
99 assert!(get_cache_home_from_env(f).unwrap() == custom_env.get("XDG_CACHE_HOME").map(PathBuf::from).unwrap());
100 }
101}