From da777795257ea89a8a08e14a07358a9f8691fd83 Mon Sep 17 00:00:00 2001 From: Ondrej Vlach Date: Wed, 7 Aug 2024 12:57:25 +0200 Subject: [PATCH] feat: add multiple working day determiner --- .../Utils/MultipleWorkingDayDeterminer.php | 42 +++++++++++++++++++ .../MultipleWorkingDayDeterminerTest.php | 42 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 app/Services/WorkingDays/Utils/MultipleWorkingDayDeterminer.php create mode 100644 tests/Unit/Services/WorkingDays/Utils/MultipleWorkingDayDeterminerTest.php diff --git a/app/Services/WorkingDays/Utils/MultipleWorkingDayDeterminer.php b/app/Services/WorkingDays/Utils/MultipleWorkingDayDeterminer.php new file mode 100644 index 0000000..6b674d0 --- /dev/null +++ b/app/Services/WorkingDays/Utils/MultipleWorkingDayDeterminer.php @@ -0,0 +1,42 @@ + $workingDayDeterminers + */ + public function __construct( + protected readonly array $workingDayDeterminers, + ) { + } + + public function isWorkingDay(\DateTimeImmutable $date): bool + { + foreach ($this->workingDayDeterminers as $workingDayDeterminer) { + if (!$workingDayDeterminer->isWorkingDay($date)) { + return false; + } + } + return true; // All working day determiners returned true, so the date is a working day. + } + + public function getWorkingDaysCount(\DateTimeImmutable $startDate, int $workingDays): int + { + $workingDaysCount = $workingDays; + + foreach ($this->workingDayDeterminers as $workingDayDeterminer) { + $workingDaysCount = min($workingDaysCount, $workingDayDeterminer->getWorkingDaysCount($startDate, $workingDays)); + } + + return $workingDaysCount; + } +} diff --git a/tests/Unit/Services/WorkingDays/Utils/MultipleWorkingDayDeterminerTest.php b/tests/Unit/Services/WorkingDays/Utils/MultipleWorkingDayDeterminerTest.php new file mode 100644 index 0000000..6e66ca3 --- /dev/null +++ b/tests/Unit/Services/WorkingDays/Utils/MultipleWorkingDayDeterminerTest.php @@ -0,0 +1,42 @@ +createMock(WorkingDayDeterminerInterface::class); + $mock->expects($this->once())->method('isWorkingDay')->with($date)->willReturn(true); + $mock1 = $this->createMock(WorkingDayDeterminerInterface::class); + $mock1->expects($this->once())->method('isWorkingDay')->with($date)->willReturn(true); + $determiner = new MultipleWorkingDayDeterminer([ + $mock, + $mock1, + ]); + + $this->assertTrue($determiner->isWorkingDay($date)); + } + + public function testFirstDeterminerReturnsFalseForWorkingDay(): void + { + $date = new \DateTimeImmutable('2021-01-01'); + $mock = $this->createMock(WorkingDayDeterminerInterface::class); + $mock->expects($this->once())->method('isWorkingDay')->with($date)->willReturn(false); + $mock1 = $this->createMock(WorkingDayDeterminerInterface::class); + $mock1->expects($this->never())->method('isWorkingDay'); + $determiner = new MultipleWorkingDayDeterminer([ + $mock, + $mock1, + ]); + + $this->assertFalse($determiner->isWorkingDay($date)); + } +}