Browse Source

Test edges of element serialization

split-manual
J. King 3 years ago
parent
commit
9eacd21c9d
  1. 6
      lib/DOM/Document.php
  2. 6
      lib/DOM/Element.php
  3. 40
      tests/cases/TestDOM.php
  4. 7
      tests/cases/TestSerializer.php
  5. 20
      tests/cases/serializer/menbeam01.dat
  6. 3
      tests/phpunit.dist.xml

6
lib/DOM/Document.php

@ -98,7 +98,11 @@ class Document extends \DOMDocument {
// Replace any offending characters with "UHHHHHH" where H are the
// uppercase hexadecimal digits of the character's code point
$this->mangledElements = true;
$qualifiedName = $this->coerceName($qualifiedName);
if ($namespaceURI !== null) {
$qualifiedName = implode(":", array_map([$this, "coerceName"], explode(":", $qualifiedName, 2)));
} else {
$qualifiedName = $this->coerceName($qualifiedName);
}
return parent::createElementNS($namespaceURI, $qualifiedName, $value);
}
}

6
lib/DOM/Element.php

@ -336,9 +336,11 @@ class Element extends \DOMElement {
# The attribute’s serialized name is the attribute’s qualified name.
$name = $attr->nodeName;
}
// undo any name mangling
if (strpos($name, 'U') !== false) {
$name = $this->uncoerceName($name);
}
$value = $this->escapeString($attr->value, true);
$s .= " $name=\"$value\"";
}

40
tests/cases/TestDOM.php

@ -0,0 +1,40 @@
<?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\TestCase;
use MensBeam\HTML\Document;
/**
* @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 */
public function testCreateNamespacedElements(?string $ns, string $name, string $local, string $prefix): void {
$d = new Document;
$e = $d->createElementNS($ns, $name);
$this->assertSame($ns, $e->namespaceURI);
$this->assertSame($local, $e->localName);
$this->assertSame($prefix, $e->prefix);
}
public function provideNamespacedElements(): iterable {
return [
[null, "test", "test", ""],
[null, "test:test", "testU00003Atest", ""],
["http://www.w3.org/2000/svg", "svg", "svg", ""],
["http://www.w3.org/2000/svg", "svg:svg", "svg", "svg"],
["fake_ns", "test:test", "test", "test"],
["fake_ns", "test:test:test", "testU00003Atest", "test"],
["fake_ns", "te st:test", "test", "teU000020st"],
];
}
}

7
tests/cases/TestSerializer.php

@ -18,11 +18,6 @@ use MensBeam\HTML\Parser;
* @covers \MensBeam\HTML\Text
*/
class TestSerializer extends \PHPUnit\Framework\TestCase {
use \MensBeam\HTML\EscapeString;
protected $out;
protected $depth;
/** @dataProvider provideStandardSerializerTests */
public function testStandardTreeTests(array $data, bool $fragment, string $exp): void {
$node = $this->buildTree($data, $fragment);
@ -112,7 +107,7 @@ class TestSerializer extends \PHPUnit\Framework\TestCase {
$cur->appendChild($document->implementation->createDocumentType($name, $public, $system));
} elseif (preg_match('/^<(?:([^ ]+) )?([^>]+)>$/', $d, $m)) {
// element
$ns = strlen((string) $m[1]) ? (array_flip(Parser::NAMESPACE_MAP)[$m[1]] ?? null) : null;
$ns = strlen((string) $m[1]) ? (array_flip(Parser::NAMESPACE_MAP)[$m[1]] ?? $m[1]) : null;
$cur = $cur->appendChild($document->createElementNS($ns, $m[2]));
$pad += 2;
} elseif (preg_match('/^(?:([^" ]+) )?([^"=]+)="((?:[^"]|"(?!$))*)"$/', $d, $m)) {

20
tests/cases/serializer/menbeam01.dat

@ -0,0 +1,20 @@
#fragment
| <fake_ns test:test>
#output
<test:test></test:test>
#fragment
| <fake_ns test:te<st>
#output
<test:te<st></test:te<st>
#fragment
| <test<test>
#output
<test<test></test<test>
#fragment
| <span>
| test<test="test"
#output
<span test<test="test"></span>

3
tests/phpunit.dist.xml

@ -16,6 +16,9 @@
</filter>
<testsuites>
<testsuite name="DOM">
<file>cases/TestDOM.php</file>
</testsuite>
<testsuite name="Charset">
<file>cases/TestCharset.php</file>
</testsuite>

Loading…
Cancel
Save