sparsey 0.13.3

Entity Component System based on sparse sets
Documentation
mod common;

use common::*;
use sparsey::entity::Entity;
use sparsey::query::Query;
use sparsey::World;
use std::collections::HashSet;
use std::iter::FromIterator;

#[test]
fn test_sparse() {
    let mut world = World::builder()
        .register::<A>()
        .register::<B>()
        .register::<C>()
        .register::<D>()
        .build();

    let e0 = world.create((A(0), B(0)));
    let e1 = world.create((A(1), B(1), C(1)));
    let e2 = world.create((A(2), B(2), C(2), D(2)));

    let world = &mut world;
    test_iter::<(&A, &B), ()>(world, false, &[e0, e1, e2]);
    test_iter::<(&A, &B, &C), ()>(world, false, &[e1, e2]);
    test_iter::<(&A, &B, &C, &D), ()>(world, false, &[e2]);
    test_iter::<(&A, &B), &C>(world, false, &[e0]);
    test_iter::<(&A, &B, &C), &D>(world, false, &[e1]);
}

#[test]
fn test_dense() {
    let mut world = World::builder()
        .add_group::<(A, B)>()
        .add_group::<(A, B, C)>()
        .add_group::<(A, B, C, D)>()
        .build();

    let e0 = world.create((A(0), B(0)));
    let e1 = world.create((A(1), B(1), C(1)));
    let e2 = world.create((A(2), B(2), C(2), D(2)));

    let world = &mut world;
    test_iter::<(&A, &B), ()>(world, true, &[e0, e1, e2]);
    test_iter::<(&A, &B, &C), ()>(world, true, &[e1, e2]);
    test_iter::<(&A, &B, &C, &D), ()>(world, true, &[e2]);
    test_iter::<(&A, &B), &C>(world, true, &[e0]);
    test_iter::<(&A, &B, &C), &D>(world, true, &[e1]);
}

#[track_caller]
fn test_iter<I, E>(world: &World, is_dense: bool, expected_entities: &[Entity])
where
    I: Query,
    E: Query,
{
    let mut query = world.query_all::<Entity>().include::<I>().exclude::<E>();

    let iter = query.iter();
    assert_eq!(iter.is_dense(), is_dense);

    let entities = iter.collect::<HashSet<_>>();
    assert_eq!(
        entities,
        HashSet::from_iter(expected_entities.iter().copied()),
    );
}