forked from agzam/vyatsu-schedule
fix: wrong parsed teacher schedule
This commit is contained in:
@@ -15,6 +15,14 @@ class TeacherScheduleParserTest {
|
||||
checkNotNull(javaClass.getResourceAsStream("/prepod.html"))
|
||||
.readBytes().toString(Charsets.UTF_8)
|
||||
|
||||
private fun fixture517(): String =
|
||||
checkNotNull(javaClass.getResourceAsStream("/prepod517.html"))
|
||||
.readBytes().toString(Charsets.UTF_8)
|
||||
|
||||
private fun fixture974(): String =
|
||||
checkNotNull(javaClass.getResourceAsStream("/prepod974.html"))
|
||||
.readBytes().toString(Charsets.UTF_8)
|
||||
|
||||
@Test
|
||||
fun teachersHeaderParsedInOrderAndDeduped() {
|
||||
val parsed = TeacherScheduleParser.parse(fixture())
|
||||
@@ -83,4 +91,94 @@ class TeacherScheduleParserTest {
|
||||
val total = parsed.days.sumOf { day -> day.intervals.sumOf { it.lessons.size } }
|
||||
assertEquals(11, total)
|
||||
}
|
||||
|
||||
private fun spacerColumnFixture(): String = """
|
||||
<table>
|
||||
<tr>
|
||||
<td>День</td><td>Интервал</td><td></td>
|
||||
<td><span>Марков Р.В.</span></td><td><span>Мельцов В.Ю.</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>четверг 08.10.26</td><td>08:20-09:50</td><td></td>
|
||||
<td>2-206 Математика Практическое занятие УТб-2301-02-00</td>
|
||||
<td>1-334 Организация параллельных вычислительных систем Лекция ИВТб-4301-05-00</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>10:00-11:30</td><td></td>
|
||||
<td>2-206 Математика Практическое занятие УТб-2301-02-00</td>
|
||||
<td>1-334 Организация параллельных вычислительных систем Лекция ИВТб-4301-05-00</td>
|
||||
</tr>
|
||||
</table>
|
||||
""".trimIndent()
|
||||
|
||||
@Test
|
||||
fun emptyHeaderSpacerDoesNotShiftTeacherColumns() {
|
||||
val parsed = TeacherScheduleParser.parse(spacerColumnFixture())
|
||||
assertEquals(listOf("Марков Р.В.", "Мельцов В.Ю."), parsed.teachers)
|
||||
assertEquals(1, parsed.days.size)
|
||||
assertEquals(LocalDate.of(2026, 10, 8), parsed.days[0].date)
|
||||
assertEquals(2, parsed.days[0].intervals.size)
|
||||
for (slot in parsed.days[0].intervals) {
|
||||
val markov = slot.lessons.filter { it.teacher == "Марков Р.В." }
|
||||
val meltsov = slot.lessons.filter { it.teacher == "Мельцов В.Ю." }
|
||||
assertEquals(1, markov.size)
|
||||
assertEquals(1, meltsov.size)
|
||||
assertEquals("Математика", markov[0].subject)
|
||||
assertEquals("Организация параллельных вычислительных систем", meltsov[0].subject)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun realPage517TeacherColumnsAligned() {
|
||||
val html = checkNotNull(javaClass.getResourceAsStream("/prepod517.html"))
|
||||
.readBytes().toString(Charsets.UTF_8)
|
||||
val parsed = TeacherScheduleParser.parse(html)
|
||||
assertTrue(parsed.teachers.contains("Мельцов В.Ю."))
|
||||
val day = parsed.days.first { it.date == LocalDate.of(2026, 10, 8) }
|
||||
val all = day.intervals.flatMap { it.lessons }
|
||||
val markov = all.filter { it.teacher == "Марков Р.В." }
|
||||
val meltsov = all.filter { it.teacher == "Мельцов В.Ю." }
|
||||
assertTrue("Мельцов должен иметь пары 08.10", meltsov.isNotEmpty())
|
||||
assertTrue(
|
||||
"У Мельцова не должно быть математики Маркова",
|
||||
meltsov.none { it.subject?.contains("Математика") == true }
|
||||
)
|
||||
assertTrue(
|
||||
"У Маркова должна остаться математика",
|
||||
markov.any { it.subject?.contains("Математика") == true }
|
||||
)
|
||||
assertTrue(
|
||||
"У Мельцова параллельные вычислительные системы",
|
||||
meltsov.any { it.subject?.contains("Организация параллельных") == true }
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun realPage517MeltsovLabsSitAt1000And1145NotAt0820() {
|
||||
val parsed = TeacherScheduleParser.parse(fixture517())
|
||||
val day = parsed.days.first { it.date == LocalDate.of(2026, 10, 6) }
|
||||
val labsAt = { time: java.time.LocalTime ->
|
||||
day.intervals.firstOrNull { it.start == time }
|
||||
?.lessons
|
||||
?.filter { it.teacher == "Мельцов В.Ю." && it.type == LessonType.LABORATORY }
|
||||
.orEmpty()
|
||||
}
|
||||
assertEquals(
|
||||
"В 08:20 у Мельцова на странице 517 лабораторных нет",
|
||||
0, labsAt(java.time.LocalTime.of(8, 20)).size
|
||||
)
|
||||
assertTrue(labsAt(java.time.LocalTime.of(10, 0)).isNotEmpty())
|
||||
assertTrue(labsAt(java.time.LocalTime.of(11, 45)).isNotEmpty())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun realPage974MeltsovHasPracticeAt0820() {
|
||||
val parsed = TeacherScheduleParser.parse(fixture974())
|
||||
val day = parsed.days.first { it.date == LocalDate.of(2026, 10, 6) }
|
||||
val slot = day.intervals.first { it.start == java.time.LocalTime.of(8, 20) }
|
||||
val mel = slot.lessons.filter { it.teacher == "Мельцов В.Ю." }
|
||||
assertTrue(mel.isNotEmpty())
|
||||
assertTrue("08:20 на странице 974 — практическое занятие", mel.all { it.type == LessonType.PRACTICE })
|
||||
assertEquals("ИВТб-2305-06-00", mel.first().group)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user