12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- <?php declare(strict_types=1);
- /*
- * This file is part of sebastian/comparator.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace SebastianBergmann\Comparator;
- use function abs;
- use function assert;
- use function floor;
- use function sprintf;
- use DateInterval;
- use DateTimeInterface;
- use DateTimeZone;
- final class DateTimeComparator extends ObjectComparator
- {
- public function accepts(mixed $expected, mixed $actual): bool
- {
- return ($expected instanceof DateTimeInterface) &&
- ($actual instanceof DateTimeInterface);
- }
- /**
- * @throws ComparisonFailure
- */
- public function assertEquals(mixed $expected, mixed $actual, float $delta = 0.0, bool $canonicalize = false, bool $ignoreCase = false, array &$processed = []): void
- {
- assert($expected instanceof DateTimeInterface);
- assert($actual instanceof DateTimeInterface);
- $absDelta = abs($delta);
- $delta = new DateInterval(sprintf('PT%dS', $absDelta));
- $delta->f = $absDelta - floor($absDelta);
- $actualClone = (clone $actual)
- ->setTimezone(new DateTimeZone('UTC'));
- $expectedLower = (clone $expected)
- ->setTimezone(new DateTimeZone('UTC'))
- ->sub($delta);
- $expectedUpper = (clone $expected)
- ->setTimezone(new DateTimeZone('UTC'))
- ->add($delta);
- if ($actualClone < $expectedLower || $actualClone > $expectedUpper) {
- throw new ComparisonFailure(
- $expected,
- $actual,
- $this->dateTimeToString($expected),
- $this->dateTimeToString($actual),
- 'Failed asserting that two DateTime objects are equal.'
- );
- }
- }
- /**
- * Returns an ISO 8601 formatted string representation of a datetime or
- * 'Invalid DateTimeInterface object' if the provided DateTimeInterface was not properly
- * initialized.
- */
- private function dateTimeToString(DateTimeInterface $datetime): string
- {
- $string = $datetime->format('Y-m-d\TH:i:s.uO');
- return $string ?: 'Invalid DateTimeInterface object';
- }
- }
|