File size: 2,044 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
60
61
62
63
64
65
66
67
68
use crate::domain::Teacher;

use super::vocabulary::{teacher_names, weekly_availability};

/// Builds teachers with varied availability patterns.
/// Each teacher is created from the teacher_names() list with their full name.
pub(super) fn build_teachers() -> Vec<Teacher> {
    teacher_names()
        .iter()
        .enumerate()
        .map(|(index, name)| {
            let unavailable = [
                index % 8,
                8 + ((index * 3) % 8),
                16 + ((index * 5) % 8),
                32 + ((index * 7) % 8),
            ];

            Teacher::new(index, name.to_string(), weekly_availability(&unavailable))
        })
        .collect()
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_build_teachers() {
        let teachers = build_teachers();
        let teacher_names_list = teacher_names();
        assert_eq!(teachers.len(), teacher_names_list.len());

        for (index, teacher) in teachers.iter().enumerate() {
            assert_eq!(teacher.availability.len(), 40);
            assert!(!teacher.availability[index % 8]);
            assert_eq!(
                teacher
                    .availability
                    .iter()
                    .filter(|available| !**available)
                    .count(),
                4
            );
        }
    }

    #[test]
    fn test_teacher_names() {
        let teachers = build_teachers();
        assert_eq!(teachers.len(), 20);
        assert_eq!(teachers[0].name, "Jane Austen");
        assert_eq!(teachers[1].name, "William Shakespeare");
        assert_eq!(teachers[15].name, "Ada Lovelace");
        assert_eq!(teachers[16].name, "Alan Turing");
        assert_eq!(teachers[19].name, "Alexander von Humboldt");
    }

    #[test]
    fn test_teacher_names_from_subjects() {
        let names = teacher_names();
        assert_eq!(names.len(), 20);
        assert!(names.contains(&"Marie Curie"));
        assert!(names.contains(&"Alan Turing"));
        assert!(names.contains(&"William Shakespeare"));
    }
}