mirror of
https://github.com/bevyengine/bevy
synced 2024-11-22 12:43:34 +00:00
Add a test asserting that reflected cloning a Handle increments strong count (#13961)
# Objective Closes #5943. Seems like Assets v2 solved this one. ## Solution Added a test to confirm that using `Reflect::clone_value` and then `FromReflect::from_reflect` on a `Handle<T>` both increment the strong count. ## Testing A new test was added to confirm behavior. --------- Co-authored-by: Gino Valente <49806985+MrGVSV@users.noreply.github.com>
This commit is contained in:
parent
87fa69bd7e
commit
3a82d6784b
1 changed files with 52 additions and 0 deletions
|
@ -619,4 +619,56 @@ mod tests {
|
||||||
assert_eq!(typed, Handle::try_from(untyped.clone()).unwrap());
|
assert_eq!(typed, Handle::try_from(untyped.clone()).unwrap());
|
||||||
assert_eq!(UntypedHandle::from(typed.clone()), untyped);
|
assert_eq!(UntypedHandle::from(typed.clone()), untyped);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `Reflect::clone_value` should increase the strong count of a strong handle
|
||||||
|
#[test]
|
||||||
|
fn strong_handle_reflect_clone() {
|
||||||
|
use crate::{AssetApp, AssetPlugin, Assets, VisitAssetDependencies};
|
||||||
|
use bevy_app::App;
|
||||||
|
use bevy_reflect::FromReflect;
|
||||||
|
|
||||||
|
#[derive(Reflect)]
|
||||||
|
struct MyAsset {
|
||||||
|
value: u32,
|
||||||
|
}
|
||||||
|
impl Asset for MyAsset {}
|
||||||
|
impl VisitAssetDependencies for MyAsset {
|
||||||
|
fn visit_dependencies(&self, _visit: &mut impl FnMut(UntypedAssetId)) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut app = App::new();
|
||||||
|
app.add_plugins(AssetPlugin::default())
|
||||||
|
.init_asset::<MyAsset>();
|
||||||
|
let mut assets = app.world_mut().resource_mut::<Assets<MyAsset>>();
|
||||||
|
|
||||||
|
let handle: Handle<MyAsset> = assets.add(MyAsset { value: 1 });
|
||||||
|
match &handle {
|
||||||
|
Handle::Strong(strong) => {
|
||||||
|
assert_eq!(
|
||||||
|
Arc::strong_count(strong),
|
||||||
|
1,
|
||||||
|
"Inserting the asset should result in a strong count of 1"
|
||||||
|
);
|
||||||
|
|
||||||
|
let reflected: &dyn Reflect = &handle;
|
||||||
|
let cloned_handle: Box<dyn Reflect> = reflected.clone_value();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
Arc::strong_count(strong),
|
||||||
|
2,
|
||||||
|
"Cloning the handle with reflect should increase the strong count to 2"
|
||||||
|
);
|
||||||
|
|
||||||
|
let from_reflect_handle: Handle<MyAsset> =
|
||||||
|
FromReflect::from_reflect(&*cloned_handle).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(Arc::strong_count(strong), 3, "Converting the reflected value back to a handle should increase the strong count to 3");
|
||||||
|
assert!(
|
||||||
|
from_reflect_handle.is_strong(),
|
||||||
|
"The cloned handle should still be strong"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => panic!("Expected a strong handle"),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue