use crate::{Archetype, EntityStorage, StaticArchetype};
use rand::prelude::StdRng;
use rand::{Rng, SeedableRng};
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
struct Comp1 {
a: u32,
b: [u32; 4],
}
impl Comp1 {
fn new() -> Self {
let mut rng = StdRng::seed_from_u64(0);
Comp1 {
a: rng.random(),
b: [rng.random(), rng.random(), rng.random(), rng.random()],
}
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
struct Comp2 {
a: Vec<Comp1>,
b: [u64; 123],
c: [u32; 4],
}
impl Comp2 {
fn new() -> Self {
let mut rng = StdRng::seed_from_u64(0);
let a: Vec<Comp1> = (0..rng.random_range(0..100)).map(|_| Comp1::new()).collect();
let b: Vec<u64> = (0..123).map(|_| rng.random()).collect();
Comp2 {
a,
b: b.try_into().unwrap(),
c: [rng.random(), rng.random(), rng.random(), rng.random()],
}
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
struct Comp3;
#[derive(Clone, Archetype)]
struct Archetype12 {
comp1: Comp1,
comp2: Comp2,
}
#[derive(Clone, Archetype)]
struct Archetype1 {
comp1: Comp1,
}
#[derive(Clone, Archetype)]
struct Archetype2(Comp2);
#[derive(Clone, Archetype)]
struct Archetype3(Comp3);
#[test]
fn general() {
let mut storage = EntityStorage::new();
let e00v = Comp1::new();
let e01v = Comp2::new();
let e1v = Comp1::new();
let e2v = Comp2::new();
let _e0 = storage.add(Archetype12 {
comp1: e00v.clone(),
comp2: e01v.clone(),
});
let e0 = storage.add(
Archetype12 {
comp1: e00v.clone(),
comp2: e01v.clone(),
}
.into_any(),
);
let temp = storage.add(Archetype3(Comp3).into_any());
storage.remove(&temp);
let _e1 = storage.add(Archetype1 { comp1: e1v.clone() });
let e1 = storage.add(Archetype1 { comp1: e1v.clone() });
let _e2 = storage.add(Archetype2(e2v.clone()));
let e2 = storage.add(Archetype2(e2v.clone()).into_any());
assert_eq!(storage.count_entities(), 6);
assert_eq!(storage.entities().iter().count(), storage.count_entities());
let v00 = storage.get::<Comp1>(&e0).unwrap();
let v01 = storage.get::<Comp2>(&e0).unwrap();
let v1 = storage.get::<Comp1>(&e1).unwrap();
let v2 = storage.get::<Comp2>(&e2).unwrap();
assert_eq!(&e00v, v00);
assert_eq!(&e01v, v01);
assert_eq!(&e1v, v1);
assert_eq!(&e2v, v2);
assert_eq!(storage.entry(&e1).unwrap().get::<Comp1>(), Some(&e1v));
storage.remove(&_e0);
storage.remove(&_e1);
storage.remove(&_e2);
storage.remove(&e0);
storage.remove(&e1);
storage.remove(&e2);
let v00 = storage.get::<Comp1>(&e0);
let v01 = storage.get::<Comp2>(&e0);
let v1 = storage.get::<Comp1>(&e1);
let v2 = storage.get::<Comp2>(&e2);
assert_eq!(v00, None);
assert_eq!(v01, None);
assert_eq!(v1, None);
assert_eq!(v2, None);
assert_eq!(storage.count_entities(), 0);
}
#[test]
fn add_modify_remove_add() {
let mut storage = EntityStorage::new();
let e = storage.add(Archetype1 {
comp1: Comp1 {
a: 123,
b: Default::default(),
},
});
storage.get_mut::<Comp1>(&e).unwrap().a = 230;
storage.remove(&e);
let e2 = storage.add(Archetype1 {
comp1: Comp1 {
a: 123,
b: Default::default(),
},
});
assert_eq!(storage.get::<Comp1>(&e2).unwrap().a, 123);
}