diff --git a/Cargo.lock b/Cargo.lock index e0578b1956..145b1f4fee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4764,6 +4764,28 @@ dependencies = [ "syn 1.0.72", ] +[[package]] +name = "serial_test" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0bccbcf40c8938196944a3da0e133e031a33f4d6b72db3bda3cc556e361905d" +dependencies = [ + "lazy_static", + "parking_lot 0.11.1", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2acd6defeddb41eb60bb468f8825d0cfd0c2a76bc03bfd235b6a1dc4f6a1ad5" +dependencies = [ + "proc-macro2 1.0.27", + "quote 1.0.9", + "syn 1.0.72", +] + [[package]] name = "sha1" version = "0.6.0" @@ -5806,6 +5828,7 @@ dependencies = [ "lazy_static", "ron", "serde", + "serial_test", "tracing", ] diff --git a/common/assets/Cargo.toml b/common/assets/Cargo.toml index 84c5f21b87..edb60a77fc 100644 --- a/common/assets/Cargo.toml +++ b/common/assets/Cargo.toml @@ -13,3 +13,6 @@ ron = { version = "0.6", default-features = false } dot_vox = "4.0" image = { version = "0.23.12", default-features = false, features = ["png"] } tracing = "0.1" + +[dev-dependencies] +serial_test = "0.5" diff --git a/common/assets/src/lib.rs b/common/assets/src/lib.rs index 9915347eaa..4d35b3318a 100644 --- a/common/assets/src/lib.rs +++ b/common/assets/src/lib.rs @@ -299,13 +299,14 @@ pub mod asset_tweak { /// /// # Panics /// 1) If given `asset_specifier` does not exists - pub fn tweak_expect(asset_specifier: &str) -> T + pub fn tweak_expect(specifier: &str) -> T where T: Clone + Sized + Send + Sync + 'static + DeserializeOwned, { if cfg!(not(any(debug_assertions, test))) { tracing::warn!("AssetTweaker used in release build!"); } + let asset_specifier: &str = &format!("tweak.{}", specifier); let handle = as AssetExt>::load_expect(asset_specifier); let AssetTweakWrapper(value) = handle.read().clone(); value @@ -339,10 +340,11 @@ pub mod asset_tweak { { if cfg!(not(any(debug_assertions, test))) { tracing::warn!("AssetTweaker used in release build!"); + return value; } let root = find_root().expect("failed to discover repository_root"); - let tweak_dir = root.join("asset/tweak/"); + let tweak_dir = root.join("assets/tweak/"); let filename = format!("{}.ron", specifier); if Path::new(&tweak_dir.join(&filename)).is_file() { @@ -352,7 +354,7 @@ pub mod asset_tweak { new_value } else { - fs::create_dir(&tweak_dir).expect("failed to create directory for tweak files"); + fs::create_dir_all(&tweak_dir).expect("failed to create directory for tweak files"); let f = fs::File::create(tweak_dir.join(&filename)).unwrap_or_else(|err| { panic!("failed to create file {:?}. Error: {:?}", &filename, err) }); @@ -367,7 +369,11 @@ pub mod asset_tweak { #[cfg(test)] mod tests { - use super::{asset_tweak::tweak_expect, find_root}; + use super::{ + asset_tweak::{tweak_expect, tweak_expect_or_create}, + find_root, + }; + use serial_test::serial; use std::{ convert::AsRef, fmt::Debug, @@ -416,6 +422,8 @@ mod tests { File::create(&file).unwrap_or_else(|_| panic!("failed to create file {:?}", &file)); (Self { file }, f) } + + fn hold(file: P) -> Self { Self { file } } } impl

Drop for FileGuard

@@ -429,15 +437,16 @@ mod tests { } #[test] + #[serial] fn test_tweaked_string() { let root = find_root().expect("failed to discover repository_root"); let tweak_dir = root.join("assets/tweak/"); let _dir_guard = DirectoryGuard::create(tweak_dir.clone()); // define test files - let from_int = tweak_dir.join("int_tweak.ron"); - let from_string = tweak_dir.join("string_tweak.ron"); - let from_map = tweak_dir.join("map_tweak.ron"); + let from_int = tweak_dir.join("__test_int_tweak.ron"); + let from_string = tweak_dir.join("__test_string_tweak.ron"); + let from_map = tweak_dir.join("__test_map_tweak.ron"); // setup fs guards let (_file_guard1, mut file1) = FileGuard::create(from_int); @@ -448,14 +457,14 @@ mod tests { file1 .write_all(b"(5)") .expect("failed to write to the file"); - let x = tweak_expect::("tweak.int_tweak"); + let x = tweak_expect::("__test_int_tweak"); assert_eq!(x, 5); // write to file and check result file2 .write_all(br#"("Hello Zest")"#) .expect("failed to write to the file"); - let x = tweak_expect::("tweak.string_tweak"); + let x = tweak_expect::("__test_string_tweak"); assert_eq!(x, "Hello Zest".to_owned()); // write to file and check result @@ -469,10 +478,30 @@ mod tests { "#, ) .expect("failed to write to the file"); - let x: std::collections::HashMap = tweak_expect("tweak.map_tweak"); + let x: std::collections::HashMap = tweak_expect("__test_map_tweak"); let mut map = std::collections::HashMap::new(); map.insert("wow".to_owned(), 4); map.insert("such".to_owned(), 5); assert_eq!(x, map); } + + #[test] + #[serial] + fn test_tweaked_create() { + let root = find_root().expect("failed to discover repository_root"); + let tweak_dir = root.join("assets/tweak/"); + let test_path1 = tweak_dir.join("__test_int_create.ron"); + let _file_guard1 = FileGuard::hold(&test_path1); + let x = tweak_expect_or_create("__test_int_create", 5); + assert_eq!(x, 5); + assert!(test_path1.is_file()); + + // Test that file has stronger priority + let test_path2 = tweak_dir.join("__test_priority.ron"); + let (_file_guard2, mut file) = FileGuard::create(&test_path2); + file.write_all(b"(10)") + .expect("failed to write to the file"); + let x = tweak_expect_or_create("__test_priority", 6); + assert_eq!(x, 10); + } }