assertFalse($deadlines->isDue(null, new \DateTimeImmutable('2020-01-01'), CarbonImmutable::parse('2026-08-10'))); $this->assertNull($deadlines->getCurrentDeadline(CarbonImmutable::parse('2026-08-10'))); } public function testIsNotDueBeforeTheFirstDeadlineEvenWhenNeverConfirmed(): void { $deadlines = new RecurringDeadlines(['01-15', '07-15']); $this->assertFalse($deadlines->isDue( null, new \DateTimeImmutable('2025-11-05 12:00:00'), CarbonImmutable::parse('2026-01-10 12:00:00'), )); } public function testIsDueAfterTheFirstDeadlineWhenNeverConfirmed(): void { $deadlines = new RecurringDeadlines(['01-15', '07-15']); $this->assertTrue($deadlines->isDue( null, new \DateTimeImmutable('2025-11-05 12:00:00'), CarbonImmutable::parse('2026-01-20 12:00:00'), )); } public function testIsNotDueWhenConfirmedAfterTheCurrentDeadline(): void { $deadlines = new RecurringDeadlines(['01-15', '07-15']); $this->assertFalse($deadlines->isDue( new \DateTimeImmutable('2026-01-16 10:00:00'), new \DateTimeImmutable('2025-11-05 12:00:00'), CarbonImmutable::parse('2026-05-20 12:00:00'), )); } public function testIsDueWhenTheConfirmationPredatesTheCurrentDeadline(): void { $deadlines = new RecurringDeadlines(['01-15', '07-15']); $this->assertTrue($deadlines->isDue( new \DateTimeImmutable('2026-02-01 10:00:00'), new \DateTimeImmutable('2025-11-05 12:00:00'), CarbonImmutable::parse('2026-07-20 12:00:00'), )); } public function testIsNotDueWhenRegisteredAfterTheFirstDeadline(): void { $deadlines = new RecurringDeadlines(['01-15', '07-15']); $this->assertFalse($deadlines->isDue( null, new \DateTimeImmutable('2026-03-01 10:00:00'), CarbonImmutable::parse('2026-05-20 12:00:00'), )); } public function testIsNotDueWhenRegisteredAfterTheSecondDeadline(): void { $deadlines = new RecurringDeadlines(['01-15', '07-15']); $this->assertFalse($deadlines->isDue( null, new \DateTimeImmutable('2026-10-01 10:00:00'), CarbonImmutable::parse('2026-11-20 12:00:00'), )); } public function testIsDueWhenRegisteredBeforeAllCurrentYearDeadlines(): void { $deadlines = new RecurringDeadlines(['01-15', '07-15']); $this->assertTrue($deadlines->isDue( null, new \DateTimeImmutable('2025-10-01 10:00:00'), CarbonImmutable::parse('2026-11-20 12:00:00'), )); } public function testAMissingRegistrationDateDoesNotExempt(): void { $deadlines = new RecurringDeadlines(['01-15', '07-15']); $this->assertTrue($deadlines->isDue(null, null, CarbonImmutable::parse('2026-01-20 12:00:00'))); } public function testGetCurrentDeadlineReturnsTheMostRecentlyPassedOne(): void { $deadlines = new RecurringDeadlines(['01-15', '07-15']); $this->assertSame( '2026-07-15', $deadlines->getCurrentDeadline(CarbonImmutable::parse('2026-08-10'))?->format('Y-m-d'), ); $this->assertNull($deadlines->getCurrentDeadline(CarbonImmutable::parse('2026-01-10'))); } }