#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate serde_json;
#[macro_use]
extern crate calx_ecs;
#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)]
pub struct Desc {
name: String,
icon: usize,
}
#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)]
pub struct Pos {
x: i32,
y: i32,
}
Ecs! {
desc: Desc,
pos: Pos,
}
#[test]
fn test_ecs() {
let mut ecs = Ecs::new();
let e1 = ecs.make();
assert!(ecs.contains(e1));
assert!(!ecs.pos.contains(e1));
ecs.pos.insert(e1, Pos { x: 3, y: 4 });
assert_eq!(ecs.pos[e1], Pos { x: 3, y: 4 });
Desc {
name: "Orc".to_string(),
icon: 8,
}.add_to_ecs(&mut ecs, e1);
assert_eq!(ecs.desc[e1].name, "Orc");
ecs.remove(e1);
assert!(!ecs.pos.contains(e1));
assert!(!ecs.contains(e1));
let e2 = ecs.make();
assert_ne!(e2, e1);
let loadout = Loadout::new().c(Desc {
name: "Critter".to_string(),
icon: 10,
});
let e3 = loadout.make(&mut ecs);
assert_eq!(ecs.desc[e3].icon, 10);
let saved = serde_json::to_string(&ecs).expect("ECS serialization failed");
let ecs2: Ecs = serde_json::from_str(&saved).expect("ECS deserialization failed");
assert_eq!(ecs2.desc[e3].icon, 10);
ecs.desc.insert(
e2,
Desc {
name: "Foo".to_string(),
icon: 20,
},
);
ecs.remove(e3);
assert_eq!(ecs.desc[e2].icon, 20);
}