Spaces:
Sleeping
Sleeping
File size: 1,653 Bytes
4b94493 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | use crate::domain::Group;
use super::vocabulary::{group_specs, weekly_availability};
/// Builds groups with varied availability patterns.
///
/// Creates groups with different availability to simulate
/// real-world constraints where groups may have restricted schedules.
pub(super) fn build_groups(count: usize) -> Vec<Group> {
group_specs()
.iter()
.take(count)
.enumerate()
.map(|(index, spec)| {
let unavailable = [
index % 8,
8 + ((index + 2) % 8),
16 + ((index + 4) % 8),
24 + ((index + 6) % 8),
32 + ((index + 1) % 8),
];
Group::new(
index,
spec.name,
spec.student_count,
weekly_availability(&unavailable),
)
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_build_groups_with_varied_availability() {
let groups = build_groups(12);
assert_eq!(groups.len(), 12);
assert_eq!(groups[0].name, "Cohort 01");
assert_eq!(groups[5].student_count, 34);
assert_eq!(groups[0].availability.len(), 40);
assert!(!groups[0].availability[0]);
assert!(!groups[0].availability[10]);
assert!(!groups[0].availability[20]);
assert!(!groups[0].availability[30]);
assert!(!groups[0].availability[33]);
assert_eq!(
groups[0]
.availability
.iter()
.filter(|available| !**available)
.count(),
5
);
}
}
|