shipyard 0.11.2

Entity Component System
Documentation
use shipyard::*;

#[allow(unused)]
struct U32(u32);
impl Component for U32 {
    type Tracking = track::Untracked;
}

#[test]
fn alive() {
    let mut world = World::new();
    world.add_entity((U32(0),));
    let entity = world.add_entity((U32(1),));
    world.add_entity((U32(2),));

    let mut entities = world.borrow::<EntitiesViewMut>().unwrap();

    assert!(entities.spawn(entity));

    assert!(entities.is_alive(entity));
}

#[test]
fn single_dead() {
    let mut world = World::new();
    world.add_entity((U32(0),));
    let entity = world.add_entity((U32(1),));
    world.add_entity((U32(2),));

    world.delete_entity(entity);

    let mut entities = world.borrow::<EntitiesViewMut>().unwrap();

    assert!(entities.spawn(entity));

    assert!(entities.is_alive(entity));
}

#[cfg(feature = "serde1")]
#[test]
fn multiple_dead_first() {
    let mut world = World::new();
    let entity0 = world.add_entity((U32(0),));
    let entity1 = world.add_entity((U32(1),));
    let entity2 = world.add_entity((U32(2),));

    world.delete_entity(entity1);
    world.delete_entity(entity0);
    world.delete_entity(entity2);

    let mut entities = world.borrow::<EntitiesViewMut>().unwrap();

    assert!(entities.spawn(entity1));

    assert!(entities.is_alive(entity1));
    assert!(!entities.is_alive(entity0));
    assert!(!entities.is_alive(entity2));

    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(entity0.index(), 1)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(entity2.index(), 1)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(3, 0)
    );
}

#[cfg(feature = "serde1")]
#[test]
fn multiple_dead_middle() {
    let mut world = World::new();
    let entity0 = world.add_entity((U32(0),));
    let entity1 = world.add_entity((U32(1),));
    let entity2 = world.add_entity((U32(2),));

    world.delete_entity(entity0);
    world.delete_entity(entity1);
    world.delete_entity(entity2);

    let mut entities = world.borrow::<EntitiesViewMut>().unwrap();

    assert!(entities.spawn(entity1));

    assert!(entities.is_alive(entity1));
    assert!(!entities.is_alive(entity0));
    assert!(!entities.is_alive(entity2));

    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(entity0.index(), 1)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(entity2.index(), 1)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(3, 0)
    );
}

#[cfg(feature = "serde1")]
#[test]
fn multiple_dead_last() {
    let mut world = World::new();
    let entity0 = world.add_entity((U32(0),));
    let entity1 = world.add_entity((U32(1),));
    let entity2 = world.add_entity((U32(2),));

    world.delete_entity(entity0);
    world.delete_entity(entity2);
    world.delete_entity(entity1);

    let mut entities = world.borrow::<EntitiesViewMut>().unwrap();

    assert!(entities.spawn(entity1));

    assert!(entities.is_alive(entity1));
    assert!(!entities.is_alive(entity0));
    assert!(!entities.is_alive(entity2));

    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(entity0.index(), 1)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(entity2.index(), 1)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(3, 0)
    );
}

#[cfg(feature = "serde1")]
#[test]
fn new_world_empty() {
    let world = World::new();
    let entity = EntityId::new_from_index_and_gen(3, 0);

    let mut entities = world.borrow::<EntitiesViewMut>().unwrap();

    assert!(entities.spawn(entity));

    assert!(entities.is_alive(entity));

    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(0, 0)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(1, 0)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(2, 0)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(4, 0)
    );
}

#[cfg(feature = "serde1")]
#[test]
fn new_world() {
    let mut world = World::new();
    let entity = EntityId::new_from_index_and_gen(5, 0);

    let entity0 = world.add_entity((U32(0),));
    let entity1 = world.add_entity((U32(1),));
    let entity2 = world.add_entity((U32(2),));

    world.delete_entity(entity0);
    world.delete_entity(entity1);
    world.delete_entity(entity2);

    let mut entities = world.borrow::<EntitiesViewMut>().unwrap();

    assert!(entities.spawn(entity));

    assert!(entities.is_alive(entity));

    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(0, 1)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(1, 1)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(2, 1)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(3, 0)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(4, 0)
    );
    assert_eq!(
        entities.add_entity((), ()),
        EntityId::new_from_index_and_gen(6, 0)
    );
}