eliashaeussler/deep-closure-comparator

This package is abandoned and no longer maintained. The author suggests using the sebastian/comparator package instead.

Provides a PHPUnit comparator to assert equality of closures

Package info

github.com/eliashaeussler/deep-closure-comparator

pkg:composer/eliashaeussler/deep-closure-comparator

Statistics

Installs: 80 491

Dependents: 2

Suggesters: 0

Stars: 0

Open Issues: 1

1.2.3 2026-06-07 17:43 UTC

Requires

Suggests

None

Provides

None

Conflicts

None

Replaces

None

GPL-3.0-or-later 7c1897e338c2b72dbe0c8245de84ad311ff4a702

This package is auto-updated.

Last update: 2026-06-07 17:44:09 UTC


README

Deep Closure Comparator

πŸ‘ Coverage
πŸ‘ CGL
πŸ‘ Tests
πŸ‘ Supported PHP Versions

Important

Abandoned! This library was created in response to a change within the sebastian/comparator library. Since the underlying comparison mechanism was updated in the meanwhile, this library is no longer necessary and is therefore abandoned. Please switch back to sebastian/comparator (versions 7.1.8, 8.2.1 and onwards).

A Composer library that provides a PHPUnit comparator to assert equality of closures. It can be used to perform deep evaluation of closures, e.g. as part of objects. Closures are compared using their serialized value, which is calculated by the opis/closure library.

πŸ”₯ Installation

πŸ‘ Packagist
πŸ‘ Packagist Downloads

composer require --dev eliashaeussler/deep-closure-comparator

⚑ Usage

Instead of using the self::assertEquals() method of a PHPUnit test case, use the assertEquals method that is shipped within the DeepClosureAssert class:

use EliasHaeussler\DeepClosureComparator\DeepClosureAssert;
use PHPUnit\Framework\TestCase;

final class Foo
{
 public function __construct(
 public ?\Closure $bar = null,
 ) {}
}

final class FooTest extends TestCase
{
 public function testSomething(): void
 {
 $expected = new Foo();
 $expected->bar = static fn() => 'foo';

 $actual = new Foo();
 $actual->bar = static fn() => 'foo';

 DeepClosureAssert::assertEquals($expected, $actual);
 }
}

Or, in other words:

-self::assertEquals($expected, $actual);
+DeepClosureAssert::assertEquals($expected, $actual);

Note

Closures are compared using their serialized representation. This is done by the opis/closure library, which provides mechanisms to deep inspect and serialize given closures. More information can be found in the official documentation of this library.

πŸ§‘β€πŸ’» Contributing

Please have a look at CONTRIBUTING.md.

πŸ’Ž Credits

This project developed from a hardened implementation detail in the sebastian/comparator library, as part of PHPUnit's supply chain. With the introduction of a new ClosureComparator, comparing closures got a lot more difficult. Finally, @tstarling suggested parts of the actual implementation of this deep-closure-comparator library. Thank you very much for your support!

⭐ License

This project is licensed under GNU General Public License 3.0 (or later).