From dd2a647b7e5d618bcdd3ba5779027d9c5db98719 Mon Sep 17 00:00:00 2001 From: Frank Koornstra Date: Fri, 19 Jan 2018 16:26:09 +0100 Subject: [PATCH] Make FrozenClock mutable through setter Because the FrozenClock is often injected in other objects during testing, being able to change the current time on the FrozenClock without reinjecting it in the object under test is quite useful. --- src/FrozenClock.php | 5 +++++ test/FrozenClockTest.php | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/FrozenClock.php b/src/FrozenClock.php index 80862a72..b9d54c89 100644 --- a/src/FrozenClock.php +++ b/src/FrozenClock.php @@ -18,6 +18,11 @@ public function __construct(DateTimeImmutable $now) $this->now = $now; } + public function setTo(DateTimeImmutable $now): void + { + $this->now = $now; + } + public function now(): DateTimeImmutable { return $this->now; diff --git a/test/FrozenClockTest.php b/test/FrozenClockTest.php index 5a39d1db..80be833d 100644 --- a/test/FrozenClockTest.php +++ b/test/FrozenClockTest.php @@ -23,4 +23,23 @@ public function nowShouldReturnAlwaysTheSameObject() self::assertSame($now, $clock->now()); self::assertSame($now, $clock->now()); } + + /** + * @test + * + * @covers \Lcobucci\Clock\FrozenClock::setTo + * @uses \Lcobucci\Clock\FrozenClock::__construct() + * @uses \Lcobucci\Clock\FrozenClock::now + */ + public function nowSetChangesTheObject() + { + $oldNow = new DateTimeImmutable(); + $clock = new FrozenClock($oldNow); + + $newNow = new DateTimeImmutable(); + $clock->setTo($newNow); + + self::assertNotSame($oldNow, $clock->now()); + self::assertSame($newNow, $clock->now()); + } }