Ook!
Ookeek
Eek!
Ack
Eekack
HTML, 'UTF-8'); $e = $d->getElementById('ack'); $this->assertSame($d->getElementById('eek'), $e->closest('#eek')); $this->assertSame($e, $e->closest('div div')); $this->assertSame($d->getElementById('ook'), $e->closest('article > div')); $this->assertSame($d->getElementById('ookeek'), $e->closest(':not(div)')); $this->assertNull($e->closest('svg')); } /** * @covers \MensBeam\HTML\DOM\Element::closest * * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\DOMException::__construct * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_closest__errors() { $this->expectException(DOMException::class); $this->expectExceptionCode(DOMException::SYNTAX_ERROR); $d = new Document(); $documentElement = $d->appendChild($d->createElement('html')); $documentElement->closest('fail?'); } /** * @covers \MensBeam\HTML\DOM\Attr::__get_value * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI * @covers \MensBeam\HTML\DOM\Element::getAttribute * @covers \MensBeam\HTML\DOM\Element::getAttributeNode * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor */ public function testMethod_getAttribute() { $d = new Document('', 'UTF-8'); $documentElement = $d->documentElement; // id attribute $this->assertSame('ook', $documentElement->getAttribute('id')); // coerced attribute $this->assertSame('jeff', $documentElement->getAttribute('poop💩')); // nonexistent attribute $this->assertNull($documentElement->getAttribute('class')); } /** * @covers \MensBeam\HTML\DOM\Element::getAttributeNames * * @covers \MensBeam\HTML\DOM\Collection::__construct * @covers \MensBeam\HTML\DOM\Collection::item * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagName * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\HTMLCollection::item * @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor */ public function testMethod_getAttributeNames() { $d = new Document('
'); $div = $d->getElementsByTagName('div')[0]; $this->assertSame([ 'id', 'class', 'ack', 'foo', 'bar' ], $div->getAttributeNames()); } /** * @covers \MensBeam\HTML\DOM\Element::getAttributeNodeNS * @covers \MensBeam\HTML\DOM\Element::getAttributeNS * * @covers \MensBeam\HTML\DOM\Attr::__get_value * @covers \MensBeam\HTML\DOM\Attr::__set_value * @covers \MensBeam\HTML\DOM\Collection::__construct * @covers \MensBeam\HTML\DOM\Collection::item * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createAttributeNS * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagNameNS * @covers \MensBeam\HTML\DOM\DocumentOrElement::validateAndExtract * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::setAttributeNode * @covers \MensBeam\HTML\DOM\Element::setAttributeNodeNS * @covers \MensBeam\HTML\DOM\Element::setAttributeNS * @covers \MensBeam\HTML\DOM\HTMLCollection::item * @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_getAttributeNS() { $d = new Document('', 'UTF-8'); $svg = $d->getElementsByTagNameNS(Node::SVG_NAMESPACE, 'svg')[0]; // Parser per the spec doesn't parse xmlns prefixed attributes except xlink, so let's add one manually instead to test coercion. $svg->setAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns:poop💩', 'https://poop💩.poop'); // xmlns attribute $this->assertSame(Node::SVG_NAMESPACE, $svg->getAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns')); // xmlns xlink attribute $this->assertSame(Node::XLINK_NAMESPACE, $svg->getAttributeNS(Node::XMLNS_NAMESPACE, 'xlink')); // coerced namespaced attribute $this->assertSame('https://poop💩.poop', $svg->getAttributeNS(Node::XMLNS_NAMESPACE, 'poop💩')); // nonexistent namespaced attribute $this->assertNull($svg->getAttributeNS(Node::XMLNS_NAMESPACE, 'ook')); // empty string namespace $this->assertSame('0 0 42 42', $svg->getAttributeNS('', 'viewBox')); } /** * @covers \MensBeam\HTML\DOM\Element::hasAttribute * * @covers \MensBeam\HTML\DOM\Collection::__construct * @covers \MensBeam\HTML\DOM\Collection::item * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagNameNS * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI * @covers \MensBeam\HTML\DOM\Element::getAttributeNode * @covers \MensBeam\HTML\DOM\HTMLCollection::item * @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor */ public function testMethod_hasAttribute() { $d = new Document('', 'UTF-8'); $documentElement = $d->documentElement; $svg = $d->getElementsByTagNameNS(Node::SVG_NAMESPACE, 'svg')[0]; $this->assertTrue($documentElement->hasAttribute('id')); $this->assertTrue($documentElement->hasAttribute('poop💩')); } /** * @covers \MensBeam\HTML\DOM\Element::hasAttributeNS * * @covers \MensBeam\HTML\DOM\Attr::__set_value * @covers \MensBeam\HTML\DOM\Collection::__construct * @covers \MensBeam\HTML\DOM\Collection::item * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createAttributeNS * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagNameNS * @covers \MensBeam\HTML\DOM\DocumentOrElement::validateAndExtract * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::getAttributeNodeNS * @covers \MensBeam\HTML\DOM\Element::setAttributeNode * @covers \MensBeam\HTML\DOM\Element::setAttributeNodeNS * @covers \MensBeam\HTML\DOM\Element::setAttributeNS * @covers \MensBeam\HTML\DOM\HTMLCollection::item * @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_hasAttributeNS() { $d = new Document('', 'UTF-8'); $svg = $d->getElementsByTagNameNS(Node::SVG_NAMESPACE, 'svg')[0]; // Parser per the spec doesn't parse xmlns prefixed attributes except xlink, so let's add one manually instead to test coercion. $svg->setAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns:poop💩', 'https://poop💩.poop'); // xmlns attribute $this->assertTrue($svg->hasAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns')); // xmlns xlink attribute $this->assertTrue($svg->hasAttributeNS(Node::XMLNS_NAMESPACE, 'xlink')); // coerced namespaced attribute $this->assertTrue($svg->hasAttributeNS(Node::XMLNS_NAMESPACE, 'poop💩')); // nonexistent namespaced attribute $this->assertFalse($svg->hasAttributeNS(Node::XMLNS_NAMESPACE, 'ook')); // empty string namespace $this->assertTrue($svg->hasAttributeNS('', 'viewBox')); } /** * @covers \MensBeam\HTML\DOM\Element::hasAttributes * * @covers \MensBeam\HTML\DOM\Collection::__construct * @covers \MensBeam\HTML\DOM\Collection::item * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagNameNS * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\HTMLCollection::item * @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor */ public function testMethod_hasAttributes() { $d = new Document('', 'UTF-8'); $svg = $d->getElementsByTagNameNS(Node::SVG_NAMESPACE, 'svg')[0]; $this->assertTrue($svg->hasAttributes()); } /** * @covers \MensBeam\HTML\DOM\Element::insertAdjacent * * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\Document::createTextNode * @covers \MensBeam\HTML\DOM\DOMException::__construct * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::insertAdjacentText * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Text::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_insertAdjacent__errors() { $this->expectException(DOMException::class); $this->expectExceptionCode(DOMException::SYNTAX_ERROR); $d = new Document(); $d->appendChild($d->createElement('html')); $d->documentElement->insertAdjacentText('fail', 'fail'); } /** * @covers \MensBeam\HTML\DOM\Element::insertAdjacentElement * * @covers \MensBeam\HTML\DOM\Collection::__construct * @covers \MensBeam\HTML\DOM\Collection::item * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_body * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\Document::createTextNode * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\Document::serialize * @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagName * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::insertAdjacent * @covers \MensBeam\HTML\DOM\HTMLCollection::item * @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_firstChild * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_nextSibling * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::__get_parentNode * @covers \MensBeam\HTML\DOM\Node::__toString * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::insertBefore * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Text::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::__get_xpath * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_insertAdjacentElement() { $d = new Document('

