fix regressions in parseOpeningHours, ignore holidays (#1411)

This commit is contained in:
shtrophic 2025-06-01 20:05:12 +02:00 committed by GitHub
parent 9d3bdb4600
commit 6d87230281
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 43 additions and 4 deletions

View File

@ -388,6 +388,8 @@ internal fun parseOpeningSchedule(
} }
} }
} }
} else if (!rule.holidays.isNullOrEmpty()) {
continue // skip PH and SH entries
} else if (!rule.times.isNullOrEmpty() || !rule.months.isNullOrEmpty()) { } else if (!rule.times.isNullOrEmpty() || !rule.months.isNullOrEmpty()) {
rulesMap.forEach { _, it -> rulesMap.forEach { _, it ->
it.add(rule) it.add(rule)
@ -395,14 +397,12 @@ internal fun parseOpeningSchedule(
} }
} }
// Filter out rules that are not valid for the current year, month, and week. Hopefully, // Filter out rules that are not valid for the current year, month, and week.
// there is only one rule left per weekday. If not, skip that weekday. val applicableRules = rulesMap.flatMap { (day, rules) ->
val applicableRules = rulesMap.mapNotNull { (day, rules) ->
rules.filterYears(localTime) rules.filterYears(localTime)
.filterMonths(localTime) .filterMonths(localTime)
.filterNthDays(localTime) .filterNthDays(localTime)
.map { it.copy(weekdays = listOf(day)) } .map { it.copy(weekdays = listOf(day)) }
.singleOrNull()
} }
val hours = mutableSetOf<OpeningHours>() val hours = mutableSetOf<OpeningHours>()

View File

@ -302,4 +302,43 @@ class OpeningHoursTest {
LocalDateTime.of(2025, Month.APRIL, 10, 0, 0) LocalDateTime.of(2025, Month.APRIL, 10, 0, 0)
) )
} }
@Test
fun regressTest0() {
OpeningSchedule.Hours(
setOf(
OpeningHours(dayOfWeek = DayOfWeek.MONDAY, startTime = LocalTime.of(8,30), duration = Duration.ofHours(3) + Duration.ofMinutes(30)),
OpeningHours(dayOfWeek = DayOfWeek.TUESDAY, startTime = LocalTime.of(8,30), duration = Duration.ofHours(3) + Duration.ofMinutes(30)),
OpeningHours(dayOfWeek = DayOfWeek.WEDNESDAY, startTime = LocalTime.of(8,30), duration = Duration.ofHours(3) + Duration.ofMinutes(30)),
OpeningHours(dayOfWeek = DayOfWeek.THURSDAY, startTime = LocalTime.of(8,30), duration = Duration.ofHours(3) + Duration.ofMinutes(30)),
OpeningHours(dayOfWeek = DayOfWeek.FRIDAY, startTime = LocalTime.of(8,30), duration = Duration.ofHours(3) + Duration.ofMinutes(30)),
OpeningHours(dayOfWeek = DayOfWeek.MONDAY, startTime = LocalTime.of(14,0), duration = Duration.ofHours(2)),
OpeningHours(dayOfWeek = DayOfWeek.TUESDAY, startTime = LocalTime.of(14,0), duration = Duration.ofHours(2)),
OpeningHours(dayOfWeek = DayOfWeek.FRIDAY, startTime = LocalTime.of(14,0), duration = Duration.ofHours(2)),
OpeningHours(dayOfWeek = DayOfWeek.THURSDAY, startTime = LocalTime.of(17,0), duration = Duration.ofHours(2)),
)
) assertEqualTo parseOpeningSchedule(
"Mo-Fr 08:30-12:00; Mo,Tu,Fr 14:00-16:00; Th 17:00-19:00"
)
}
@Test
fun regressTest1() {
OpeningSchedule.Hours(
setOf(
OpeningHours(dayOfWeek = DayOfWeek.TUESDAY, startTime = LocalTime.of(11,45), duration = Duration.ofHours(10) + Duration.ofMinutes(45)),
OpeningHours(dayOfWeek = DayOfWeek.WEDNESDAY, startTime = LocalTime.of(11,45), duration = Duration.ofHours(10) + Duration.ofMinutes(45)),
OpeningHours(dayOfWeek = DayOfWeek.THURSDAY, startTime = LocalTime.of(11,45), duration = Duration.ofHours(10) + Duration.ofMinutes(45)),
OpeningHours(dayOfWeek = DayOfWeek.FRIDAY, startTime = LocalTime.of(11,45), duration = Duration.ofHours(10) + Duration.ofMinutes(45)),
OpeningHours(dayOfWeek = DayOfWeek.SATURDAY, startTime = LocalTime.of(11,45), duration = Duration.ofHours(10) + Duration.ofMinutes(45)),
OpeningHours(dayOfWeek = DayOfWeek.SUNDAY, startTime = LocalTime.of(11,30), duration = Duration.ofHours(11)),
// We don't track public holidays. Otherwise, we'd probably go mad!
)
) assertEqualTo parseOpeningSchedule(
"Tu-Sa 11:45-22:30; Su 11:30-22:30; PH 11:30-22:30"
)
}
} }