From 6d8723028188c47e60d782b68a6910202387bc3c Mon Sep 17 00:00:00 2001 From: shtrophic <47949835+shtrophic@users.noreply.github.com> Date: Sun, 1 Jun 2025 20:05:12 +0200 Subject: [PATCH] fix regressions in parseOpeningHours, ignore holidays (#1411) --- .../providers/openstreetmaps/OsmLocation.kt | 8 ++-- .../src/test/kotlin/OpeningHoursTest.kt | 39 +++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/data/locations/src/main/java/de/mm20/launcher2/locations/providers/openstreetmaps/OsmLocation.kt b/data/locations/src/main/java/de/mm20/launcher2/locations/providers/openstreetmaps/OsmLocation.kt index 7ead7b07..760f851e 100644 --- a/data/locations/src/main/java/de/mm20/launcher2/locations/providers/openstreetmaps/OsmLocation.kt +++ b/data/locations/src/main/java/de/mm20/launcher2/locations/providers/openstreetmaps/OsmLocation.kt @@ -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()) { rulesMap.forEach { _, it -> 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, - // there is only one rule left per weekday. If not, skip that weekday. - val applicableRules = rulesMap.mapNotNull { (day, rules) -> + // Filter out rules that are not valid for the current year, month, and week. + val applicableRules = rulesMap.flatMap { (day, rules) -> rules.filterYears(localTime) .filterMonths(localTime) .filterNthDays(localTime) .map { it.copy(weekdays = listOf(day)) } - .singleOrNull() } val hours = mutableSetOf() diff --git a/data/locations/src/test/kotlin/OpeningHoursTest.kt b/data/locations/src/test/kotlin/OpeningHoursTest.kt index 59e413b7..37e94af6 100644 --- a/data/locations/src/test/kotlin/OpeningHoursTest.kt +++ b/data/locations/src/test/kotlin/OpeningHoursTest.kt @@ -302,4 +302,43 @@ class OpeningHoursTest { 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" + ) + } } \ No newline at end of file