diff --git a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/CRTestSuiteRuntimeVariables.php b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/CRTestSuiteRuntimeVariables.php index 656e45666cc..520f031a637 100644 --- a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/CRTestSuiteRuntimeVariables.php +++ b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/CRTestSuiteRuntimeVariables.php @@ -17,8 +17,8 @@ use Neos\ContentRepository\Core\ContentGraphFinder; use Neos\ContentRepository\Core\ContentRepository; use Neos\ContentRepository\Core\DimensionSpace\DimensionSpacePoint; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\ContentSubgraphInterface; -use Neos\ContentRepository\Core\Projection\ContentGraph\Node; use Neos\ContentRepository\Core\Projection\ContentGraph\NodeAggregate; use Neos\ContentRepository\Core\Projection\ContentGraph\NodePath; use Neos\ContentRepository\Core\Projection\ContentGraph\VisibilityConstraints; @@ -29,6 +29,8 @@ use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; use Neos\ContentRepository\TestSuite\Behavior\Features\Bootstrap\Helpers\FakeClock; use Neos\ContentRepository\TestSuite\Behavior\Features\Bootstrap\Helpers\FakeUserIdProvider; +use Neos\ContentRepository\TestSuite\Behavior\Features\Bootstrap\Helpers\ContentStreamAwareNode; +use PHPUnit\Framework\Assert; /** * The node creation trait for behavioral tests @@ -49,7 +51,11 @@ trait CRTestSuiteRuntimeVariables protected ?\Exception $lastCommandException = null; - protected ?Node $currentNode = null; + /** + * The Node's content stream id doesn't necessarily have to match with {@see $currentContentStreamId} if the node was initialized via the content graph from another workspace + * thus we have to track it as well. + */ + protected ?ContentStreamAwareNode $currentNode = null; protected ?NodeAggregate $currentNodeAggregate = null; @@ -147,16 +153,22 @@ public function visibilityConstraintsAreSetTo(string $restrictionType): void }; } - public function getCurrentSubgraph(): ContentSubgraphInterface + public function getCurrentContentGraph(): ContentGraphInterface { + // todo cache content graph per test run??? Otherwise it will be flushed too often? $contentGraphFinder = $this->currentContentRepository->projectionState(ContentGraphFinder::class); $contentGraphFinder->forgetInstances(); - if (isset($this->currentContentStreamId)) { + if ($this->currentContentStreamId !== null) { // This must still be supported for low level tests, e.g. for content stream forking - return $contentGraphFinder->getByWorkspaceNameAndContentStreamId($this->currentWorkspaceName, $this->currentContentStreamId)->getSubgraph($this->currentDimensionSpacePoint, $this->currentVisibilityConstraints); + return $contentGraphFinder->getByWorkspaceNameAndContentStreamId($this->currentWorkspaceName, $this->currentContentStreamId); } - return $contentGraphFinder->getByWorkspaceName($this->currentWorkspaceName)->getSubgraph( + return $contentGraphFinder->getByWorkspaceName($this->currentWorkspaceName); + } + + public function getCurrentSubgraph(): ContentSubgraphInterface + { + return $this->getCurrentContentGraph()->getSubgraph( $this->currentDimensionSpacePoint, $this->currentVisibilityConstraints ); @@ -175,7 +187,12 @@ public function iRememberNodeAggregateIdOfNodesChildAs(string $parentNodeAggrega protected function getCurrentNodeAggregateId(): NodeAggregateId { - assert($this->currentNode instanceof Node); + $this->expectCurrentNode(); return $this->currentNode->aggregateId; } + + protected function expectCurrentNode(): void + { + Assert::assertNotNull($this->currentNode, 'No current node present'); + } } diff --git a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Features/NodeCopying.php b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Features/NodeCopying.php index 6c68de67e35..3122c2501f9 100644 --- a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Features/NodeCopying.php +++ b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Features/NodeCopying.php @@ -59,7 +59,7 @@ public function theCommandCopyNodesRecursivelyIsExecutedCopyingTheCurrentNodeAgg $command = CopyNodesRecursively::createFromSubgraphAndStartNode( $subgraph, $workspaceName, - $this->currentNode, + $this->currentNode->nodeInstance, $targetDimensionSpacePoint, NodeAggregateId::fromString($commandArguments['targetParentNodeAggregateId']), $targetSucceedingSiblingNodeAggregateId, diff --git a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/ContentStreamAwareNode.php b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/ContentStreamAwareNode.php new file mode 100644 index 00000000000..691b0e72dca --- /dev/null +++ b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/ContentStreamAwareNode.php @@ -0,0 +1,30 @@ +instance->aggregateId */ + public NodeAggregateId $aggregateId, + ) { + } + + public static function create(ContentStreamId $contentStreamId, Node $node): self + { + return new self($contentStreamId, $node, $node->aggregateId); + } + + public function builder(): ContentStreamAwareNodeBuilder + { + return ContentStreamAwareNodeBuilder::create($this->contentStreamId); + } +} diff --git a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/ContentStreamAwareNodeBuilder.php b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/ContentStreamAwareNodeBuilder.php new file mode 100644 index 00000000000..86a5d1bbef2 --- /dev/null +++ b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/ContentStreamAwareNodeBuilder.php @@ -0,0 +1,26 @@ +contentStreamId, $node); + } +} diff --git a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/NodeDiscriminator.php b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/NodeDiscriminator.php index 005e5464e4d..c39488aec8b 100644 --- a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/NodeDiscriminator.php +++ b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/NodeDiscriminator.php @@ -15,6 +15,7 @@ namespace Neos\ContentRepository\TestSuite\Behavior\Features\Bootstrap\Helpers; use Neos\ContentRepository\Core\DimensionSpace\OriginDimensionSpacePoint; +use Neos\ContentRepository\Core\Projection\ContentGraph\ContentGraphInterface; use Neos\ContentRepository\Core\Projection\ContentGraph\Node; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; @@ -47,12 +48,12 @@ public static function fromShorthand(string $shorthand): self ); } - public static function fromNode(Node $node): self + public static function fromNode(ContentStreamAwareNode $contentStreamAwareNode): self { return new self( - $node->subgraphIdentity->contentStreamId, - $node->aggregateId, - $node->originDimensionSpacePoint + $contentStreamAwareNode->contentStreamId, + $contentStreamAwareNode->nodeInstance->aggregateId, + $contentStreamAwareNode->nodeInstance->originDimensionSpacePoint ); } diff --git a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/NodeDiscriminators.php b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/NodeDiscriminators.php index 2bedcbce70e..07924d1de4a 100644 --- a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/NodeDiscriminators.php +++ b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/Helpers/NodeDiscriminators.php @@ -53,14 +53,6 @@ public static function fromArray(array $array): self )); } - public static function fromNodes(Nodes $nodes): self - { - return new self(...array_map( - fn (Node $node): NodeDiscriminator => NodeDiscriminator::fromNode($node), - iterator_to_array($nodes) - )); - } - public function equal(self $other): bool { return $this->discriminators == $other->discriminators; diff --git a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/ProjectedNodeTrait.php b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/ProjectedNodeTrait.php index ad96bdacce4..56bc9d46bf3 100644 --- a/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/ProjectedNodeTrait.php +++ b/Neos.ContentRepository.TestSuite/Classes/Behavior/Features/Bootstrap/ProjectedNodeTrait.php @@ -33,10 +33,13 @@ use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateId; use Neos\ContentRepository\Core\SharedModel\Node\NodeName; use Neos\ContentRepository\Core\SharedModel\Node\PropertyName; +use Neos\ContentRepository\Core\SharedModel\Workspace\ContentStreamId; use Neos\ContentRepository\Core\Tests\Behavior\Fixtures\DayOfWeek; use Neos\ContentRepository\Core\Tests\Behavior\Fixtures\PostalAddress; use Neos\ContentRepository\Core\Tests\Behavior\Fixtures\PriceSpecification; use Neos\ContentRepository\TestSuite\Behavior\Features\Bootstrap\Helpers\NodeDiscriminator; +use Neos\ContentRepository\TestSuite\Behavior\Features\Bootstrap\Helpers\ContentStreamAwareNode; +use Neos\ContentRepository\TestSuite\Behavior\Features\Bootstrap\Helpers\ContentStreamAwareNodeBuilder; use PHPUnit\Framework\Assert; /** @@ -96,7 +99,8 @@ public function iExpectANodeIdentifiedByXToExistInTheContentGraph(string $serial . '" and originating in dimension space point "' . $nodeDiscriminator->originDimensionSpacePoint->toJson() . '" was not found in content stream "' . $nodeDiscriminator->contentStreamId->value . '"' ); - $this->currentNode = $currentNodeAggregate->getNodeByOccupiedDimensionSpacePoint($nodeDiscriminator->originDimensionSpacePoint); + $node = $currentNodeAggregate->getNodeByOccupiedDimensionSpacePoint($nodeDiscriminator->originDimensionSpacePoint); + $this->currentNode = ContentStreamAwareNode::create($nodeDiscriminator->contentStreamId, $node); } /** @@ -108,10 +112,10 @@ public function iExpectNodeAggregateIdToLeadToNode( ): void { $nodeAggregateId = NodeAggregateId::fromString($serializedNodeAggregateId); $expectedDiscriminator = NodeDiscriminator::fromShorthand($serializedNodeDiscriminator); - $this->initializeCurrentNodeFromContentSubgraph(function (ContentSubgraphInterface $subgraph) use ($nodeAggregateId, $expectedDiscriminator) { + $this->initializeCurrentNodeFromContentSubgraph(function (ContentSubgraphInterface $subgraph, ContentStreamAwareNodeBuilder $contentStreamAwareNodeBuilder) use ($nodeAggregateId, $expectedDiscriminator) { $currentNode = $subgraph->findNodeById($nodeAggregateId); Assert::assertNotNull($currentNode, 'No node could be found by node aggregate id "' . $nodeAggregateId->value . '" in content subgraph "' . $this->currentDimensionSpacePoint->toJson() . '@' . $this->currentWorkspaceName->value . '"'); - $actualDiscriminator = NodeDiscriminator::fromNode($currentNode); + $actualDiscriminator = NodeDiscriminator::fromNode($contentStreamAwareNodeBuilder->buildNode($currentNode)); Assert::assertTrue($expectedDiscriminator->equals($actualDiscriminator), 'Node discriminators do not match. Expected was ' . json_encode($expectedDiscriminator) . ' , given was ' . json_encode($actualDiscriminator)); return $currentNode; }); @@ -145,10 +149,10 @@ public function iExpectPathToLeadToNode(string $serializedNodePath, string $seri } $nodePath = NodePath::fromString($serializedNodePath); $expectedDiscriminator = NodeDiscriminator::fromShorthand($serializedNodeDiscriminator); - $this->initializeCurrentNodeFromContentSubgraph(function (ContentSubgraphInterface $subgraph) use ($nodePath, $expectedDiscriminator) { + $this->initializeCurrentNodeFromContentSubgraph(function (ContentSubgraphInterface $subgraph, ContentStreamAwareNodeBuilder $contentStreamAwareNodeBuilder) use ($nodePath, $expectedDiscriminator) { $currentNode = $subgraph->findNodeByPath($nodePath, $this->getRootNodeAggregateId()); Assert::assertNotNull($currentNode, 'No node could be found by node path "' . $nodePath->serializeToString() . '" in content subgraph "' . $this->currentDimensionSpacePoint->toJson() . '@' . $this->currentWorkspaceName->value . '"'); - $actualDiscriminator = NodeDiscriminator::fromNode($currentNode); + $actualDiscriminator = NodeDiscriminator::fromNode($contentStreamAwareNodeBuilder->buildNode($currentNode)); Assert::assertTrue($expectedDiscriminator->equals($actualDiscriminator), 'Node discriminators do not match. Expected was ' . json_encode($expectedDiscriminator) . ' , given was ' . json_encode($actualDiscriminator)); return $currentNode; }); @@ -275,9 +279,19 @@ public function iExpectThisNodeToExactlyInheritTheTags(string $expectedTagList): }); } + /** + * @param callable(ContentSubgraphInterface $subgraph, ContentStreamAwareNodeBuilder $contentStreamAwareNodeBuilder): Node $query + */ protected function initializeCurrentNodeFromContentSubgraph(callable $query): void { - $this->currentNode = $query($this->getCurrentSubgraph()); + $contentGraph = $this->getCurrentContentGraph(); + $subgraph = $contentGraph->getSubgraph( + $this->currentDimensionSpacePoint, + $this->currentVisibilityConstraints + ); + $contentStreamAwareNodeBuilder = ContentStreamAwareNodeBuilder::create($contentGraph->getContentStreamId()); + $node = $query($subgraph, $contentStreamAwareNodeBuilder); + $this->currentNode = $contentStreamAwareNodeBuilder->buildNode($node); } /** @@ -428,11 +442,11 @@ public function iExpectThisNodeToHaveNoProperties(): void */ public function iExpectThisNodeToHaveTheFollowingReferences(TableNode $expectedReferences): void { - $this->assertOnCurrentNode(function (Node $currentNode) use ($expectedReferences) { + $this->assertOnCurrentContentStreamAwareNode(function (ContentStreamAwareNode $currentNode) use ($expectedReferences) { $actualReferences = $this->getCurrentSubgraph() ->findReferences($currentNode->aggregateId, FindReferencesFilter::create()); - $this->assertReferencesMatch($expectedReferences, $actualReferences); + $this->assertReferencesMatch($expectedReferences, $actualReferences, $currentNode->builder()); }); } @@ -456,15 +470,15 @@ public function iExpectThisNodeToHaveNoReferences(): void */ public function iExpectThisNodeToBeReferencedBy(TableNode $expectedReferences): void { - $this->assertOnCurrentNode(function (Node $currentNode) use ($expectedReferences) { + $this->assertOnCurrentContentStreamAwareNode(function (ContentStreamAwareNode $currentNode) use ($expectedReferences) { $actualReferences = $this->getCurrentSubgraph() ->findBackReferences($currentNode->aggregateId, FindBackReferencesFilter::create()); - $this->assertReferencesMatch($expectedReferences, $actualReferences); + $this->assertReferencesMatch($expectedReferences, $actualReferences, $currentNode->builder()); }); } - private function assertReferencesMatch(TableNode $expectedReferencesTable, References $actualReferences): void + private function assertReferencesMatch(TableNode $expectedReferencesTable, References $actualReferences, ContentStreamAwareNodeBuilder $contentStreamAwareNodeBuilder): void { $expectedReferences = $expectedReferencesTable->getHash(); Assert::assertSame( @@ -480,7 +494,7 @@ private function assertReferencesMatch(TableNode $expectedReferencesTable, Refer $actualReferences[$index]->name->value ); $expectedReferenceDiscriminator = NodeDiscriminator::fromShorthand($row['Node']); - $actualReferenceDiscriminator = NodeDiscriminator::fromNode($actualReferences[$index]->node); + $actualReferenceDiscriminator = NodeDiscriminator::fromNode($contentStreamAwareNodeBuilder->buildNode($actualReferences[$index]->node)); Assert::assertTrue( $expectedReferenceDiscriminator->equals($actualReferenceDiscriminator), 'Reference discriminator does not match.' @@ -549,17 +563,17 @@ public function iExpectThisNodeToNotBeReferenced(): void public function iExpectThisNodeToBeTheChildOfNode(string $serializedParentNodeDiscriminator): void { $expectedParentDiscriminator = NodeDiscriminator::fromShorthand($serializedParentNodeDiscriminator); - $this->assertOnCurrentNode(function (Node $currentNode) use ($expectedParentDiscriminator) { + $this->assertOnCurrentContentStreamAwareNode(function (ContentStreamAwareNode $currentNode) use ($expectedParentDiscriminator) { $subgraph = $this->getCurrentSubgraph(); $parent = $subgraph->findParentNode($currentNode->aggregateId); Assert::assertInstanceOf(Node::class, $parent, 'Parent not found.'); - $actualParentDiscriminator = NodeDiscriminator::fromNode($parent); + $actualParentDiscriminator = NodeDiscriminator::fromNode($currentNode->builder()->buildNode($parent)); Assert::assertTrue($expectedParentDiscriminator->equals($actualParentDiscriminator), 'Parent discriminator does not match. Expected was ' . json_encode($expectedParentDiscriminator) . ', given was ' . json_encode($actualParentDiscriminator)); $expectedChildDiscriminator = NodeDiscriminator::fromNode($currentNode); - $child = $subgraph->findNodeByPath($currentNode->name, $parent->aggregateId); - $actualChildDiscriminator = NodeDiscriminator::fromNode($child); + $child = $subgraph->findNodeByPath($currentNode->nodeInstance->name, $parent->aggregateId); + $actualChildDiscriminator = NodeDiscriminator::fromNode($currentNode->builder()->buildNode($child)); Assert::assertTrue($expectedChildDiscriminator->equals($actualChildDiscriminator), 'Child discriminator does not match. Expected was ' . json_encode($expectedChildDiscriminator) . ', given was ' . json_encode($actualChildDiscriminator)); }); } @@ -582,7 +596,7 @@ public function iExpectThisNodeToHaveNoParentNode(): void */ public function iExpectThisNodeToHaveTheFollowingChildNodes(TableNode $expectedChildNodesTable): void { - $this->assertOnCurrentNode(function (Node $currentNode) use ($expectedChildNodesTable) { + $this->assertOnCurrentContentStreamAwareNode(function (ContentStreamAwareNode $currentNode) use ($expectedChildNodesTable) { $subgraph = $this->getCurrentSubgraph(); $actualChildNodes = []; foreach ($subgraph->findChildNodes($currentNode->aggregateId, FindChildNodesFilter::create()) as $actualChildNode) { @@ -597,7 +611,7 @@ public function iExpectThisNodeToHaveTheFollowingChildNodes(TableNode $expectedC Assert::assertTrue($expectedNodeName->equals($actualNodeName), 'ContentSubgraph::findChildNodes: Node name in index ' . $index . ' does not match. Expected: "' . $expectedNodeName->value . '" Actual: "' . $actualNodeName->value . '"'); if (isset($row['NodeDiscriminator'])) { $expectedNodeDiscriminator = NodeDiscriminator::fromShorthand($row['NodeDiscriminator']); - $actualNodeDiscriminator = NodeDiscriminator::fromNode($actualChildNodes[$index]); + $actualNodeDiscriminator = NodeDiscriminator::fromNode($currentNode->builder()->buildNode($actualChildNodes[$index])); Assert::assertTrue($expectedNodeDiscriminator->equals($actualNodeDiscriminator), 'ContentSubgraph::findChildNodes: Node discriminator in index ' . $index . ' does not match. Expected: ' . json_encode($expectedNodeDiscriminator->jsonSerialize()) . ' Actual: ' . json_encode($actualNodeDiscriminator)); } } @@ -623,7 +637,7 @@ public function iExpectThisNodeToHaveNoChildNodes(): void */ public function iExpectThisNodeToHaveTheFollowingPrecedingSiblings(TableNode $expectedPrecedingSiblingsTable): void { - $this->assertOnCurrentNode(function (Node $currentNode) use ($expectedPrecedingSiblingsTable) { + $this->assertOnCurrentContentStreamAwareNode(function (ContentStreamAwareNode $currentNode) use ($expectedPrecedingSiblingsTable) { $actualSiblings = []; foreach ( $this->getCurrentSubgraph()->findPrecedingSiblingNodes( @@ -636,7 +650,7 @@ public function iExpectThisNodeToHaveTheFollowingPrecedingSiblings(TableNode $ex Assert::assertCount(count($expectedPrecedingSiblingsTable->getHash()), $actualSiblings, 'ContentSubgraph::findPrecedingSiblingNodes: Sibling count does not match'); foreach ($expectedPrecedingSiblingsTable->getHash() as $index => $row) { $expectedNodeDiscriminator = NodeDiscriminator::fromShorthand($row['NodeDiscriminator']); - $actualNodeDiscriminator = NodeDiscriminator::fromNode($actualSiblings[$index]); + $actualNodeDiscriminator = NodeDiscriminator::fromNode($currentNode->builder()->buildNode($actualSiblings[$index])); Assert::assertTrue($expectedNodeDiscriminator->equals($actualNodeDiscriminator), 'ContentSubgraph::findPrecedingSiblingNodes: Node discriminator in index ' . $index . ' does not match. Expected: ' . json_encode($expectedNodeDiscriminator) . ' Actual: ' . json_encode($actualNodeDiscriminator)); } }); @@ -660,7 +674,7 @@ public function iExpectThisNodeToHaveNoPrecedingSiblings(): void */ public function iExpectThisNodeToHaveTheFollowingSucceedingSiblings(TableNode $expectedSucceedingSiblingsTable): void { - $this->assertOnCurrentNode(function (Node $currentNode) use ($expectedSucceedingSiblingsTable) { + $this->assertOnCurrentContentStreamAwareNode(function (ContentStreamAwareNode $currentNode) use ($expectedSucceedingSiblingsTable) { $actualSiblings = []; foreach ( $this->getCurrentSubgraph()->findSucceedingSiblingNodes( @@ -673,7 +687,7 @@ public function iExpectThisNodeToHaveTheFollowingSucceedingSiblings(TableNode $e Assert::assertCount(count($expectedSucceedingSiblingsTable->getHash()), $actualSiblings, 'ContentSubgraph::findSucceedingSiblingNodes: Sibling count does not match'); foreach ($expectedSucceedingSiblingsTable->getHash() as $index => $row) { $expectedNodeDiscriminator = NodeDiscriminator::fromShorthand($row['NodeDiscriminator']); - $actualNodeDiscriminator = NodeDiscriminator::fromNode($actualSiblings[$index]); + $actualNodeDiscriminator = NodeDiscriminator::fromNode($currentNode->builder()->buildNode($actualSiblings[$index])); Assert::assertTrue($expectedNodeDiscriminator->equals($actualNodeDiscriminator), 'ContentSubgraph::findSucceedingSiblingNodes: Node discriminator in index ' . $index . ' does not match. Expected: ' . json_encode($expectedNodeDiscriminator) . ' Actual: ' . json_encode($actualNodeDiscriminator)); } }); @@ -691,14 +705,15 @@ public function iExpectThisNodeToHaveNoSucceedingSiblings(): void }); } - protected function assertOnCurrentNode(callable $assertions): void + protected function assertOnCurrentContentStreamAwareNode(callable $assertions): void { $this->expectCurrentNode(); $assertions($this->currentNode); } - protected function expectCurrentNode(): void + protected function assertOnCurrentNode(callable $assertions): void { - Assert::assertNotNull($this->currentNode, 'No current node present'); + $this->expectCurrentNode(); + $assertions($this->currentNode->nodeInstance); } }