package appointmentplanner; import static org.assertj.core.api.Assertions.assertThat; import java.time.Duration; import java.time.Instant; import java.util.List; import java.util.stream.Stream; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import appointmentplanner.api.LocalDay; import appointmentplanner.api.LocalDayPlan; import appointmentplanner.api.TimeSlot; public class LocalDayPlanTest { private static Stream provideLocalDPDataset() { return Stream.of( Arguments.of(new LocalDay(), Instant.parse("2023-01-01T08:30:00Z"), Instant.parse("2023-01-01T17:30:00Z")), Arguments.of(new LocalDay(), Instant.parse("2023-06-15T09:00:00Z"), Instant.parse("2023-06-15T18:00:00Z")), Arguments.of(new LocalDay(), Instant.parse("2024-12-31T07:00:00Z"), Instant.parse("2024-12-31T16:00:00Z"))); } @ParameterizedTest @MethodSource("provideLocalDPDataset") void ldpInit_shouldBeSuccessful(LocalDay day, Instant start, Instant end) { LocalDayPlan plan = new LocalDayPlanImpl(day, start, end); assertThat(plan).isNotNull(); } @ParameterizedTest @MethodSource("provideLocalDPDataset") void ldpGetters_shouldReturnSetValues(LocalDay day, Instant start, Instant end) { LocalDayPlan plan = new LocalDayPlanImpl(day, start, end); assertThat(plan.day()).isEqualTo(day); assertThat(plan.startOfDay()).isEqualTo(start); assertThat(plan.endOfDay()).isEqualTo(end); } @ParameterizedTest @MethodSource("provideLocalDPDataset") void ldpToString_shouldReturnStringContainingLocalDateAndTimeZone(LocalDay day, Instant start, Instant end) { LocalDayPlan plan = new LocalDayPlanImpl(day, start, end); assertThat(plan.toString()).contains(day.zone().toString(), day.date().toString()); } @Test void ldpFindMatchingFreeSlotsOnEmptyDay() { LocalDayPlan plan = TestData.emptyWorkingDay(); List freeSlots = plan.findGapsFitting(Duration.ofHours(2)); assertThat(freeSlots.size()).isEqualTo(1); } }