diff options
author | HampusM <hampus@hampusmat.com> | 2025-03-21 20:05:53 +0100 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2025-03-22 15:16:01 +0100 |
commit | fe62665b1d62d36ee0839e6bf24e3841ea667da9 (patch) | |
tree | 0533941d2cbbe5bf0a1995a33f05bca37da949fd /ecs/tests/query.rs | |
parent | 76e7e612e7b516bf52b508ae5bb367b1ddc3babc (diff) |
refactor(ecs): replace query options with fieldless terms
Diffstat (limited to 'ecs/tests/query.rs')
-rw-r--r-- | ecs/tests/query.rs | 139 |
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], + ); } |