diff --git a/src/Util/Exporter.php b/src/Util/Exporter.php index 4cbe4141ff8..797f1418cb9 100644 --- a/src/Util/Exporter.php +++ b/src/Util/Exporter.php @@ -11,6 +11,7 @@ use function is_array; use function is_scalar; +use SebastianBergmann\RecursionContext\Context; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit @@ -26,7 +27,7 @@ public static function export(mixed $value, bool $exportObjects = false): string return '{enable export of objects to see this value}'; } - private static function isScalarOrArrayOfScalars(mixed $value): bool + private static function isScalarOrArrayOfScalars(mixed &$value, Context $context = null): bool { if (is_scalar($value)) { return true; @@ -36,8 +37,19 @@ private static function isScalarOrArrayOfScalars(mixed $value): bool return false; } - foreach ($value as $_value) { - if (!self::isScalarOrArrayOfScalars($_value)) { + if (!$context) { + $context = new Context; + } + + if ($context->contains($value) !== false) { + return true; + } + + $array = $value; + $context->add($value); + + foreach ($array as &$_value) { + if (!self::isScalarOrArrayOfScalars($_value, $context)) { return false; } } diff --git a/tests/end-to-end/regression/5567.phpt b/tests/end-to-end/regression/5567.phpt new file mode 100644 index 00000000000..abcd46020ff --- /dev/null +++ b/tests/end-to-end/regression/5567.phpt @@ -0,0 +1,32 @@ +--TEST-- +https://github.com/sebastianbergmann/phpunit/issues/5567 +--FILE-- +run($_SERVER['argv']); +--EXPECTF-- +PHPUnit %s by Sebastian Bergmann and contributors. + +Runtime: %s + +F 1 / 1 (100%) + +Time: %s, Memory: %s MB + +There was 1 failure: + +1) PHPUnit\TestFixture\Issue5567\Issue5567Test::testAnythingThatFailsWithRecursiveArray +Failed asserting that Array &0 [ + 'self' => Array &1 [ + 'self' => Array &1, + ], +] is false. + +%sIssue5567Test.php:%d + +FAILURES! +Tests: 1, Assertions: 1, Failures: 1. diff --git a/tests/end-to-end/regression/5567/Issue5567Test.php b/tests/end-to-end/regression/5567/Issue5567Test.php new file mode 100644 index 00000000000..cbbcec219ad --- /dev/null +++ b/tests/end-to-end/regression/5567/Issue5567Test.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TestFixture\Issue5567; + +use PHPUnit\Framework\TestCase; + +final class Issue5567Test extends TestCase +{ + public function testAnythingThatFailsWithRecursiveArray(): void + { + $array = []; + $array['self'] = &$array; + + $this->assertFalse($array); + } +}