From d3f26e3d5f7d5037de480cf06a2e2826019393fa Mon Sep 17 00:00:00 2001 From: Bailey Spencer Date: Sun, 10 Apr 2022 13:48:58 -0400 Subject: [PATCH] Add mock for gettimeofday --- README.md | 2 +- src/ClockMock.php | 22 ++++++++++++++++++++++ tests/ClockMockTest.php | 26 ++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e9af96..c419ea7 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ Note that, as this is not a tool intended for production, it should be required - date_create() - date_create_immutable() - getdate() +- gettimeofday() - gmdate() - idate() - localtime() @@ -49,7 +50,6 @@ Note that, as this is not a tool intended for production, it should be required - date_create_from_format() - date_create_immutable_from_format() -- gettimeofday() - gmmktime() - gmstrftime() - mktime() diff --git a/src/ClockMock.php b/src/ClockMock.php index 6dec18f..ee70608 100644 --- a/src/ClockMock.php +++ b/src/ClockMock.php @@ -54,6 +54,7 @@ public static function reset(): void uopz_unset_return('date_create'); uopz_unset_return('date_create_immutable'); uopz_unset_return('getdate'); + uopz_unset_return('gettimeofday'); uopz_unset_return('gmdate'); uopz_unset_return('idate'); uopz_unset_return('localtime'); @@ -78,6 +79,7 @@ private static function activateMocksIfNeeded(): void uopz_set_return('date_create', self::mock_date_create(), true); uopz_set_return('date_create_immutable', self::mock_date_create_immutable(), true); uopz_set_return('getdate', self::mock_getdate(), true); + uopz_set_return('gettimeofday', self::mock_gettimeofday(), true); uopz_set_return('gmdate', self::mock_gmdate(), true); uopz_set_return('idate', self::mock_idate(), true); uopz_set_return('localtime', self::mock_localtime(), true); @@ -132,6 +134,26 @@ private static function mock_getdate(): callable return fn (?int $timestamp = null) => $getdate_mock($timestamp); } + /** + * @see https://www.php.net/manual/en/function.gettimeofday.php + */ + private static function mock_gettimeofday(): callable + { + $gettimeofday_mock = function (bool $as_float) { + if ($as_float) { + return (float) self::$frozenDateTime->format('U.u'); + } + return [ + 'sec' => self::$frozenDateTime->getTimestamp(), + 'usec' => (int) self::$frozenDateTime->format('u'), + 'minuteswest' => (int) self::$frozenDateTime->format('Z') / -60, + 'dsttime' => (int) self::$frozenDateTime->format('I'), + ]; + }; + + return fn (bool $as_float = false) => $gettimeofday_mock($as_float); + } + /** * @see https://www.php.net/manual/en/function.gmdate.php */ diff --git a/tests/ClockMockTest.php b/tests/ClockMockTest.php index 57c46fd..878a862 100644 --- a/tests/ClockMockTest.php +++ b/tests/ClockMockTest.php @@ -141,6 +141,32 @@ public function test_getdate() ); } + public function dataProvider_gettimeofday(): array + { + return [ + ['2022-04-04 14:26:29.123456', 'UTC', [1649082389, 123456, 0, 0]], + ['2022-03-04 14:26:29.123456', 'Europe/Kiev', [1646396789, 123456, -120, 0]], + ['2022-04-04 14:26:29.123456', 'Europe/Kiev', [1649071589, 123456, -180, 1]], + ]; + } + + /** + * @dataProvider dataProvider_gettimeofday + */ + public function test_gettimeofday(string $freezeDateTime, string $freezeTimeZone, array $expectedResult) + { + ClockMock::freeze(new \DateTime($freezeDateTime, new \DateTimeZone($freezeTimeZone))); + + $this->assertEquals(array_combine(['sec', 'usec', 'minuteswest', 'dsttime'], $expectedResult), gettimeofday()); + } + + public function test_gettimeofday_as_float() + { + ClockMock::freeze(new \DateTime('2022-04-04 14:26:29.123456')); // UTC, +00:00 + + $this->assertEquals(1649082389.123456, gettimeofday(true)); + } + public function test_gmdate() { ClockMock::freeze(new \DateTime('1986-06-05'));