use qmi::Qmi;
use tempfile::tempdir;
#[test]
fn save_load_single_entity() {
let dir = tempdir().unwrap();
{
let mut qmi = Qmi::new(dir.path().join("test.persy")).unwrap();
qmi.spawn(("Hello".to_string(), 10, Some(20)));
qmi.save::<String>().unwrap();
qmi.save::<i32>().unwrap();
qmi.save::<Option<i32>>().unwrap();
}
{
let mut qmi = Qmi::new(dir.path().join("test.persy")).unwrap();
qmi.load::<String>().unwrap();
qmi.load::<i32>().unwrap();
qmi.load::<Option<i32>>().unwrap();
for (text, number, some_number) in qmi.world.query::<(&String, &i32, &Option<i32>)>().iter()
{
assert_eq!(text, &"Hello".to_string());
assert_eq!(number, &10);
assert_eq!(some_number, &Some(20));
}
assert_eq!(qmi.world.len(), 1);
}
}
#[test]
fn save_load_multiple_entities() {
let dir = tempdir().unwrap();
{
let mut qmi = Qmi::new(dir.path().join("test.persy")).unwrap();
qmi.spawn(("hello".to_string(), 10, 5.2));
qmi.spawn((10, 5.2));
qmi.spawn(("hello".to_string(), 5.2));
qmi.save::<String>().unwrap();
qmi.save::<i32>().unwrap();
qmi.save::<f32>().unwrap();
}
{
let mut qmi = Qmi::new(dir.path().join("test.persy")).unwrap();
qmi.load::<String>().unwrap();
qmi.load::<i32>().unwrap();
qmi.load::<f32>().unwrap();
assert_eq!(qmi.world.len(), 3);
}
}
#[test]
fn spawn_after_load_does_not_collide() {
let dir = tempdir().unwrap();
let db_path = dir.path().join("test.persy");
{
let mut qmi = Qmi::new(&db_path).unwrap();
qmi.spawn(("Loaded Entity".to_string(), 100));
qmi.save::<String>().unwrap();
qmi.save::<i32>().unwrap();
}
{
let mut qmi = Qmi::new(&db_path).unwrap();
qmi.load::<String>().unwrap();
qmi.load::<i32>().unwrap();
qmi.spawn(("New Entity".to_string(), 200));
assert_eq!(qmi.world.len(), 2);
let mut names: Vec<String> = qmi.world.query::<&String>().iter().cloned().collect();
names.sort();
assert_eq!(
names,
vec!["Loaded Entity".to_string(), "New Entity".to_string()]
);
}
}