use std::collections::{BTreeMap, BTreeSet};
use crate::name::{OverlayName, ProjectName, TaskName};
use crate::task::Task;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Overlay {
pub name: OverlayName,
pub matched_projects: BTreeSet<ProjectName>,
pub tasks: BTreeMap<TaskName, Task>,
}
#[cfg(test)]
mod tests {
use std::collections::{BTreeMap, BTreeSet};
use std::str::FromStr;
use nonempty::NonEmpty;
use crate::action::TaskAction;
use crate::env::EnvSettings;
use crate::name::{OverlayName, ProjectName, TaskName};
use crate::overlay::Overlay;
use crate::task::Task;
fn task(name: &str) -> Task {
Task {
name: TaskName::from_str(name).unwrap(),
action: TaskAction::Command(NonEmpty::from_vec(vec!["true".to_owned()]).unwrap()),
inputs: vec![],
outputs: vec![],
deps: vec![],
weak_deps: vec![],
mutex: None,
env: EnvSettings::default(),
}
}
fn project_name(s: &str) -> ProjectName {
ProjectName::from_str(s).unwrap()
}
fn overlay_name(s: &str) -> OverlayName {
OverlayName::from_str(s).unwrap()
}
#[test]
fn overlay_with_one_matched_project_and_one_task() {
let overlay = Overlay {
name: overlay_name("lint"),
matched_projects: BTreeSet::from([project_name("lib_core")]),
tasks: BTreeMap::from([(TaskName::from_str("lint").unwrap(), task("lint"))]),
};
assert_eq!(overlay.matched_projects.len(), 1);
assert_eq!(overlay.tasks.len(), 1);
}
#[test]
fn overlay_with_empty_matched_projects_is_representable() {
let overlay = Overlay {
name: overlay_name("ghost_filter"),
matched_projects: BTreeSet::new(),
tasks: BTreeMap::from([(TaskName::from_str("lint").unwrap(), task("lint"))]),
};
assert!(overlay.matched_projects.is_empty());
}
#[test]
fn overlay_equality_is_structural() {
let a = Overlay {
name: overlay_name("lint"),
matched_projects: BTreeSet::from([project_name("lib_core")]),
tasks: BTreeMap::new(),
};
let b = Overlay {
name: overlay_name("lint"),
matched_projects: BTreeSet::from([project_name("lib_core")]),
tasks: BTreeMap::new(),
};
let c = Overlay {
name: overlay_name("lint"),
matched_projects: BTreeSet::from([project_name("web_frontend")]),
tasks: BTreeMap::new(),
};
assert_eq!(a, b);
assert_ne!(a, c, "different matched_projects => different overlay");
}
#[test]
fn overlay_with_multiple_matched_projects_and_tasks() {
let overlay = Overlay {
name: overlay_name("ts_pipeline"),
matched_projects: BTreeSet::from([
project_name("web_frontend"),
project_name("admin_panel"),
]),
tasks: BTreeMap::from([
(TaskName::from_str("compile").unwrap(), task("compile")),
(TaskName::from_str("test").unwrap(), task("test")),
]),
};
assert_eq!(overlay.matched_projects.len(), 2);
assert_eq!(overlay.tasks.len(), 2);
}
}