calculator = new AbsenceDayCalculator(new PublicHolidayProvider()); } public function testFullWeekIsFiveWorkingDays(): void { // Mon 2026-06-01 to Fri 2026-06-05, no holidays that week self::assertSame(5.0, $this->calculator->countWorkingDays( new DateTimeImmutable('2026-06-01'), new DateTimeImmutable('2026-06-05'), )); } public function testWeekendIsSkipped(): void { // Fri 2026-06-05 to Mon 2026-06-08 => Fri + Mon = 2 self::assertSame(2.0, $this->calculator->countWorkingDays( new DateTimeImmutable('2026-06-05'), new DateTimeImmutable('2026-06-08'), )); } public function testHolidayIsSkipped(): void { // Thu 2026-05-07 to Fri 2026-05-08 (Victoire 1945) => Thu only = 1 self::assertSame(1.0, $this->calculator->countWorkingDays( new DateTimeImmutable('2026-05-07'), new DateTimeImmutable('2026-05-08'), )); } public function testHalfDayStartSubtractsHalf(): void { self::assertSame(4.5, $this->calculator->countWorkingDays( new DateTimeImmutable('2026-06-01'), new DateTimeImmutable('2026-06-05'), HalfDay::Afternoon, )); } public function testBothHalfDaysSubtractOne(): void { self::assertSame(4.0, $this->calculator->countWorkingDays( new DateTimeImmutable('2026-06-01'), new DateTimeImmutable('2026-06-05'), HalfDay::Afternoon, HalfDay::Morning, )); } public function testSingleHalfDay(): void { self::assertSame(0.5, $this->calculator->countWorkingDays( new DateTimeImmutable('2026-06-01'), new DateTimeImmutable('2026-06-01'), HalfDay::Morning, )); } public function testWorkingDaysVsOpenDays(): void { // Fri 2026-06-05 to Mon 2026-06-08, "ouvrables" includes Saturday // => Fri + Sat + Mon = 3 (Sunday always skipped) self::assertSame(3.0, $this->calculator->countWorkingDays( new DateTimeImmutable('2026-06-05'), new DateTimeImmutable('2026-06-08'), null, null, false, )); } }