forked from agzam/vyatsu-schedule
feat(domain): add teacher models and repository interfaces
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
package agzam.vyatsu
|
||||
|
||||
import agzam.vyatsu.domain.model.Day
|
||||
import agzam.vyatsu.domain.model.Lesson
|
||||
import agzam.vyatsu.domain.model.LessonType
|
||||
import agzam.vyatsu.domain.model.SchedulePeriod
|
||||
import agzam.vyatsu.domain.model.Season
|
||||
import agzam.vyatsu.domain.model.TeacherSchedule
|
||||
import agzam.vyatsu.domain.model.TimeSlot
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalTime
|
||||
|
||||
class TeacherScheduleDomainTest {
|
||||
|
||||
@Test
|
||||
fun daysForTeacherFiltersAndPreservesOrder() {
|
||||
val date1 = LocalDate.of(2026, 9, 14)
|
||||
val date2 = LocalDate.of(2026, 9, 15)
|
||||
val slot1 = TimeSlot(
|
||||
LocalTime.of(8, 20),
|
||||
LocalTime.of(9, 50),
|
||||
listOf(lesson(room = "4-302", teacher = "A"), lesson(room = "5-100", teacher = "B"))
|
||||
)
|
||||
val slot2 = TimeSlot(
|
||||
LocalTime.of(10, 0),
|
||||
LocalTime.of(11, 30),
|
||||
listOf(lesson(room = "5-100", teacher = "B"))
|
||||
)
|
||||
val day2Slot = TimeSlot(
|
||||
LocalTime.of(8, 20),
|
||||
LocalTime.of(9, 50),
|
||||
listOf(lesson(room = "5-100", teacher = "B"))
|
||||
)
|
||||
val schedule = TeacherSchedule(
|
||||
period = SchedulePeriod(date1, date2, Season.AUTUMN),
|
||||
days = listOf(Day(date1, listOf(slot1, slot2)), Day(date2, listOf(day2Slot)))
|
||||
)
|
||||
|
||||
val result = schedule.daysForTeacher("A")
|
||||
|
||||
assertEquals(1, result.size)
|
||||
assertEquals(date1, result[0].date)
|
||||
assertEquals(1, result[0].intervals.size)
|
||||
assertEquals(LocalTime.of(8, 20), result[0].intervals[0].start)
|
||||
assertEquals(1, result[0].intervals[0].lessons.size)
|
||||
assertEquals("A", result[0].intervals[0].lessons[0].teacher)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun daysForTeacherDropsDayWithoutTeacher() {
|
||||
val date1 = LocalDate.of(2026, 9, 14)
|
||||
val date2 = LocalDate.of(2026, 9, 15)
|
||||
val schedule = TeacherSchedule(
|
||||
period = SchedulePeriod(date1, date2, Season.AUTUMN),
|
||||
days = listOf(
|
||||
Day(date1, listOf(slotOf(lesson(room = "4-302", teacher = "A")))),
|
||||
Day(date2, listOf(slotOf(lesson(room = "5-100", teacher = "B"))))
|
||||
)
|
||||
)
|
||||
|
||||
val result = schedule.daysForTeacher("A")
|
||||
|
||||
assertEquals(1, result.size)
|
||||
assertEquals(date1, result[0].date)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun dedupCollapsesOnlyIdenticalLessons() {
|
||||
val date = LocalDate.of(2026, 9, 14)
|
||||
val raw = "4-302 Программирование Лекция ИВТб-3304-01-00"
|
||||
val identical = lesson(
|
||||
room = "4-302",
|
||||
group = "ИВТб-3304-01-00",
|
||||
teacher = "A",
|
||||
raw = raw,
|
||||
subject = "Программирование"
|
||||
)
|
||||
val differsInGroup = identical.copy(group = "ИВТб-3304-02-00")
|
||||
val differsInRoom = identical.copy(room = "5-102")
|
||||
|
||||
val schedule = TeacherSchedule(
|
||||
period = SchedulePeriod(date, date, Season.AUTUMN),
|
||||
days = listOf(
|
||||
Day(
|
||||
date,
|
||||
listOf(
|
||||
TimeSlot(
|
||||
LocalTime.of(8, 20),
|
||||
LocalTime.of(9, 50),
|
||||
listOf(identical, identical, differsInGroup, differsInRoom)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
val result = schedule.daysForTeacher("A")
|
||||
|
||||
val lessons = result[0].intervals[0].lessons
|
||||
assertEquals(3, lessons.size)
|
||||
assertEquals(1, lessons.count { it == identical })
|
||||
assertEquals(1, lessons.count { it.room == "4-302" && it.group == "ИВТб-3304-01-00" })
|
||||
assertTrue(lessons.any { it.group == "ИВТб-3304-02-00" })
|
||||
assertTrue(lessons.any { it.room == "5-102" })
|
||||
}
|
||||
|
||||
private fun slotOf(lesson: Lesson) =
|
||||
TimeSlot(LocalTime.of(8, 20), LocalTime.of(9, 50), listOf(lesson))
|
||||
|
||||
private fun lesson(
|
||||
room: String,
|
||||
group: String = "ИВТб-3304-01-00",
|
||||
teacher: String,
|
||||
raw: String = "$room Программирование Лекция $group",
|
||||
subject: String = "Программирование"
|
||||
) = Lesson(
|
||||
raw = raw,
|
||||
room = room,
|
||||
group = group,
|
||||
subject = subject,
|
||||
type = LessonType.LECTURE,
|
||||
teacher = teacher
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user