use super::types::*;
use crate::resources::Resource;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResearchProjects {
projects: HashMap<ResearchId, ResearchProject>,
}
impl Resource for ResearchProjects {}
impl ResearchProjects {
pub fn new() -> Self {
Self {
projects: HashMap::new(),
}
}
pub fn define(&mut self, project: ResearchProject) {
self.projects.insert(project.id.clone(), project);
}
pub fn get(&self, id: &ResearchId) -> Option<&ResearchProject> {
self.projects.get(id)
}
pub fn contains(&self, id: &ResearchId) -> bool {
self.projects.contains_key(id)
}
pub fn iter(&self) -> impl Iterator<Item = &ResearchProject> {
self.projects.values()
}
pub fn len(&self) -> usize {
self.projects.len()
}
pub fn is_empty(&self) -> bool {
self.projects.is_empty()
}
}
impl Default for ResearchProjects {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_projects_new() {
let projects = ResearchProjects::new();
assert!(projects.is_empty());
assert_eq!(projects.len(), 0);
}
#[test]
fn test_define_and_get() {
let mut projects = ResearchProjects::new();
let project = ResearchProject::new("test", "Test Project", "Test description");
projects.define(project);
assert_eq!(projects.len(), 1);
assert!(!projects.is_empty());
assert!(projects.get(&ResearchId::new("test")).is_some());
assert_eq!(
projects.get(&ResearchId::new("test")).unwrap().name,
"Test Project"
);
}
#[test]
fn test_contains() {
let mut projects = ResearchProjects::new();
projects.define(ResearchProject::new("test", "Test", "Test"));
assert!(projects.contains(&ResearchId::new("test")));
assert!(!projects.contains(&ResearchId::new("other")));
}
#[test]
fn test_iter() {
let mut projects = ResearchProjects::new();
projects.define(ResearchProject::new("test1", "Test 1", "Test"));
projects.define(ResearchProject::new("test2", "Test 2", "Test"));
let count = projects.iter().count();
assert_eq!(count, 2);
}
}