Ook

', 'UTF-8'); $body = $d->body; $p = $d->getElementsByTagName('p')[0]; $dd = $d->createElement('div'); $dd->appendChild($d->createTextNode('beforebegin')); $p->insertAdjacentElement('beForebEgin', $dd); $this->assertSame('
beforebegin

Ook

', (string)$body); $dd = $d->createElement('div'); $dd->appendChild($d->createTextNode('afterbegin')); $p->insertAdjacentElement('AfterbeGin', $dd); $this->assertSame('
beforebegin

afterbegin
Ook

', (string)$body); $dd = $d->createElement('div'); $dd->appendChild($d->createTextNode('beforeend')); $p->insertAdjacentElement('beforeend', $dd); $this->assertSame('
beforebegin

afterbegin
Ook
beforeend

', (string)$body); $dd = $d->createElement('div'); $dd->appendChild($d->createTextNode('afterend')); $p->insertAdjacentElement('aFteREND', $dd); $this->assertSame('
beforebegin

afterbegin
Ook
beforeend

afterend
', (string)$body); $t = $d->createElement('template'); $t->content->appendChild($d->createTextNode('beforebegin')); $p->insertAdjacentElement('beForebEgin', $t); $this->assertSame('
beforebegin

afterbegin
Ook
beforeend

