summaryrefslogtreecommitdiff
path: root/ecs/tests/query.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ecs/tests/query.rs')
-rw-r--r--ecs/tests/query.rs139
1 files changed, 108 insertions, 31 deletions
diff --git a/ecs/tests/query.rs b/ecs/tests/query.rs
index 79dfe85..fa36689 100644
--- a/ecs/tests/query.rs
+++ b/ecs/tests/query.rs
@@ -1,7 +1,11 @@
use ecs::component::Component;
-use ecs::query::TermSequence as QueryTermSequence;
+use ecs::query::term::Without;
+use ecs::query::{
+ TermWithFieldTuple as QueryTermWithFieldTuple,
+ TermWithoutFieldTuple as QueryTermWithoutFieldTuple,
+};
use ecs::uid::Uid;
-use ecs::{Component, World};
+use ecs::{Component, Query, World};
use parking_lot::{Mutex, Once};
pub static SETUP: Once = Once::new();
@@ -42,26 +46,26 @@ fn setup()
});
}
-fn assert_query_finds_ents<QueryTerms>(world: &World, mut expected_ent_ids: Vec<Uid>)
-where
- QueryTerms: QueryTermSequence,
+fn assert_query_finds_ents<QueryFieldTerms, QueryFieldlessTerms>(
+ query: Query<'_, QueryFieldTerms, QueryFieldlessTerms>,
+ mut expected_ent_ids: Vec<Uid>,
+) where
+ QueryFieldTerms: QueryTermWithFieldTuple,
+ QueryFieldlessTerms: QueryTermWithoutFieldTuple,
{
assert!(
- world
- .query::<QueryTerms, ()>()
- .iter_with_euids()
- .all(|(ent_id, _)| {
- let Some(index) = expected_ent_ids
- .iter()
- .position(|expected_id| *expected_id == ent_id)
- else {
- return false;
- };
-
- expected_ent_ids.remove(index);
-
- true
- }),
+ query.iter_with_euids().all(|(ent_id, _)| {
+ let Some(index) = expected_ent_ids
+ .iter()
+ .position(|expected_id| *expected_id == ent_id)
+ else {
+ return false;
+ };
+
+ expected_ent_ids.remove(index);
+
+ true
+ }),
"Unexpected entity was found. Expected entities left: {expected_ent_ids:?}"
);
@@ -90,8 +94,8 @@ fn query_archetype_exists_with_edges_to_next_archetypes()
let ent_3_id = world.create_entity((A, B, C, E));
let ent_4_id = world.create_entity((A, B, C, G, F));
- assert_query_finds_ents::<(&A, &B, &C)>(
- &world,
+ assert_query_finds_ents(
+ world.query::<(&A, &B, &C), ()>(),
vec![ent_1_id, ent_2_id, ent_3_id, ent_4_id],
);
}
@@ -109,7 +113,7 @@ fn query_archetype_exists_with_2_comps_diff_to_next_archetype()
let ent_2_id = world.create_entity((A, B, F));
- assert_query_finds_ents::<(&A, &B, &F)>(&world, vec![ent_1_id, ent_2_id]);
+ assert_query_finds_ents(world.query::<(&A, &B, &F), ()>(), vec![ent_1_id, ent_2_id]);
}
#[test]
@@ -125,7 +129,7 @@ fn query_archetype_exists_with_2_comps_diff_to_next_archetype_rev()
let ent_2_id = world.create_entity((A, B, C, D, F));
- assert_query_finds_ents::<(&A, &B, &F)>(&world, vec![ent_1_id, ent_2_id]);
+ assert_query_finds_ents(world.query::<(&A, &B, &F), ()>(), vec![ent_1_id, ent_2_id]);
}
#[test]
@@ -141,7 +145,7 @@ fn query_archetype_exists_with_3_comps_diff_to_next_archetype()
let ent_2_id = world.create_entity((A, B, F));
- assert_query_finds_ents::<(&A, &B, &F)>(&world, vec![ent_1_id, ent_2_id]);
+ assert_query_finds_ents(world.query::<(&A, &B, &F), ()>(), vec![ent_1_id, ent_2_id]);
}
#[test]
@@ -157,7 +161,7 @@ fn query_archetype_exists_with_3_comps_diff_to_next_archetype_rev()
let ent_2_id = world.create_entity((A, B, C, D, E, F));
- assert_query_finds_ents::<(&A, &B, &F)>(&world, vec![ent_1_id, ent_2_id]);
+ assert_query_finds_ents(world.query::<(&A, &B, &F), ()>(), vec![ent_1_id, ent_2_id]);
}
#[test]
@@ -173,7 +177,7 @@ fn query_archetype_exists_with_4_comps_diff_to_next_archetype()
let ent_2_id = world.create_entity((A, B, G));
- assert_query_finds_ents::<(&A, &B, &G)>(&world, vec![ent_1_id, ent_2_id]);
+ assert_query_finds_ents(world.query::<(&A, &B, &G), ()>(), vec![ent_1_id, ent_2_id]);
}
#[test]
@@ -189,7 +193,7 @@ fn query_archetype_exists_with_4_comps_diff_to_next_archetype_rev()
let ent_2_id = world.create_entity((A, B, C, D, E, F, G));
- assert_query_finds_ents::<(&A, &B, &G)>(&world, vec![ent_1_id, ent_2_id]);
+ assert_query_finds_ents(world.query::<(&A, &B, &G), ()>(), vec![ent_1_id, ent_2_id]);
}
#[test]
@@ -205,7 +209,10 @@ fn query_archetype_exists_with_4_comps_diff_to_next_archetype_and_opt_comp()
let ent_2_id = world.create_entity((A, B, G));
- assert_query_finds_ents::<(&A, &Option<E>, &G)>(&world, vec![ent_1_id, ent_2_id]);
+ assert_query_finds_ents(
+ world.query::<(&A, &Option<E>, &G), ()>(),
+ vec![ent_1_id, ent_2_id],
+ );
}
#[test]
@@ -224,7 +231,7 @@ fn query_archetype_nonexistant()
world.create_entity((A, B, C, G, F));
- assert_query_finds_ents::<(&A, &E)>(&world, vec![ent_2_id, ent_3_id]);
+ assert_query_finds_ents(world.query::<(&A, &E), ()>(), vec![ent_2_id, ent_3_id]);
}
#[test]
@@ -241,5 +248,75 @@ fn query_archetype_nonexistant_and_opt_comp()
let ent_3_id = world.create_entity((A, B, C, E));
world.create_entity((A, B, C, G, F));
- assert_query_finds_ents::<(&A, &E, &Option<D>)>(&world, vec![ent_2_id, ent_3_id]);
+ assert_query_finds_ents(
+ world.query::<(&A, &E, &Option<D>), ()>(),
+ vec![ent_2_id, ent_3_id],
+ );
+}
+
+#[test]
+fn query_without_comp_and_archetype_exists()
+{
+ setup();
+
+ let _test_lock = TEST_LOCK.lock();
+
+ let mut world = World::new();
+
+ let ent_1_id = world.create_entity((A, B, C));
+
+ world.create_entity((A, B, C, E));
+ world.create_entity((A, B, C, F, E));
+
+ let ent_2_id = world.create_entity((A, B, C, G));
+ let ent_3_id = world.create_entity((A, B, C, G, F));
+
+ assert_query_finds_ents(
+ world.query::<(&A, &B, &C), (Without<E>,)>(),
+ vec![ent_1_id, ent_2_id, ent_3_id],
+ );
+}
+
+#[test]
+fn query_without_required_comp_and_archetype_exists()
+{
+ setup();
+
+ let _test_lock = TEST_LOCK.lock();
+
+ let mut world = World::new();
+
+ world.create_entity((A, B, C));
+
+ world.create_entity((A, B, C, E));
+ world.create_entity((A, B, C, F, E));
+
+ world.create_entity((A, B, C, G));
+ world.create_entity((A, B, C, G, F));
+
+ assert_query_finds_ents(world.query::<(&A, &B), (Without<B>,)>(), vec![]);
+}
+
+#[test]
+fn query_without_comp_and_archetype_nonexistant()
+{
+ setup();
+
+ let _test_lock = TEST_LOCK.lock();
+
+ let mut world = World::new();
+
+ world.create_entity((A, B, C));
+
+ let ent_1_id = world.create_entity((A, B, C, E));
+
+ world.create_entity((A, B, C, F, E));
+
+ let ent_2_id = world.create_entity((A, B, C, G, E));
+ world.create_entity((A, B, C, G, F, E));
+
+ assert_query_finds_ents(
+ world.query::<(&A, &E), (Without<F>,)>(),
+ vec![ent_1_id, ent_2_id],
+ );
}