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.

167 lines
7.1 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,
Exception
};
/** @covers \MensBeam\HTML\DOM\NodeTrait */
class TestNodeTrait extends \PHPUnit\Framework\TestCase {
/** @covers \MensBeam\HTML\DOM\NodeTrait::compareDocumentPosition */
public function testCompareDocumentPosition(): void {
$d = new Document();
$d->appendChild($d->createElement('html'));
$d->documentElement->appendChild($d->createElement('body'));
$d->body->innerHTML = '<header><h1>Ook</h1></header><main><h2 id="eek" class="ack">Eek</h2><p>Ook <a href="ook">eek</a>, ook?</p></main><footer></footer>';
$m = $d->getElementsByTagName('main')->item(0);
$f = $d->getElementsByTagName('footer')->item(0);
$e = $d->getElementById('eek');
$h2Id = $e->getAttributeNode('id');
$h2Class = $e->getAttributeNode('class');
$aHref = $d->getElementsByTagName('a')->item(0)->getAttributeNode('href');
$compareMainToBody = $m->compareDocumentPosition($d->body);
$this->assertEquals(10, $compareMainToBody);
$compareBodyToMain = $d->body->compareDocumentPosition($m);
$this->assertEquals(20, $compareBodyToMain);
$compareFooterToMain = $f->compareDocumentPosition($m);
$this->assertEquals(2, $compareFooterToMain);
$compareMainToFooter = $m->compareDocumentPosition($f);
$this->assertEquals(4, $compareMainToFooter);
$compareH2IdToAHref = $h2Id->compareDocumentPosition($aHref);
$this->assertEquals(4, $compareH2IdToAHref);
$compareH2IdToH2Class = $h2Id->compareDocumentPosition($h2Class);
$this->assertEquals(36, $compareH2IdToH2Class);
$compareH2ClassToH2Id = $h2Class->compareDocumentPosition($h2Id);
$this->assertEquals(34, $compareH2ClassToH2Id);
$this->assertEquals(0, $m->compareDocumentPosition($m));
$this->assertGreaterThan(0, $compareMainToBody & Document::DOCUMENT_POSITION_CONTAINS);
$this->assertGreaterThan(0, $compareMainToBody & Document::DOCUMENT_POSITION_PRECEDING);
$this->assertEquals(0, $compareMainToBody & Document::DOCUMENT_POSITION_FOLLOWING);
$this->assertGreaterThan(0, $compareBodyToMain & Document::DOCUMENT_POSITION_CONTAINED_BY);
$this->assertGreaterThan(0, $compareBodyToMain & Document::DOCUMENT_POSITION_FOLLOWING);
$this->assertEquals(0, $compareBodyToMain & Document::DOCUMENT_POSITION_PRECEDING);
$this->assertGreaterThan(0, $compareFooterToMain & Document::DOCUMENT_POSITION_PRECEDING);
$this->assertGreaterThan(0, $compareMainToFooter & Document::DOCUMENT_POSITION_FOLLOWING);
$this->assertGreaterThan(0, $compareH2IdToAHref & Document::DOCUMENT_POSITION_FOLLOWING);
$this->assertGreaterThan(0, $compareH2IdToH2Class & Document::DOCUMENT_POSITION_FOLLOWING);
$this->assertGreaterThan(0, $compareH2ClassToH2Id & Document::DOCUMENT_POSITION_PRECEDING);
$m->parentNode->removeChild($m);
$compareDetachedMainToFooter = $m->compareDocumentPosition($f);
$this->assertEquals($compareDetachedMainToFooter, $m->compareDocumentPosition($f));
$this->assertGreaterThanOrEqual(35, $compareDetachedMainToFooter);
$this->assertLessThanOrEqual(37, $compareDetachedMainToFooter);
$this->assertNotEquals(36, $compareDetachedMainToFooter);
}
/** @covers \MensBeam\HTML\DOM\NodeTrait::contains */
public function testContains(): void {
$d = new Document();
$d->appendChild($d->createElement('html'));
$d->documentElement->appendChild($d->createElement('body'));
$o = $d->body->appendChild($d->createTextNode('Ook!'));
$d2 = new Document();
$d2->appendChild($d2->createElement('html'));
$this->assertTrue($d->documentElement->contains($d->body));
$this->assertTrue($d->contains($o));
$this->assertFalse($o->contains($d));
$this->assertFalse($d->contains($d2->documentElement));
}
public function provideDisabledMethods(): iterable {
return [
[ 'C14N' ],
[ 'C14NFile', 'ook' ],
[ 'getLineNo' ]
];
}
/**
* @dataProvider provideDisabledMethods
* @covers \MensBeam\HTML\DOM\NodeTrait::C14N
* @covers \MensBeam\HTML\DOM\NodeTrait::C14NFile
* @covers \MensBeam\HTML\DOM\NodeTrait::getLineNo
*/
public function testDisabledMethods(string $methodName, ...$arguments): void {
$this->expectException(Exception::class);
$this->expectExceptionCode(Exception::DISABLED_METHOD);
$d = new Document();
$d->$methodName(...$arguments);
}
/** @covers \MensBeam\HTML\DOM\NodeTrait::getRootNode */
public function testGetRootNode(): void {
$d = new Document();
$t = $d->createElement('template');
$div = $t->content->appendChild($d->createElement('div'));
$this->assertTrue($t->content->isSameNode($div->getRootNode()));
}
/** @covers \MensBeam\HTML\DOM\NodeTrait::isEqualNode */
public function testIsEqualNode(): void {
$d = new Document();
$d->appendChild($d->createElement('html'));
$d->documentElement->appendChild($d->createElement('body'));
$d->body->innerHTML = '<main><h1>Ook</h1><p>Eek</p></main><footer></footer>';
$d2 = new Document();
$d2->appendChild($d2->createElement('html'));
$d2->documentElement->appendChild($d2->createElement('body'));
$d2->body->innerHTML = '<main><h1>Ook</h1><p>Eek</p></main><footer></footer>';
$this->assertTrue($d->isEqualNode($d2));
$d = new Document();
$de = $d->createElement('html');
$this->assertFalse($d->isEqualNode($de));
$d = new Document();
$d->appendChild($d->implementation->createDocumentType('html', '', ''));
$d2 = new Document();
$d2->appendChild($d2->implementation->createDocumentType('ook', 'eek', 'ack'));
$this->assertFalse($d->isEqualNode($d2));
$d = new Document('<!DOCTYPE html><html lang="en"><head><title>Ook!</title></head><body><head><h1>Eek</h1></head><footer></footer></body></html>');
$d2 = new Document('<!DOCTYPE html><html lang="en"><head><title>Eek!</title></head><body><head><h1>Eek</h1></head><footer></footer></body></html>');
$this->assertFalse($d->isEqualNode($d2));
$d = new Document();
$f = $d->createDocumentFragment();
$f->appendChild($d->createElement('span'));
$f->appendChild($d->createTextNode('Ook'));
$f2 = $d->createDocumentFragment();
$f2->appendChild($d->createElement('span'));
$this->assertFalse($f->isEqualNode($f2));
$s = $d->createElement('span');
$s->setAttribute('id', 'ook');
$s2 = $d->createElement('span');
$s2->setAttribute('class', 'ook');
$this->assertFalse($s->isEqualNode($s2));
$s = $d->createElement('span');
$br = $d->createElement('br');
$this->assertFalse($s->isEqualNode($br));
}
}