afterend
', (string)$body); $p = $d->createElement('p'); $this->assertNull($p->insertAdjacentElement('beforebegin', $dd)); $this->assertNull($p->insertAdjacentElement('afterend', $dd)); } /** * @covers \MensBeam\HTML\DOM\Element::insertAdjacentHTML * * @covers \MensBeam\HTML\DOM\Collection::__construct * @covers \MensBeam\HTML\DOM\Collection::item * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_body * @covers \MensBeam\HTML\DOM\Document::createDocumentFragment * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\Document::serialize * @covers \MensBeam\HTML\DOM\DocumentFragment::__construct * @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagName * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_localName * @covers \MensBeam\HTML\DOM\HTMLCollection::item * @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet * @covers \MensBeam\HTML\DOM\HTMLTemplateElement::__construct * @covers \MensBeam\HTML\DOM\HTMLTemplateElement::__get_content * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_firstChild * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_lastChild * @covers \MensBeam\HTML\DOM\Node::__get_nextSibling * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::__get_parentNode * @covers \MensBeam\HTML\DOM\Node::__toString * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::appendChildInner * @covers \MensBeam\HTML\DOM\Node::cloneInnerNode * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::insertBefore * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Serializer::getTemplateContent * @covers \MensBeam\HTML\DOM\Text::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty * @covers \MensBeam\HTML\DOM\Inner\Reflection::setProtectedProperties */ public function testMethod_insertAdjacentHTML() { $d = new Document('

Ook

', 'UTF-8'); $body = $d->body; $p = $d->getElementsByTagName('p')[0]; $t = $d->getElementsByTagName('template')[0]; $p->insertAdjacentHTML('beForebEgin', '
beforebegin
'); $this->assertSame('
beforebegin

Ook

', (string)$body); $p->insertAdjacentHTML('AfterbeGin', '
afterbegin
'); $this->assertSame('
beforebegin

afterbegin
Ook

', (string)$body); $p->insertAdjacentHTML('beforeend', '
beforeend
'); $this->assertSame('
beforebegin

afterbegin
Ook
beforeend

', (string)$body); $p->insertAdjacentHTML('aFteREND', '
afterend
'); $this->assertSame('
beforebegin

afterbegin
Ook
beforeend

afterend
', (string)$body); $t->insertAdjacentHTML('beforebegin', '
beforebegin
'); $this->assertSame('
beforebegin

afterbegin
Ook
beforeend

afterend
beforebegin
', (string)$body); // Yes, this is correct. There are no special handling instructions for // templates in this. $t->insertAdjacentHTML('afterbegin', '
afterbegin
'); $this->assertSame('
beforebegin

afterbegin
Ook
beforeend

afterend
beforebegin
', (string)$body); $t->content->appendChild($d->createElement('div')); $t->content->lastChild->insertAdjacentHTML('beforebegin', '
beforebegin
'); $this->assertSame('
beforebegin

afterbegin
Ook
beforeend

