mirror of
https://github.com/danog/Valinor.git
synced 2024-12-04 02:27:54 +01:00
a805ba0442
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.
44 lines
1.3 KiB
PHP
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);
|
|
}
|
|
}
|