*/ trait ClockSensitiveTrait { public static function mockTime(string|\DateTimeImmutable|bool $when = true): ClockInterface { Clock::set(match (true) { false === $when => self::saveClockBeforeTest(false), true === $when => new MockClock(), $when instanceof \DateTimeImmutable => new MockClock($when), default => new MockClock(now($when)), }); return Clock::get(); } /** * @beforeClass * * @before * * @internal */ #[Before] #[BeforeClass] public static function saveClockBeforeTest(bool $save = true): ClockInterface { static $originalClock; if ($save && $originalClock) { self::restoreClockAfterTest(); } return $save ? $originalClock = Clock::get() : $originalClock; } /** * @after * * @internal */ #[After] protected static function restoreClockAfterTest(): void { Clock::set(self::saveClockBeforeTest(false)); } }