diff --git a/crates/bevy_ecs/hecs/src/query_one.rs b/crates/bevy_ecs/hecs/src/query_one.rs index cd355fb3bf278..ae7c330bbd2c9 100644 --- a/crates/bevy_ecs/hecs/src/query_one.rs +++ b/crates/bevy_ecs/hecs/src/query_one.rs @@ -37,7 +37,11 @@ impl<'a, Q: Query> QueryOne<'a, Q> { pub fn get(&mut self) -> Option<>::Item> { unsafe { let mut fetch = Q::Fetch::get(self.archetype, self.index)?; - Some(fetch.next()) + if fetch.should_skip() { + None + } else { + Some(fetch.next()) + } } } @@ -104,7 +108,11 @@ where { unsafe { let mut fetch = Q::Fetch::get(self.archetype, self.index)?; - Some(fetch.next()) + if fetch.should_skip() { + None + } else { + Some(fetch.next()) + } } } diff --git a/crates/bevy_ecs/hecs/tests/tests.rs b/crates/bevy_ecs/hecs/tests/tests.rs index f3911cb0dfb27..773f9d4c84ca4 100644 --- a/crates/bevy_ecs/hecs/tests/tests.rs +++ b/crates/bevy_ecs/hecs/tests/tests.rs @@ -365,3 +365,35 @@ fn remove_tracking() { "world clears result in 'removed component' states" ); } + +#[test] +fn added_tracking() { + let mut world = World::new(); + let a = world.spawn((123,)); + + assert_eq!(world.query::<&i32>().iter().count(), 1); + assert_eq!(world.query::>().iter().count(), 1); + assert_eq!(world.query_mut::<&i32>().iter().count(), 1); + assert_eq!(world.query_mut::>().iter().count(), 1); + assert!(world.query_one::<&i32>(a).unwrap().get().is_some()); + assert!(world.query_one::>(a).unwrap().get().is_some()); + assert!(world.query_one_mut::<&i32>(a).unwrap().get().is_some()); + assert!(world + .query_one_mut::>(a) + .unwrap() + .get() + .is_some()); + + world.clear_trackers(); + + assert_eq!(world.query::<&i32>().iter().count(), 1); + assert_eq!(world.query::>().iter().count(), 0); + assert_eq!(world.query_mut::<&i32>().iter().count(), 1); + assert_eq!(world.query_mut::>().iter().count(), 0); + assert!(world.query_one_mut::<&i32>(a).unwrap().get().is_some()); + assert!(world + .query_one_mut::>(a) + .unwrap() + .get() + .is_none()); +}