newInstanceWithoutConstructor(); $contract = new Contract(); $weekDays = ['2026-03-16', '2026-03-17', '2026-03-18', '2026-03-19', '2026-03-20', '2026-03-21', '2026-03-22']; $contractsByDate = [ '2026-03-16' => null, '2026-03-17' => null, '2026-03-18' => null, '2026-03-19' => $contract, '2026-03-20' => $contract, '2026-03-21' => $contract, '2026-03-22' => $contract, ]; $anchor = $this->invokePrivate($service, 'resolveWeekAnchorDate', $weekDays, $contractsByDate); self::assertSame('2026-03-19', $anchor); } public function testResolveWeekAnchorDateReturnsFirstDayWhenItIsContracted(): void { $service = new ReflectionClass(RttRecoveryComputationService::class)->newInstanceWithoutConstructor(); $contract = new Contract(); $weekDays = ['2026-03-23', '2026-03-24', '2026-03-25']; $contractsByDate = [ '2026-03-23' => $contract, '2026-03-24' => $contract, '2026-03-25' => $contract, ]; $anchor = $this->invokePrivate($service, 'resolveWeekAnchorDate', $weekDays, $contractsByDate); self::assertSame('2026-03-23', $anchor); } public function testResolveWeekAnchorDateFallsBackToFirstDayWhenNoContract(): void { $service = new ReflectionClass(RttRecoveryComputationService::class)->newInstanceWithoutConstructor(); $weekDays = ['2026-03-16', '2026-03-17']; $contractsByDate = ['2026-03-16' => null, '2026-03-17' => null]; $anchor = $this->invokePrivate($service, 'resolveWeekAnchorDate', $weekDays, $contractsByDate); self::assertSame('2026-03-16', $anchor); } private function invokePrivate(object $obj, string $method, mixed ...$args): mixed { return new ReflectionClass($obj::class)->getMethod($method)->invoke($obj, ...$args); } }