/**
  * @param array $schedule
  * @param array $expectedSchedule
  * @return void
  * @dataProvider processDataProvider
  */
 public function testProcess($schedule, $expectedSchedule)
 {
     foreach ($schedule['structure'] as $structureElement) {
         $this->scheduledStructure->setStructureElement($structureElement, []);
     }
     $reorderMap = [];
     foreach ($schedule['sort'] as $elementName => $sort) {
         list($parentName, $sibling, $isAfter) = $sort;
         $this->scheduledStructure->setElementToSortList($parentName, $elementName, $sibling, $isAfter);
         $reorderMap[] = [$parentName, $elementName, $sibling, $isAfter];
     }
     foreach ($schedule['move'] as $elementName => $move) {
         $this->scheduledStructure->setElementToMove($elementName, $move);
         list($destination, $sibling, $isAfter) = $move;
         $reorderMap[] = [$destination, $elementName, $sibling, $isAfter];
     }
     $invocation = $this->structureMock->expects($this->any())->method('reorderChildElement');
     call_user_func_array([$invocation, 'withConsecutive'], $reorderMap);
     foreach ($schedule['remove'] as $remove) {
         $this->scheduledStructure->setElementToRemoveList($remove);
     }
     $this->helperMock->expects($this->atLeastOnce())->method('scheduleElement')->with($this->scheduledStructure, $this->structureMock, $this->anything())->willReturnCallback(function ($scheduledStructure, $structure, $elementName) use($schedule) {
         /**
          * @var $scheduledStructure ScheduledStructure
          * @var $structure DataStructure
          */
         $this->assertContains($elementName, $schedule['structure']);
         $scheduledStructure->unsetStructureElement($elementName);
         $scheduledStructure->setElement($elementName, []);
         $structure->createStructuralElement($elementName, 'block', 'someClass');
     });
     $this->model->process($this->readerContextMock, $this->generatorContextMock);
     $this->assertEquals($expectedSchedule, $this->scheduledStructure->getElements());
 }
Example #2
0
 /**
  * @covers \Magento\Framework\View\Layout\ScheduledStructure::setStructureElement
  */
 public function testSetStructureElement()
 {
     $data = ['some', 'new', 'data', 'structure', 'element'];
     /** Test add new structure element */
     $this->assertFalse($this->_model->hasStructureElement('new_element'));
     $this->_model->setStructureElement('new_element', $data);
     $this->assertEquals($data, $this->_model->getStructureElement('new_element'));
     /** Test override existing structure element */
     $this->assertTrue($this->_model->hasStructureElement('element1'));
     $this->_model->setStructureElement('element1', $data);
     $this->assertEquals($data, $this->_model->getStructureElement('element1'));
 }
Example #3
0
 /**
  * Populate queue for generating structural elements
  *
  * @param \Magento\Framework\View\Layout\Element $node
  * @param \Magento\Framework\View\Layout\Element $parent
  * @return void
  * @see _scheduleElement() where the _scheduledStructure is used
  */
 protected function _scheduleStructure($node, $parent)
 {
     if ((string) $node->getAttribute('name')) {
         $name = (string) $node->getAttribute('name');
     } else {
         $name = $this->_generateAnonymousName($parent->getElementName() . '_schedule_block');
         $node->addAttribute('name', $name);
     }
     $path = $name;
     // type, alias, parentName, siblingName, isAfter, node
     $row = array(self::SCHEDULED_STRUCTURE_INDEX_NAME => $node->getName(), self::SCHEDULED_STRUCTURE_INDEX_ALIAS => '', self::SCHEDULED_STRUCTURE_INDEX_PARENT_NAME => '', self::SCHEDULED_STRUCTURE_INDEX_SIBLING_NAME => null, self::SCHEDULED_STRUCTURE_INDEX_IS_AFTER => true, self::SCHEDULED_STRUCTURE_INDEX_LAYOUT_ELEMENT => $node);
     $parentName = $parent->getElementName();
     if ($parentName) {
         $row[self::SCHEDULED_STRUCTURE_INDEX_ALIAS] = (string) $node->getAttribute('as');
         $row[self::SCHEDULED_STRUCTURE_INDEX_PARENT_NAME] = $parentName;
         list($row[self::SCHEDULED_STRUCTURE_INDEX_SIBLING_NAME], $row[self::SCHEDULED_STRUCTURE_INDEX_IS_AFTER]) = $this->_beforeAfterToSibling($node);
         // materialized path for referencing nodes in the plain array of _scheduledStructure
         if ($this->_scheduledStructure->hasPath($parentName)) {
             $path = $this->_scheduledStructure->getPath($parentName) . '/' . $path;
         }
     }
     $this->_overrideElementWorkaround($name, $path);
     $this->_scheduledStructure->setPathElement($name, $path);
     if ($this->_scheduledStructure->hasStructureElement($name)) {
         // union of arrays
         $this->_scheduledStructure->setStructureElement($name, $row + $this->_scheduledStructure->getStructureElement($name));
     } else {
         $this->_scheduledStructure->setStructureElement($name, $row);
     }
 }