// Copyright © 2016 HSL <https://www.hsl.fi> // This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses. package fi.hsl.parkandride.core.domain; import com.google.common.collect.ImmutableMap; import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.joda.time.LocalTime; import org.junit.Test; import java.util.ArrayList; import java.util.List; import static fi.hsl.parkandride.core.domain.CapacityType.*; import static fi.hsl.parkandride.core.domain.DayType.*; import static fi.hsl.parkandride.core.domain.FacilityStatus.*; import static fi.hsl.parkandride.core.domain.Usage.COMMERCIAL; import static fi.hsl.parkandride.core.domain.Usage.PARK_AND_RIDE; import static org.assertj.core.api.Assertions.assertThat; public class OpeningHoursTest { private static final LocalDate SOME_MONDAY = new LocalDate(2000, 1, 3); private static final LocalDate SOME_TUESDAY = new LocalDate(2000, 1, 4); private static final LocalDate SOME_WEDNESDAY = new LocalDate(2000, 1, 5); private static final LocalDate SOME_THURSDAY = new LocalDate(2000, 1, 6); private static final LocalDate SOME_FRIDAY = new LocalDate(2000, 1, 7); private static final LocalDate SOME_SATURDAY = new LocalDate(2000, 1, 8); private static final LocalDate SOME_SUNDAY = new LocalDate(2000, 1, 9); private final OpeningHours openingHours = new OpeningHours(); private final List<Pricing> pricing = new ArrayList<>(); @Test public void empty_opening_hours() { openingHours.initialize(pricing, new DateTime(), IN_OPERATION); assertThat(openingHours.byDayType).isEqualTo(ImmutableMap.of()); assertThat(openingHours.openNow).isFalse(); } @Test public void opening_hours_is_min_max_over_capacity_types_and_usages() { // BUSINESS_DAY: 8-22 pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "17", "22", null)); pricing.add(new Pricing(ELECTRIC_CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "12", "19", null)); pricing.add(new Pricing(BICYCLE, COMMERCIAL, 10, BUSINESS_DAY, "8", "10", null)); openingHours.initialize(pricing, new DateTime(), IN_OPERATION); assertThat(openingHours.byDayType).isEqualTo(ImmutableMap.of( BUSINESS_DAY, new TimeDuration("8", "22") )); } // open now: opening and closing time range checks @Test public void is_closed_before_opening_hour() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); openingHours.initialize(pricing, SOME_MONDAY.toDateTime(new LocalTime(9, 59)), IN_OPERATION); assertThat(openingHours.openNow).isFalse(); } @Test public void is_open_on_opening_hour() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); openingHours.initialize(pricing, SOME_MONDAY.toDateTime(new LocalTime(10, 0)), IN_OPERATION); assertThat(openingHours.openNow).isTrue(); } @Test public void is_open_between_opening_and_closing_hours() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); openingHours.initialize(pricing, SOME_MONDAY.toDateTime(new LocalTime(14, 0)), IN_OPERATION); assertThat(openingHours.openNow).isTrue(); } @Test public void is_open_on_closing_hour() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); openingHours.initialize(pricing, SOME_MONDAY.toDateTime(new LocalTime(20, 0)), IN_OPERATION); assertThat(openingHours.openNow).isTrue(); } @Test public void is_closed_after_closing_hour() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); openingHours.initialize(pricing, SOME_MONDAY.toDateTime(new LocalTime(20, 1)), IN_OPERATION); assertThat(openingHours.openNow).isFalse(); } // open now: day of week checks @Test public void uses_business_day_schedule_on_Monday() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SATURDAY, "12:00", "16:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SUNDAY, "12:00", "16:00", null)); openingHours.initialize(pricing, SOME_MONDAY.toDateTime(new LocalTime(11, 0)), IN_OPERATION); assertThat(openingHours.openNow).isTrue(); } @Test public void uses_business_day_schedule_on_Tuesday() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SATURDAY, "12:00", "16:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SUNDAY, "12:00", "16:00", null)); openingHours.initialize(pricing, SOME_TUESDAY.toDateTime(new LocalTime(11, 0)), IN_OPERATION); assertThat(openingHours.openNow).isTrue(); } @Test public void uses_business_day_schedule_on_Wednesday() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SATURDAY, "12:00", "16:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SUNDAY, "12:00", "16:00", null)); openingHours.initialize(pricing, SOME_WEDNESDAY.toDateTime(new LocalTime(11, 0)), IN_OPERATION); assertThat(openingHours.openNow).isTrue(); } @Test public void uses_business_day_schedule_on_Thursday() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SATURDAY, "12:00", "16:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SUNDAY, "12:00", "16:00", null)); openingHours.initialize(pricing, SOME_THURSDAY.toDateTime(new LocalTime(11, 0)), IN_OPERATION); assertThat(openingHours.openNow).isTrue(); } @Test public void uses_business_day_schedule_on_Friday() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SATURDAY, "12:00", "16:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SUNDAY, "12:00", "16:00", null)); openingHours.initialize(pricing, SOME_FRIDAY.toDateTime(new LocalTime(11, 0)), IN_OPERATION); assertThat(openingHours.openNow).isTrue(); } @Test public void uses_Saturday_schedule_on_Saturday() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "12:00", "16:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SATURDAY, "10:00", "20:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SUNDAY, "12:00", "16:00", null)); openingHours.initialize(pricing, SOME_SATURDAY.toDateTime(new LocalTime(11, 0)), IN_OPERATION); assertThat(openingHours.openNow).isTrue(); } @Test public void uses_Sunday_schedule_on_Sunday() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "12:00", "16:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SATURDAY, "12:00", "16:00", null)); pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, SUNDAY, "10:00", "20:00", null)); openingHours.initialize(pricing, SOME_SUNDAY.toDateTime(new LocalTime(11, 0)), IN_OPERATION); assertThat(openingHours.openNow).isTrue(); } // open now: facility status @Test public void open_normally_when_facility_in_operation() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); openingHours.initialize(pricing, SOME_MONDAY.toDateTime(new LocalTime(14, 0)), IN_OPERATION); assertThat(openingHours.openNow).isTrue(); } @Test public void open_normally_when_facility_under_exceptional_situation() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); openingHours.initialize(pricing, SOME_MONDAY.toDateTime(new LocalTime(14, 0)), EXCEPTIONAL_SITUATION); assertThat(openingHours.openNow).isTrue(); } @Test public void closed_when_facility_inactive() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); openingHours.initialize(pricing, SOME_MONDAY.toDateTime(new LocalTime(14, 0)), INACTIVE); assertThat(openingHours.openNow).isFalse(); } @Test public void closed_when_facility_temporarily_closed() { pricing.add(new Pricing(CAR, PARK_AND_RIDE, 10, BUSINESS_DAY, "10:00", "20:00", null)); openingHours.initialize(pricing, SOME_MONDAY.toDateTime(new LocalTime(14, 0)), TEMPORARILY_CLOSED); assertThat(openingHours.openNow).isFalse(); } }