use std::{any::Any, ffi::OsStr, path::Path};
use serde::{Deserialize, Serialize};
use serde_mosaic::*;
#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct Bar(String);
#[typetag::serde]
impl DatabaseEntry for Bar {
fn name(&self) -> &OsStr {
OsStr::new(&self.0)
}
}
#[test]
fn test_serialize_and_deserialize() {
let relative_path = Path::new("tests/test_database");
let mut path = std::env::current_dir().unwrap();
path.push(relative_path);
let mut dbm = DatabaseManager::open(path.to_path_buf(), SerdeYaml).unwrap();
let name = "this is a bar object";
let bar = Bar(name.into());
let subfolder = path.clone().join(type_name::<Bar>());
assert!(!subfolder.exists());
dbm.write(&bar, &WriteOptions::default()).unwrap();
assert!(subfolder.exists());
let bar_de: Bar = dbm.read(name).unwrap();
dbm.remove((type_name::<Bar>(), name)).unwrap();
dbm.remove_empty_subfolders().unwrap();
assert!(!subfolder.exists());
assert_eq!(bar, bar_de);
}
#[test]
fn test_format_readout() {
let dbm = DatabaseManager::new("tests/test_database", SerdeYaml)
.expect("directory exists or can be created");
let format_ref = dbm.data_format() as &dyn Any; assert!(format_ref.downcast_ref::<SerdeYaml>().is_some());
}