afterend
beforebegin
', (string)$body); } public function provideMethod_insertAdjacentHTML__errors(): iterable { return [ [ function() { $d = new Document(); $documentElement = $d->appendChild($d->createElement('html')); $documentElement->insertAdjacentHTML('beforebegin', 'Ook!'); }, DOMException::NO_MODIFICATION_ALLOWED ], [ function() { $d = new Document(); $documentElement = $d->appendChild($d->createElement('html')); $documentElement->insertAdjacentHTML('fail', 'fail'); }, DOMException::SYNTAX_ERROR ] ]; } /** * @dataProvider provideMethod_insertAdjacentHTML__errors * @covers \MensBeam\HTML\DOM\Element::insertAdjacentHTML * * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\DOMException::__construct * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_parentNode * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_insertAdjacentHTML__errors(\Closure $closure, int $errorCode) { $this->expectException(DOMException::class); $this->expectExceptionCode($errorCode); $closure(); } /** * @covers \MensBeam\HTML\DOM\Element::insertAdjacentText * * @covers \MensBeam\HTML\DOM\Collection::__construct * @covers \MensBeam\HTML\DOM\Collection::item * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_body * @covers \MensBeam\HTML\DOM\Document::createTextNode * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\Document::serialize * @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagName * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::insertAdjacent * @covers \MensBeam\HTML\DOM\HTMLCollection::item * @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_firstChild * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_nextSibling * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::__get_parentNode * @covers \MensBeam\HTML\DOM\Node::__toString * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::insertBefore * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Text::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_insertAdjacentText() { $d = new Document('

Ook

', 'UTF-8'); $body = $d->body; $p = $d->getElementsByTagName('p')[0]; $p->insertAdjacentText('beforebegin', 'beforebegin'); $this->assertSame('beforebegin

Ook

', (string)$body); $p->insertAdjacentText('afterbegin', 'afterbegin'); $this->assertSame('beforebegin

afterbeginOok

', (string)$body); $p->insertAdjacentText('beforeend', 'beforeend'); $this->assertSame('beforebegin

afterbeginOokbeforeend

', (string)$body); $p->insertAdjacentText('afterend', 'afterend'); $this->assertSame('beforebegin

afterbeginOokbeforeend

