Valinor/tests/Integration/Mapping/VisitorMappingTest.php
Romain Canon a805ba0442 feat!: wrap node messages in proper class
A new class `NodeMessage` is used to wrap messages added to a node
during the mapping. This class will allow further features by giving
access to useful data related to the bound node.

BREAKING CHANGE: as of now every message is wrapped into a `NodeMessage`
it is therefore not possible to check whether the message is an instance
of `Throwable` — a new method `$message->isError()` is now to be used
for such cases.
2022-01-06 14:11:42 +01:00

44 lines
1.3 KiB
PHP

<?php
declare(strict_types=1);
namespace CuyZ\Valinor\Tests\Integration\Mapping;
use CuyZ\Valinor\Mapper\MappingError;
use CuyZ\Valinor\Mapper\Tree\Node;
use CuyZ\Valinor\Tests\Fake\Mapper\Tree\Message\FakeErrorMessage;
use CuyZ\Valinor\Tests\Integration\IntegrationTest;
use CuyZ\Valinor\Tests\Integration\Mapping\Fixture\SimpleObject;
final class VisitorMappingTest extends IntegrationTest
{
public function test_visitors_are_called_during_mapping(): void
{
$visits = [];
$error = new FakeErrorMessage();
try {
$this->mapperBuilder
->visit(function (Node $node) use (&$visits): void {
if ($node->isRoot()) {
$visits[] = '#1';
}
})
->visit(function (Node $node) use (&$visits): void {
if ($node->isRoot()) {
$visits[] = '#2';
}
})
->visit(function () use ($error): void {
throw $error;
})
->mapper()
->map(SimpleObject::class, ['value' => 'foo']);
} catch (MappingError $exception) {
self::assertSame((string)$error, (string)$exception->node()->messages()[0]);
}
self::assertSame(['#1', '#2'], $visits);
}
}