fail("Issues found in handle declaration:\n" . implode("\n", $issues) . "\n"); } }, \Magento\Framework\App\Utility\Files::init()->getLayoutFiles() ); } public function testContainerDeclarations() { $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this); $invoker( /** * Test dependencies between container attributes that is out of coverage by XSD * * @param string $layoutFile */ function ($layoutFile) { $issues = []; $xml = simplexml_load_file($layoutFile); $containers = $xml->xpath('/layout//container') ?: []; /** @var \SimpleXMLElement $node */ foreach ($containers as $node) { if (!isset($node['htmlTag']) && (isset($node['htmlId']) || isset($node['htmlClass']))) { $issues[] = $node->asXML(); } } if ($issues) { $this->fail( 'The following containers declare attribute "htmlId" and/or "htmlClass", but not "htmlTag":' . "\n" . implode( "\n", $issues ) . "\n" ); } }, \Magento\Framework\App\Utility\Files::init()->getLayoutFiles() ); } public function testHeadBlockUsage() { $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this); $invoker( /** * Test validate that head block doesn't exist in layout * * @param string $layoutFile */ function ($layoutFile) { $dom = new \DOMDocument(); $dom->load($layoutFile); $xpath = new \DOMXpath($dom); if ($xpath->query("//*[@name='head']")->length) { $this->fail('Following file contains deprecated head block. File Path:' . "\n" . $layoutFile); } }, \Magento\Framework\App\Utility\Files::init()->getLayoutFiles() ); } }