From 5d370449fb539ddca634a90257eb9ff5cabf8ee4 Mon Sep 17 00:00:00 2001 From: NathanW Date: Thu, 20 May 2021 12:15:38 -0600 Subject: [PATCH 1/8] [assets] set LoadState properly and more testing! --- crates/bevy_asset/Cargo.toml | 4 + crates/bevy_asset/src/asset_server.rs | 170 +++++++++++++++++++++++--- 2 files changed, 156 insertions(+), 18 deletions(-) diff --git a/crates/bevy_asset/Cargo.toml b/crates/bevy_asset/Cargo.toml index 6abbe968c938f..52a0510805714 100644 --- a/crates/bevy_asset/Cargo.toml +++ b/crates/bevy_asset/Cargo.toml @@ -45,3 +45,7 @@ js-sys = "0.3" [target.'cfg(target_os = "android")'.dependencies] ndk-glue = { version = "0.2" } + +[dev-dependencies] +futures-lite = "1.4.0" +tempfile = "3.2.0" diff --git a/crates/bevy_asset/src/asset_server.rs b/crates/bevy_asset/src/asset_server.rs index c553be3e4a52b..9f2f93e85fae2 100644 --- a/crates/bevy_asset/src/asset_server.rs +++ b/crates/bevy_asset/src/asset_server.rs @@ -230,7 +230,6 @@ impl AssetServer { self.load_untyped(path).typed() } - // TODO: properly set failed LoadState in all failure cases async fn load_async( &self, asset_path: AssetPath<'_>, @@ -272,15 +271,19 @@ impl AssetServer { source_info.version }; + let set_asset_failed = || { + let mut asset_sources = self.server.asset_sources.write(); + let source_info = asset_sources + .get_mut(&asset_path_id.source_path_id()) + .expect("`AssetSource` should exist at this point."); + source_info.load_state = LoadState::Failed; + }; + // load the asset bytes let bytes = match self.server.asset_io.load_path(asset_path.path()).await { Ok(bytes) => bytes, Err(err) => { - let mut asset_sources = self.server.asset_sources.write(); - let source_info = asset_sources - .get_mut(&asset_path_id.source_path_id()) - .expect("`AssetSource` should exist at this point."); - source_info.load_state = LoadState::Failed; + set_asset_failed(); return Err(AssetServerError::AssetIoError(err)); } }; @@ -293,10 +296,15 @@ impl AssetServer { version, &self.server.task_pool, ); - asset_loader + + if let Err(err) = asset_loader .load(&bytes, &mut load_context) .await - .map_err(AssetServerError::AssetLoaderError)?; + .map_err(AssetServerError::AssetLoaderError) + { + set_asset_failed(); + return Err(err); + } // if version has changed since we loaded and grabbed a lock, return. theres is a newer // version being loaded @@ -517,23 +525,35 @@ impl AssetServer { } } -pub fn free_unused_assets_system(asset_server: Res) { +fn free_unused_assets_system_impl(asset_server: &AssetServer) { asset_server.free_unused_assets(); asset_server.mark_unused_assets(); } +pub fn free_unused_assets_system(asset_server: Res) { + free_unused_assets_system_impl(&asset_server); +} + #[cfg(test)] mod test { use super::*; + use crate::loader::LoadedAsset; + use bevy_reflect::TypeUuid; use bevy_utils::BoxedFuture; + use tempfile::*; + + #[derive(Debug, TypeUuid)] + #[uuid = "a5189b72-0572-4290-a2e0-96f73a491c44"] + struct PngAsset; struct FakePngLoader; impl AssetLoader for FakePngLoader { fn load<'a>( &'a self, _: &'a [u8], - _: &'a mut LoadContext, + ctx: &'a mut LoadContext, ) -> BoxedFuture<'a, Result<(), anyhow::Error>> { + ctx.set_default_asset(LoadedAsset::new(PngAsset)); Box::pin(async move { Ok(()) }) } @@ -542,6 +562,21 @@ mod test { } } + struct FailingLoader; + impl AssetLoader for FailingLoader { + fn load<'a>( + &'a self, + _: &'a [u8], + _: &'a mut LoadContext, + ) -> BoxedFuture<'a, Result<(), anyhow::Error>> { + Box::pin(async { anyhow::bail!("failed") }) + } + + fn extensions(&self) -> &[&str] { + &["fail"] + } + } + struct FakeMultipleDotLoader; impl AssetLoader for FakeMultipleDotLoader { fn load<'a>( @@ -557,7 +592,7 @@ mod test { } } - fn setup() -> AssetServer { + fn setup(asset_path: impl AsRef) -> AssetServer { use crate::FileAssetIo; let asset_server = AssetServer { @@ -569,38 +604,39 @@ mod test { handle_to_path: Default::default(), asset_lifecycles: Default::default(), task_pool: Default::default(), - asset_io: Box::new(FileAssetIo::new(&".")), + asset_io: Box::new(FileAssetIo::new(asset_path)), }), }; asset_server.add_loader::(FakePngLoader); + asset_server.add_loader::(FailingLoader); asset_server.add_loader::(FakeMultipleDotLoader); asset_server } #[test] fn extensions() { - let asset_server = setup(); + let asset_server = setup("."); let t = asset_server.get_path_asset_loader("test.png"); assert_eq!(t.unwrap().extensions()[0], "png"); } #[test] fn case_insensitive_extensions() { - let asset_server = setup(); + let asset_server = setup("."); let t = asset_server.get_path_asset_loader("test.PNG"); assert_eq!(t.unwrap().extensions()[0], "png"); } #[test] fn no_loader() { - let asset_server = setup(); + let asset_server = setup("."); let t = asset_server.get_path_asset_loader("test.pong"); assert!(t.is_err()); } #[test] fn multiple_extensions_no_loader() { - let asset_server = setup(); + let asset_server = setup("."); assert!( match asset_server.get_path_asset_loader("test.v1.2.3.pong") { @@ -635,15 +671,113 @@ mod test { #[test] fn filename_with_dots() { - let asset_server = setup(); + let asset_server = setup("."); let t = asset_server.get_path_asset_loader("test-v1.2.3.png"); assert_eq!(t.unwrap().extensions()[0], "png"); } #[test] fn multiple_extensions() { - let asset_server = setup(); + let asset_server = setup("."); let t = asset_server.get_path_asset_loader("test.test.png"); assert_eq!(t.unwrap().extensions()[0], "test.png"); } + + fn create_dir_and_file(file: impl AsRef) -> TempDir { + let asset_dir = tempdir().unwrap(); + std::fs::write(asset_dir.path().join(file), &[]).unwrap(); + asset_dir + } + + #[test] + fn test_missing_loader() { + let dir = create_dir_and_file("file.not-a-real-extension"); + let asset_server = setup(dir.path()); + + let path: AssetPath = "file.not-a-real-extension".into(); + let handle = asset_server.get_handle_untyped(path.get_id()); + + let err = futures_lite::future::block_on(asset_server.load_async(path.clone(), true)) + .unwrap_err(); + assert!(match err { + AssetServerError::MissingAssetLoader { extensions } => { + extensions == ["not-a-real-extension"] + } + _ => false, + }); + + assert_eq!(asset_server.get_load_state(handle), LoadState::NotLoaded); + } + + #[test] + fn test_invalid_asset_path() { + let asset_server = setup("."); + + let path: AssetPath = "an/invalid/path.png".into(); + let handle = asset_server.get_handle_untyped(path.get_id()); + + let err = futures_lite::future::block_on(asset_server.load_async(path.clone(), true)) + .unwrap_err(); + assert!(matches!(err, AssetServerError::AssetIoError(_))); + + assert_eq!(asset_server.get_load_state(handle), LoadState::Failed); + } + + #[test] + fn test_failing_loader() { + let dir = create_dir_and_file("fake.fail"); + let asset_server = setup(dir.path()); + + let path: AssetPath = "fake.fail".into(); + let handle = asset_server.get_handle_untyped(path.get_id()); + + let err = futures_lite::future::block_on(asset_server.load_async(path.clone(), true)) + .unwrap_err(); + assert!(matches!(err, AssetServerError::AssetLoaderError(_))); + + assert_eq!(asset_server.get_load_state(handle), LoadState::Failed); + } + + #[test] + fn test_asset_lifecycle() { + let dir = create_dir_and_file("fake.png"); + let asset_server = setup(dir.path()); + let mut assets = asset_server.register_asset_type::(); + + let path: AssetPath = "fake.png".into(); + assert_eq!( + LoadState::NotLoaded, + asset_server.get_load_state(path.get_id()) + ); + + // load the asset + let id = + futures_lite::future::block_on(asset_server.load_async(path.clone(), true)).unwrap(); + let handle = asset_server.get_handle_untyped(id); + + // asset is loading + assert_eq!(LoadState::Loading, asset_server.get_load_state(id)); + + // mimics one full frame + let tick = |server: &AssetServer, assets: &mut Assets| { + free_unused_assets_system_impl(server); + server.update_asset_storage(assets); + }; + + tick(&asset_server, &mut assets); + // asset should exist and be loaded at this point + assert_eq!(LoadState::Loaded, asset_server.get_load_state(id)); + assert!(assets.get(&handle).is_some()); + + // after dropping the handle, next call to `tick` will prepare the assets for removal. + drop(handle); + tick(&asset_server, &mut assets); + assert_eq!(LoadState::Loaded, asset_server.get_load_state(id)); + assert!(assets.get(id).is_some()); + + // second call to tick will actually remove the asset. + tick(&asset_server, &mut assets); + assert_eq!(LoadState::NotLoaded, asset_server.get_load_state(id)); + assert!(assets.get(id).is_none()); + } } From 7e5cb446e24f5658d787a74f41cbdb52f894e9f0 Mon Sep 17 00:00:00 2001 From: NathanW Date: Mon, 24 May 2021 09:55:23 -0600 Subject: [PATCH 2/8] fix asset-lifecycle-test to pass --- crates/bevy_asset/src/asset_server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_asset/src/asset_server.rs b/crates/bevy_asset/src/asset_server.rs index 9f2f93e85fae2..5bce00a438b94 100644 --- a/crates/bevy_asset/src/asset_server.rs +++ b/crates/bevy_asset/src/asset_server.rs @@ -777,7 +777,7 @@ mod test { // second call to tick will actually remove the asset. tick(&asset_server, &mut assets); - assert_eq!(LoadState::NotLoaded, asset_server.get_load_state(id)); + assert_eq!(LoadState::Loaded, asset_server.get_load_state(id)); // TODO: should this now show `LoadState::NotLoaded`? assert!(assets.get(id).is_none()); } } From 2566b954a0daca43179457f089a4c47130f40a73 Mon Sep 17 00:00:00 2001 From: NathanW Date: Tue, 25 May 2021 18:02:51 -0600 Subject: [PATCH 3/8] introduce LoadState::Unloaded and strengthen test --- crates/bevy_asset/src/asset_server.rs | 38 ++++++++++++++++++--------- crates/bevy_asset/src/info.rs | 7 +++++ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/crates/bevy_asset/src/asset_server.rs b/crates/bevy_asset/src/asset_server.rs index 5bce00a438b94..fc41ba0c462d0 100644 --- a/crates/bevy_asset/src/asset_server.rs +++ b/crates/bevy_asset/src/asset_server.rs @@ -205,6 +205,7 @@ impl AssetServer { } LoadState::Failed => return LoadState::Failed, LoadState::NotLoaded => return LoadState::NotLoaded, + LoadState::Unloaded => return LoadState::Unloaded, }, HandleId::Id(_, _) => return LoadState::NotLoaded, } @@ -509,9 +510,7 @@ impl AssetServer { .get_or_insert_with(|| self.server.asset_sources.write()); if let Some(source_info) = asset_sources.get_mut(&id.source_path_id()) { source_info.committed_assets.remove(&id.label_id()); - if source_info.is_loaded() { - source_info.load_state = LoadState::Loaded; - } + source_info.load_state = LoadState::Unloaded; } } assets.remove(handle_id); @@ -750,13 +749,18 @@ mod test { asset_server.get_load_state(path.get_id()) ); + let load_asset = || { + let id = futures_lite::future::block_on(asset_server.load_async(path.clone(), true)) + .unwrap(); + asset_server.get_handle_untyped(id) + }; + // load the asset - let id = - futures_lite::future::block_on(asset_server.load_async(path.clone(), true)).unwrap(); - let handle = asset_server.get_handle_untyped(id); + let handle = load_asset(); + let weak_handle = handle.clone_weak(); // asset is loading - assert_eq!(LoadState::Loading, asset_server.get_load_state(id)); + assert_eq!(LoadState::Loading, asset_server.get_load_state(&handle)); // mimics one full frame let tick = |server: &AssetServer, assets: &mut Assets| { @@ -766,18 +770,28 @@ mod test { tick(&asset_server, &mut assets); // asset should exist and be loaded at this point - assert_eq!(LoadState::Loaded, asset_server.get_load_state(id)); + assert_eq!(LoadState::Loaded, asset_server.get_load_state(&handle)); assert!(assets.get(&handle).is_some()); // after dropping the handle, next call to `tick` will prepare the assets for removal. drop(handle); tick(&asset_server, &mut assets); - assert_eq!(LoadState::Loaded, asset_server.get_load_state(id)); - assert!(assets.get(id).is_some()); + assert_eq!(LoadState::Loaded, asset_server.get_load_state(&weak_handle)); + assert!(assets.get(&weak_handle).is_some()); // second call to tick will actually remove the asset. tick(&asset_server, &mut assets); - assert_eq!(LoadState::Loaded, asset_server.get_load_state(id)); // TODO: should this now show `LoadState::NotLoaded`? - assert!(assets.get(id).is_none()); + assert_eq!( + LoadState::Unloaded, + asset_server.get_load_state(&weak_handle) + ); + assert!(assets.get(&weak_handle).is_none()); + + // finally, reload the asset + let handle = load_asset(); + assert_eq!(LoadState::Loading, asset_server.get_load_state(&handle)); + tick(&asset_server, &mut assets); + assert_eq!(LoadState::Loaded, asset_server.get_load_state(&handle)); + assert!(assets.get(&handle).is_some()); } } diff --git a/crates/bevy_asset/src/info.rs b/crates/bevy_asset/src/info.rs index f781fa0eea66a..6005e92def189 100644 --- a/crates/bevy_asset/src/info.rs +++ b/crates/bevy_asset/src/info.rs @@ -41,8 +41,15 @@ impl SourceInfo { /// The load state of an asset #[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] pub enum LoadState { + /// The asset has not be loaded. NotLoaded, + /// The asset in the the process of loading. Loading, + /// The asset has loaded and is living inside an [`Assets`](crate::Assets) collection. Loaded, + /// The asset failed to load. Failed, + /// The asset was previously loaded, however all handles were dropped and + /// the asset was removed from the [`Assets`](crate::Assets) collection. + Unloaded, } From b1099cf28d789c8e6ed16047ea718dba14e2316c Mon Sep 17 00:00:00 2001 From: NathanW Date: Tue, 25 May 2021 20:41:43 -0600 Subject: [PATCH 4/8] remove tempfile glob import --- crates/bevy_asset/src/asset_server.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/bevy_asset/src/asset_server.rs b/crates/bevy_asset/src/asset_server.rs index fc41ba0c462d0..854824dc0dc59 100644 --- a/crates/bevy_asset/src/asset_server.rs +++ b/crates/bevy_asset/src/asset_server.rs @@ -539,7 +539,6 @@ mod test { use crate::loader::LoadedAsset; use bevy_reflect::TypeUuid; use bevy_utils::BoxedFuture; - use tempfile::*; #[derive(Debug, TypeUuid)] #[uuid = "a5189b72-0572-4290-a2e0-96f73a491c44"] @@ -682,8 +681,8 @@ mod test { assert_eq!(t.unwrap().extensions()[0], "test.png"); } - fn create_dir_and_file(file: impl AsRef) -> TempDir { - let asset_dir = tempdir().unwrap(); + fn create_dir_and_file(file: impl AsRef) -> tempfile::TempDir { + let asset_dir = tempfile::tempdir().unwrap(); std::fs::write(asset_dir.path().join(file), &[]).unwrap(); asset_dir } From bce6eb18b993976f29bd37e4fc6357e05908908d Mon Sep 17 00:00:00 2001 From: NathanW Date: Thu, 3 Jun 2021 13:59:53 -0600 Subject: [PATCH 5/8] remove adding loaders in AssetServer tests --- crates/bevy_asset/src/asset_server.rs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/crates/bevy_asset/src/asset_server.rs b/crates/bevy_asset/src/asset_server.rs index 854824dc0dc59..b243884636320 100644 --- a/crates/bevy_asset/src/asset_server.rs +++ b/crates/bevy_asset/src/asset_server.rs @@ -593,7 +593,7 @@ mod test { fn setup(asset_path: impl AsRef) -> AssetServer { use crate::FileAssetIo; - let asset_server = AssetServer { + AssetServer { server: Arc::new(AssetServerInternal { loaders: Default::default(), extension_to_loader_index: Default::default(), @@ -604,16 +604,14 @@ mod test { task_pool: Default::default(), asset_io: Box::new(FileAssetIo::new(asset_path)), }), - }; - asset_server.add_loader::(FakePngLoader); - asset_server.add_loader::(FailingLoader); - asset_server.add_loader::(FakeMultipleDotLoader); - asset_server + } } #[test] fn extensions() { let asset_server = setup("."); + asset_server.add_loader(FakePngLoader); + let t = asset_server.get_path_asset_loader("test.png"); assert_eq!(t.unwrap().extensions()[0], "png"); } @@ -621,6 +619,8 @@ mod test { #[test] fn case_insensitive_extensions() { let asset_server = setup("."); + asset_server.add_loader(FakePngLoader); + let t = asset_server.get_path_asset_loader("test.PNG"); assert_eq!(t.unwrap().extensions()[0], "png"); } @@ -670,6 +670,8 @@ mod test { #[test] fn filename_with_dots() { let asset_server = setup("."); + asset_server.add_loader(FakePngLoader); + let t = asset_server.get_path_asset_loader("test-v1.2.3.png"); assert_eq!(t.unwrap().extensions()[0], "png"); } @@ -677,6 +679,8 @@ mod test { #[test] fn multiple_extensions() { let asset_server = setup("."); + asset_server.add_loader(FakeMultipleDotLoader); + let t = asset_server.get_path_asset_loader("test.test.png"); assert_eq!(t.unwrap().extensions()[0], "test.png"); } @@ -710,6 +714,7 @@ mod test { #[test] fn test_invalid_asset_path() { let asset_server = setup("."); + asset_server.add_loader(FakePngLoader); let path: AssetPath = "an/invalid/path.png".into(); let handle = asset_server.get_handle_untyped(path.get_id()); @@ -725,6 +730,7 @@ mod test { fn test_failing_loader() { let dir = create_dir_and_file("fake.fail"); let asset_server = setup(dir.path()); + asset_server.add_loader(FailingLoader); let path: AssetPath = "fake.fail".into(); let handle = asset_server.get_handle_untyped(path.get_id()); @@ -740,6 +746,8 @@ mod test { fn test_asset_lifecycle() { let dir = create_dir_and_file("fake.png"); let asset_server = setup(dir.path()); + asset_server.add_loader(FakePngLoader); + let mut assets = asset_server.register_asset_type::(); let path: AssetPath = "fake.png".into(); From a7233d599bc0f181546469dccbe520591d2828ef Mon Sep 17 00:00:00 2001 From: NathanW Date: Thu, 3 Jun 2021 15:25:59 -0600 Subject: [PATCH 6/8] update test to work with new changes to update_asset_storage --- crates/bevy_asset/src/asset_server.rs | 100 +++++++++++++++++--------- 1 file changed, 67 insertions(+), 33 deletions(-) diff --git a/crates/bevy_asset/src/asset_server.rs b/crates/bevy_asset/src/asset_server.rs index b243884636320..4b2e328aa09b7 100644 --- a/crates/bevy_asset/src/asset_server.rs +++ b/crates/bevy_asset/src/asset_server.rs @@ -537,6 +537,7 @@ pub fn free_unused_assets_system(asset_server: Res) { mod test { use super::*; use crate::loader::LoadedAsset; + use bevy_ecs::prelude::*; use bevy_reflect::TypeUuid; use bevy_utils::BoxedFuture; @@ -747,58 +748,91 @@ mod test { let dir = create_dir_and_file("fake.png"); let asset_server = setup(dir.path()); asset_server.add_loader(FakePngLoader); + let assets = asset_server.register_asset_type::(); - let mut assets = asset_server.register_asset_type::(); + let mut world = World::new(); + world.insert_resource(assets); + world.insert_resource(asset_server); - let path: AssetPath = "fake.png".into(); - assert_eq!( - LoadState::NotLoaded, - asset_server.get_load_state(path.get_id()) - ); + let mut tick = { + fn free_unused_assets(asset_server: Res) { + free_unused_assets_system(asset_server); + } + + fn update_asset_storage( + asset_server: Res, + assets: ResMut>, + ) { + asset_server.update_asset_storage(assets); + } - let load_asset = || { + let mut free_unused_assets = free_unused_assets.system(); + free_unused_assets.initialize(&mut world); + let mut update_asset_storage = update_asset_storage.system(); + update_asset_storage.initialize(&mut world); + + move |world: &mut World| { + free_unused_assets.run((), world); + update_asset_storage.run((), world); + } + }; + + fn load_asset(path: AssetPath, world: &World) -> HandleUntyped { + let asset_server = world.get_resource::().unwrap(); let id = futures_lite::future::block_on(asset_server.load_async(path.clone(), true)) .unwrap(); asset_server.get_handle_untyped(id) - }; + } + + fn get_asset(id: impl Into, world: &World) -> Option<&PngAsset> { + world + .get_resource::>() + .unwrap() + .get(id.into()) + } + + fn get_load_state(id: impl Into, world: &World) -> LoadState { + world + .get_resource::() + .unwrap() + .get_load_state(id.into()) + } + + // --- + // Start of the actual lifecycle test + // --- + + let path: AssetPath = "fake.png".into(); + assert_eq!(LoadState::NotLoaded, get_load_state(path.get_id(), &world)); // load the asset - let handle = load_asset(); + let handle = load_asset(path.clone(), &world); let weak_handle = handle.clone_weak(); // asset is loading - assert_eq!(LoadState::Loading, asset_server.get_load_state(&handle)); - - // mimics one full frame - let tick = |server: &AssetServer, assets: &mut Assets| { - free_unused_assets_system_impl(server); - server.update_asset_storage(assets); - }; + assert_eq!(LoadState::Loading, get_load_state(&handle, &world)); - tick(&asset_server, &mut assets); + tick(&mut world); // asset should exist and be loaded at this point - assert_eq!(LoadState::Loaded, asset_server.get_load_state(&handle)); - assert!(assets.get(&handle).is_some()); + assert_eq!(LoadState::Loaded, get_load_state(&handle, &world)); + assert!(get_asset(&handle, &world).is_some()); // after dropping the handle, next call to `tick` will prepare the assets for removal. drop(handle); - tick(&asset_server, &mut assets); - assert_eq!(LoadState::Loaded, asset_server.get_load_state(&weak_handle)); - assert!(assets.get(&weak_handle).is_some()); + tick(&mut world); + assert_eq!(LoadState::Loaded, get_load_state(&weak_handle, &world)); + assert!(get_asset(&weak_handle, &world).is_some()); // second call to tick will actually remove the asset. - tick(&asset_server, &mut assets); - assert_eq!( - LoadState::Unloaded, - asset_server.get_load_state(&weak_handle) - ); - assert!(assets.get(&weak_handle).is_none()); + tick(&mut world); + assert_eq!(LoadState::Unloaded, get_load_state(&weak_handle, &world)); + assert!(get_asset(&weak_handle, &world).is_none()); // finally, reload the asset - let handle = load_asset(); - assert_eq!(LoadState::Loading, asset_server.get_load_state(&handle)); - tick(&asset_server, &mut assets); - assert_eq!(LoadState::Loaded, asset_server.get_load_state(&handle)); - assert!(assets.get(&handle).is_some()); + let handle = load_asset(path.clone(), &world); + assert_eq!(LoadState::Loading, get_load_state(&handle, &world)); + tick(&mut world); + assert_eq!(LoadState::Loaded, get_load_state(&handle, &world)); + assert!(get_asset(&handle, &world).is_some()); } } From a9614013b393386dcc9304cbe68eeb2a26a01572 Mon Sep 17 00:00:00 2001 From: NathanW Date: Mon, 7 Jun 2021 09:23:15 -0600 Subject: [PATCH 7/8] simplify tests --- crates/bevy_asset/src/asset_server.rs | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/crates/bevy_asset/src/asset_server.rs b/crates/bevy_asset/src/asset_server.rs index 4b2e328aa09b7..62058f1c18e96 100644 --- a/crates/bevy_asset/src/asset_server.rs +++ b/crates/bevy_asset/src/asset_server.rs @@ -536,7 +536,7 @@ pub fn free_unused_assets_system(asset_server: Res) { #[cfg(test)] mod test { use super::*; - use crate::loader::LoadedAsset; + use crate::{loader::LoadedAsset, update_asset_storage_system}; use bevy_ecs::prelude::*; use bevy_reflect::TypeUuid; use bevy_utils::BoxedFuture; @@ -755,25 +755,14 @@ mod test { world.insert_resource(asset_server); let mut tick = { - fn free_unused_assets(asset_server: Res) { - free_unused_assets_system(asset_server); - } - - fn update_asset_storage( - asset_server: Res, - assets: ResMut>, - ) { - asset_server.update_asset_storage(assets); - } - - let mut free_unused_assets = free_unused_assets.system(); - free_unused_assets.initialize(&mut world); - let mut update_asset_storage = update_asset_storage.system(); - update_asset_storage.initialize(&mut world); + let mut free_unused_assets_system = free_unused_assets_system.system(); + free_unused_assets_system.initialize(&mut world); + let mut update_asset_storage_system = update_asset_storage_system.system(); + update_asset_storage_system.initialize(&mut world); move |world: &mut World| { - free_unused_assets.run((), world); - update_asset_storage.run((), world); + free_unused_assets_system.run((), world); + update_asset_storage_system.run((), world); } }; From ce852cf88f4c962b7649bc4aefe7e299f11601d4 Mon Sep 17 00:00:00 2001 From: NathanW Date: Mon, 7 Jun 2021 09:27:10 -0600 Subject: [PATCH 8/8] fix missing function type --- crates/bevy_asset/src/asset_server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_asset/src/asset_server.rs b/crates/bevy_asset/src/asset_server.rs index 62058f1c18e96..f83002e594212 100644 --- a/crates/bevy_asset/src/asset_server.rs +++ b/crates/bevy_asset/src/asset_server.rs @@ -757,7 +757,7 @@ mod test { let mut tick = { let mut free_unused_assets_system = free_unused_assets_system.system(); free_unused_assets_system.initialize(&mut world); - let mut update_asset_storage_system = update_asset_storage_system.system(); + let mut update_asset_storage_system = update_asset_storage_system::.system(); update_asset_storage_system.initialize(&mut world); move |world: &mut World| {