From 4d3ce8f801dd7a2e9b74d77c5b0f423180025712 Mon Sep 17 00:00:00 2001 From: Denis Brumann Date: Thu, 10 Nov 2022 15:03:01 +0100 Subject: [PATCH] [Clock] Provide modify() in MockClock --- src/Symfony/Component/Clock/MockClock.php | 9 ++++ .../Component/Clock/Tests/MockClockTest.php | 53 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/Symfony/Component/Clock/MockClock.php b/src/Symfony/Component/Clock/MockClock.php index 4835b96029157..a189ff54c4dc9 100644 --- a/src/Symfony/Component/Clock/MockClock.php +++ b/src/Symfony/Component/Clock/MockClock.php @@ -47,6 +47,15 @@ public function sleep(float|int $seconds): void $this->now = (new \DateTimeImmutable($now, $timezone))->setTimezone($timezone); } + public function modify(string $modifier): void + { + if (false === $modifiedNow = @$this->now->modify($modifier)) { + throw new \InvalidArgumentException(sprintf('Invalid modifier: "%s". Could not modify MockClock.', $modifier)); + } + + $this->now = $modifiedNow; + } + public function withTimeZone(\DateTimeZone|string $timezone): static { $clone = clone $this; diff --git a/src/Symfony/Component/Clock/Tests/MockClockTest.php b/src/Symfony/Component/Clock/Tests/MockClockTest.php index caafcbdb42608..f2ad743c3dc1c 100644 --- a/src/Symfony/Component/Clock/Tests/MockClockTest.php +++ b/src/Symfony/Component/Clock/Tests/MockClockTest.php @@ -63,6 +63,59 @@ public function testSleep() $this->assertSame($tz, $clock->now()->getTimezone()->getName()); } + public function provideValidModifyStrings(): iterable + { + yield 'absolute datetime value' => [ + '2112-09-17 23:53:03.001', + '2112-09-17 23:53:03.001000', + ]; + + yield 'relative modified date' => [ + '+2 days', + '2112-09-19 23:53:00.999000', + ]; + } + + /** + * @dataProvider provideValidModifyStrings + */ + public function testModifyWithSpecificDateTime(string $modifiedNow, string $expectedNow) + { + $clock = new MockClock((new \DateTimeImmutable('2112-09-17 23:53:00.999Z'))->setTimezone(new \DateTimeZone('UTC'))); + $tz = $clock->now()->getTimezone()->getName(); + + $clock->modify($modifiedNow); + + $this->assertSame($expectedNow, $clock->now()->format('Y-m-d H:i:s.u')); + $this->assertSame($tz, $clock->now()->getTimezone()->getName()); + } + + public function provideInvalidModifyStrings(): iterable + { + yield 'Named holiday is not recognized' => [ + 'Halloween', + 'Invalid modifier: "Halloween". Could not modify MockClock.', + ]; + + yield 'empty string' => [ + '', + 'Invalid modifier: "". Could not modify MockClock.', + ]; + } + + /** + * @dataProvider provideInvalidModifyStrings + */ + public function testModifyThrowsOnInvalidString(string $modifiedNow, string $expectedMessage) + { + $clock = new MockClock((new \DateTimeImmutable('2112-09-17 23:53:00.999Z'))->setTimezone(new \DateTimeZone('UTC'))); + + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage($expectedMessage); + + $clock->modify($modifiedNow); + } + public function testWithTimeZone() { $clock = new MockClock();