Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions crates/bevy_app/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1568,12 +1568,15 @@ mod tests {
#[derive(ScheduleLabel, Hash, Clone, PartialEq, Eq, Debug)]
struct EnterMainMenu;

#[derive(Component)]
struct A;

fn bar(mut commands: Commands) {
commands.spawn_empty();
commands.spawn(A);
}

fn foo(mut commands: Commands) {
commands.spawn_empty();
commands.spawn(A);
}

#[test]
Expand All @@ -1582,7 +1585,7 @@ mod tests {
app.add_systems(EnterMainMenu, (foo, bar));

app.world_mut().run_schedule(EnterMainMenu);
assert_eq!(app.world().entity_count(), 2);
assert_eq!(app.world_mut().query::<&A>().query(app.world()).count(), 2);
}

#[test]
Expand Down
8 changes: 5 additions & 3 deletions crates/bevy_ecs/src/entity_disabling.rs
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,10 @@ mod tests {

use super::*;
use crate::{
observer::Observer,
prelude::{Add, EntityMut, EntityRef, On, World},
query::{Has, With},
system::SystemIdMarker,
};
use alloc::{vec, vec::Vec};

Expand Down Expand Up @@ -355,15 +357,15 @@ mod tests {
world.register_system(|| {});
let mut query = world.query::<()>();
assert_eq!(query.iter(&world).count(), 0);
let mut query = world.query_filtered::<(), With<Internal>>();
let mut query = world.query_filtered::<&SystemIdMarker, With<Internal>>();
assert_eq!(query.iter(&world).count(), 1);

#[derive(Component)]
struct A;
world.add_observer(|_: On<Add, A>| {});
let mut query = world.query::<()>();
assert_eq!(query.iter(&world).count(), 0);
let mut query = world.query_filtered::<(), With<Internal>>();
assert_eq!(query.iter(&world).count(), 2);
let mut query = world.query_filtered::<&Observer, With<Internal>>();
assert_eq!(query.iter(&world).count(), 1);
}
}
21 changes: 11 additions & 10 deletions crates/bevy_ecs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -390,9 +390,9 @@ mod tests {
let mut world = World::new();
let e = world.spawn((TableStored("abc"), A(123))).id();
let f = world.spawn((TableStored("def"), A(456))).id();
assert_eq!(world.entities.len(), 2);
assert_eq!(world.query::<&TableStored>().query(&world).count(), 2);
assert!(world.despawn(e));
assert_eq!(world.entities.len(), 1);
assert_eq!(world.query::<&TableStored>().query(&world).count(), 1);
assert!(world.get::<TableStored>(e).is_none());
assert!(world.get::<A>(e).is_none());
assert_eq!(world.get::<TableStored>(f).unwrap().0, "def");
Expand All @@ -405,9 +405,9 @@ mod tests {

let e = world.spawn((TableStored("abc"), SparseStored(123))).id();
let f = world.spawn((TableStored("def"), SparseStored(456))).id();
assert_eq!(world.entities.len(), 2);
assert_eq!(world.query::<&TableStored>().query(&world).count(), 2);
assert!(world.despawn(e));
assert_eq!(world.entities.len(), 1);
assert_eq!(world.query::<&TableStored>().query(&world).count(), 1);
assert!(world.get::<TableStored>(e).is_none());
assert!(world.get::<SparseStored>(e).is_none());
assert_eq!(world.get::<TableStored>(f).unwrap().0, "def");
Expand Down Expand Up @@ -1647,25 +1647,26 @@ mod tests {

let mut q1 = world.query::<&A>();
let mut q2 = world.query::<&SparseStored>();
let mut q3 = world.query::<()>();

assert_eq!(q1.iter(&world).len(), 1);
assert_eq!(q2.iter(&world).len(), 1);
assert_eq!(world.entity_count(), 2);
assert_eq!(q1.query(&world).count(), 1);
assert_eq!(q2.query(&world).count(), 1);
assert_eq!(q3.query(&world).count(), 2);

world.clear_entities();

assert_eq!(
q1.iter(&world).len(),
q1.query(&world).count(),
0,
"world should not contain table components"
);
assert_eq!(
q2.iter(&world).len(),
q2.query(&world).count(),
0,
"world should not contain sparse set components"
);
assert_eq!(
world.entity_count(),
q3.query(&world).count(),
0,
"world should not have any entities"
);
Expand Down
14 changes: 11 additions & 3 deletions crates/bevy_ecs/src/observer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -500,9 +500,10 @@ mod tests {
use bevy_platform::collections::HashMap;
use bevy_ptr::OwningPtr;

use crate::component::ComponentId;
use crate::{
change_detection::MaybeLocation,
component::ComponentId,
entity_disabling::Internal,
observer::{Observer, Replace},
prelude::*,
traversal::Traversal,
Expand Down Expand Up @@ -716,8 +717,15 @@ mod tests {

world.spawn(A).flush();
assert_eq!(vec!["add_2", "add_1"], world.resource::<Order>().0);
// Our A entity plus our two observers
assert_eq!(world.entity_count(), 3);
// we have one A entity and two observers
assert_eq!(world.query::<&A>().query(&world).count(), 1);
assert_eq!(
world
.query_filtered::<&Observer, Allows<Internal>>()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Huh, it's unfortunate that we need Allows<Internal> in order to query Observer. As a follow-up, we may want to consider expanding the rule for allowing filters to account for required components so that mentioning Observer disables the Internal filter. I don't know whether it's possible to do that efficiently, though.

.query(&world)
.count(),
2
);
}

#[test]
Expand Down
18 changes: 7 additions & 11 deletions crates/bevy_ecs/src/query/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2172,9 +2172,7 @@ mod tests {
world.spawn((B(0), C(0)));
world.spawn(C(0));

let mut df = DefaultQueryFilters::empty();
df.register_disabling_component(world.register_component::<C>());
world.insert_resource(df);
world.register_disabling_component::<C>();

// Without<C> only matches the first entity
let mut query = QueryState::<()>::new(&mut world);
Expand Down Expand Up @@ -2214,30 +2212,28 @@ mod tests {
let mut query = QueryState::<()>::new(&mut world);
// There are no sparse components involved thus the query is dense
assert!(query.is_dense);
assert_eq!(3, query.iter(&world).count());
assert_eq!(3, query.query(&world).count());

let mut df = DefaultQueryFilters::empty();
df.register_disabling_component(world.register_component::<Sparse>());
world.insert_resource(df);
world.register_disabling_component::<Sparse>();

let mut query = QueryState::<()>::new(&mut world);
// The query doesn't ask for sparse components, but the default filters adds
// a sparse components thus it is NOT dense
assert!(!query.is_dense);
assert_eq!(1, query.iter(&world).count());
assert_eq!(1, query.query(&world).count());

let mut df = DefaultQueryFilters::empty();
let mut df = DefaultQueryFilters::from_world(&mut world);
df.register_disabling_component(world.register_component::<Table>());
world.insert_resource(df);

let mut query = QueryState::<()>::new(&mut world);
// If the filter is instead a table components, the query can still be dense
assert!(query.is_dense);
assert_eq!(1, query.iter(&world).count());
assert_eq!(1, query.query(&world).count());

let mut query = QueryState::<&Sparse>::new(&mut world);
// But only if the original query was dense
assert!(!query.is_dense);
assert_eq!(1, query.iter(&world).count());
assert_eq!(1, query.query(&world).count());
}
}
2 changes: 1 addition & 1 deletion crates/bevy_ecs/src/system/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2503,7 +2503,7 @@ mod tests {
.spawn((W(1u32), W(2u64)))
.id();
command_queue.apply(&mut world);
assert_eq!(world.entity_count(), 1);
assert_eq!(world.query::<&W<u32>>().query(&world).count(), 1);
let results = world
.query::<(&W<u32>, &W<u64>)>()
.iter(&world)
Expand Down
9 changes: 6 additions & 3 deletions crates/bevy_ecs/src/system/system.rs
Original file line number Diff line number Diff line change
Expand Up @@ -494,16 +494,19 @@ mod tests {
assert_eq!(*world.resource::<Counter>(), Counter(2));
}

#[derive(Component)]
struct A;

fn spawn_entity(mut commands: Commands) {
commands.spawn_empty();
commands.spawn(A);
}

#[test]
fn command_processing() {
let mut world = World::new();
assert_eq!(world.entities.len(), 0);
assert_eq!(world.query::<&A>().query(&world).count(), 0);
world.run_system_once(spawn_entity).unwrap();
assert_eq!(world.entities.len(), 1);
assert_eq!(world.query::<&A>().query(&world).count(), 1);
}

#[test]
Expand Down
13 changes: 8 additions & 5 deletions crates/bevy_ecs/src/world/command_queue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ impl SystemBuffer for CommandQueue {
#[cfg(test)]
mod test {
use super::*;
use crate::resource::Resource;
use crate::{component::Component, resource::Resource};
use alloc::{borrow::ToOwned, string::String, sync::Arc};
use core::{
panic::AssertUnwindSafe,
Expand Down Expand Up @@ -405,11 +405,14 @@ mod test {
assert_eq!(drops_b.load(Ordering::Relaxed), 1);
}

#[derive(Component)]
struct A;

struct SpawnCommand;

impl Command for SpawnCommand {
fn apply(self, world: &mut World) {
world.spawn_empty();
world.spawn(A);
}
}

Expand All @@ -423,12 +426,12 @@ mod test {
let mut world = World::new();
queue.apply(&mut world);

assert_eq!(world.entity_count(), 2);
assert_eq!(world.query::<&A>().query(&world).count(), 2);

// The previous call to `apply` cleared the queue.
// This call should do nothing.
queue.apply(&mut world);
assert_eq!(world.entity_count(), 2);
assert_eq!(world.query::<&A>().query(&world).count(), 2);
}

#[expect(
Expand Down Expand Up @@ -462,7 +465,7 @@ mod test {
queue.push(SpawnCommand);
queue.push(SpawnCommand);
queue.apply(&mut world);
assert_eq!(world.entity_count(), 3);
assert_eq!(world.query::<&A>().query(&world).count(), 3);
}

#[test]
Expand Down
8 changes: 0 additions & 8 deletions crates/bevy_ecs/src/world/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,14 +216,6 @@ impl World {
&mut self.entities
}

/// Retrieves the number of [`Entities`] in the world.
///
/// This is helpful as a diagnostic, but it can also be used effectively in tests.
#[inline]
pub fn entity_count(&self) -> u32 {
self.entities.len()
}

/// Retrieves this world's [`Archetypes`] collection.
#[inline]
pub fn archetypes(&self) -> &Archetypes {
Expand Down
Loading