froql 0.1.0

an in memory query dsl
Documentation
use froql::{
    component::{EXCLUSIVE, SYMMETRIC},
    query,
    world::World,
};

#[test]
fn scenario_marriage() {
    #[derive(Debug)]
    #[allow(unused)]
    struct Person(usize);
    enum Spouse {}

    let mut world = World::new();
    world.register_component::<Person>();
    world.register_relation_flags::<Spouse>(SYMMETRIC | EXCLUSIVE);

    for i in 0..5 {
        world.create().add(Person(i));
    }

    while let Some((first,)) = {
        world.process();
        query!(world, &this, _ Person, !Spouse(this, _)).next()
    } {
        if let Some((second,)) =
            query!(world, &this, _ Person, !Spouse(this, _), this != *first).next()
        {
            second.relate_to::<Spouse>(first.entity);
        } else {
            break;
        }
    }
    world.process();

    let mut married_count = 0;
    for (a, b) in query!(world, Person(a), Person(b), Spouse(a, b)) {
        println!("{a:?} is married to {b:?}");
        married_count += 1;
    }
    assert_eq!(4, married_count);

    for (person,) in query!(world, Person, !Spouse(this, _)) {
        println!("{person:?} is not married");
    }
}

#[test]
fn deferred_creation_simple() {
    let mut world = World::new();
    let e = world.create_deferred().entity;
    dbg!(&e);
    assert!(!world.is_alive(e));
    world.process();
    assert!(world.is_alive(e));
}

#[test]
fn deferred_creation_using_freelist() {
    let mut world = World::new();
    for _ in 0..5 {
        world.create_entity();
    }
    let a = world.create_entity();
    let b = world.create_entity();
    let c = world.create_entity();
    world.destroy(a);
    world.destroy(b);
    world.destroy(c);

    let c_new = world.create_deferred().entity;
    let b_new = world.create_deferred().entity;
    world.create_deferred();
    world.create_deferred();

    assert!(!world.is_alive(c));
    assert!(!world.is_alive(c_new));
    assert_eq!(c_new.id, c.id);
    assert_ne!(c_new.generation, c.generation);

    assert!(!world.is_alive(b));
    assert!(!world.is_alive(b_new));
    assert_eq!(b_new.id, b.id);
    assert_ne!(b_new.generation, b.generation);

    world.process();
    assert!(!world.is_alive(b));
    assert!(!world.is_alive(c));
    assert!(world.is_alive(b_new));
    assert!(world.is_alive(c_new));
}

#[test]
fn deferred_creation_realised_by_undeferred() {
    let mut world = World::new();
    let e = world.create_deferred().entity;
    assert!(!world.is_alive(e));
    let a = world.create_entity();
    assert!(world.is_alive(e));

    let e = world.create_deferred().entity;
    assert!(!world.is_alive(e));
    world.destroy(a);
    assert!(world.is_alive(e));
}