/** @test */ public function visitorCorrectlyCreatesLeftRightEnumerationOnTree() { $node1 = Tx_PtExtbase_Tests_Unit_Tree_NodeMock::createNode('1', 0, 0, 1, '1'); $node2 = Tx_PtExtbase_Tests_Unit_Tree_NodeMock::createNode('2', 0, 0, 1, '2'); $node3 = Tx_PtExtbase_Tests_Unit_Tree_NodeMock::createNode('3', 0, 0, 1, '3'); $node4 = Tx_PtExtbase_Tests_Unit_Tree_NodeMock::createNode('4', 0, 0, 1, '4'); $node5 = Tx_PtExtbase_Tests_Unit_Tree_NodeMock::createNode('5', 0, 0, 1, '5'); $node6 = Tx_PtExtbase_Tests_Unit_Tree_NodeMock::createNode('6', 0, 0, 1, '6'); $node1->addChild($node2); $node2->setParent($node1); $node1->addChild($node5); $node5->setParent($node1); $node2->addChild($node3); $node3->setParent($node2); $node2->addChild($node4); $node4->setParent($node2); $node5->addChild($node6); $node6->setParent($node5); $tree = Tx_PtExtbase_Tree_Tree::getInstanceByRootNode($node1); $visitor = new Tx_PtExtbase_Tree_NestedSetVisitor(); $treeWalker = new Tx_PtExtbase_Tree_TreeWalker(array($visitor)); $treeWalker->traverseTreeDfs($tree); $this->assertEquals($node1->getLft(), 1); $this->assertEquals($node1->getRgt(), 12); $this->assertEquals($node2->getLft(), 2); $this->assertEquals($node2->getRgt(), 7); $this->assertEquals($node3->getLft(), 3); $this->assertEquals($node3->getRgt(), 4); $this->assertEquals($node4->getLft(), 5); $this->assertEquals($node4->getRgt(), 6); $this->assertEquals($node5->getLft(), 8); $this->assertEquals($node5->getRgt(), 11); $this->assertEquals($node6->getLft(), 9); $this->assertEquals($node6->getRgt(), 10); }
/** * @return string */ protected function buildTreeNodes() { if ($this->treeRootNode) { $subTreeRootNode = $this->tree->getNodeByUid($this->treeRootNode); $this->tree = Tx_PtExtbase_Tree_Tree::getInstanceByRootNode($subTreeRootNode); } if (isset($this->treeMaxDepth)) { $this->tree->setRestrictedDepth($this->treeMaxDepth); $this->tree->setRespectRestrictedDepth(TRUE); } $arrayWriterVisitor = $this->objectManager->get('Tx_PtExtbase_Tree_ExtJsJsonWriterVisitor'); $arrayWriterVisitor->registerFirstVisitCallback($this, 'alterNodeArrayOnFirstVisit'); $arrayWriterVisitor->registerLastVisitCallBack($this, 'alterNodeArrayOnLastVisit'); $arrayWriterVisitor->setMultipleSelect($this->getMultiple()); $arrayWriterVisitor->setSelection($this->filterValues); $jsonTreeWriter = $this->objectManager->get('Tx_PtExtbase_Tree_JsonTreeWriter', array($arrayWriterVisitor), $arrayWriterVisitor); return $jsonTreeWriter->writeTree($this->tree); }
/** * Builds a tree for given namespace. * * If there are no nodes for given namespace, a new, empty tree with a single root node will be returned. * * @param $namespace * @return Tx_PtExtbase_Tree_Tree * @throws Exception */ public function buildTreeForNamespace($namespace) { $nodes = $this->nodeRepository->findByNamespace($namespace); // We have no nodes for given namespace, so we return empty tree with single root node if ($nodes->count() == 0) { return $this->getEmptyTree($namespace); } $stack = new Tx_PtExtbase_Tree_Stack(); $prevLft = PHP_INT_MAX; foreach ($nodes as $node) { /* @var $node Tx_PtExtbase_Tree_Node */ /* Assertion: Nodes must be given in descending left-value order. */ if ($node->getLft() > $prevLft) { throw new Exception('Nodes must be given in descending left-value order', 1307861852); } $prevLft = $node->getLft(); #echo "<br><br>Knoten: " . $node->toString(); if ($stack->isEmpty() || $stack->top()->getRgt() > $node->getRgt()) { $stack->push($node); #echo "Pushed on stack:" . $stack->toString(); } else { #echo "Adding children:"; while (!$stack->isEmpty() && $stack->top()->getRgt() < $node->getRgt()) { #echo "In while - current node " . $node->toString() . " current topStack: " . $stack->top()->toString(); $stack->top()->setParent($node, false); $node->addChild($stack->top(), false); $stack->pop(); #echo "After while-iteration: ". $stack->toString(); } $stack->push($node); #echo "After pushing after while: <ul>" . $stack->toString() . "</ul>"; } } $tree = Tx_PtExtbase_Tree_Tree::getInstanceByRootNode($stack->top()); $tree->setRestrictedDepth($this->restrictedDepth); $tree->setRespectRestrictedDepth($this->respectRestrictedDepth); #echo "Finished tree: " . $tree->toString(); return $tree; }
/** * @return Tx_PtExtbase_Tree_Tree */ protected function getTestTree() { $node1 = Tx_PtExtbase_Tests_Unit_Tree_NodeMock::createNode('1', 0, 0, 1, '1'); $node2 = Tx_PtExtbase_Tests_Unit_Tree_NodeMock::createNode('2', 0, 0, 1, '2'); $node3 = Tx_PtExtbase_Tests_Unit_Tree_NodeMock::createNode('3', 0, 0, 1, '3'); $node4 = Tx_PtExtbase_Tests_Unit_Tree_NodeMock::createNode('4', 0, 0, 1, '4'); $node5 = Tx_PtExtbase_Tests_Unit_Tree_NodeMock::createNode('5', 0, 0, 1, '5'); $node6 = Tx_PtExtbase_Tests_Unit_Tree_NodeMock::createNode('6', 0, 0, 1, '6'); $node1->addChild($node2); $node2->setParent($node1); $node1->addChild($node5); $node5->setParent($node1); $node2->addChild($node3); $node3->setParent($node2); $node2->addChild($node4); $node4->setParent($node2); $node5->addChild($node6); $node6->setParent($node5); $tree = Tx_PtExtbase_Tree_Tree::getInstanceByRootNode($node1); return $tree; }
/** @test */ public function deletingNodeFromTreeAddsDeletedNodesToListOfDeletedNodes() { $rootNode = new Tx_PtExtbase_Tests_Unit_Tree_NodeMock(1); $firstChild = new Tx_PtExtbase_Tests_Unit_Tree_NodeMock(2); $secondChild = new Tx_PtExtbase_Tests_Unit_Tree_NodeMock(3); $thirdChild = new Tx_PtExtbase_Tests_Unit_Tree_NodeMock(4); $fourthChild = new Tx_PtExtbase_Tests_Unit_Tree_NodeMock(5); $thirdChild->addChild($fourthChild); $firstChild->addChild($secondChild); $firstChild->addChild($thirdChild); $rootNode->addChild($firstChild); $tree = Tx_PtExtbase_Tree_Tree::getInstanceByRootNode($rootNode); $tree->deleteNode($thirdChild); $this->assertTrue(in_array($thirdChild, $tree->getDeletedNodes())); $this->assertTrue(in_array($fourthChild, $tree->getDeletedNodes())); }