use pokeys_lib::model_manager::ModelManager;
use pokeys_lib::models::{DeviceModel, PinModel};
use std::collections::HashMap;
use std::fs;
use tempfile::tempdir;
#[test]
fn test_model_manager_initialization() {
let dir = tempdir().unwrap();
let manager = ModelManager::new(Some(dir.path().to_path_buf()));
assert!(manager.is_ok(), "Failed to create model manager");
assert!(dir.path().exists());
assert!(dir.path().is_dir());
let default_models = [
"PoKeys56U.yaml",
"PoKeys57U.yaml",
"PoKeys56E.yaml",
"PoKeys57E.yaml",
];
for model_file in &default_models {
let file_path = dir.path().join(model_file);
assert!(
file_path.exists(),
"Default model file {model_file} was not copied"
);
}
}
#[test]
fn test_model_manager_create_model() {
let dir = tempdir().unwrap();
let mut manager = ModelManager::new(Some(dir.path().to_path_buf())).unwrap();
let mut pins = HashMap::new();
pins.insert(
1,
PinModel {
capabilities: vec!["DigitalInput".to_string(), "DigitalOutput".to_string()],
active: true,
},
);
pins.insert(
2,
PinModel {
capabilities: vec!["DigitalInput".to_string(), "AnalogInput".to_string()],
active: true,
},
);
assert!(manager.create_model("TestModel", pins).is_ok());
let file_path = dir.path().join("TestModel.yaml");
assert!(file_path.exists(), "Model file was not created");
let model = manager.get_model("TestModel");
assert!(model.is_some(), "Model was not loaded");
let model = model.unwrap();
assert_eq!(model.name, "TestModel");
assert_eq!(model.pins.len(), 2);
assert!(model.pins.contains_key(&1));
assert!(model.pins.contains_key(&2));
}
#[test]
fn test_model_manager_copy_model() {
let dir = tempdir().unwrap();
let mut manager = ModelManager::new(Some(dir.path().to_path_buf())).unwrap();
let mut pins = HashMap::new();
pins.insert(
1,
PinModel {
capabilities: vec!["DigitalInput".to_string(), "DigitalOutput".to_string()],
active: true,
},
);
assert!(manager.create_model("SourceModel", pins).is_ok());
assert!(manager.copy_model("SourceModel", "TargetModel").is_ok());
let file_path = dir.path().join("TargetModel.yaml");
assert!(file_path.exists(), "Target model file was not created");
let model = manager.get_model("TargetModel");
assert!(model.is_some(), "Target model was not loaded");
let model = model.unwrap();
assert_eq!(model.name, "TargetModel");
assert_eq!(model.pins.len(), 1);
assert!(model.pins.contains_key(&1));
assert!(manager.copy_model("NonExistentModel", "NewModel").is_err());
}
#[test]
fn test_model_manager_delete_model() {
let dir = tempdir().unwrap();
let mut manager = ModelManager::new(Some(dir.path().to_path_buf())).unwrap();
let mut pins = HashMap::new();
pins.insert(
1,
PinModel {
capabilities: vec!["DigitalInput".to_string(), "DigitalOutput".to_string()],
active: true,
},
);
assert!(manager.create_model("TestModel", pins).is_ok());
let file_path = dir.path().join("TestModel.yaml");
assert!(file_path.exists(), "Model file was not created");
assert!(manager.delete_model("TestModel").is_ok());
assert!(!file_path.exists(), "Model file was not deleted");
assert!(
manager.get_model("TestModel").is_none(),
"Model was not removed from memory"
);
assert!(manager.delete_model("NonExistentModel").is_ok());
}
#[test]
fn test_model_manager_reload_models() {
let dir = tempdir().unwrap();
let mut model = DeviceModel {
name: "TestModel".to_string(),
pins: HashMap::new(),
};
model.pins.insert(
1,
PinModel {
capabilities: vec!["DigitalInput".to_string(), "DigitalOutput".to_string()],
active: true,
},
);
let file_path = dir.path().join("TestModel.yaml");
let yaml = serde_yaml::to_string(&model).unwrap();
fs::write(&file_path, yaml).unwrap();
let mut manager = ModelManager::new(Some(dir.path().to_path_buf())).unwrap();
let loaded_model = manager.get_model("TestModel");
assert!(loaded_model.is_some(), "Model was not loaded");
fs::remove_file(&file_path).unwrap();
assert!(
manager.get_model("TestModel").is_some(),
"Model was removed from memory"
);
assert!(manager.reload_models().is_ok());
assert!(
manager.get_model("TestModel").is_none(),
"Model was not removed after reload"
);
let mut new_model = DeviceModel {
name: "NewModel".to_string(),
pins: HashMap::new(),
};
new_model.pins.insert(
1,
PinModel {
capabilities: vec!["DigitalInput".to_string()],
active: true,
},
);
let new_file_path = dir.path().join("NewModel.yaml");
let yaml = serde_yaml::to_string(&new_model).unwrap();
fs::write(&new_file_path, yaml).unwrap();
assert!(manager.reload_models().is_ok());
assert!(
manager.get_model("NewModel").is_some(),
"New model was not loaded"
);
}
#[test]
fn test_model_manager_validate_model() {
let dir = tempdir().unwrap();
let mut manager = ModelManager::new(Some(dir.path().to_path_buf())).unwrap();
let mut pins = HashMap::new();
pins.insert(
1,
PinModel {
capabilities: vec!["DigitalInput".to_string(), "DigitalOutput".to_string()],
active: true,
},
);
assert!(manager.create_model("ValidModel", pins).is_ok());
assert!(manager.validate_model("ValidModel").is_ok());
let mut pins = HashMap::new();
pins.insert(
1,
PinModel {
capabilities: vec![],
active: true,
},
);
assert!(manager.create_model("InvalidModel", pins).is_err());
assert!(manager.validate_model("NonExistentModel").is_err());
}
#[test]
fn test_model_manager_save_model() {
let dir = tempdir().unwrap();
let mut manager = ModelManager::new(Some(dir.path().to_path_buf())).unwrap();
let mut pins = HashMap::new();
pins.insert(
1,
PinModel {
capabilities: vec!["DigitalInput".to_string(), "DigitalOutput".to_string()],
active: true,
},
);
assert!(manager.create_model("TestModel", pins).is_ok());
let mut model = manager.get_model("TestModel").unwrap().clone();
model.pins.insert(
2,
PinModel {
capabilities: vec!["DigitalInput".to_string(), "AnalogInput".to_string()],
active: true,
},
);
assert!(manager.save_model(&model).is_ok());
assert!(manager.reload_models().is_ok());
let loaded_model = manager.get_model("TestModel").unwrap();
assert_eq!(loaded_model.pins.len(), 2);
assert!(loaded_model.pins.contains_key(&1));
assert!(loaded_model.pins.contains_key(&2));
}
#[test]
fn test_model_manager_get_model_dir() {
let dir = tempdir().unwrap();
let manager = ModelManager::new(Some(dir.path().to_path_buf())).unwrap();
assert_eq!(manager.get_model_dir(), dir.path());
let manager = ModelManager::new(None).unwrap();
let default_dir = pokeys_lib::models::get_default_model_dir();
assert_eq!(manager.get_model_dir(), default_dir);
}
#[test]
fn test_model_manager_get_all_models() {
let dir = tempdir().unwrap();
let mut manager = ModelManager::new(Some(dir.path().to_path_buf())).unwrap();
let mut pins1 = HashMap::new();
pins1.insert(
1,
PinModel {
capabilities: vec!["DigitalInput".to_string()],
active: true,
},
);
let mut pins2 = HashMap::new();
pins2.insert(
2,
PinModel {
capabilities: vec!["DigitalOutput".to_string()],
active: true,
},
);
assert!(manager.create_model("Model1", pins1).is_ok());
assert!(manager.create_model("Model2", pins2).is_ok());
let models = manager.get_all_models();
assert!(models.contains_key("Model1"));
assert!(models.contains_key("Model2"));
assert!(models.contains_key("PoKeys56U"));
assert!(models.contains_key("PoKeys57U"));
assert!(models.contains_key("PoKeys56E"));
assert!(models.contains_key("PoKeys57E"));
}