shipyard 0.11.2

Entity Component System
Documentation
use shipyard::advanced::Mut;
use shipyard::*;

#[test]
fn type_check() {
    #[derive(Debug, PartialEq)]
    struct Life(f32);
    impl Component for Life {
        type Tracking = track::Untracked;
    }

    #[derive(Debug, PartialEq)]
    struct Energy(f32);
    impl Component for Energy {
        type Tracking = track::Untracked;
    }

    let world = World::new();

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

    let mut vm_energy = world.borrow::<ViewMut<Energy>>().unwrap();

    let entity = entities.add_entity((&mut vm_life, &mut vm_energy), (Life(0.), Energy(0.)));

    let life: Mut<Life> = (&mut vm_life).get(entity).unwrap();
    let energy: Mut<Energy> = (&mut vm_energy).get(entity).unwrap();

    assert_eq!(*life, Life(0.));
    assert_eq!(*energy, Energy(0.));
}

#[test]
fn non_packed() {
    #[derive(PartialEq, Eq, Debug)]
    struct U32(u32);
    impl Component for U32 {
        type Tracking = track::Untracked;
    }

    #[derive(PartialEq, Eq, Debug)]
    struct I16(i16);
    impl Component for I16 {
        type Tracking = track::Untracked;
    }

    let world = World::new();

    let (mut entities, mut u32s, mut i16s) = world
        .borrow::<(EntitiesViewMut, ViewMut<U32>, ViewMut<I16>)>()
        .unwrap();
    let entity0 = entities.add_entity((&mut u32s, &mut i16s), (U32(0), I16(10)));
    let entity1 = entities.add_entity(&mut u32s, U32(1));
    let entity2 = entities.add_entity((&mut u32s, &mut i16s), (U32(2), I16(12)));
    let entity3 = entities.add_entity(&mut i16s, I16(13));
    let entity4 = entities.add_entity((&mut u32s, &mut i16s), (U32(4), I16(14)));

    assert_eq!(u32s.get(entity0), Ok(&U32(0)));
    assert_eq!(u32s.get(entity1), Ok(&U32(1)));
    assert_eq!(u32s.get(entity2), Ok(&U32(2)));
    assert!(u32s.get(entity3).is_err());
    assert_eq!(u32s.get(entity4), Ok(&U32(4)));

    assert_eq!(i16s.get(entity0), Ok(&I16(10)));
    assert!(i16s.get(entity1).is_err());
    assert_eq!(i16s.get(entity2), Ok(&I16(12)));
    assert_eq!(i16s.get(entity3), Ok(&I16(13)));
    assert_eq!(i16s.get(entity4), Ok(&I16(14)));

    assert_eq!((&u32s, &i16s).get(entity0), Ok((&U32(0), &I16(10))));
    assert!((&u32s, &i16s).get(entity1).is_err());
    assert_eq!((&u32s, &i16s).get(entity2), Ok((&U32(2), &I16(12))));
    assert!((&u32s, &i16s).get(entity3).is_err());
    assert_eq!((&u32s, &i16s).get(entity4), Ok((&U32(4), &I16(14))));
}

#[test]
fn update() {
    #[derive(PartialEq, Eq, Debug)]
    struct U32(u32);
    impl Component for U32 {
        type Tracking = track::Untracked;
    }

    #[derive(PartialEq, Eq, Debug)]
    struct I16(i16);
    impl Component for I16 {
        type Tracking = track::Untracked;
    }

    let mut world = World::new();
    world.track_all::<(U32, I16)>();

    let (mut entities, mut u32s, mut i16s) = world
        .borrow::<(EntitiesViewMut, ViewMut<U32>, ViewMut<I16>)>()
        .unwrap();

    let entity0 = entities.add_entity((&mut u32s, &mut i16s), (U32(0), I16(10)));
    let entity1 = entities.add_entity(&mut u32s, U32(1));
    let entity2 = entities.add_entity((&mut u32s, &mut i16s), (U32(2), I16(12)));
    let entity3 = entities.add_entity(&mut i16s, I16(13));
    let entity4 = entities.add_entity((&mut u32s, &mut i16s), (U32(4), I16(14)));

    assert_eq!(u32s.get(entity0), Ok(&U32(0)));
    assert_eq!(u32s.get(entity1), Ok(&U32(1)));
    assert_eq!(u32s.get(entity2), Ok(&U32(2)));
    assert!(u32s.get(entity3).is_err());
    assert_eq!(u32s.get(entity4), Ok(&U32(4)));

    assert_eq!(i16s.get(entity0), Ok(&I16(10)));
    assert!(i16s.get(entity1).is_err());
    assert_eq!(i16s.get(entity2), Ok(&I16(12)));
    assert_eq!(i16s.get(entity3), Ok(&I16(13)));
    assert_eq!(i16s.get(entity4), Ok(&I16(14)));

    assert_eq!((&u32s, &i16s).get(entity0), Ok((&U32(0), &I16(10))));
    assert!((&u32s, &i16s).get(entity1).is_err());
    assert_eq!((&u32s, &i16s).get(entity2), Ok((&U32(2), &I16(12))));
    assert!((&u32s, &i16s).get(entity3).is_err());
    assert_eq!((&u32s, &i16s).get(entity4), Ok((&U32(4), &I16(14))));
}
#[test]
fn old_id() {
    #[allow(unused)]
    struct U32(u32);
    impl Component for U32 {
        type Tracking = track::Untracked;
    }

    let world = World::new();

    world.run(|mut entities: EntitiesViewMut, mut u32s: ViewMut<U32>| {
        let entity = entities.add_entity(&mut u32s, U32(0));

        entities.delete_unchecked(entity);

        let entity1 = entities.add_entity((), ());

        assert!(u32s.get(entity1).is_err());
    });
}