now()->format(DATE_ATOM), $wrappedClock->now()->format(DATE_ATOM) ); } /** * @test * * @covers ::wrapping */ public function itWrapsAnObjectWithANowMethod(): void { $now = FrozenClock::fromUTC()->now(); $clock = new class($now) { private DateTimeImmutable $now; public function __construct(DateTimeImmutable $now) { $this->now = $now; } public function now(): DateTimeImmutable { return $this->now; } }; $wrappedClock = WrappingClock::wrapping($clock); self::assertSame( $now->format(DATE_ATOM), $wrappedClock->now()->format(DATE_ATOM) ); } /** * @test * * @covers ::wrapping */ public function itRejectsObjectsWithANowMethodReturningANonDateTimeImmutable(): void { $clock = new class() { public function now(): string { return 'foo'; } }; $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('$clock->now() must return a DateTimeImmutable'); WrappingClock::wrapping($clock); } }