From f08f1a1a37ffa17436df57f51b39e8321e168fca Mon Sep 17 00:00:00 2001 From: "J. King" Date: Sat, 10 Apr 2021 13:07:38 -0400 Subject: [PATCH] Fix up attribute testing Coverage is not more specific, and handling of prefixes is improved --- lib/DOM/Document.php | 8 +++-- lib/DOM/Element.php | 6 +++- tests/cases/TestDOM.php | 80 ++++++++++++++++++++++++----------------- 3 files changed, 59 insertions(+), 35 deletions(-) diff --git a/lib/DOM/Document.php b/lib/DOM/Document.php index c8f640e..efe3ef3 100644 --- a/lib/DOM/Document.php +++ b/lib/DOM/Document.php @@ -49,8 +49,12 @@ class Document extends \DOMDocument { // Replace any offending characters with "UHHHHHH" where H are the // uppercase hexadecimal digits of the character's code point $this->mangledAttributes = true; - $qualifiedName = $this->coerceName($qualifiedName); - return $this->createAttributeNS($namespaceURI, $qualifiedName); + if ($namespaceURI !== null) { + $qualifiedName = implode(":", array_map([$this, "coerceName"], explode(":", $qualifiedName, 2))); + } else { + $qualifiedName = $this->coerceName($qualifiedName); + } + return parent::createAttributeNS($namespaceURI, $qualifiedName); } } diff --git a/lib/DOM/Element.php b/lib/DOM/Element.php index 9df2b3d..684c7ee 100644 --- a/lib/DOM/Element.php +++ b/lib/DOM/Element.php @@ -92,7 +92,11 @@ class Element extends \DOMElement { // Replace any offending characters with "UHHHHHH" where H are the // uppercase hexadecimal digits of the character's code point $this->ownerDocument->mangledAttributes = true; - $qualifiedName = $this->coerceName($qualifiedName); + if ($namespaceURI !== null) { + $qualifiedName = implode(":", array_map([$this, "coerceName"], explode(":", $qualifiedName, 2))); + } else { + $qualifiedName = $this->coerceName($qualifiedName); + } parent::setAttributeNS($namespaceURI, $qualifiedName, $value); } if ($qualifiedName === "id" && $namespaceURI === null) { diff --git a/tests/cases/TestDOM.php b/tests/cases/TestDOM.php index c641006..f8ea7d8 100644 --- a/tests/cases/TestDOM.php +++ b/tests/cases/TestDOM.php @@ -9,16 +9,11 @@ namespace MensBeam\HTML\TestCase; use MensBeam\HTML\Document; use MensBeam\HTML\TemplateElement; -/** - * @covers \MensBeam\HTML\Document - * @covers \MensBeam\HTML\DocumentFragment - * @covers \MensBeam\HTML\Element - * @covers \MensBeam\HTML\TemplateElement - * @covers \MensBeam\HTML\Comment - * @covers \MensBeam\HTML\Text - */ class TestDOM extends \PHPUnit\Framework\TestCase { - /** @dataProvider provideNamespacedElements */ + /** + * @dataProvider provideNamespacedElements + * @covers \MensBeam\HTML\Document::createElementNS + */ public function testCreateNamespacedElements(?string $nsIn, string $nameIn, ?string $nsOut, string $local, string $prefix): void { $d = new Document; $e = $d->createElementNS($nsIn, $nameIn); @@ -45,7 +40,10 @@ class TestDOM extends \PHPUnit\Framework\TestCase { ["http://www.w3.org/1998/Math/MathML", "TEST", "http://www.w3.org/1998/Math/MathML", "TEST", ""], ]; } - /** @dataProvider provideBareElements */ + /** + * @dataProvider provideBareElements + * @covers \MensBeam\HTML\Document::createElement + */ public function testCreateBareElements(string $nameIn, $nameOut): void { $d = new Document; $e = $d->createElement($nameIn); @@ -63,6 +61,7 @@ class TestDOM extends \PHPUnit\Framework\TestCase { ]; } + /** @covers \MensBeam\HTML\Document::createElementNS */ public function testCreateTemplateElements(): void { $d = new Document; $t = $d->createElement("template"); @@ -85,7 +84,10 @@ class TestDOM extends \PHPUnit\Framework\TestCase { $this->assertNotNull($t->ownerDocument); } - /** @dataProvider provideNamespacedAttributeCreations */ + /** + * @dataProvider provideNamespacedAttributeCreations + * @covers \MensBeam\HTML\Document::createAttributeNS + */ public function testCreateNamespacedAttributes(?string $nsIn, string $nameIn, string $local, string $prefix): void { $d = new Document; $d->appendChild($d->createElement("html")); @@ -97,15 +99,22 @@ class TestDOM extends \PHPUnit\Framework\TestCase { public function provideNamespacedAttributeCreations(): iterable { return [ - [null, "test", "test", ""], - [null, "test:test", "testU00003Atest", ""], - [null, "test", "test", ""], - [null, "TEST:TEST", "TESTU00003ATEST", ""], - ["fake_ns", "test", "test", ""], + [null, "test", "test", ""], + [null, "test:test", "testU00003Atest", ""], + [null, "test", "test", ""], + [null, "TEST:TEST", "TESTU00003ATEST", ""], + ["fake_ns", "test", "test", ""], + ["fake_ns", "test:test", "test", "test"], + ["fake_ns", "TEST:TEST", "TEST", "TEST"], + ["fake_ns", "test:test:test", "testU00003Atest", "test"], + ["fake_ns", "TEST:TEST:TEST", "TESTU00003ATEST", "TEST"], ]; } - /** @dataProvider provideBareAttributeCreations */ + /** + * @dataProvider provideBareAttributeCreations + * @covers \MensBeam\HTML\Document::createAttribute + */ public function testCreateBareAttributes(string $nameIn, string $nameOut): void { $d = new Document; $d->appendChild($d->createElement("html")); @@ -123,31 +132,38 @@ class TestDOM extends \PHPUnit\Framework\TestCase { ]; } - /** @dataProvider provideNamespacedAttributeSettings */ + /** + * @dataProvider provideNamespacedAttributeSettings + * @covers \MensBeam\HTML\Element::setAttributeNS + */ public function testSetNamespoacedAttributes(?string $elementNS, ?string $attrNS, string $nameIn, string $nameOut): void { $d = new Document; $e = $d->createElementNS($elementNS, "test"); $e->setAttributeNS($attrNS, $nameIn, "test"); $this->assertSame(1, $e->attributes->length); - $this->assertTrue($e->hasAttribute($nameOut)); + $a = $e->attributes[0]; + $this->assertSame($nameOut, $a->nodeName); $this->assertSame($attrNS, $e->attributes[0]->namespaceURI); } public function provideNamespacedAttributeSettings(): iterable { return [ - [null, null, "test", "test"], - [null, null, "TEST", "test"], - ["http://www.w3.org/1999/xhtml", null, "test", "test"], - ["http://www.w3.org/1999/xhtml", null, "TEST", "test"], - [null, null, "test:test", "testU00003Atest"], - [null, null, "TEST:TEST", "testU00003Atest"], - ["http://www.w3.org/1999/xhtml", null, "test:test", "testU00003Atest"], - ["http://www.w3.org/1999/xhtml", null, "TEST:TEST", "testU00003Atest"], - [null, "http://www.w3.org/1999/xhtml", "test:test", "test:test"], - [null, "http://www.w3.org/1999/xhtml", "TEST:TEST", "TEST:TEST"], - ["http://www.w3.org/1998/Math/MathML", null, "test", "test"], - ["http://www.w3.org/1998/Math/MathML", null, "TEST", "TEST"], - [null, "http://www.w3.org/2000/xmlns/", "xmlns:xlink", "xmlns:xlink"], + [null, null, "test", "test"], + [null, null, "TEST", "test"], + ["http://www.w3.org/1999/xhtml", null, "test", "test"], + ["http://www.w3.org/1999/xhtml", null, "TEST", "test"], + [null, null, "test:test", "testU00003Atest"], + [null, null, "TEST:TEST", "testU00003Atest"], + ["http://www.w3.org/1999/xhtml", null, "test:test", "testU00003Atest"], + ["http://www.w3.org/1999/xhtml", null, "TEST:TEST", "testU00003Atest"], + [null, "http://www.w3.org/1999/xhtml", "test:test", "test:test"], + [null, "http://www.w3.org/1999/xhtml", "TEST:TEST", "TEST:TEST"], + ["http://www.w3.org/1998/Math/MathML", null, "test", "test"], + ["http://www.w3.org/1998/Math/MathML", null, "TEST", "TEST"], + [null, "http://www.w3.org/2000/xmlns/", "xmlns:xlink", "xmlns:xlink"], + [null, "http://www.w3.org/2000/xmlns/", "xmlns:XLINK", "xmlns:XLINK"], + [null, "fake_ns", "test:test:test", "test:testU00003Atest"], + [null, "fake_ns", "TEST:TEST:TEST", "TEST:TESTU00003ATEST"], ]; } }