afterend', (string)$body); } /** * @covers \MensBeam\HTML\DOM\Element::matches * @covers \MensBeam\HTML\DOM\Element::webkitMatchesSelector * * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\NonElementParentNode::getElementById * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_xpath * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor */ public function testMethod_matches_webkitMatchesSelector() { $d = new Document(<< HTML, 'UTF-8'); $ook = $d->getElementById('ook'); $eek = $d->getElementById('eek'); $this->assertTrue($ook->matches('.ook')); $this->assertTrue($ook->matches('body > ul')); $this->assertTrue($eek->matches('.eek')); $this->assertTrue($eek->matches('li + li')); $this->assertFalse($ook->webkitMatchesSelector('li')); } /** * @covers \MensBeam\HTML\DOM\Element::matches * * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\DOMException::__construct * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_matches__errors() { $this->expectException(DOMException::class); $this->expectExceptionCode(DOMException::SYNTAX_ERROR); $d = new Document(); $documentElement = $d->appendChild($d->createElement('html')); $documentElement->matches('fail?'); } /** * @covers \MensBeam\HTML\DOM\Element::removeAttribute * * @covers \MensBeam\HTML\DOM\Collection::__construct * @covers \MensBeam\HTML\DOM\Collection::__get_length * @covers \MensBeam\HTML\DOM\Collection::count * @covers \MensBeam\HTML\DOM\Collection::item * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagNameNS * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_attributes * @covers \MensBeam\HTML\DOM\HTMLCollection::item * @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet * @covers \MensBeam\HTML\DOM\NamedNodeMap::__construct * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor */ public function testMethod_removeAttribute() { $d = new Document('', 'UTF-8'); $svg = $d->getElementsByTagNameNS(Node::SVG_NAMESPACE, 'svg')[0]; // Trying to remove namespaced attribute $svg->removeAttribute('xmlns'); $this->assertEquals(4, $svg->attributes->length); // Removing attribute $svg->removeAttribute('viewBox'); $this->assertEquals(3, $svg->attributes->length); // Removing coerced attribute $svg->removeAttribute('poop💩'); $this->assertEquals(2, $svg->attributes->length); } /** * @covers \MensBeam\HTML\DOM\Element::removeAttributeNode * * @covers \MensBeam\HTML\DOM\Attr::__get_localName * @covers \MensBeam\HTML\DOM\Attr::__get_namespaceURI * @covers \MensBeam\HTML\DOM\Attr::__get_ownerElement * @covers \MensBeam\HTML\DOM\Attr::__set_value * @covers \MensBeam\HTML\DOM\Collection::__construct * @covers \MensBeam\HTML\DOM\Collection::__get_length * @covers \MensBeam\HTML\DOM\Collection::count * @covers \MensBeam\HTML\DOM\Collection::item * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createAttributeNS * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagNameNS * @covers \MensBeam\HTML\DOM\DocumentOrElement::validateAndExtract * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_attributes * @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI * @covers \MensBeam\HTML\DOM\Element::getAttributeNode * @covers \MensBeam\HTML\DOM\Element::getAttributeNodeNS * @covers \MensBeam\HTML\DOM\Element::setAttributeNode * @covers \MensBeam\HTML\DOM\Element::setAttributeNodeNS * @covers \MensBeam\HTML\DOM\Element::setAttributeNS * @covers \MensBeam\HTML\DOM\HTMLCollection::item * @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet * @covers \MensBeam\HTML\DOM\NamedNodeMap::__construct * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_removeAttributeNode() { $d = new Document('', 'UTF-8'); $svg = $d->getElementsByTagNameNS(Node::SVG_NAMESPACE, 'svg')[0]; // Parser per the spec doesn't parse xmlns prefixed attributes except xlink, so let's add one manually instead to test coercion. $svg->setAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns:poop💩', 'https://poop💩.poop'); $xmlns = $svg->getAttributeNodeNS(Node::XMLNS_NAMESPACE, 'xmlns'); $xlink = $svg->getAttributeNodeNS(Node::XMLNS_NAMESPACE, 'xlink'); $poop = $svg->getAttributeNodeNS(Node::XMLNS_NAMESPACE, 'poop💩'); $viewBox = $svg->getAttributeNode('viewBox'); $svg->removeAttributeNode($xmlns); $this->assertEquals(3, $svg->attributes->length); $svg->removeAttributeNode($xlink); $this->assertEquals(2, $svg->attributes->length); $svg->removeAttributeNode($poop); $this->assertEquals(1, $svg->attributes->length); $svg->removeAttributeNode($viewBox); $this->assertEquals(0, $svg->attributes->length); } /** * @covers \MensBeam\HTML\DOM\Element::removeAttributeNode * * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createAttribute * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\DOMException::__construct * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_removeAttributeNode__errors() { $this->expectException(DOMException::class); $this->expectExceptionCode(DOMException::NOT_FOUND); $d = new Document(); $documentElement = $d->appendChild($d->createElement('html')); $documentElement->removeAttributeNode($d->createAttribute('shit')); } /** * @covers \MensBeam\HTML\DOM\Element::removeAttributeNS * * @covers \MensBeam\HTML\DOM\Attr::__get_localName * @covers \MensBeam\HTML\DOM\Attr::__get_namespaceURI * @covers \MensBeam\HTML\DOM\Attr::__get_ownerElement * @covers \MensBeam\HTML\DOM\Attr::__set_value * @covers \MensBeam\HTML\DOM\Collection::__construct * @covers \MensBeam\HTML\DOM\Collection::__get_length * @covers \MensBeam\HTML\DOM\Collection::count * @covers \MensBeam\HTML\DOM\Collection::item * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createAttributeNS * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagNameNS * @covers \MensBeam\HTML\DOM\DocumentOrElement::validateAndExtract * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_attributes * @covers \MensBeam\HTML\DOM\Element::getAttributeNodeNS * @covers \MensBeam\HTML\DOM\Element::setAttributeNode * @covers \MensBeam\HTML\DOM\Element::setAttributeNodeNS * @covers \MensBeam\HTML\DOM\Element::setAttributeNS * @covers \MensBeam\HTML\DOM\HTMLCollection::item * @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet * @covers \MensBeam\HTML\DOM\NamedNodeMap::__construct * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_removeAttributeNS() { $d = new Document('', 'UTF-8'); $svg = $d->getElementsByTagNameNS(Node::SVG_NAMESPACE, 'svg')[0]; // Parser per the spec doesn't parse xmlns prefixed attributes except xlink, so let's add one manually instead to test coercion. $svg->setAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns:poop💩', 'https://poop💩.poop'); // Remove null namespaced attribute $svg->removeAttributeNS(null, 'viewBox'); $this->assertEquals(3, $svg->attributes->length); // Remove namespaced attribute $svg->removeAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns'); $this->assertEquals(2, $svg->attributes->length); // Remove coerced namespaced attribute $svg->removeAttributeNS(Node::XMLNS_NAMESPACE, 'poop💩'); $this->assertEquals(1, $svg->attributes->length); } /** * @covers \MensBeam\HTML\DOM\Element::setAttribute * * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI * @covers \MensBeam\HTML\DOM\Element::getAttributeNode * @covers \MensBeam\HTML\DOM\Element::hasAttribute * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_setAttribute() { $d = new Document(); $d->appendChild($d->createElement('html')); $documentElement = $d->documentElement; // Just need to test coerced attributes; everything else has been covered // elsewhere $documentElement->setAttribute('poop💩', 'jeff'); $this->assertTrue($documentElement->hasAttribute('poop💩')); } /** * @covers \MensBeam\HTML\DOM\Element::setAttribute * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\DOMException::__construct * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_setAttribute__errors() { $this->expectException(DOMException::class); $this->expectExceptionCode(DOMException::INVALID_CHARACTER); $d = new Document(); $d->appendChild($d->createElement('html')); $d->documentElement->setAttribute('this will fail', 'fail'); } /** * @covers \MensBeam\HTML\DOM\Element::setAttributeNode * @covers \MensBeam\HTML\DOM\Attr::__get_localName * @covers \MensBeam\HTML\DOM\Attr::__get_ownerElement * @covers \MensBeam\HTML\DOM\Attr::__get_value * @covers \MensBeam\HTML\DOM\Attr::__set_value * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createAttribute * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI * @covers \MensBeam\HTML\DOM\Element::getAttribute * @covers \MensBeam\HTML\DOM\Element::getAttributeNode * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_setAttributeNode() { $d = new Document(); $d->appendChild($d->createElement('html')); $documentElement = $d->documentElement; $attr = $d->createAttribute('poop💩'); $attr->value = 'jeff'; $documentElement->setAttributeNode($attr); // Almost everything is covered. Just need to test same attributes and // replacements. $documentElement->setAttributeNode($attr); $this->assertSame('jeff', $documentElement->getAttribute('poop💩')); $attr = $d->createAttribute('poop💩'); $attr->value = 'jeff'; $documentElement->setAttributeNode($attr); $this->assertSame('jeff', $documentElement->getAttribute('poop💩')); } /** * @covers \MensBeam\HTML\DOM\Element::setAttributeNode * * @covers \MensBeam\HTML\DOM\Attr::__get_localName * @covers \MensBeam\HTML\DOM\Attr::__get_ownerElement * @covers \MensBeam\HTML\DOM\Attr::__set_value * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createAttribute * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\DOMException::__construct * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI * @covers \MensBeam\HTML\DOM\Element::getAttributeNode * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_setAttributeNode__errors() { $this->expectException(DOMException::class); $this->expectExceptionCode(DOMException::IN_USE_ATTRIBUTE); $d = new Document(); $documentElement = $d->appendChild($d->createElement('html')); $body = $documentElement->appendChild($d->createElement('body')); $attr = $d->createAttribute('ook'); $attr->value = 'eek'; $body->setAttributeNode($attr); $documentElement->setAttributeNode($attr); } /** * @covers \MensBeam\HTML\DOM\Element::setAttributeNS * * @covers \MensBeam\HTML\DOM\Attr::__get_value * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\DocumentOrElement::validateAndExtract * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::getAttributeNodeNS * @covers \MensBeam\HTML\DOM\Element::getAttributeNS * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\NonElementParentNode::getElementById * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testMethod_setAttributeNS() { $d = new Document(); $d->appendChild($d->createElement('html')); $documentElement = $d->documentElement; // Just need to test setting of a bullshit namespaced attribute and id // attribute; everything else is covered already. $documentElement->setAttributeNS('https://poop💩.poop💩', 'poop💩:poop💩', 'jeff'); $this->assertSame('jeff', $documentElement->getAttributeNS('https://poop💩.poop💩', 'poop💩')); $documentElement->setAttributeNS(null, 'id', 'ook'); $this->assertSame($documentElement, $d->getElementById('ook')); } /** * @covers \MensBeam\HTML\DOM\Element::__get_attributes * * @covers \MensBeam\HTML\DOM\Attr::__get_value * @covers \MensBeam\HTML\DOM\Collection::__get_length * @covers \MensBeam\HTML\DOM\Collection::count * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI * @covers \MensBeam\HTML\DOM\Element::getAttribute * @covers \MensBeam\HTML\DOM\Element::getAttributeNode * @covers \MensBeam\HTML\DOM\NamedNodeMap::__construct * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor */ public function testProperty_attributes() { $d = new Document('', 'UTF-8'); $documentElement = $d->documentElement; $this->assertEquals(6, $documentElement->attributes->length); $this->assertSame(Node::HTML_NAMESPACE, $documentElement->getAttribute('xmlns')); } /** * @covers \MensBeam\HTML\DOM\Element::__get_classList * * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::load * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\DOMTokenList::__construct * @covers \MensBeam\HTML\DOM\DOMTokenList::__get_length * @covers \MensBeam\HTML\DOM\DOMTokenList::parseOrderedSet * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::hasChildNodes * @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testProperty_classList() { $d = new Document('', 'UTF-8'); $documentElement = $d->documentElement; $this->assertEquals(5, $documentElement->classList->length); } /** * @covers \MensBeam\HTML\DOM\Element::__get_className * @covers \MensBeam\HTML\DOM\Element::__set_className * * @covers \MensBeam\HTML\DOM\Attr::__get_value * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI * @covers \MensBeam\HTML\DOM\Element::getAttribute * @covers \MensBeam\HTML\DOM\Element::getAttributeNode * @covers \MensBeam\HTML\DOM\Element::setAttribute * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testProperty_className() { $d = new Document(); $documentElement = $d->appendChild($d->createElement('html')); $documentElement->className = 'ook'; $this->assertSame('ook', $documentElement->className); } /** * @covers \MensBeam\HTML\DOM\Element::__get_id * @covers \MensBeam\HTML\DOM\Element::__set_id * * @covers \MensBeam\HTML\DOM\Attr::__get_value * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI * @covers \MensBeam\HTML\DOM\Element::getAttribute * @covers \MensBeam\HTML\DOM\Element::getAttributeNode * @covers \MensBeam\HTML\DOM\Element::setAttribute * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testProperty_id() { $d = new Document(); $documentElement = $d->appendChild($d->createElement('html')); $documentElement->id = 'ook'; $this->assertSame('ook', $documentElement->id); } /** * @covers \MensBeam\HTML\DOM\Element::__get_innerHTML * @covers \MensBeam\HTML\DOM\Element::__set_innerHTML * * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_body * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createDocumentFragment * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\Document::createTextNode * @covers \MensBeam\HTML\DOM\DocumentFragment::__construct * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\HTMLTemplateElement::__construct * @covers \MensBeam\HTML\DOM\HTMLTemplateElement::__get_content * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_firstChild * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::containsInner * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Serializer::getTemplateContent * @covers \MensBeam\HTML\DOM\Text::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty * @covers \MensBeam\HTML\DOM\Inner\Reflection::setProtectedProperties */ public function testProperty_innerHTML() { $d = new Document(); $d->appendChild($d->createElement('html')); $d->documentElement->appendChild($d->createElement('body')); $s = $d->body->appendChild($d->createElement('span')); $s->appendChild($d->createTextNode('ook')); $this->assertSame('ook', $d->body->innerHTML); $d->body->innerHTML = '
eek
'; $this->assertSame('
eek
', $d->body->innerHTML); $t = $d->body->appendChild($d->createElement('template')); $t->innerHTML = 'ook'; $this->assertSame('ook', $t->innerHTML); } /** * @covers \MensBeam\HTML\DOM\Element::__get_outerHTML * @covers \MensBeam\HTML\DOM\Element::__set_outerHTML * * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::__get_body * @covers \MensBeam\HTML\DOM\Document::__get_documentElement * @covers \MensBeam\HTML\DOM\Document::createDocumentFragment * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\Document::createTextNode * @covers \MensBeam\HTML\DOM\Document::serialize * @covers \MensBeam\HTML\DOM\DocumentFragment::__construct * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI * @covers \MensBeam\HTML\DOM\Element::setAttribute * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument * @covers \MensBeam\HTML\DOM\Node::__get_parentNode * @covers \MensBeam\HTML\DOM\Node::__toString * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::containsInner * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Node::replaceChild * @covers \MensBeam\HTML\DOM\Text::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testProperty_outerHTML() { $d = new Document(); $d->appendChild($d->createElement('html')); $d->documentElement->appendChild($d->createElement('body')); $d->body->setAttribute('class', 'ook'); $s = $d->body->appendChild($d->createElement('span')); $s->appendChild($d->createTextNode('ook')); $this->assertSame('ook', $d->body->outerHTML); $d->body->outerHTML = 'eek'; $this->assertSame('eek', $d->body->outerHTML); $f = $d->createDocumentFragment(); $div = $f->appendChild($d->createElement('div')); $div->outerHTML = 'ook'; $this->assertSame('ook', (string)$f); $div = $d->createElement('div'); $div->appendChild($d->createTextNode('ook')); $div->outerHTML = '
eek
'; $this->assertSame('
ook
', (string)$div); } /** * @covers \MensBeam\HTML\DOM\Element::__set_outerHTML * * @covers \MensBeam\HTML\DOM\Document::__construct * @covers \MensBeam\HTML\DOM\Document::createElement * @covers \MensBeam\HTML\DOM\DOMException::__construct * @covers \MensBeam\HTML\DOM\DOMImplementation::__construct * @covers \MensBeam\HTML\DOM\Element::__construct * @covers \MensBeam\HTML\DOM\Node::__construct * @covers \MensBeam\HTML\DOM\Node::__get_innerNode * @covers \MensBeam\HTML\DOM\Node::__get_parentNode * @covers \MensBeam\HTML\DOM\Node::appendChild * @covers \MensBeam\HTML\DOM\Node::getInnerDocument * @covers \MensBeam\HTML\DOM\Node::getRootNode * @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes * @covers \MensBeam\HTML\DOM\Node::preInsertionValidity * @covers \MensBeam\HTML\DOM\Inner\Document::__construct * @covers \MensBeam\HTML\DOM\Inner\Document::__get_wrapperNode * @covers \MensBeam\HTML\DOM\Inner\Document::getWrapperNode * @covers \MensBeam\HTML\DOM\Inner\NodeCache::get * @covers \MensBeam\HTML\DOM\Inner\NodeCache::has * @covers \MensBeam\HTML\DOM\Inner\NodeCache::key * @covers \MensBeam\HTML\DOM\Inner\NodeCache::set * @covers \MensBeam\HTML\DOM\Inner\Reflection::createFromProtectedConstructor * @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty */ public function testProperty_outerHTML__errors() { $this->expectException(DOMException::class); $this->expectExceptionCode(DOMException::NO_MODIFICATION_ALLOWED); $d = new Document(); $documentElement = $d->appendChild($d->createElement('html')); $documentElement->outerHTML = 'FAIL'; } }