Modern DOM library written in PHP for HTML documents
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
4.3 KiB

<?php
/**
* @license MIT
* Copyright 2017 Dustin Wilson, J. King, et al.
* See LICENSE and AUTHORS files for details
*/
declare(strict_types=1);
namespace MensBeam\HTML\DOM\TestCase;
use MensBeam\HTML\DOM\{
Document,
DOMException,
Element,
Node,
Text,
XMLDocument
};
/** @covers \MensBeam\HTML\DOM\DocumentOrElement */
class TestDocumentOrElement extends \PHPUnit\Framework\TestCase {
public function testMethod_getElementsByClassName() {
$d = new Document('<!DOCTYPE html><html><body><div class="ook eek"><span class="ook eek"><i class="ookeek eek"></i></span></div></body></html>');
// Empty class
$ook = $d->getElementsByClassName('');
$this->assertEquals(0, $ook->length);
// Whitespace
$ook = $d->getElementsByClassName(' ');
$this->assertEquals(0, $ook->length);
// Document context node
$ook = $d->getElementsByClassName('ook');
$this->assertEquals(2, $ook->length);
// Document context node with additional whitespace
$ook = $d->getElementsByClassName(' ook ');
$this->assertEquals(2, $ook->length);
// Element context node
$div = $ook[0];
$ook = $div->getElementsByClassName('ook');
$this->assertSame('DIV', $div->nodeName);
$this->assertEquals(1, $ook->length);
$this->assertSame('SPAN', $ook[0]->nodeName);
// Multiple classes
$ook = $d->getElementsByClassName('ook eek');
$this->assertEquals(2, $ook->length);
}
public function testMethod_getElementsByTagName() {
$d = new Document('<!DOCTYPE html><html><body><div><div><span></span></div></div><div></div><span></span><span></span><svg></svg></body></html>');
// Document context
$div = $d->getElementsByTagName('div');
$this->assertEquals(3, $div->length);
// Element context
$div = $div[1];
$span = $div->getElementsByTagName('span');
$this->assertEquals(1, $span->length);
// Wildcard
$all = $d->getElementsByTagName('*');
$this->assertEquals(10, $all->length);
// XML Document
$d = new XMLDocument();
$ook = $d->appendChild($d->createElement('ook'));
for ($i = 0; $i < 9; $i++) {
$ook->appendChild($d->createElement('ook'));
}
$ook = $d->getElementsByTagName('ook');
$this->assertEquals(10, $ook->length);
}
public function testMethod_getElementsByTagNameNS() {
$d = new Document('<!DOCTYPE html><html><body><div><div><span></span></div></div><div></div><span></span><span></span><svg></svg></body></html>');
$svg = $d->body->lastChild;
$svg->appendChild($d->createElementNS(Node::SVG_NAMESPACE, 'div'));
// HTML namespace
$div = $d->getElementsByTagNameNS(Node::HTML_NAMESPACE, 'div');
$this->assertEquals(3, $div->length);
// Null namespace
$div = $d->getElementsByTagNameNS(null, 'div');
$this->assertEquals(0, $div->length);
// Empty string namespace
$div = $d->getElementsByTagNameNS('', 'div');
$this->assertEquals(0, $div->length);
// Wildcard namespace and local name
$all = $d->getElementsByTagNameNS('*', '*');
$this->assertEquals(11, $all->length);
// Wildcard namespace
$div = $d->getElementsByTagNameNS('*', 'div');
$this->assertEquals(4, $div->length);
// Wildcard local name
$svg = $d->getElementsByTagNameNS(Node::SVG_NAMESPACE, '*');
$this->assertEquals(2, $svg->length);
}
public function provideMethod_validateAndExtract__errors(): iterable {
return [
[ function() {
$d = new Document();
$d->createElementNS(Node::HTML_NAMESPACE, 'this will fail');
}, DOMException::INVALID_CHARACTER ],
[ function() {
$d = new Document();
$d->createAttributeNS(Node::HTML_NAMESPACE, 'xmlns');
}, DOMException::NAMESPACE_ERROR ]
];
}
/**
* @dataProvider provideMethod_validateAndExtract__errors
*/
public function testMethod_validateAndExtract__errors(\Closure $closure, int $errorCode): void {
$this->expectException(DOMException::class);
$this->expectExceptionCode($errorCode);
$closure();
}
}