use std::path::Path;
use tree_type_proc_macro::tree_type;
tree_type! {
TestRoot {
config,
src/ {
lib,
main
}
}
}
#[test]
fn test_basic_navigation() {
let root = TestRoot::new("/tmp/test").unwrap();
assert_eq!(root.as_path(), Path::new("/tmp/test"));
let config = root.config();
assert_eq!(config.as_path(), Path::new("/tmp/test/config"));
let src = root.src();
assert_eq!(src.as_path(), Path::new("/tmp/test/src"));
let lib = src.lib();
assert_eq!(lib.as_path(), Path::new("/tmp/test/src/lib"));
let main = src.main();
assert_eq!(main.as_path(), Path::new("/tmp/test/src/main"));
}
tree_type! {
CustomRoot {
config(".config"),
ssh/(".ssh") {
key("id_rsa")
}
}
}
#[test]
fn test_custom_filenames() {
let root = CustomRoot::new("/home/user").unwrap();
let config = root.config();
assert_eq!(config.as_path(), Path::new("/home/user/.config"));
let ssh = root.ssh();
assert_eq!(ssh.as_path(), Path::new("/home/user/.ssh"));
let key = ssh.key();
assert_eq!(key.as_path(), Path::new("/home/user/.ssh/id_rsa"));
}
tree_type! {
TypedRoot {
config as ConfigFile,
data/ as DataDir {
settings as SettingsFile
}
}
}
#[test]
fn test_custom_types() {
let root = TypedRoot::new("/app").unwrap();
let config: ConfigFile = root.config();
assert_eq!(config.as_path(), Path::new("/app/config"));
let data: DataDir = root.data();
assert_eq!(data.as_path(), Path::new("/app/data"));
let settings: SettingsFile = data.settings();
assert_eq!(settings.as_path(), Path::new("/app/data/settings"));
}
tree_type! {
DeepRoot {
a/ {
b/ {
c/ {
d
}
}
}
}
}
#[test]
fn test_deep_nesting() {
let root = DeepRoot::new("/deep").unwrap();
let a = root.a();
assert_eq!(a.as_path(), Path::new("/deep/a"));
let b = a.b();
assert_eq!(b.as_path(), Path::new("/deep/a/b"));
let c = b.c();
assert_eq!(c.as_path(), Path::new("/deep/a/b/c"));
let d = c.d();
assert_eq!(d.as_path(), Path::new("/deep/a/b/c/d"));
}