diff --git a/exercise/java/day01/src/main/java/communication/SantaCommunicator.java b/exercise/java/day01/src/main/java/communication/SantaCommunicator.java index 8aa41bb1b..9b8760461 100644 --- a/exercise/java/day01/src/main/java/communication/SantaCommunicator.java +++ b/exercise/java/day01/src/main/java/communication/SantaCommunicator.java @@ -1,28 +1,47 @@ package communication; public class SantaCommunicator { - private final int numberOfDaysToRest; + private final ReindeerPlanner reindeerPlanner; public SantaCommunicator(int numberOfDaysToRest) { - this.numberOfDaysToRest = numberOfDaysToRest; + this.reindeerPlanner = new ReindeerPlanner(numberOfDaysToRest); } - public String composeMessage(String reindeerName, String currentLocation, int numbersOfDaysForComingBack, int numberOfDaysBeforeChristmas) { - var daysBeforeReturn = daysBeforeReturn(numbersOfDaysForComingBack, numberOfDaysBeforeChristmas); + public String composeMessage(String reindeerName, ReindeerLocation reindeerLocation, int numberOfDaysBeforeChristmas) { + var daysBeforeReturn = reindeerPlanner.daysBeforeReturn(reindeerLocation, numberOfDaysBeforeChristmas); - return "Dear " + reindeerName + ", please return from " + currentLocation + - " in " + daysBeforeReturn + " day(s) to be ready and rest before Christmas."; + return "Dear " + reindeerName + ", please return from " + reindeerLocation.currentLocation() + + " in " + daysBeforeReturn + " day(s) to be ready and rest before Christmas."; } - public boolean isOverdue(String reindeerName, String currentLocation, int numbersOfDaysForComingBack, int numberOfDaysBeforeChristmas, Logger logger) { - if (daysBeforeReturn(numbersOfDaysForComingBack, numberOfDaysBeforeChristmas) <= 0) { - logger.log("Overdue for " + reindeerName + " located " + currentLocation + "."); + public boolean isOverdue(String reindeerName, ReindeerLocation reindeerLocation, int numberOfDaysBeforeChristmas, Logger logger) { + if (!reindeerLocation.isReachableInDays(reindeerPlanner.numberOfDaysBeforeRestingBeforeChristmas(numberOfDaysBeforeChristmas))) { + logger.log("Overdue for " + reindeerName + " located " + reindeerLocation.currentLocation() + "."); return true; } return false; } - private int daysBeforeReturn(int numbersOfDaysForComingBack, int numberOfDaysBeforeChristmas) { - return numberOfDaysBeforeChristmas - numbersOfDaysForComingBack - numberOfDaysToRest; + public static class ReindeerPlanner { + private final int numberOfDaysToRest; + + public ReindeerPlanner(int numberOfDaysToRest) { + this.numberOfDaysToRest = numberOfDaysToRest; + } + + private int numberOfDaysBeforeRestingBeforeChristmas(int numberOfDaysBeforeChristmas) { + return numberOfDaysBeforeChristmas - numberOfDaysToRest; + } + + private int daysBeforeReturn(ReindeerLocation reindeerLocation, int numberOfDaysBeforeChristmas) { + return numberOfDaysBeforeRestingBeforeChristmas(numberOfDaysBeforeChristmas) + - reindeerLocation.distanceFromSantaHouseInDays(); + } + } + + public record ReindeerLocation(String currentLocation, int distanceFromSantaHouseInDays) { + boolean isReachableInDays(int daysToTravel) { + return daysToTravel > distanceFromSantaHouseInDays(); + } } } \ No newline at end of file diff --git a/exercise/java/day01/src/test/java/SantaCommunicatorTest.java b/exercise/java/day01/src/test/java/SantaCommunicatorTest.java index 836ee488d..9f3e188d0 100644 --- a/exercise/java/day01/src/test/java/SantaCommunicatorTest.java +++ b/exercise/java/day01/src/test/java/SantaCommunicatorTest.java @@ -20,7 +20,7 @@ void setup() { @Test void composeMessage() { - var message = communicator.composeMessage(DASHER, NORTH_POLE, 5, numberOfDayBeforeChristmas); + var message = communicator.composeMessage(DASHER, new SantaCommunicator.ReindeerLocation(NORTH_POLE, 5), numberOfDayBeforeChristmas); assertThat(message).isEqualTo("Dear Dasher, please return from North Pole in 17 day(s) to be ready and rest before Christmas."); } @@ -28,8 +28,7 @@ void composeMessage() { void shouldDetectOverdueReindeer() { var overdue = communicator.isOverdue( DASHER, - NORTH_POLE, - numberOfDayBeforeChristmas, + new SantaCommunicator.ReindeerLocation(NORTH_POLE, numberOfDayBeforeChristmas), numberOfDayBeforeChristmas, logger); @@ -43,8 +42,7 @@ void shouldReturnFalseWhenNoOverdue() { assertThat( communicator.isOverdue( DASHER, - NORTH_POLE, - numberOfDayBeforeChristmas - numberOfDaysToRest - 1, + new SantaCommunicator.ReindeerLocation(NORTH_POLE, numberOfDayBeforeChristmas - numberOfDaysToRest - 1), numberOfDayBeforeChristmas, logger) ).isFalse();