summaryrefslogtreecommitdiff
path: root/vendor/sebastian/comparator/src
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/sebastian/comparator/src')
-rw-r--r--vendor/sebastian/comparator/src/ArrayComparator.php141
-rw-r--r--vendor/sebastian/comparator/src/Comparator.php61
-rw-r--r--vendor/sebastian/comparator/src/ComparisonFailure.php129
-rw-r--r--vendor/sebastian/comparator/src/DOMNodeComparator.php93
-rw-r--r--vendor/sebastian/comparator/src/DateTimeComparator.php95
-rw-r--r--vendor/sebastian/comparator/src/DoubleComparator.php59
-rw-r--r--vendor/sebastian/comparator/src/ExceptionComparator.php54
-rw-r--r--vendor/sebastian/comparator/src/Factory.php142
-rw-r--r--vendor/sebastian/comparator/src/MockObjectComparator.php48
-rw-r--r--vendor/sebastian/comparator/src/NumericComparator.php86
-rw-r--r--vendor/sebastian/comparator/src/ObjectComparator.php112
-rw-r--r--vendor/sebastian/comparator/src/ResourceComparator.php54
-rw-r--r--vendor/sebastian/comparator/src/ScalarComparator.php98
-rw-r--r--vendor/sebastian/comparator/src/SplObjectStorageComparator.php71
-rw-r--r--vendor/sebastian/comparator/src/TypeComparator.php62
-rw-r--r--vendor/sebastian/comparator/src/exceptions/Exception.php16
-rw-r--r--vendor/sebastian/comparator/src/exceptions/RuntimeException.php14
17 files changed, 1335 insertions, 0 deletions
diff --git a/vendor/sebastian/comparator/src/ArrayComparator.php b/vendor/sebastian/comparator/src/ArrayComparator.php
new file mode 100644
index 000000000..5d9fbce6e
--- /dev/null
+++ b/vendor/sebastian/comparator/src/ArrayComparator.php
@@ -0,0 +1,141 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use function array_key_exists;
+use function is_array;
+use function sort;
+use function sprintf;
+use function str_replace;
+use function trim;
+
+/**
+ * Compares arrays for equality.
+ *
+ * Arrays are equal if they contain the same key-value pairs.
+ * The order of the keys does not matter.
+ * The types of key-value pairs do not matter.
+ */
+class ArrayComparator extends Comparator
+{
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ */
+ public function accepts($expected, $actual)
+ {
+ return is_array($expected) && is_array($actual);
+ }
+
+ /**
+ * Asserts that two arrays are equal.
+ *
+ * @param mixed $expected First value to compare
+ * @param mixed $actual Second value to compare
+ * @param float $delta Allowed numerical distance between two values to consider them equal
+ * @param bool $canonicalize Arrays are sorted before comparison when set to true
+ * @param bool $ignoreCase Case is ignored when set to true
+ * @param array $processed List of already processed elements (used to prevent infinite recursion)
+ *
+ * @throws ComparisonFailure
+ */
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = [])/*: void*/
+ {
+ if ($canonicalize) {
+ sort($expected);
+ sort($actual);
+ }
+
+ $remaining = $actual;
+ $actualAsString = "Array (\n";
+ $expectedAsString = "Array (\n";
+ $equal = true;
+
+ foreach ($expected as $key => $value) {
+ unset($remaining[$key]);
+
+ if (!array_key_exists($key, $actual)) {
+ $expectedAsString .= sprintf(
+ " %s => %s\n",
+ $this->exporter->export($key),
+ $this->exporter->shortenedExport($value)
+ );
+
+ $equal = false;
+
+ continue;
+ }
+
+ try {
+ $comparator = $this->factory->getComparatorFor($value, $actual[$key]);
+ $comparator->assertEquals($value, $actual[$key], $delta, $canonicalize, $ignoreCase, $processed);
+
+ $expectedAsString .= sprintf(
+ " %s => %s\n",
+ $this->exporter->export($key),
+ $this->exporter->shortenedExport($value)
+ );
+
+ $actualAsString .= sprintf(
+ " %s => %s\n",
+ $this->exporter->export($key),
+ $this->exporter->shortenedExport($actual[$key])
+ );
+ } catch (ComparisonFailure $e) {
+ $expectedAsString .= sprintf(
+ " %s => %s\n",
+ $this->exporter->export($key),
+ $e->getExpectedAsString() ? $this->indent($e->getExpectedAsString()) : $this->exporter->shortenedExport($e->getExpected())
+ );
+
+ $actualAsString .= sprintf(
+ " %s => %s\n",
+ $this->exporter->export($key),
+ $e->getActualAsString() ? $this->indent($e->getActualAsString()) : $this->exporter->shortenedExport($e->getActual())
+ );
+
+ $equal = false;
+ }
+ }
+
+ foreach ($remaining as $key => $value) {
+ $actualAsString .= sprintf(
+ " %s => %s\n",
+ $this->exporter->export($key),
+ $this->exporter->shortenedExport($value)
+ );
+
+ $equal = false;
+ }
+
+ $expectedAsString .= ')';
+ $actualAsString .= ')';
+
+ if (!$equal) {
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ $expectedAsString,
+ $actualAsString,
+ false,
+ 'Failed asserting that two arrays are equal.'
+ );
+ }
+ }
+
+ protected function indent($lines)
+ {
+ return trim(str_replace("\n", "\n ", $lines));
+ }
+}
diff --git a/vendor/sebastian/comparator/src/Comparator.php b/vendor/sebastian/comparator/src/Comparator.php
new file mode 100644
index 000000000..e1906c167
--- /dev/null
+++ b/vendor/sebastian/comparator/src/Comparator.php
@@ -0,0 +1,61 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use SebastianBergmann\Exporter\Exporter;
+
+/**
+ * Abstract base class for comparators which compare values for equality.
+ */
+abstract class Comparator
+{
+ /**
+ * @var Factory
+ */
+ protected $factory;
+
+ /**
+ * @var Exporter
+ */
+ protected $exporter;
+
+ public function __construct()
+ {
+ $this->exporter = new Exporter;
+ }
+
+ public function setFactory(Factory $factory)/*: void*/
+ {
+ $this->factory = $factory;
+ }
+
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ */
+ abstract public function accepts($expected, $actual);
+
+ /**
+ * Asserts that two values are equal.
+ *
+ * @param mixed $expected First value to compare
+ * @param mixed $actual Second value to compare
+ * @param float $delta Allowed numerical distance between two values to consider them equal
+ * @param bool $canonicalize Arrays are sorted before comparison when set to true
+ * @param bool $ignoreCase Case is ignored when set to true
+ *
+ * @throws ComparisonFailure
+ */
+ abstract public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false);
+}
diff --git a/vendor/sebastian/comparator/src/ComparisonFailure.php b/vendor/sebastian/comparator/src/ComparisonFailure.php
new file mode 100644
index 000000000..857314daa
--- /dev/null
+++ b/vendor/sebastian/comparator/src/ComparisonFailure.php
@@ -0,0 +1,129 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use RuntimeException;
+use SebastianBergmann\Diff\Differ;
+use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder;
+
+/**
+ * Thrown when an assertion for string equality failed.
+ */
+class ComparisonFailure extends RuntimeException
+{
+ /**
+ * Expected value of the retrieval which does not match $actual.
+ *
+ * @var mixed
+ */
+ protected $expected;
+
+ /**
+ * Actually retrieved value which does not match $expected.
+ *
+ * @var mixed
+ */
+ protected $actual;
+
+ /**
+ * The string representation of the expected value.
+ *
+ * @var string
+ */
+ protected $expectedAsString;
+
+ /**
+ * The string representation of the actual value.
+ *
+ * @var string
+ */
+ protected $actualAsString;
+
+ /**
+ * @var bool
+ */
+ protected $identical;
+
+ /**
+ * Optional message which is placed in front of the first line
+ * returned by toString().
+ *
+ * @var string
+ */
+ protected $message;
+
+ /**
+ * Initialises with the expected value and the actual value.
+ *
+ * @param mixed $expected expected value retrieved
+ * @param mixed $actual actual value retrieved
+ * @param string $expectedAsString
+ * @param string $actualAsString
+ * @param bool $identical
+ * @param string $message a string which is prefixed on all returned lines
+ * in the difference output
+ */
+ public function __construct($expected, $actual, $expectedAsString, $actualAsString, $identical = false, $message = '')
+ {
+ $this->expected = $expected;
+ $this->actual = $actual;
+ $this->expectedAsString = $expectedAsString;
+ $this->actualAsString = $actualAsString;
+ $this->message = $message;
+ }
+
+ public function getActual()
+ {
+ return $this->actual;
+ }
+
+ public function getExpected()
+ {
+ return $this->expected;
+ }
+
+ /**
+ * @return string
+ */
+ public function getActualAsString()
+ {
+ return $this->actualAsString;
+ }
+
+ /**
+ * @return string
+ */
+ public function getExpectedAsString()
+ {
+ return $this->expectedAsString;
+ }
+
+ /**
+ * @return string
+ */
+ public function getDiff()
+ {
+ if (!$this->actualAsString && !$this->expectedAsString) {
+ return '';
+ }
+
+ $differ = new Differ(new UnifiedDiffOutputBuilder("\n--- Expected\n+++ Actual\n"));
+
+ return $differ->diff($this->expectedAsString, $this->actualAsString);
+ }
+
+ /**
+ * @return string
+ */
+ public function toString()
+ {
+ return $this->message . $this->getDiff();
+ }
+}
diff --git a/vendor/sebastian/comparator/src/DOMNodeComparator.php b/vendor/sebastian/comparator/src/DOMNodeComparator.php
new file mode 100644
index 000000000..5bf854eae
--- /dev/null
+++ b/vendor/sebastian/comparator/src/DOMNodeComparator.php
@@ -0,0 +1,93 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use function sprintf;
+use function strtolower;
+use DOMDocument;
+use DOMNode;
+use ValueError;
+
+/**
+ * Compares DOMNode instances for equality.
+ */
+class DOMNodeComparator extends ObjectComparator
+{
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ */
+ public function accepts($expected, $actual)
+ {
+ return $expected instanceof DOMNode && $actual instanceof DOMNode;
+ }
+
+ /**
+ * Asserts that two values are equal.
+ *
+ * @param mixed $expected First value to compare
+ * @param mixed $actual Second value to compare
+ * @param float $delta Allowed numerical distance between two values to consider them equal
+ * @param bool $canonicalize Arrays are sorted before comparison when set to true
+ * @param bool $ignoreCase Case is ignored when set to true
+ * @param array $processed List of already processed elements (used to prevent infinite recursion)
+ *
+ * @throws ComparisonFailure
+ */
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = [])/*: void*/
+ {
+ $expectedAsString = $this->nodeToText($expected, true, $ignoreCase);
+ $actualAsString = $this->nodeToText($actual, true, $ignoreCase);
+
+ if ($expectedAsString !== $actualAsString) {
+ $type = $expected instanceof DOMDocument ? 'documents' : 'nodes';
+
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ $expectedAsString,
+ $actualAsString,
+ false,
+ sprintf("Failed asserting that two DOM %s are equal.\n", $type)
+ );
+ }
+ }
+
+ /**
+ * Returns the normalized, whitespace-cleaned, and indented textual
+ * representation of a DOMNode.
+ */
+ private function nodeToText(DOMNode $node, bool $canonicalize, bool $ignoreCase): string
+ {
+ if ($canonicalize) {
+ $document = new DOMDocument;
+
+ try {
+ @$document->loadXML($node->C14N());
+ } catch (ValueError $e) {
+ }
+
+ $node = $document;
+ }
+
+ $document = $node instanceof DOMDocument ? $node : $node->ownerDocument;
+
+ $document->formatOutput = true;
+ $document->normalizeDocument();
+
+ $text = $node instanceof DOMDocument ? $node->saveXML() : $document->saveXML($node);
+
+ return $ignoreCase ? strtolower($text) : $text;
+ }
+}
diff --git a/vendor/sebastian/comparator/src/DateTimeComparator.php b/vendor/sebastian/comparator/src/DateTimeComparator.php
new file mode 100644
index 000000000..0a303b623
--- /dev/null
+++ b/vendor/sebastian/comparator/src/DateTimeComparator.php
@@ -0,0 +1,95 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * 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 floor;
+use function sprintf;
+use DateInterval;
+use DateTime;
+use DateTimeInterface;
+use DateTimeZone;
+use Exception;
+
+/**
+ * Compares DateTimeInterface instances for equality.
+ */
+class DateTimeComparator extends ObjectComparator
+{
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ */
+ public function accepts($expected, $actual)
+ {
+ return ($expected instanceof DateTime || $expected instanceof DateTimeInterface) &&
+ ($actual instanceof DateTime || $actual instanceof DateTimeInterface);
+ }
+
+ /**
+ * Asserts that two values are equal.
+ *
+ * @param mixed $expected First value to compare
+ * @param mixed $actual Second value to compare
+ * @param float $delta Allowed numerical distance between two values to consider them equal
+ * @param bool $canonicalize Arrays are sorted before comparison when set to true
+ * @param bool $ignoreCase Case is ignored when set to true
+ * @param array $processed List of already processed elements (used to prevent infinite recursion)
+ *
+ * @throws Exception
+ * @throws ComparisonFailure
+ */
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = [])/*: void*/
+ {
+ /** @var DateTimeInterface $expected */
+ /** @var DateTimeInterface $actual */
+ $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),
+ false,
+ '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';
+ }
+}
diff --git a/vendor/sebastian/comparator/src/DoubleComparator.php b/vendor/sebastian/comparator/src/DoubleComparator.php
new file mode 100644
index 000000000..d90b9e06b
--- /dev/null
+++ b/vendor/sebastian/comparator/src/DoubleComparator.php
@@ -0,0 +1,59 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use function is_float;
+use function is_numeric;
+
+/**
+ * Compares doubles for equality.
+ */
+class DoubleComparator extends NumericComparator
+{
+ /**
+ * Smallest value available in PHP.
+ *
+ * @var float
+ */
+ public const EPSILON = 0.0000000001;
+
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ */
+ public function accepts($expected, $actual)
+ {
+ return (is_float($expected) || is_float($actual)) && is_numeric($expected) && is_numeric($actual);
+ }
+
+ /**
+ * Asserts that two values are equal.
+ *
+ * @param mixed $expected First value to compare
+ * @param mixed $actual Second value to compare
+ * @param float $delta Allowed numerical distance between two values to consider them equal
+ * @param bool $canonicalize Arrays are sorted before comparison when set to true
+ * @param bool $ignoreCase Case is ignored when set to true
+ *
+ * @throws ComparisonFailure
+ */
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)/*: void*/
+ {
+ if ($delta == 0) {
+ $delta = self::EPSILON;
+ }
+
+ parent::assertEquals($expected, $actual, $delta, $canonicalize, $ignoreCase);
+ }
+}
diff --git a/vendor/sebastian/comparator/src/ExceptionComparator.php b/vendor/sebastian/comparator/src/ExceptionComparator.php
new file mode 100644
index 000000000..1fc0174ef
--- /dev/null
+++ b/vendor/sebastian/comparator/src/ExceptionComparator.php
@@ -0,0 +1,54 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use Exception;
+
+/**
+ * Compares Exception instances for equality.
+ */
+class ExceptionComparator extends ObjectComparator
+{
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ */
+ public function accepts($expected, $actual)
+ {
+ return $expected instanceof Exception && $actual instanceof Exception;
+ }
+
+ /**
+ * Converts an object to an array containing all of its private, protected
+ * and public properties.
+ *
+ * @param object $object
+ *
+ * @return array
+ */
+ protected function toArray($object)
+ {
+ $array = parent::toArray($object);
+
+ unset(
+ $array['file'],
+ $array['line'],
+ $array['trace'],
+ $array['string'],
+ $array['xdebug_message']
+ );
+
+ return $array;
+ }
+}
diff --git a/vendor/sebastian/comparator/src/Factory.php b/vendor/sebastian/comparator/src/Factory.php
new file mode 100644
index 000000000..5b16366f0
--- /dev/null
+++ b/vendor/sebastian/comparator/src/Factory.php
@@ -0,0 +1,142 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use function array_unshift;
+
+/**
+ * Factory for comparators which compare values for equality.
+ */
+class Factory
+{
+ /**
+ * @var Factory
+ */
+ private static $instance;
+
+ /**
+ * @var Comparator[]
+ */
+ private $customComparators = [];
+
+ /**
+ * @var Comparator[]
+ */
+ private $defaultComparators = [];
+
+ /**
+ * @return Factory
+ */
+ public static function getInstance()
+ {
+ if (self::$instance === null) {
+ self::$instance = new self; // @codeCoverageIgnore
+ }
+
+ return self::$instance;
+ }
+
+ /**
+ * Constructs a new factory.
+ */
+ public function __construct()
+ {
+ $this->registerDefaultComparators();
+ }
+
+ /**
+ * Returns the correct comparator for comparing two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return Comparator
+ */
+ public function getComparatorFor($expected, $actual)
+ {
+ foreach ($this->customComparators as $comparator) {
+ if ($comparator->accepts($expected, $actual)) {
+ return $comparator;
+ }
+ }
+
+ foreach ($this->defaultComparators as $comparator) {
+ if ($comparator->accepts($expected, $actual)) {
+ return $comparator;
+ }
+ }
+
+ throw new RuntimeException('No suitable Comparator implementation found');
+ }
+
+ /**
+ * Registers a new comparator.
+ *
+ * This comparator will be returned by getComparatorFor() if its accept() method
+ * returns TRUE for the compared values. It has higher priority than the
+ * existing comparators, meaning that its accept() method will be invoked
+ * before those of the other comparators.
+ *
+ * @param Comparator $comparator The comparator to be registered
+ */
+ public function register(Comparator $comparator)/*: void*/
+ {
+ array_unshift($this->customComparators, $comparator);
+
+ $comparator->setFactory($this);
+ }
+
+ /**
+ * Unregisters a comparator.
+ *
+ * This comparator will no longer be considered by getComparatorFor().
+ *
+ * @param Comparator $comparator The comparator to be unregistered
+ */
+ public function unregister(Comparator $comparator)/*: void*/
+ {
+ foreach ($this->customComparators as $key => $_comparator) {
+ if ($comparator === $_comparator) {
+ unset($this->customComparators[$key]);
+ }
+ }
+ }
+
+ /**
+ * Unregisters all non-default comparators.
+ */
+ public function reset()/*: void*/
+ {
+ $this->customComparators = [];
+ }
+
+ private function registerDefaultComparators(): void
+ {
+ $this->registerDefaultComparator(new MockObjectComparator);
+ $this->registerDefaultComparator(new DateTimeComparator);
+ $this->registerDefaultComparator(new DOMNodeComparator);
+ $this->registerDefaultComparator(new SplObjectStorageComparator);
+ $this->registerDefaultComparator(new ExceptionComparator);
+ $this->registerDefaultComparator(new ObjectComparator);
+ $this->registerDefaultComparator(new ResourceComparator);
+ $this->registerDefaultComparator(new ArrayComparator);
+ $this->registerDefaultComparator(new DoubleComparator);
+ $this->registerDefaultComparator(new NumericComparator);
+ $this->registerDefaultComparator(new ScalarComparator);
+ $this->registerDefaultComparator(new TypeComparator);
+ }
+
+ private function registerDefaultComparator(Comparator $comparator): void
+ {
+ $this->defaultComparators[] = $comparator;
+
+ $comparator->setFactory($this);
+ }
+}
diff --git a/vendor/sebastian/comparator/src/MockObjectComparator.php b/vendor/sebastian/comparator/src/MockObjectComparator.php
new file mode 100644
index 000000000..cb6703161
--- /dev/null
+++ b/vendor/sebastian/comparator/src/MockObjectComparator.php
@@ -0,0 +1,48 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use PHPUnit\Framework\MockObject\MockObject;
+
+/**
+ * Compares PHPUnit\Framework\MockObject\MockObject instances for equality.
+ */
+class MockObjectComparator extends ObjectComparator
+{
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ */
+ public function accepts($expected, $actual)
+ {
+ return $expected instanceof MockObject && $actual instanceof MockObject;
+ }
+
+ /**
+ * Converts an object to an array containing all of its private, protected
+ * and public properties.
+ *
+ * @param object $object
+ *
+ * @return array
+ */
+ protected function toArray($object)
+ {
+ $array = parent::toArray($object);
+
+ unset($array['__phpunit_invocationMocker']);
+
+ return $array;
+ }
+}
diff --git a/vendor/sebastian/comparator/src/NumericComparator.php b/vendor/sebastian/comparator/src/NumericComparator.php
new file mode 100644
index 000000000..12e6721d6
--- /dev/null
+++ b/vendor/sebastian/comparator/src/NumericComparator.php
@@ -0,0 +1,86 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * 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 is_float;
+use function is_infinite;
+use function is_nan;
+use function is_numeric;
+use function is_string;
+use function sprintf;
+
+/**
+ * Compares numerical values for equality.
+ */
+class NumericComparator extends ScalarComparator
+{
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ */
+ public function accepts($expected, $actual)
+ {
+ // all numerical values, but not if one of them is a double
+ // or both of them are strings
+ return is_numeric($expected) && is_numeric($actual) &&
+ !(is_float($expected) || is_float($actual)) &&
+ !(is_string($expected) && is_string($actual));
+ }
+
+ /**
+ * Asserts that two values are equal.
+ *
+ * @param mixed $expected First value to compare
+ * @param mixed $actual Second value to compare
+ * @param float $delta Allowed numerical distance between two values to consider them equal
+ * @param bool $canonicalize Arrays are sorted before comparison when set to true
+ * @param bool $ignoreCase Case is ignored when set to true
+ *
+ * @throws ComparisonFailure
+ */
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)/*: void*/
+ {
+ if ($this->isInfinite($actual) && $this->isInfinite($expected)) {
+ return;
+ }
+
+ if (($this->isInfinite($actual) xor $this->isInfinite($expected)) ||
+ ($this->isNan($actual) || $this->isNan($expected)) ||
+ abs($actual - $expected) > $delta) {
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ '',
+ '',
+ false,
+ sprintf(
+ 'Failed asserting that %s matches expected %s.',
+ $this->exporter->export($actual),
+ $this->exporter->export($expected)
+ )
+ );
+ }
+ }
+
+ private function isInfinite($value): bool
+ {
+ return is_float($value) && is_infinite($value);
+ }
+
+ private function isNan($value): bool
+ {
+ return is_float($value) && is_nan($value);
+ }
+}
diff --git a/vendor/sebastian/comparator/src/ObjectComparator.php b/vendor/sebastian/comparator/src/ObjectComparator.php
new file mode 100644
index 000000000..9380ba150
--- /dev/null
+++ b/vendor/sebastian/comparator/src/ObjectComparator.php
@@ -0,0 +1,112 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use function get_class;
+use function in_array;
+use function is_object;
+use function sprintf;
+use function substr_replace;
+
+/**
+ * Compares objects for equality.
+ */
+class ObjectComparator extends ArrayComparator
+{
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ */
+ public function accepts($expected, $actual)
+ {
+ return is_object($expected) && is_object($actual);
+ }
+
+ /**
+ * Asserts that two values are equal.
+ *
+ * @param mixed $expected First value to compare
+ * @param mixed $actual Second value to compare
+ * @param float $delta Allowed numerical distance between two values to consider them equal
+ * @param bool $canonicalize Arrays are sorted before comparison when set to true
+ * @param bool $ignoreCase Case is ignored when set to true
+ * @param array $processed List of already processed elements (used to prevent infinite recursion)
+ *
+ * @throws ComparisonFailure
+ */
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = [])/*: void*/
+ {
+ if (get_class($actual) !== get_class($expected)) {
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ $this->exporter->export($expected),
+ $this->exporter->export($actual),
+ false,
+ sprintf(
+ '%s is not instance of expected class "%s".',
+ $this->exporter->export($actual),
+ get_class($expected)
+ )
+ );
+ }
+
+ // don't compare twice to allow for cyclic dependencies
+ if (in_array([$actual, $expected], $processed, true) ||
+ in_array([$expected, $actual], $processed, true)) {
+ return;
+ }
+
+ $processed[] = [$actual, $expected];
+
+ // don't compare objects if they are identical
+ // this helps to avoid the error "maximum function nesting level reached"
+ // CAUTION: this conditional clause is not tested
+ if ($actual !== $expected) {
+ try {
+ parent::assertEquals(
+ $this->toArray($expected),
+ $this->toArray($actual),
+ $delta,
+ $canonicalize,
+ $ignoreCase,
+ $processed
+ );
+ } catch (ComparisonFailure $e) {
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ // replace "Array" with "MyClass object"
+ substr_replace($e->getExpectedAsString(), get_class($expected) . ' Object', 0, 5),
+ substr_replace($e->getActualAsString(), get_class($actual) . ' Object', 0, 5),
+ false,
+ 'Failed asserting that two objects are equal.'
+ );
+ }
+ }
+ }
+
+ /**
+ * Converts an object to an array containing all of its private, protected
+ * and public properties.
+ *
+ * @param object $object
+ *
+ * @return array
+ */
+ protected function toArray($object)
+ {
+ return $this->exporter->toArray($object);
+ }
+}
diff --git a/vendor/sebastian/comparator/src/ResourceComparator.php b/vendor/sebastian/comparator/src/ResourceComparator.php
new file mode 100644
index 000000000..7822598b1
--- /dev/null
+++ b/vendor/sebastian/comparator/src/ResourceComparator.php
@@ -0,0 +1,54 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use function is_resource;
+
+/**
+ * Compares resources for equality.
+ */
+class ResourceComparator extends Comparator
+{
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ */
+ public function accepts($expected, $actual)
+ {
+ return is_resource($expected) && is_resource($actual);
+ }
+
+ /**
+ * Asserts that two values are equal.
+ *
+ * @param mixed $expected First value to compare
+ * @param mixed $actual Second value to compare
+ * @param float $delta Allowed numerical distance between two values to consider them equal
+ * @param bool $canonicalize Arrays are sorted before comparison when set to true
+ * @param bool $ignoreCase Case is ignored when set to true
+ *
+ * @throws ComparisonFailure
+ */
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)/*: void*/
+ {
+ if ($actual != $expected) {
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ $this->exporter->export($expected),
+ $this->exporter->export($actual)
+ );
+ }
+ }
+}
diff --git a/vendor/sebastian/comparator/src/ScalarComparator.php b/vendor/sebastian/comparator/src/ScalarComparator.php
new file mode 100644
index 000000000..08ded922b
--- /dev/null
+++ b/vendor/sebastian/comparator/src/ScalarComparator.php
@@ -0,0 +1,98 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use function is_object;
+use function is_scalar;
+use function is_string;
+use function method_exists;
+use function sprintf;
+use function strtolower;
+
+/**
+ * Compares scalar or NULL values for equality.
+ */
+class ScalarComparator extends Comparator
+{
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ *
+ * @since Method available since Release 3.6.0
+ */
+ public function accepts($expected, $actual)
+ {
+ return ((is_scalar($expected) xor null === $expected) &&
+ (is_scalar($actual) xor null === $actual))
+ // allow comparison between strings and objects featuring __toString()
+ || (is_string($expected) && is_object($actual) && method_exists($actual, '__toString'))
+ || (is_object($expected) && method_exists($expected, '__toString') && is_string($actual));
+ }
+
+ /**
+ * Asserts that two values are equal.
+ *
+ * @param mixed $expected First value to compare
+ * @param mixed $actual Second value to compare
+ * @param float $delta Allowed numerical distance between two values to consider them equal
+ * @param bool $canonicalize Arrays are sorted before comparison when set to true
+ * @param bool $ignoreCase Case is ignored when set to true
+ *
+ * @throws ComparisonFailure
+ */
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)/*: void*/
+ {
+ $expectedToCompare = $expected;
+ $actualToCompare = $actual;
+
+ // always compare as strings to avoid strange behaviour
+ // otherwise 0 == 'Foobar'
+ if (is_string($expected) || is_string($actual)) {
+ $expectedToCompare = (string) $expectedToCompare;
+ $actualToCompare = (string) $actualToCompare;
+
+ if ($ignoreCase) {
+ $expectedToCompare = strtolower($expectedToCompare);
+ $actualToCompare = strtolower($actualToCompare);
+ }
+ }
+
+ if ($expectedToCompare !== $actualToCompare && is_string($expected) && is_string($actual)) {
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ $this->exporter->export($expected),
+ $this->exporter->export($actual),
+ false,
+ 'Failed asserting that two strings are equal.'
+ );
+ }
+
+ if ($expectedToCompare != $actualToCompare) {
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ // no diff is required
+ '',
+ '',
+ false,
+ sprintf(
+ 'Failed asserting that %s matches expected %s.',
+ $this->exporter->export($actual),
+ $this->exporter->export($expected)
+ )
+ );
+ }
+ }
+}
diff --git a/vendor/sebastian/comparator/src/SplObjectStorageComparator.php b/vendor/sebastian/comparator/src/SplObjectStorageComparator.php
new file mode 100644
index 000000000..d9b6f541a
--- /dev/null
+++ b/vendor/sebastian/comparator/src/SplObjectStorageComparator.php
@@ -0,0 +1,71 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use SplObjectStorage;
+
+/**
+ * Compares \SplObjectStorage instances for equality.
+ */
+class SplObjectStorageComparator extends Comparator
+{
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ */
+ public function accepts($expected, $actual)
+ {
+ return $expected instanceof SplObjectStorage && $actual instanceof SplObjectStorage;
+ }
+
+ /**
+ * Asserts that two values are equal.
+ *
+ * @param mixed $expected First value to compare
+ * @param mixed $actual Second value to compare
+ * @param float $delta Allowed numerical distance between two values to consider them equal
+ * @param bool $canonicalize Arrays are sorted before comparison when set to true
+ * @param bool $ignoreCase Case is ignored when set to true
+ *
+ * @throws ComparisonFailure
+ */
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)/*: void*/
+ {
+ foreach ($actual as $object) {
+ if (!$expected->contains($object)) {
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ $this->exporter->export($expected),
+ $this->exporter->export($actual),
+ false,
+ 'Failed asserting that two objects are equal.'
+ );
+ }
+ }
+
+ foreach ($expected as $object) {
+ if (!$actual->contains($object)) {
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ $this->exporter->export($expected),
+ $this->exporter->export($actual),
+ false,
+ 'Failed asserting that two objects are equal.'
+ );
+ }
+ }
+ }
+}
diff --git a/vendor/sebastian/comparator/src/TypeComparator.php b/vendor/sebastian/comparator/src/TypeComparator.php
new file mode 100644
index 000000000..b0d38d72e
--- /dev/null
+++ b/vendor/sebastian/comparator/src/TypeComparator.php
@@ -0,0 +1,62 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use function gettype;
+use function sprintf;
+
+/**
+ * Compares values for type equality.
+ */
+class TypeComparator extends Comparator
+{
+ /**
+ * Returns whether the comparator can compare two values.
+ *
+ * @param mixed $expected The first value to compare
+ * @param mixed $actual The second value to compare
+ *
+ * @return bool
+ */
+ public function accepts($expected, $actual)
+ {
+ return true;
+ }
+
+ /**
+ * Asserts that two values are equal.
+ *
+ * @param mixed $expected First value to compare
+ * @param mixed $actual Second value to compare
+ * @param float $delta Allowed numerical distance between two values to consider them equal
+ * @param bool $canonicalize Arrays are sorted before comparison when set to true
+ * @param bool $ignoreCase Case is ignored when set to true
+ *
+ * @throws ComparisonFailure
+ */
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)/*: void*/
+ {
+ if (gettype($expected) != gettype($actual)) {
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ // we don't need a diff
+ '',
+ '',
+ false,
+ sprintf(
+ '%s does not match expected type "%s".',
+ $this->exporter->shortenedExport($actual),
+ gettype($expected)
+ )
+ );
+ }
+ }
+}
diff --git a/vendor/sebastian/comparator/src/exceptions/Exception.php b/vendor/sebastian/comparator/src/exceptions/Exception.php
new file mode 100644
index 000000000..8975aaf1b
--- /dev/null
+++ b/vendor/sebastian/comparator/src/exceptions/Exception.php
@@ -0,0 +1,16 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+use Throwable;
+
+interface Exception extends Throwable
+{
+}
diff --git a/vendor/sebastian/comparator/src/exceptions/RuntimeException.php b/vendor/sebastian/comparator/src/exceptions/RuntimeException.php
new file mode 100644
index 000000000..ca726084a
--- /dev/null
+++ b/vendor/sebastian/comparator/src/exceptions/RuntimeException.php
@@ -0,0 +1,14 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/comparator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\Comparator;
+
+final class RuntimeException extends \RuntimeException implements Exception
+{
+}