Compare commits
2 Commits
Author | SHA1 | Date |
---|---|---|
Dustin Wilson | e2f8592682 | 5 months ago |
Dustin Wilson | c0ff4395d0 | 5 months ago |
66 changed files with 2885 additions and 8892 deletions
File diff suppressed because it is too large
@ -0,0 +1,11 @@ |
|||
<?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; |
|||
|
|||
class InvalidArgumentException extends \OutOfBoundsException {} |
@ -1,166 +0,0 @@ |
|||
<?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; |
|||
use MensBeam\HTML\DOM\Inner\Reflection; |
|||
|
|||
|
|||
trait XPathEvaluate { |
|||
private ?XPathException $__xpathException = null; |
|||
|
|||
|
|||
public function xpathErrorHandler(int $errno, string $errstr, string $errfile, int $errline) { |
|||
if ($this->__xpathException) { |
|||
return true; |
|||
} |
|||
|
|||
$lowerErrstr = strtolower($errstr); |
|||
if (str_contains(needle: 'undefined namespace prefix', haystack: $lowerErrstr)) { |
|||
$this->__xpathException = new XPathException(XPathException::UNRESOLVABLE_NAMESPACE_PREFIX); |
|||
} elseif (str_contains(needle: 'invalid expression', haystack: $lowerErrstr)) { |
|||
$this->__xpathException = new XPathException(XPathException::INVALID_EXPRESSION); |
|||
} |
|||
|
|||
return true; |
|||
} // @codeCoverageIgnore |
|||
|
|||
protected function xpathEvaluate(string $expression, Node $contextNode, \Closure|XPathNSResolver|null $resolver = null, int $type = XPathResult::ANY_TYPE, ?XPathResult $result = null): XPathResult { |
|||
$innerContextNode = $contextNode->innerNode; |
|||
$doc = ($innerContextNode instanceof \DOMDocument) ? $innerContextNode : $innerContextNode->ownerDocument; |
|||
|
|||
if ($resolver !== null && preg_match_all('/([A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}]{1}[A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}-\.0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}]*):([A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}]{1}[A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}-\.0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}]*)/u', $expression, $m, \PREG_SET_ORDER)) { |
|||
foreach ($m as $prefix) { |
|||
$prefix = $prefix[1]; |
|||
|
|||
if ($resolver instanceof XPathNSResolver) { |
|||
$namespace = $contextNode->lookupNamespaceURI($prefix); |
|||
} elseif ($namespace = $resolver($prefix)) { |
|||
$namespace = (string)$namespace; |
|||
} |
|||
|
|||
if ($namespace !== null) { |
|||
$doc->xpath->registerNamespace($prefix, $namespace); |
|||
} |
|||
} |
|||
} |
|||
|
|||
// PHP's DOM XPath incorrectly issues warnings rather than exceptions when |
|||
// expressions are incorrect, so we must use a custom error handler here to |
|||
// "catch" it and throw an exception in its place. |
|||
set_error_handler([ $this, 'xpathErrorHandler' ]); |
|||
$result = $doc->xpath->evaluate($expression, $innerContextNode); |
|||
restore_error_handler(); |
|||
if ($this->__xpathException) { |
|||
$e = $this->__xpathException; |
|||
$this->__xpathException = null; |
|||
throw $e; |
|||
} |
|||
|
|||
if ($type === XPathResult::ANY_TYPE) { |
|||
$typeOfResult = gettype($result); |
|||
if ($typeOfResult === 'object') { |
|||
$typeOfResult = $result::class; |
|||
} |
|||
|
|||
switch ($typeOfResult) { |
|||
case 'integer': |
|||
case 'double': |
|||
$resultType = XPathResult::NUMBER_TYPE; |
|||
break; |
|||
case 'string': |
|||
$resultType = XPathResult::STRING_TYPE; |
|||
break; |
|||
case 'boolean': |
|||
$resultType = XPathResult::BOOLEAN_TYPE; |
|||
break; |
|||
case 'DOMNodeList': |
|||
$resultType = XPathResult::ORDERED_NODE_ITERATOR_TYPE; |
|||
break; |
|||
default: |
|||
throw new NotSupportedError(); |
|||
} |
|||
} else { |
|||
switch ($type) { |
|||
case XPathResult::NUMBER_TYPE: |
|||
if ($result instanceof \DOMNodeList) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
|
|||
$result = (float)$result; |
|||
break; |
|||
|
|||
case XPathResult::STRING_TYPE: |
|||
if ($result instanceof \DOMNodeList) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
|
|||
$result = (string)$result; |
|||
break; |
|||
|
|||
case XPathResult::BOOLEAN_TYPE: |
|||
if ($result instanceof \DOMNodeList) { |
|||
$result = ($result->length > 0); |
|||
} |
|||
|
|||
$result = (bool)$result; |
|||
break; |
|||
|
|||
// In this implementation there's no difference between these because PHP's |
|||
// XPath DOM (ALMOST!) always returns in document order, and that cannot be |
|||
// changed. |
|||
case XPathResult::UNORDERED_NODE_ITERATOR_TYPE: |
|||
case XPathResult::ORDERED_NODE_ITERATOR_TYPE: |
|||
if (!$result instanceof \DOMNodeList) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
break; |
|||
|
|||
// In this implementation there's no difference between these because PHP's |
|||
// XPath DOM (ALMOST!) always returns in document order, and that cannot be |
|||
// changed. |
|||
case XPathResult::UNORDERED_NODE_SNAPSHOT_TYPE: |
|||
case XPathResult::ORDERED_NODE_SNAPSHOT_TYPE: |
|||
if (!$result instanceof \DOMNodeList) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
|
|||
$temp = []; |
|||
foreach ($result as $node) { |
|||
$temp[] = $node; |
|||
} |
|||
$result = $temp; |
|||
break; |
|||
|
|||
// In this implementation there's no difference between these because PHP's |
|||
// XPath DOM (ALMOST!) always returns in document order, and that cannot be |
|||
// changed. |
|||
case XPathResult::ANY_UNORDERED_NODE_TYPE: |
|||
case XPathResult::FIRST_ORDERED_NODE_TYPE: |
|||
if (!$result instanceof \DOMNodeList) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
|
|||
$result = $result->item(0); |
|||
break; |
|||
|
|||
default: throw new NotSupportedError(); |
|||
} |
|||
|
|||
$resultType = $type; |
|||
} |
|||
|
|||
// XPathResult cannot be created from their constructors normally. |
|||
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\XPathResult', $resultType, ($result instanceof \DOMNodeList || is_array($result)) ? $result : [ $result ]); |
|||
} |
|||
|
|||
protected function xpathRegisterPhpFunctions(Document $document, string|array|null $restrict = null): void { |
|||
$xpath = $document->innerNode->xpath; |
|||
$xpath->registerNamespace('php', 'http://php.net/xpath'); |
|||
$xpath->registerPhpFunctions($restrict); |
|||
} |
|||
} |
@ -1,19 +0,0 @@ |
|||
<?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; |
|||
|
|||
|
|||
class XPathEvaluator { |
|||
use XPathEvaluatorBase; |
|||
|
|||
|
|||
public function registerXPathFunctions(Document $document, string|array|null $restrict = null): void { |
|||
$this->xpathRegisterPhpFunctions($document, $restrict); |
|||
} |
|||
} |
@ -1,30 +0,0 @@ |
|||
<?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; |
|||
use MensBeam\HTML\DOM\Inner\Reflection; |
|||
|
|||
|
|||
trait XPathEvaluatorBase { |
|||
use XPathEvaluate; |
|||
|
|||
|
|||
public function createExpression(string $expression, ?XPathNSResolver $resolver = null): XPathExpression { |
|||
// XPathExpression cannot be created from their constructors normally. |
|||
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\XPathExpression', $expression, $resolver); |
|||
} |
|||
|
|||
public function createNSResolver(Node $nodeResolver): XPathNSResolver { |
|||
// XPathNSResolver cannot be created from their constructors normally. |
|||
return Reflection::createFromProtectedConstructor(__NAMESPACE__ . '\\XPathNSResolver', $nodeResolver); |
|||
} |
|||
|
|||
public function evaluate(string $expression, Node $contextNode, \Closure|XPathNSResolver|null $resolver = null, int $type = XPathResult::ANY_TYPE, ?XPathResult $result = null): XPathResult { |
|||
return $this->xpathEvaluate($expression, $contextNode, $resolver, $type, $result); |
|||
} |
|||
} |
@ -1,64 +0,0 @@ |
|||
<?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; |
|||
use MensBeam\HTML\DOM\Inner\Reflection; |
|||
|
|||
|
|||
class XPathExpression { |
|||
use XPathEvaluate; |
|||
|
|||
protected string $expression; |
|||
protected ?XPathNSResolver $resolver; |
|||
|
|||
|
|||
protected function __construct(string $expression, ?XPathNSResolver $resolver) { |
|||
if ($resolver !== null && preg_match_all('/([A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}]{1}[A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}-\.0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}]*):([A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}]{1}[A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}-\.0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}]*)/u', $expression, $m, \PREG_SET_ORDER)) { |
|||
// This part is especially nasty because of egregious use of reflection to get |
|||
// protected properties, but neither should be exposed publicly; this is a crazy |
|||
// polyfill hack that wouldn't normally be necessary otherwise. |
|||
$nodeResolver = Reflection::getProtectedProperty($resolver, 'nodeResolver'); |
|||
$innerNodeResolver = $nodeResolver->innerNode; |
|||
$doc = ($innerNodeResolver instanceof \DOMDocument) ? $innerNodeResolver : $innerNodeResolver->ownerDocument; |
|||
|
|||
foreach ($m as $prefix) { |
|||
$prefix = $prefix[1]; |
|||
if ($namespace = $resolver->lookupNamespaceURI($prefix)) { |
|||
$doc->xpath->registerNamespace($prefix, $namespace); |
|||
} |
|||
} |
|||
|
|||
set_error_handler([ $this, 'xpathErrorHandler' ]); |
|||
$doc->xpath->evaluate($expression); |
|||
restore_error_handler(); |
|||
} else { |
|||
// Test the expression by attempting to run it on an empty document. PHP's DOM |
|||
// XPath incorrectly issues a warnings rather than exceptions when expressions |
|||
// are incorrect, so we must use a custom error handler here to "catch" it and |
|||
// throw an exception in its place. |
|||
set_error_handler([ $this, 'xpathErrorHandler' ]); |
|||
$xpath = new \DOMXPath(new \DOMDocument()); |
|||
$xpath->evaluate($expression); |
|||
restore_error_handler(); |
|||
} |
|||
|
|||
if ($this->__xpathException) { |
|||
$e = $this->__xpathException; |
|||
$this->__xpathException = null; |
|||
throw $e; |
|||
} |
|||
|
|||
$this->expression = $expression; |
|||
$this->resolver = $resolver; |
|||
} |
|||
|
|||
|
|||
public function evaluate(Node $contextNode, int $type = XPathResult::ANY_TYPE, ?XPathResult $result = null): XPathResult { |
|||
return $this->xpathEvaluate($this->expression, $contextNode, $this->resolver, $type, $result); |
|||
} |
|||
} |
@ -1,24 +0,0 @@ |
|||
<?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; |
|||
|
|||
|
|||
class XPathNSResolver { |
|||
protected Node $nodeResolver; |
|||
|
|||
|
|||
protected function __construct(Node $nodeResolver) { |
|||
$this->nodeResolver = $nodeResolver; |
|||
} |
|||
|
|||
|
|||
public function lookupNamespaceURI(?string $prefix): ?string { |
|||
return $this->nodeResolver->lookupNamespaceURI($prefix); |
|||
} |
|||
} |
@ -1,171 +0,0 @@ |
|||
<?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; |
|||
use MensBeam\GettersAndSetters; |
|||
|
|||
|
|||
class XPathResult implements \ArrayAccess, \Countable, \Iterator { |
|||
use GettersAndSetters; |
|||
|
|||
public const ANY_TYPE = 0; |
|||
public const NUMBER_TYPE = 1; |
|||
public const STRING_TYPE = 2; |
|||
public const BOOLEAN_TYPE = 3; |
|||
public const UNORDERED_NODE_ITERATOR_TYPE = 4; |
|||
public const ORDERED_NODE_ITERATOR_TYPE = 5; |
|||
public const UNORDERED_NODE_SNAPSHOT_TYPE = 6; |
|||
public const ORDERED_NODE_SNAPSHOT_TYPE = 7; |
|||
public const ANY_UNORDERED_NODE_TYPE = 8; |
|||
public const FIRST_ORDERED_NODE_TYPE = 9; |
|||
|
|||
protected bool $_invalidIteratorState = false; |
|||
protected int $position = 0; |
|||
protected int $_resultType; |
|||
protected \DOMNodeList|array $storage; |
|||
|
|||
protected function __get_booleanValue(): ?bool { |
|||
if ($this->_resultType !== self::BOOLEAN_TYPE) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
|
|||
return $this->storage[0]; |
|||
} |
|||
|
|||
protected function __get_invalidIteratorState(): bool { |
|||
return $this->_invalidIteratorState; |
|||
} |
|||
|
|||
protected function __get_numberValue(): ?float { |
|||
if ($this->_resultType !== self::NUMBER_TYPE) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
|
|||
return $this->storage[0]; |
|||
} |
|||
|
|||
protected function __get_resultType(): int { |
|||
return $this->_resultType; |
|||
} |
|||
|
|||
protected function __get_singleNodeValue(): ?Node { |
|||
if (!in_array($this->_resultType, [ self::ANY_UNORDERED_NODE_TYPE, self::FIRST_ORDERED_NODE_TYPE ])) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
|
|||
$node = $this->storage[0]; |
|||
return ($node !== null) ? $node->ownerDocument->getWrapperNode($node) : null; |
|||
} |
|||
|
|||
protected function __get_snapshotLength(): int { |
|||
if (!in_array($this->_resultType, [ self::ORDERED_NODE_SNAPSHOT_TYPE, self::UNORDERED_NODE_SNAPSHOT_TYPE ])) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
|
|||
return $this->count(); |
|||
} |
|||
|
|||
protected function __get_stringValue(): ?string { |
|||
if ($this->_resultType !== self::STRING_TYPE) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
|
|||
return $this->storage[0]; |
|||
} |
|||
|
|||
|
|||
protected function __construct(int $type, \DOMNodeList|array $object) { |
|||
$this->storage = $object; |
|||
$this->_resultType = $type; |
|||
} |
|||
|
|||
|
|||
public function count(): int { |
|||
$this->validateStorage(); |
|||
return (is_array($this->storage)) ? count($this->storage) : $this->storage->length; |
|||
} |
|||
|
|||
public function current(): ?Node { |
|||
$this->validateStorage(); |
|||
$node = $this->storage[$this->position]; |
|||
return $node->ownerDocument->getWrapperNode($node); |
|||
} |
|||
|
|||
public function iterateNext(): ?Node { |
|||
if (!in_array($this->_resultType, [ self::ORDERED_NODE_ITERATOR_TYPE, self::UNORDERED_NODE_ITERATOR_TYPE ])) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
|
|||
if ($this->position + 1 > $this->count()) { |
|||
return null; |
|||
} |
|||
|
|||
$node = $this->storage[$this->position++]; |
|||
return $node->ownerDocument->getWrapperNode($node); |
|||
} |
|||
|
|||
public function key(): int { |
|||
$this->validateStorage(); |
|||
return $this->position; |
|||
} |
|||
|
|||
public function next(): void { |
|||
$this->validateStorage(); |
|||
$this->position++; |
|||
} |
|||
|
|||
public function rewind(): void { |
|||
$this->validateStorage(); |
|||
$this->position = 0; |
|||
} |
|||
|
|||
public function offsetExists($offset): bool { |
|||
$this->validateStorage(); |
|||
return isset($this->storage[$offset]); |
|||
} |
|||
|
|||
public function offsetGet($offset): ?Node { |
|||
$this->validateStorage(); |
|||
|
|||
$node = $this->storage[$offset]; |
|||
return ($node !== null) ? $node->ownerDocument->getWrapperNode($node) : null; |
|||
} |
|||
|
|||
public function offsetSet($offset, $value): void { |
|||
$this->validateStorage(); |
|||
} |
|||
|
|||
public function offsetUnset($offset): void { |
|||
$this->validateStorage(); |
|||
} |
|||
|
|||
public function snapshotItem(int $index): ?Node { |
|||
if (!in_array($this->_resultType, [ self::ORDERED_NODE_SNAPSHOT_TYPE, self::UNORDERED_NODE_SNAPSHOT_TYPE ])) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
|
|||
if (!isset($this->storage[$index])) { |
|||
return null; |
|||
} |
|||
|
|||
$node = $this->storage[$index]; |
|||
return $node->ownerDocument->getWrapperNode($node); |
|||
} |
|||
|
|||
public function valid(): bool { |
|||
$this->validateStorage(); |
|||
return $this->offsetExists($this->position); |
|||
} |
|||
|
|||
|
|||
protected function validateStorage(): void { |
|||
if (!in_array($this->_resultType, [ self::ORDERED_NODE_ITERATOR_TYPE, self::UNORDERED_NODE_ITERATOR_TYPE, self::ORDERED_NODE_SNAPSHOT_TYPE, self::UNORDERED_NODE_SNAPSHOT_TYPE ])) { |
|||
throw new XPathException(XPathException::TYPE_ERROR); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,57 @@ |
|||
#!/usr/bin/env php |
|||
<?php |
|||
/** |
|||
* @license MIT |
|||
* Copyright 2022 Dustin Wilson, et al. |
|||
* See LICENSE and AUTHORS files for details |
|||
*/ |
|||
|
|||
$dir = ini_get('extension_dir'); |
|||
$php = escapeshellarg(\PHP_BINARY); |
|||
$code = escapeshellarg(__DIR__ . '/lib'); |
|||
|
|||
|
|||
array_shift($argv); |
|||
foreach ($argv as $k => $v) { |
|||
if (in_array($v, ['--coverage', '--coverage-html'])) { |
|||
$argv[$k] = '--coverage-html tests/coverage'; |
|||
} |
|||
} |
|||
|
|||
$cmd = [ |
|||
$php, |
|||
'-d opcache.enable_cli=0', |
|||
]; |
|||
|
|||
$pcovLoaded = extension_loaded('pcov'); |
|||
$xdebugLoaded = extension_loaded('xdebug'); |
|||
|
|||
if (!$pcovLoaded && !$xdebugLoaded) { |
|||
$extDir = ini_get('extension_dir'); |
|||
if (!extension_loaded('pcov') && file_exists("$extDir/pcov.so")) { |
|||
$cmd[] = '-d zend_extension=pcov.so'; |
|||
$pcovLoaded = true; |
|||
} elseif (!extension_loaded('xdebug') && file_exists("$extDir/xdebug.so")) { |
|||
$cmd[] = '-d zend_extension=xdebug.so'; |
|||
$xdebugLoaded = true; |
|||
} |
|||
} |
|||
|
|||
if ($pcovLoaded) { |
|||
$cmd[] = '-d pcov.enabled=1'; |
|||
$cmd[] = "-d pcov.directory=$code"; |
|||
} elseif ($xdebugLoaded) { |
|||
$cmd[] = '-d xdebug.mode=coverage,develop,trace'; |
|||
} else { |
|||
fwrite(\STDERR, "Either the pcov or xdebug extension is required to run tests.\n"); |
|||
exit(1); |
|||
} |
|||
|
|||
$cmd = implode(' ', [ |
|||
...$cmd, |
|||
escapeshellarg(__DIR__ . '/vendor/bin/phpunit'), |
|||
'--configuration tests/phpunit.xml', |
|||
...$argv, |
|||
'--display-deprecations' |
|||
]); |
|||
passthru($cmd); |
@ -1,24 +1,18 @@ |
|||
<?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; |
|||
namespace MensBeam\HTML\DOM\Test; |
|||
|
|||
const NS_BASE = __NAMESPACE__."\\"; |
|||
define(NS_BASE."BASE", dirname(__DIR__).DIRECTORY_SEPARATOR); |
|||
const DOCROOT = BASE."tests".DIRECTORY_SEPARATOR."docroot".DIRECTORY_SEPARATOR; |
|||
ini_set("memory_limit", "-1"); |
|||
ini_set("zend.assertions", "1"); |
|||
ini_set("assert.exception", "true"); |
|||
ini_set('memory_limit', '2G'); |
|||
ini_set('zend.assertions', '1'); |
|||
ini_set('assert.exception', 'true'); |
|||
error_reporting(\E_ALL); |
|||
require_once BASE."vendor".DIRECTORY_SEPARATOR."autoload.php"; |
|||
define('CWD', dirname(__DIR__)); |
|||
require_once CWD . '/vendor/autoload.php'; |
|||
|
|||
/*if (function_exists("xdebug_set_filter")) { |
|||
if (defined("XDEBUG_PATH_INCLUDE")) { |
|||
xdebug_set_filter(\XDEBUG_FILTER_CODE_COVERAGE, XDEBUG_PATH_INCLUDE, [BASE."lib/"]); |
|||
if (extension_loaded('xdebug') && ini_get('xdebug.mode') !== 'off' && function_exists('xdebug_set_filter')) { |
|||
if (defined('XDEBUG_PATH_INCLUDE')) { |
|||
xdebug_set_filter(\XDEBUG_FILTER_CODE_COVERAGE, \XDEBUG_PATH_INCLUDE, [ CWD . '/lib/' ]); |
|||
} else { |
|||
xdebug_set_filter(\XDEBUG_FILTER_CODE_COVERAGE, XDEBUG_PATH_WHITELIST, [BASE."lib/"]); |
|||
xdebug_set_filter(\XDEBUG_FILTER_CODE_COVERAGE, \XDEBUG_PATH_WHITELIST, [ CWD . '/lib/' ]); |
|||
} |
|||
}*/ |
|||
} |
@ -1,148 +0,0 @@ |
|||
<?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, |
|||
Node |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\Attr */ |
|||
class TestAttr extends \PHPUnit\Framework\TestCase { |
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\Attr::__get_name |
|||
* |
|||
* @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\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_documentElement |
|||
* @covers \MensBeam\HTML\DOM\Document::createAttributeNS |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @covers \MensBeam\HTML\DOM\DocumentOrElement::validateAndExtract |
|||
* @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::getAttributeNodeNS |
|||
* @covers \MensBeam\HTML\DOM\Element::setAttributeNode |
|||
* @covers \MensBeam\HTML\DOM\Element::setAttributeNodeNS |
|||
* @covers \MensBeam\HTML\DOM\Element::setAttributeNS |
|||
* @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\NonElementParentNode::getElementById |
|||
* @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 |
|||
*/ |
|||
public function testProperty_name(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body ook="ook" poop💩="poop💩"><svg id="eek"></svg></body></html>', 'utf-8'); |
|||
$body = $d->body; |
|||
$svg = $d->getElementById('eek'); |
|||
$svg->setAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns:xlink', Node::XLINK_NAMESPACE); |
|||
|
|||
// HTML name |
|||
$this->assertSame('ook', $body->getAttributeNode('ook')->name); |
|||
// Coerced name |
|||
$this->assertSame('poop💩', $body->getAttributeNode('poop💩')->name); |
|||
// Foreign attribute name |
|||
$this->assertSame('xmlns:xlink', $svg->getAttributeNodeNS(Node::XMLNS_NAMESPACE, 'xlink')->name); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\Attr::__get_prefix |
|||
* |
|||
* @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\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::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\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\NonElementParentNode::getElementById |
|||
* @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 |
|||
*/ |
|||
public function testProperty_prefix(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><svg id="eek"></svg></body></html>', 'utf-8'); |
|||
$svg = $d->getElementById('eek'); |
|||
$svg->setAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns:xlink', Node::XLINK_NAMESPACE); |
|||
$svg->setAttributeNS('https://poop.poop', 'poop💩:poop💩', 'poop💩'); |
|||
|
|||
// Foreign attribute name |
|||
$this->assertSame('xmlns', $svg->getAttributeNodeNS(Node::XMLNS_NAMESPACE, 'xlink')->prefix); |
|||
$this->assertSame('poop💩', $svg->getAttributeNodeNS('https://poop.poop', 'poop💩')->prefix); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\Attr::__get_specified |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @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::getAttributeNode |
|||
* @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::__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 testProperty_specified(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body ook="ook"></body></html>', 'utf-8'); |
|||
$this->assertTrue($d->body->getAttributeNode('ook')->specified); |
|||
} |
|||
} |
@ -1,220 +0,0 @@ |
|||
<?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, |
|||
XMLDocument |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\CharacterData */ |
|||
class TestCharacterData extends \PHPUnit\Framework\TestCase { |
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::appendData |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::__get_length |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createCDATASection |
|||
* @covers \MensBeam\HTML\DOM\Document::createTextNode |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Text::__construct |
|||
* @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_appendData(): void { |
|||
$d = new Document(); |
|||
$t = $d->createTextNode('ookeek'); |
|||
$this->assertEquals(6, $t->length); |
|||
$t->appendData('💩'); |
|||
$this->assertEquals(7, $t->length); |
|||
|
|||
$d = new XMLDocument(); |
|||
$t = $d->createCDATASection('ookeek'); |
|||
$this->assertEquals(6, $t->length); |
|||
$t->appendData('💩'); |
|||
$this->assertEquals(7, $t->length); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::deleteData |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::__get_data |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::__set_data |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createTextNode |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Text::__construct |
|||
* @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_deleteData(): void { |
|||
$d = new Document(); |
|||
$t = $d->createTextNode('ook eek'); |
|||
$t->deleteData(3, 1); |
|||
$this->assertSame('ookeek', $t->data); |
|||
$t->data = 'ook💩eek'; |
|||
$t->deleteData(3, 1); |
|||
$this->assertSame('ookeek', $t->data); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::insertData |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::__get_data |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createTextNode |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Text::__construct |
|||
* @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_insertData(): void { |
|||
$d = new Document(); |
|||
$t = $d->createTextNode('ookeek'); |
|||
$t->insertData(3, '💩'); |
|||
$this->assertSame('ook💩eek', $t->data); |
|||
$t->insertData(3, '💩'); |
|||
$this->assertSame('ook💩💩eek', $t->data); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::replaceData |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::__get_data |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createTextNode |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Text::__construct |
|||
* @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_replaceData(): void { |
|||
$d = new Document(); |
|||
$t = $d->createTextNode('ook💩💩eek'); |
|||
$t->replaceData(3, 2, ' '); |
|||
$this->assertSame('ook eek', $t->data); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::substringData |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createTextNode |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Text::__construct |
|||
* @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_substringData(): void { |
|||
$d = new Document(); |
|||
$t = $d->createTextNode('ook💩💩eek'); |
|||
$this->assertSame('💩💩', $t->substringData(3, 2)); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::__get_data |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::__set_data |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createCDATASection |
|||
* @covers \MensBeam\HTML\DOM\Document::createTextNode |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Text::__construct |
|||
* @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 testProperty_data(): void { |
|||
$d = new Document(); |
|||
$t = $d->createTextNode('ook'); |
|||
// Getting is thoroughly tested, setting isn't. |
|||
$t->data = 'eek'; |
|||
$this->assertSame('eek', $t->data); |
|||
|
|||
$d = new XMLDocument(); |
|||
$t = $d->createCDATASection('ook'); |
|||
$t->data = 'eek'; |
|||
$this->assertSame('eek', $t->data); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::__get_length |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::__get_data |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::__set_data |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createCDATASection |
|||
* @covers \MensBeam\HTML\DOM\Document::createTextNode |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Text::__construct |
|||
* @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 testProperty_length(): void { |
|||
$d = new Document(); |
|||
$t = $d->createTextNode('ookeek'); |
|||
$this->assertEquals(6, $t->length); |
|||
$t->data .= '💩'; |
|||
$this->assertEquals(7, $t->length); |
|||
|
|||
$d = new XMLDocument(); |
|||
$t = $d->createCDATASection('ookeek'); |
|||
$this->assertEquals(6, $t->length); |
|||
$t->data .= '💩'; |
|||
$this->assertEquals(7, $t->length); |
|||
} |
|||
} |
@ -1,146 +0,0 @@ |
|||
<?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 |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\ChildNode */ |
|||
class TestChildNode extends \PHPUnit\Framework\TestCase { |
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\ChildNode::after |
|||
* @covers \MensBeam\HTML\DOM\ChildNode::before |
|||
* @covers \MensBeam\HTML\DOM\ChildNode::replaceWith |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Comment::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_documentElement |
|||
* @covers \MensBeam\HTML\DOM\Document::createComment |
|||
* @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\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::__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::convertNodesToNode |
|||
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument |
|||
* @covers \MensBeam\HTML\DOM\Node::getRootNode |
|||
* @covers \MensBeam\HTML\DOM\Node::insertBefore |
|||
* @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 testMethod_after_before_replaceWith(): void { |
|||
$d = new Document(); |
|||
$d->appendChild($d->createElement('html')); |
|||
$body = $d->documentElement->appendChild($d->createElement('body')); |
|||
$div = $body->appendChild($d->createElement('div')); |
|||
$o = $body->appendChild($d->createTextNode('ook')); |
|||
$div2 = $body->appendChild($d->createElement('div')); |
|||
|
|||
// On node with parent |
|||
$div->after($d->createElement('span'), $o, 'eek'); |
|||
$this->assertSame('<body><div></div><span></span>ookeek<div></div></body>', (string)$body); |
|||
$div->after($o); |
|||
$this->assertSame('<body><div></div>ook<span></span>eek<div></div></body>', (string)$body); |
|||
|
|||
|
|||
// On node with no parent |
|||
$c = $d->createComment('ook'); |
|||
$this->assertNull($c->after($d->createTextNode('ook'))); |
|||
|
|||
// On node with parent |
|||
$br = $body->insertBefore($d->createElement('br'), $div); |
|||
$e = $d->createTextNode('eek'); |
|||
$div->before($d->createElement('span'), $o, 'eek', $e, $br); |
|||
$this->assertSame('<body><span></span>ookeekeek<br><div></div><span></span>eek<div></div></body>', (string)$body); |
|||
$div->before($o); |
|||
$this->assertSame('<body><span></span>eekeek<br>ook<div></div><span></span>eek<div></div></body>', (string)$body); |
|||
|
|||
// On node with no parent |
|||
$c = $d->createComment('ook'); |
|||
$this->assertNull($c->before($d->createTextNode('ook'))); |
|||
|
|||
// On node with parent |
|||
$s = $d->createElement('span'); |
|||
$br->replaceWith('ack', $o, $e, $s); |
|||
$this->assertSame('<body><span></span>eekackookeek<span></span><div></div><span></span>eek<div></div></body>', (string)$body); |
|||
$s->replaceWith($o); |
|||
$this->assertSame('<body><span></span>eekackeekook<div></div><span></span>eek<div></div></body>', (string)$body); |
|||
|
|||
// On node with no parent |
|||
$c = $d->createComment('ook'); |
|||
$this->assertNull($c->replaceWith($d->createTextNode('ook'))); |
|||
|
|||
// Parent within node |
|||
$o->replaceWith('poo', $o, $e); |
|||
$this->assertSame('<body><span></span>eekackpooookeek<div></div><span></span>eek<div></div></body>', (string)$body); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\ChildNode::remove |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @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::__get_innerNode |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_parentNode |
|||
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument |
|||
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes |
|||
* @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix |
|||
* @covers \MensBeam\HTML\DOM\Node::removeChild |
|||
* @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 |
|||
* @covers \MensBeam\HTML\DOM\Inner\Reflection::getProtectedProperty |
|||
*/ |
|||
public function testMethod_remove(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body></body></html>'); |
|||
$body = $d->body; |
|||
$body->remove(); |
|||
$this->assertNull($d->body); |
|||
|
|||
// Test removal of an element without a parent. |
|||
$body->remove(); |
|||
} |
|||
} |
@ -1,94 +0,0 @@ |
|||
<?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\{ |
|||
Attr, |
|||
Document, |
|||
HTMLElement |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\Collection */ |
|||
class TestCollection extends \PHPUnit\Framework\TestCase { |
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\Collection::current |
|||
* @covers \MensBeam\HTML\DOM\Collection::item |
|||
* @covers \MensBeam\HTML\DOM\Collection::key |
|||
* @covers \MensBeam\HTML\DOM\Collection::next |
|||
* @covers \MensBeam\HTML\DOM\Collection::offsetExists |
|||
* @covers \MensBeam\HTML\DOM\Collection::rewind |
|||
* @covers \MensBeam\HTML\DOM\Collection::valid |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Collection::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @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::__get_childNodes |
|||
* @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_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 testIteration(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><br><br><br><br><br></body></html>'); |
|||
$body = $d->body; |
|||
$children = $body->childNodes; |
|||
foreach ($children as $key => $child) { |
|||
$this->assertTrue($child instanceof HTMLElement); |
|||
} |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\Collection::offsetGet |
|||
* @covers \MensBeam\HTML\DOM\Collection::offsetUnset |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Attr::__get_value |
|||
* @covers \MensBeam\HTML\DOM\Collection::item |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_attributes |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::__construct |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::item |
|||
* @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::__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_offsetSet_offsetUnset(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body a="ook" b="eek" c="ook" d="eek" e="ook"></body></html>'); |
|||
$body = $d->body; |
|||
$attributes = $body->attributes; |
|||
$attributes[0] = 'eek'; |
|||
$this->assertSame('ook', $attributes[0]->value); |
|||
unset($attributes[2]); |
|||
$this->assertSame('ook', $attributes[2]->value); |
|||
} |
|||
} |
@ -1,164 +0,0 @@ |
|||
<?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, |
|||
DOMImplementation, |
|||
Node |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\DOMImplementation */ |
|||
class TestDOMImplementation extends \PHPUnit\Framework\TestCase { |
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::createDocument |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_contentType |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_doctype |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_documentElement |
|||
* @covers \MensBeam\HTML\DOM\Document::createElementNS |
|||
* @covers \MensBeam\HTML\DOM\DocumentOrElement::validateAndExtract |
|||
* @covers \MensBeam\HTML\DOM\DocumentType::__construct |
|||
* @covers \MensBeam\HTML\DOM\DocumentType::__get_name |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::createDocumentType |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_localName |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_prefix |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_tagName |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_nodeName |
|||
* @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 |
|||
* @covers \MensBeam\HTML\DOM\Inner\Reflection::setProtectedProperties |
|||
*/ |
|||
public function testMethod_createDocument(): void { |
|||
$di = new DOMImplementation(); |
|||
$d = $di->createDocument(null, 'ook', $di->createDocumentType('ook', 'eek', 'ack')); |
|||
$this->assertNull($d->documentElement->namespaceURI); |
|||
$this->assertSame('ook', $d->documentElement->tagName); |
|||
$this->assertSame('ook', $d->doctype->nodeName); |
|||
$this->assertSame('application/xml', $d->contentType); |
|||
|
|||
$d = $di->createDocument(Node::HTML_NAMESPACE, 'html', $di->createDocumentType('html', '', '')); |
|||
$this->assertSame(Node::HTML_NAMESPACE, $d->documentElement->namespaceURI); |
|||
$this->assertSame('html', $d->documentElement->tagName); |
|||
$this->assertSame('html', $d->doctype->nodeName); |
|||
$this->assertSame('application/xhtml+xml', $d->contentType); |
|||
|
|||
$d = $di->createDocument(Node::SVG_NAMESPACE, 'svg', null); |
|||
$this->assertSame(Node::SVG_NAMESPACE, $d->documentElement->namespaceURI); |
|||
$this->assertSame('svg', $d->documentElement->tagName); |
|||
$this->assertNull($d->doctype); |
|||
$this->assertSame('image/svg+xml', $d->contentType); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::createDocumentType |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMException::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct |
|||
*/ |
|||
public function testMethod_createDocumentType__errors(): void { |
|||
$this->expectException(DOMException::class); |
|||
$this->expectExceptionCode(DOMException::INVALID_CHARACTER); |
|||
|
|||
$di = new DOMImplementation(); |
|||
$di->createDocumentType('fail fail', 'fail', 'fail'); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::createHTMLDocument |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_contentType |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_doctype |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_documentElement |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_implementation |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_title |
|||
* @covers \MensBeam\HTML\DOM\Document::createElement |
|||
* @covers \MensBeam\HTML\DOM\Document::createTextNode |
|||
* @covers \MensBeam\HTML\DOM\DocumentType::__construct |
|||
* @covers \MensBeam\HTML\DOM\DocumentType::__get_name |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::createDocumentType |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_localName |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_prefix |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_tagName |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_nodeName |
|||
* @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::setProtectedProperties |
|||
*/ |
|||
public function testMethod_createHTMLDocument(): void { |
|||
$di = new DOMImplementation(); |
|||
$d = $di->createHTMLDocument('ook'); |
|||
$this->assertSame(Node::HTML_NAMESPACE, $d->documentElement->namespaceURI); |
|||
$this->assertSame('html', $d->documentElement->tagName); |
|||
$this->assertSame('html', $d->doctype->nodeName); |
|||
$this->assertSame('text/html', $d->contentType); |
|||
$this->assertSame('ook', $d->title); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::hasFeature |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct |
|||
*/ |
|||
public function testMethod_hasFeature(): void { |
|||
$di = new DOMImplementation(); |
|||
$this->assertTrue($di->hasFeature()); |
|||
} |
|||
} |
@ -1,578 +0,0 @@ |
|||
<?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\DOMTokenList */ |
|||
class TestDOMTokenList extends \PHPUnit\Framework\TestCase { |
|||
public function provideMethod_add_remove_replace_toggle___errors(): iterable { |
|||
return [ |
|||
[ function() { |
|||
$d = new Document(); |
|||
$e = $d->createElement('html'); |
|||
$e->classList->add(''); |
|||
}, DOMException::SYNTAX_ERROR ], |
|||
[ function() { |
|||
$d = new Document(); |
|||
$e = $d->createElement('html'); |
|||
$e->classList->remove(''); |
|||
}, DOMException::SYNTAX_ERROR ], |
|||
[ function() { |
|||
$d = new Document(); |
|||
$e = $d->createElement('html'); |
|||
$e->classList->replace('ack', ''); |
|||
}, DOMException::SYNTAX_ERROR ], |
|||
[ function() { |
|||
$d = new Document(); |
|||
$e = $d->createElement('html'); |
|||
$e->classList->toggle(''); |
|||
}, DOMException::SYNTAX_ERROR ], |
|||
[ function() { |
|||
$d = new Document(); |
|||
$e = $d->createElement('html'); |
|||
$e->classList->add('fail fail'); |
|||
}, DOMException::INVALID_CHARACTER ], |
|||
[ function() { |
|||
$d = new Document(); |
|||
$e = $d->createElement('html'); |
|||
$e->classList->remove('fail fail'); |
|||
}, DOMException::INVALID_CHARACTER ], |
|||
[ function() { |
|||
$d = new Document(); |
|||
$e = $d->createElement('html'); |
|||
$e->classList->replace('ack', 'fail fail'); |
|||
}, DOMException::INVALID_CHARACTER ], |
|||
[ function() { |
|||
$d = new Document(); |
|||
$e = $d->createElement('html'); |
|||
$e->classList->toggle('fail fail'); |
|||
}, DOMException::INVALID_CHARACTER ] |
|||
]; |
|||
} |
|||
|
|||
/** |
|||
* @dataProvider provideMethod_add_remove_replace_toggle___errors |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::add |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::remove |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::replace |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::toggle |
|||
* |
|||
* @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\DOMTokenList::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_classList |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @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_add_remove_replace_toggle___errors(\Closure $closure, int $errorCode): void { |
|||
$this->expectException(DOMException::class); |
|||
$this->expectExceptionCode($errorCode); |
|||
$closure(); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::contains |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createElement |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__toString |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::add |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::parseOrderedSet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::update |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_classList |
|||
* @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 |
|||
*/ |
|||
public function testMethod_contains() { |
|||
$d = new Document(); |
|||
$e = $d->appendChild($d->createElement('html')); |
|||
$e->classList->add('ook', 'eek', 'ack', 'ookeek'); |
|||
$this->assertTrue($e->classList->contains('ack')); |
|||
$this->assertFalse($e->classList->contains('fail')); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::count |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createElement |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__toString |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::add |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::parseOrderedSet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::update |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_classList |
|||
* @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 |
|||
*/ |
|||
public function testMethod_count(): void { |
|||
$d = new Document(); |
|||
$e = $d->appendChild($d->createElement('html')); |
|||
$this->assertEquals(0, count($e->classList)); |
|||
$e->classList->add('ook', 'eek', 'ack', 'ookeek'); |
|||
$this->assertEquals(4, count($e->classList)); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::item |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createElement |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__get_length |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__toString |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::add |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::parseOrderedSet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::update |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_classList |
|||
* @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 |
|||
*/ |
|||
public function testMethod_item(): void { |
|||
$d = new Document(); |
|||
$e = $d->appendChild($d->createElement('html')); |
|||
$e->classList->add('ook', 'eek', 'ack', 'ookeek'); |
|||
$this->assertNull($e->classList->item(42)); |
|||
$this->assertEquals(4, $e->classList->length); |
|||
} |
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::offsetSet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::offsetUnset |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createElement |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__get_length |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__toString |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::add |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::parseOrderedSet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::update |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_classList |
|||
* @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 |
|||
*/ |
|||
public function testMethod_offsetSet_offsetUnset(): void { |
|||
$d = new Document(); |
|||
$e = $d->appendChild($d->createElement('html')); |
|||
$e->classList->add('ook', 'eek', 'ack', 'ookeek'); |
|||
$e->classList[3] = 'ook'; |
|||
unset($e->classList[3]); |
|||
$this->assertEquals(4, $e->classList->length); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::replace |
|||
* |
|||
* @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\DOMTokenList::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__get_value |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__toString |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::parseOrderedSet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::update |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_classList |
|||
* @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 |
|||
*/ |
|||
public function testMethod_replace(): void { |
|||
$d = new Document(); |
|||
$e = $d->appendChild($d->createElement('html')); |
|||
$e->setAttribute('class', 'ook eek ack ookeek'); |
|||
$this->assertTrue($e->classList->replace('ack', 'what')); |
|||
$this->assertSame('ook eek what ookeek', $e->classList->value); |
|||
$this->assertSame('ook eek what ookeek', $e->getAttribute('class')); |
|||
$this->assertFalse($e->classList->replace('fail', 'eekook')); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::remove |
|||
* @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\DOMTokenList::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__get_length |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__get_value |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__toString |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::item |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::offsetGet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::parseOrderedSet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::update |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_classList |
|||
* @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 |
|||
*/ |
|||
public function testMethod_remove(): void { |
|||
$d = new Document(); |
|||
$e = $d->appendChild($d->createElement('html')); |
|||
$e->classList->remove('ook'); |
|||
$e->setAttribute('class', 'ook eek ack ookeek'); |
|||
$e->classList->remove('ack'); |
|||
$this->assertSame('ook eek ookeek', $e->classList->value); |
|||
$this->assertSame('ook eek ookeek', $e->getAttribute('class')); |
|||
|
|||
// It is wasteful to do it like this of course, but this is only for testing. |
|||
$classList = $e->classList; |
|||
while ($classList->length > 0) { |
|||
$classList->remove($classList[0]); |
|||
} |
|||
|
|||
$this->assertEquals(0, $e->classList->length); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::supports |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createElement |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__toString |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::add |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::parseOrderedSet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::update |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_classList |
|||
* @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 |
|||
*/ |
|||
public function testMethod_supports(): void { |
|||
// PHPUnit is supposed to support expecting of errors, but it doesn't. So let's |
|||
// write a bunch of bullshit so we can catch and assert errors instead. |
|||
set_error_handler(function($errno) { |
|||
if ($errno === \E_USER_ERROR) { |
|||
$this->assertEquals(\E_USER_ERROR, $errno); |
|||
} |
|||
}); |
|||
|
|||
$d = new Document(); |
|||
$e = $d->appendChild($d->createElement('html')); |
|||
$e->classList->add('ook', 'eek', 'ack', 'ookeek'); |
|||
$e->classList->supports('ack'); |
|||
|
|||
restore_error_handler(); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::toggle |
|||
* |
|||
* @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\DOMTokenList::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__get_value |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__toString |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::add |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::parseOrderedSet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::remove |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::update |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_classList |
|||
* @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 |
|||
*/ |
|||
public function testMethod_toggle(): void { |
|||
$d = new Document(); |
|||
$e = $d->appendChild($d->createElement('html')); |
|||
$e->setAttribute('class', 'ook eek ack ookeek'); |
|||
$this->assertFalse($e->classList->toggle('ack')); |
|||
$this->assertSame('ook eek ookeek', $e->classList->value); |
|||
$this->assertSame('ook eek ookeek', $e->getAttribute('class')); |
|||
$this->assertTrue($e->classList->toggle('ack')); |
|||
$this->assertSame('ook eek ookeek ack', $e->classList->value); |
|||
$this->assertSame('ook eek ookeek ack', $e->getAttribute('class')); |
|||
$this->assertTrue($e->classList->toggle('ack', true)); |
|||
$this->assertSame('ook eek ookeek ack', $e->classList->value); |
|||
$this->assertSame('ook eek ookeek ack', $e->getAttribute('class')); |
|||
$this->assertFalse($e->classList->toggle('eekook', false)); |
|||
$this->assertSame('ook eek ookeek ack', $e->classList->value); |
|||
$this->assertSame('ook eek ookeek ack', $e->getAttribute('class')); |
|||
$this->assertTrue($e->classList->toggle('eekook', true)); |
|||
$this->assertSame('ook eek ookeek ack eekook', $e->classList->value); |
|||
$this->assertSame('ook eek ookeek ack eekook', $e->getAttribute('class')); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createElement |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__toString |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::add |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::current |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::item |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::key |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::next |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::offsetExists |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::offsetGet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::parseOrderedSet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::rewind |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::update |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::valid |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_classList |
|||
* @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 |
|||
*/ |
|||
public function testProcess_iteration(): void { |
|||
$d = new Document(); |
|||
$e = $d->appendChild($d->createElement('html')); |
|||
$e->classList->add('ook', 'eek', 'ack', 'ookeek'); |
|||
|
|||
foreach ($e->classList as $key => $className) { |
|||
$this->assertSame($className, $e->classList[$key]); |
|||
// test offsetExists |
|||
$this->assertTrue(isset($e->classList[$key])); |
|||
} |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__get_value |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__set_value |
|||
* |
|||
* @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\DOMTokenList::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::__toString |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::add |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::item |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::offsetGet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::parseOrderedSet |
|||
* @covers \MensBeam\HTML\DOM\DOMTokenList::update |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_classList |
|||
* @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 |
|||
*/ |
|||
public function testProperty_value(): void { |
|||
// Test it with and without an attached document element |
|||
$d = new Document(); |
|||
$e = $d->createElement('html'); |
|||
$e->classList->add('ook', 'eek', 'ack', 'ookeek'); |
|||
$this->assertSame('ook eek ack ookeek', $e->classList->value); |
|||
$this->assertSame('ook eek ack ookeek', $e->getAttribute('class')); |
|||
$e->classList->value = 'omg wtf bbq lol zor bor xxx'; |
|||
$this->assertSame('lol', $e->classList[3]); |
|||
$this->assertSame('omg wtf bbq lol zor bor xxx', $e->classList->value); |
|||
$this->assertSame('omg wtf bbq lol zor bor xxx', $e->getAttribute('class')); |
|||
$e->classList->value = ''; |
|||
$this->assertSame('', $e->classList->value); |
|||
$this->assertSame('', $e->getAttribute('class')); |
|||
|
|||
$d = new Document(); |
|||
$e = $d->appendChild($d->createElement('html')); |
|||
$e->classList->add('ook', 'eek', 'ack', 'ookeek'); |
|||
$this->assertSame('ook eek ack ookeek', $e->classList->value); |
|||
$this->assertSame('ook eek ack ookeek', $e->getAttribute('class')); |
|||
$e->classList->value = 'omg wtf bbq lol zor bor xxx'; |
|||
$this->assertSame('lol', $e->classList[3]); |
|||
$this->assertSame('omg wtf bbq lol zor bor xxx', $e->classList->value); |
|||
$this->assertSame('omg wtf bbq lol zor bor xxx', $e->getAttribute('class')); |
|||
$e->classList->value = ''; |
|||
$this->assertSame('', $e->classList->value); |
|||
$this->assertSame('', $e->getAttribute('class')); |
|||
} |
|||
} |
File diff suppressed because it is too large
@ -1,134 +1,78 @@ |
|||
<?php |
|||
/** |
|||
* @license MIT |
|||
* Copyright 2017 Dustin Wilson, J. King, et al. |
|||
* Copyright 2022 Dustin Wilson, 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 |
|||
namespace MensBeam\HTML\DOM\Test; |
|||
use MensBeam\HTML\DOM\Document; |
|||
use MensBeam\HTML\DOM\DOMException\{ |
|||
InvalidCharacterError, |
|||
NamespaceError |
|||
}; |
|||
use PHPUnit\Framework\{ |
|||
TestCase, |
|||
Attributes\CoversClass, |
|||
Attributes\DataProvider |
|||
}; |
|||
|
|||
|
|||
/** @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); |
|||
#[CoversClass('MensBeam\HTML\DOM\DocumentOrElement')] |
|||
#[CoversClass('MensBeam\HTML\DOM\Document')] |
|||
#[CoversClass('MensBeam\HTML\DOM\DOMException\InvalidCharacterError')] |
|||
#[CoversClass('MensBeam\HTML\DOM\DOMException\NamespaceError')] |
|||
class TestDocumentOrElement extends TestCase { |
|||
#[DataProvider('provideFatalErrors')] |
|||
public function testFatalErrors(string $throwableClassName, \Closure $closure): void { |
|||
$this->expectException($throwableClassName); |
|||
$d = new Document(); |
|||
$closure($d); |
|||
$d->destroy(); |
|||
} |
|||
|
|||
|
|||
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 ] |
|||
public static function provideFatalErrors(): iterable { |
|||
$iterable = [ |
|||
// Invalid attribute name |
|||
[ |
|||
InvalidCharacterError::class, |
|||
function (Document $d): void { |
|||
$d->createAttributeNS('fail', ' '); |
|||
} |
|||
], |
|||
// Attribute: non-null prefix, null/empty namespace |
|||
[ |
|||
NamespaceError::class, |
|||
function (Document $d): void { |
|||
$d->createAttributeNS('', 'fail:fail'); |
|||
} |
|||
], |
|||
// Attribute: prefix is 'xml', namespace is not xml namespace |
|||
[ |
|||
NamespaceError::class, |
|||
function (Document $d): void { |
|||
$d->createAttributeNS('fail', 'xml:fail'); |
|||
} |
|||
], |
|||
// Attribute: qualified name is 'xmlns', namespace is not xmlns namespace |
|||
[ |
|||
NamespaceError::class, |
|||
function (Document $d): void { |
|||
$d->createAttributeNS('fail', 'xmlns'); |
|||
} |
|||
], |
|||
// Attribute: prefix is 'xmlns', namespace is not xmlns namespace |
|||
[ |
|||
NamespaceError::class, |
|||
function (Document $d): void { |
|||
$d->createAttributeNS('fail', 'xmlns:fail'); |
|||
} |
|||
] |
|||
]; |
|||
} |
|||
|
|||
/** |
|||
* @dataProvider provideMethod_validateAndExtract__errors |
|||
*/ |
|||
public function testMethod_validateAndExtract__errors(\Closure $closure, int $errorCode): void { |
|||
$this->expectException(DOMException::class); |
|||
$this->expectExceptionCode($errorCode); |
|||
$closure(); |
|||
foreach ($iterable as $i) { |
|||
yield $i; |
|||
} |
|||
} |
|||
} |
File diff suppressed because it is too large
@ -1,35 +0,0 @@ |
|||
<?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\Exception; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\Exception */ |
|||
class TestDOMException extends \PHPUnit\Framework\TestCase { |
|||
public function provideConstructorFailures(): iterable { |
|||
return [ |
|||
[ function() { |
|||
$d = new Exception(2112); |
|||
}, Exception::INVALID_CODE ], |
|||
[ function() { |
|||
throw new Exception(Exception::UNKNOWN_ERROR, 'FAIL'); |
|||
}, Exception::INCORRECT_PARAMETERS_FOR_MESSAGE ] |
|||
]; |
|||
} |
|||
|
|||
/** |
|||
* @dataProvider provideConstructorFailures |
|||
* @covers \MensBeam\HTML\DOM\Exception::__construct |
|||
*/ |
|||
public function testConstructorFailures(\Closure $closure, int $errorCode): void { |
|||
$this->expectException(Exception::class); |
|||
$this->expectExceptionCode($errorCode); |
|||
$closure(); |
|||
} |
|||
} |
@ -1,126 +0,0 @@ |
|||
<?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, |
|||
Element, |
|||
Node |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\HTMLCollection */ |
|||
class TestHTMLCollection extends \PHPUnit\Framework\TestCase { |
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLCollection::current |
|||
* @covers \MensBeam\HTML\DOM\HTMLCollection::item |
|||
* @covers \MensBeam\HTML\DOM\HTMLCollection::offsetExists |
|||
* @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Collection::__construct |
|||
* @covers \MensBeam\HTML\DOM\Collection::current |
|||
* @covers \MensBeam\HTML\DOM\Collection::item |
|||
* @covers \MensBeam\HTML\DOM\Collection::key |
|||
* @covers \MensBeam\HTML\DOM\Collection::next |
|||
* @covers \MensBeam\HTML\DOM\Collection::rewind |
|||
* @covers \MensBeam\HTML\DOM\Collection::valid |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @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::getInnerDocument |
|||
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes |
|||
* @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix |
|||
* @covers \MensBeam\HTML\DOM\ParentNode::__get_children |
|||
* @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 testIteration(): void { |
|||
$d = new Document(<<<HTML |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<body> |
|||
<div id="ook">Ook</div> |
|||
<div id="eek">Eek</div> |
|||
<div id="ack">Ack</div> |
|||
<div name="ook">Ook</div> |
|||
<div name="poop💩">poop💩</div> |
|||
</body> |
|||
</html> |
|||
HTML, 'UTF-8'); |
|||
$body = $d->body; |
|||
|
|||
$children = $body->children; |
|||
foreach ($children as $key => $child) { |
|||
$this->assertTrue($child instanceof Element); |
|||
} |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLCollection::namedItem |
|||
* @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\CharacterData::__get_data |
|||
* @covers \MensBeam\HTML\DOM\Collection::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @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::__get_firstChild |
|||
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument |
|||
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes |
|||
* @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix |
|||
* @covers \MensBeam\HTML\DOM\ParentNode::__get_children |
|||
* @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 |
|||
*/ |
|||
public function testMethod_namedItem_offsetGet(): void { |
|||
$d = new Document(<<<HTML |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<body> |
|||
<div id="ook">Ook</div> |
|||
<div id="eek">Eek</div> |
|||
<div id="ack">Ack</div> |
|||
<div name="ook">Ook</div> |
|||
<div name="poop💩">poop💩</div> |
|||
</body> |
|||
</html> |
|||
HTML, 'UTF-8'); |
|||
$body = $d->body; |
|||
|
|||
$children = $body->children; |
|||
$this->assertSame($children[0], $children['ook']); |
|||
$this->assertSame($children[0], $children->namedItem('ook')); |
|||
$this->assertSame('Ook', $children['ook']->firstChild->data); |
|||
$this->assertSame('poop💩', $children['poop💩']->firstChild->data); |
|||
$this->assertNull($children['fail']); |
|||
$this->assertNull($children->namedItem('fail')); |
|||
$this->assertNull($children->namedItem('')); |
|||
} |
|||
} |
@ -1,693 +0,0 @@ |
|||
<?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 |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\HTMLElement */ |
|||
class TestHTMLElement extends \PHPUnit\Framework\TestCase { |
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_accessKey |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_accessKey |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Attr::__get_value |
|||
* @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\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_ownerDocument |
|||
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument |
|||
* @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_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 |
|||
*/ |
|||
public function testProperty_accessKey(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><a id="ook" href="https://ook.com" accesskey="o"></a></body></html>'); |
|||
$ook = $d->getElementById('ook'); |
|||
$this->assertSame('o', $ook->accessKey); |
|||
$ook->accessKey = 'e'; |
|||
$this->assertSame('e', $ook->accessKey); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_autocapitalize |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_autocapitalize |
|||
* |
|||
* @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\Element::__get_namespaceURI |
|||
* @covers \MensBeam\HTML\DOM\Element::removeAttribute |
|||
* @covers \MensBeam\HTML\DOM\Element::setAttribute |
|||
* @covers \MensBeam\HTML\DOM\HTMLCollection::item |
|||
* @covers \MensBeam\HTML\DOM\HTMLCollection::offsetGet |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::autoCapitalizationHint |
|||
* @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::__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 testProperty_autocapitalize(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><form><input type="text" autocapitalize="on"></form></body></html>'); |
|||
$ook = $d->getElementsByTagName('input')[0]; |
|||
$this->assertSame('sentences', $ook->autocapitalize); |
|||
$ook->removeAttribute('autocapitalize'); |
|||
$this->assertSame('', $ook->autocapitalize); |
|||
$ook->autocapitalize = 'words'; |
|||
$this->assertSame('words', $ook->autocapitalize); |
|||
$ook->autocapitalize = 'off'; |
|||
$this->assertSame('none', $ook->autocapitalize); |
|||
|
|||
$form = $d->getElementsByTagName('form')[0]; |
|||
$form->autocapitalize = 'bullshit'; |
|||
$ook->removeAttribute('autocapitalize'); |
|||
$this->assertSame('sentences', $ook->autocapitalize); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_contentEditable |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_contentEditable |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_isContentEditable |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Attr::__get_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_body |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_designMode |
|||
* @covers \MensBeam\HTML\DOM\Document::__set_designMode |
|||
* @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\Element::__get_namespaceURI |
|||
* @covers \MensBeam\HTML\DOM\Element::getAttribute |
|||
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode |
|||
* @covers \MensBeam\HTML\DOM\Element::hasAttribute |
|||
* @covers \MensBeam\HTML\DOM\Element::removeAttribute |
|||
* @covers \MensBeam\HTML\DOM\Element::setAttribute |
|||
* @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::__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 testProperty_contentEditable_isContentEditable(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><div></div></body></html>'); |
|||
$div = $d->getElementsByTagName('div')[0]; |
|||
$this->assertSame('inherit', $div->contentEditable); |
|||
$this->assertFalse($div->isContentEditable); |
|||
$div->contentEditable = 'true'; |
|||
$this->assertSame('true', $div->contentEditable); |
|||
$this->assertTrue($div->isContentEditable); |
|||
$div->contentEditable = 'false'; |
|||
$this->assertSame('false', $div->contentEditable); |
|||
$this->assertFalse($div->isContentEditable); |
|||
$div->contentEditable = 'inherit'; |
|||
$this->assertFalse($div->hasAttribute('contenteditable')); |
|||
$this->assertSame('inherit', $div->contentEditable); |
|||
$div->removeAttribute('contenteditable'); |
|||
$d->body->contentEditable = 'true'; |
|||
$this->assertSame('inherit', $div->contentEditable); |
|||
$this->assertTrue($div->isContentEditable); |
|||
|
|||
$d->designMode = 'on'; |
|||
$this->assertTrue($div->isContentEditable); |
|||
$d->body->contentEditable = 'false'; |
|||
$d->designMode = 'off'; |
|||
$this->assertFalse($div->isContentEditable); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_contentEditable |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_documentElement |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @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::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::__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 testProperty_contentEditable__errors(): void { |
|||
$this->expectException(DOMException::class); |
|||
$this->expectExceptionCode(DOMException::SYNTAX_ERROR); |
|||
$d = new Document('<!DOCTYPE html><html></html>'); |
|||
$d->documentElement->contentEditable = 'fail'; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_dir |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_dir |
|||
* |
|||
* @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\Element::setAttribute |
|||
* @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::__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 testProperty_dir(): void { |
|||
$d = new Document('<!DOCTYPE html><html dir="ltr"></html>'); |
|||
$html = $d->documentElement; |
|||
$this->assertSame('ltr', $html->dir); |
|||
$html->dir = 'bullshit'; |
|||
$this->assertSame('', $html->dir); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_draggable |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_draggable |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Attr::__get_value |
|||
* @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\Element::__get_localName |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_prefix |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_tagName |
|||
* @covers \MensBeam\HTML\DOM\Element::getAttribute |
|||
* @covers \MensBeam\HTML\DOM\Element::getAttributeNode |
|||
* @covers \MensBeam\HTML\DOM\Element::hasAttribute |
|||
* @covers \MensBeam\HTML\DOM\Element::removeAttribute |
|||
* @covers \MensBeam\HTML\DOM\Element::setAttribute |
|||
* @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::__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 testProperty_draggable(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><img src="ook.html"><object data="ook"></object><div></div></body></html>'); |
|||
$img = $d->getElementsByTagName('img')[0]; |
|||
$div = $d->getElementsByTagName('div')[0]; |
|||
$object = $d->getElementsByTagName('object')[0]; |
|||
$this->assertTrue($img->draggable); |
|||
$this->assertFalse($div->draggable); |
|||
|
|||
$div->draggable = true; |
|||
$this->assertTrue($div->draggable); |
|||
$div->draggable = false; |
|||
$this->assertFalse($div->draggable); |
|||
$img->draggable = false; |
|||
$this->assertFalse($img->draggable); |
|||
|
|||
$this->assertFalse($object->draggable); |
|||
$object->setAttribute('type', 'image/jpeg'); |
|||
$this->assertTrue($object->draggable); |
|||
$object->removeAttribute('type'); |
|||
$object->setAttribute('data', 'ook.png'); |
|||
$this->assertTrue($object->draggable); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_enterKeyHint |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_enterKeyHint |
|||
* |
|||
* @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\Element::setAttribute |
|||
* @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::__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 testProperty_enterKeyHint(): void { |
|||
$d = new Document('<!DOCTYPE html><html></html>'); |
|||
$html = $d->documentElement; |
|||
$this->assertSame('', $html->enterKeyHint); |
|||
$html->enterKeyHint = 'ook'; |
|||
$this->assertSame('', $html->enterKeyHint); |
|||
$html->enterKeyHint = 'done'; |
|||
$this->assertSame('done', $html->enterKeyHint); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_hidden |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_hidden |
|||
* |
|||
* @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::getElementsByTagName |
|||
* @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\Element::removeAttribute |
|||
* @covers \MensBeam\HTML\DOM\Element::setAttribute |
|||
* @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::__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 testProperty_hidden(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><div></div></body></html>'); |
|||
$div = $d->getElementsByTagName('div')[0]; |
|||
$this->assertFalse($div->hidden); |
|||
$div->hidden = true; |
|||
$this->assertTrue($div->hidden); |
|||
$div->hidden = false; |
|||
$d->documentElement->hidden = true; |
|||
$this->assertTrue($div->hidden); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_lang |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_lang |
|||
* |
|||
* @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\Element::setAttribute |
|||
* @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::__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 testProperty_lang(): void { |
|||
$d = new Document('<!DOCTYPE html><html></html>'); |
|||
$html = $d->documentElement; |
|||
|
|||
$this->assertSame('', $html->lang); |
|||
$html->lang = 'en'; |
|||
$this->assertSame('en', $html->lang); |
|||
$html->lang = 'ook'; |
|||
$this->assertSame('ook', $html->lang); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_innerText |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_innerText |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_outerText |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_outerText |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Collection::__construct |
|||
* @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_body |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_documentElement |
|||
* @covers \MensBeam\HTML\DOM\Document::createElement |
|||
* @covers \MensBeam\HTML\DOM\Document::createTextNode |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_innerHTML |
|||
* @covers \MensBeam\HTML\DOM\Element::getRenderedTextFragment |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_childNodes |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_parentNode |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_textContent |
|||
* @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 testProperty_innerText_outerText(): void { |
|||
$d = new Document(); |
|||
$d->appendChild($d->createElement('html')); |
|||
$d->documentElement->appendChild($d->createElement('body')); |
|||
$body = $d->body; |
|||
$body->appendChild($d->createTextNode('ook ')); |
|||
$s = $body->appendChild($d->createElement('span')); |
|||
$s->appendChild($d->createTextNode('ook')); |
|||
$body->appendChild($d->createTextNode(' eek')); |
|||
$this->assertSame('ook <span>ook</span> eek', $body->innerHTML); |
|||
|
|||
$s->innerText = <<<TEXT |
|||
ook\r\n |
|||
eek ook |
|||
TEXT; |
|||
$this->assertSame('ook ookook eek ook eek', $body->innerText); |
|||
$this->assertSame('ook<br><br>ook eek ook', $s->innerHTML); |
|||
|
|||
$s->outerText = 'ack'; |
|||
$this->assertSame('ook ack eek', $body->outerText); |
|||
$this->assertEquals(1, $body->childNodes->length); |
|||
|
|||
$s = $body->appendChild($d->createElement('span')); |
|||
$s->outerText = ''; |
|||
$this->assertSame('ook ack eek', $body->outerText); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_inputMode |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_inputMode |
|||
* |
|||
* @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\Element::setAttribute |
|||
* @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::__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 testProperty_inputMode(): void { |
|||
$d = new Document('<!DOCTYPE html><html></html>'); |
|||
$html = $d->documentElement; |
|||
$this->assertSame('', $html->inputMode); |
|||
$html->inputMode = 'ook'; |
|||
$this->assertSame('', $html->inputMode); |
|||
$html->inputMode = 'tel'; |
|||
$this->assertSame('tel', $html->inputMode); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_outerText |
|||
* |
|||
* @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_parentNode |
|||
* @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 testProperty_outerText__errors(): void { |
|||
$this->expectException(DOMException::class); |
|||
$this->expectExceptionCode(DOMException::NO_MODIFICATION_ALLOWED); |
|||
$d = new Document(); |
|||
$h = $d->createElement('html'); |
|||
$h->outerText = 'fail'; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_spellcheck |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_spellcheck |
|||
* |
|||
* @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\Element::setAttribute |
|||
* @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::__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 testProperty_spellcheck(): void { |
|||
$d = new Document('<!DOCTYPE html><html></html>'); |
|||
$html = $d->documentElement; |
|||
$this->assertFalse($html->spellcheck); |
|||
$html->spellcheck = true; |
|||
$this->assertTrue($html->spellcheck); |
|||
$html->spellcheck = false; |
|||
$this->assertFalse($html->spellcheck); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_title |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_title |
|||
* |
|||
* @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\Element::setAttribute |
|||
* @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::__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 testProperty_title(): void { |
|||
$d = new Document('<!DOCTYPE html><html></html>'); |
|||
$html = $d->documentElement; |
|||
$this->assertSame('', $html->title); |
|||
$html->title = 'ook'; |
|||
$this->assertSame('ook', $html->title); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__get_translate |
|||
* @covers \MensBeam\HTML\DOM\HTMLElement::__set_translate |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Attr::__get_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::load |
|||
* @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagName |
|||
* @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::removeAttribute |
|||
* @covers \MensBeam\HTML\DOM\Element::setAttribute |
|||
* @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::__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 testProperty_translate(): void { |
|||
$d = new Document('<!DOCTYPE html><html><div><span>Ook</span></div></html>'); |
|||
$html = $d->documentElement; |
|||
$span = $d->getElementsByTagName('span')[0]; |
|||
|
|||
$this->assertFalse($span->translate); |
|||
$span->translate = true; |
|||
$this->assertTrue($span->translate); |
|||
$span->removeAttribute('translate'); |
|||
$html->translate = true; |
|||
$this->assertTrue($span->translate); |
|||
$span->translate = false; |
|||
$this->assertFalse($span->translate); |
|||
} |
|||
} |
@ -1,29 +0,0 @@ |
|||
<?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 |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\HTMLOrSVGElement */ |
|||
class TestHTMLOrSVGElement extends \PHPUnit\Framework\TestCase { |
|||
public function testProperty_autofocus(): void { |
|||
$d = new Document('<!DOCTYPE html><html></html>'); |
|||
$html = $d->documentElement; |
|||
$this->assertFalse($html->autofocus); |
|||
$html->autofocus = true; |
|||
$this->assertTrue($html->autofocus); |
|||
$html->autofocus = false; |
|||
$this->assertFalse($html->autofocus); |
|||
$this->assertFalse($html->hasAttribute('autofocus')); |
|||
} |
|||
} |
@ -1,311 +0,0 @@ |
|||
<?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\{ |
|||
Attr, |
|||
Document, |
|||
DOMException, |
|||
Node, |
|||
XMLDocument |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\NamedNodeMap */ |
|||
class TestNamedNodeMap extends \PHPUnit\Framework\TestCase { |
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::current |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::item |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::offsetExists |
|||
* |
|||
* @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::current |
|||
* @covers \MensBeam\HTML\DOM\Collection::item |
|||
* @covers \MensBeam\HTML\DOM\Collection::key |
|||
* @covers \MensBeam\HTML\DOM\Collection::next |
|||
* @covers \MensBeam\HTML\DOM\Collection::rewind |
|||
* @covers \MensBeam\HTML\DOM\Collection::valid |
|||
* @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::createAttributeNS |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @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\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::__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 testIteration(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body a="ook" b="eek" c="ook" d="eek" e="ook" poop💩="poop💩"></body></html>'); |
|||
$body = $d->body; |
|||
|
|||
$body->setAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns:href', Node::HTML_NAMESPACE); |
|||
$body->setAttributeNS('https://poop💩.poop', 'poop💩:poop💩', 'poop💩'); |
|||
|
|||
$attributes = $body->attributes; |
|||
foreach ($attributes as $key => $attr) { |
|||
$this->assertTrue($attr instanceof Attr); |
|||
} |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::getNamedItem |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::getNamedItemNS |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::offsetGet |
|||
* |
|||
* @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::__get_value |
|||
* @covers \MensBeam\HTML\DOM\Attr::__set_value |
|||
* @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::createAttribute |
|||
* @covers \MensBeam\HTML\DOM\Document::createAttributeNS |
|||
* @covers \MensBeam\HTML\DOM\Document::importNode |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @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\NamedNodeMap::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_nodeName |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_ownerDocument |
|||
* @covers \MensBeam\HTML\DOM\Node::cloneInnerNode |
|||
* @covers \MensBeam\HTML\DOM\Node::cloneWrapperNode |
|||
* @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::__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_getNamedItem_getNamedItemNS_offsetGet(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body a="ook" b="eek" c="ook" d="eek" e="ook" poop💩="poop💩"></body></html>', 'UTF-8'); |
|||
$body = $d->body; |
|||
|
|||
$body->setAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns:href', Node::HTML_NAMESPACE); |
|||
$body->setAttributeNS('https://poop💩.poop', 'poop💩:poop💩', 'poop💩'); |
|||
|
|||
$attributes = $body->attributes; |
|||
$this->assertSame($attributes[0], $attributes['a']); |
|||
$this->assertSame('ook', $attributes['a']->value); |
|||
$this->assertSame('ook', $attributes->getNamedItem('a')->value); |
|||
$this->assertSame(Node::HTML_NAMESPACE, $attributes['xmlns:href']->value); |
|||
$this->assertSame('poop💩', $attributes['poop💩']->value); |
|||
$this->assertSame('poop💩', $attributes->getNamedItem('poop💩')->value); |
|||
$this->assertSame('poop💩', $attributes['poop💩:poop💩']->value); |
|||
$this->assertSame('poop💩', $attributes->getNamedItemNS('https://poop💩.poop', 'poop💩')->value); |
|||
|
|||
// Testing an edge case with uppercased attributes in the specification... |
|||
$d2 = new XMLDocument(); |
|||
$F = $d2->createAttribute('F'); |
|||
$F->value = 'eek'; |
|||
$F = $d->importNode($F); |
|||
$body->setAttributeNode($F); |
|||
$this->assertNull($attributes['F']); |
|||
$this->assertSame('F', $F->nodeName); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::removeNamedItem |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::removeNamedItemNS |
|||
* |
|||
* @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::__get_length |
|||
* @covers \MensBeam\HTML\DOM\Collection::count |
|||
* @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::createAttributeNS |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @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::hasAttribute |
|||
* @covers \MensBeam\HTML\DOM\Element::hasAttributeNS |
|||
* @covers \MensBeam\HTML\DOM\Element::removeAttributeNode |
|||
* @covers \MensBeam\HTML\DOM\Element::setAttributeNode |
|||
* @covers \MensBeam\HTML\DOM\Element::setAttributeNodeNS |
|||
* @covers \MensBeam\HTML\DOM\Element::setAttributeNS |
|||
* @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::__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_removeNamedItem_removeNamedItemNS(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body a="ook" b="eek" c="ook" d="eek" e="ook" poop💩="poop💩"></body></html>', 'UTF-8'); |
|||
$body = $d->body; |
|||
|
|||
$body->setAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns:href', Node::HTML_NAMESPACE); |
|||
$body->setAttributeNS('https://poop💩.poop', 'poop💩:poop💩', 'poop💩'); |
|||
|
|||
$attributes = $body->attributes; |
|||
$this->assertEquals(8, $attributes->length); |
|||
$attributes->removeNamedItem('a'); |
|||
$this->assertEquals(7, $attributes->length); |
|||
$this->assertFalse($body->hasAttribute('a')); |
|||
$attributes->removeNamedItem('poop💩'); |
|||
$this->assertEquals(6, $attributes->length); |
|||
$this->assertFalse($body->hasAttribute('poop💩')); |
|||
$attributes->removeNamedItemNS('https://poop💩.poop', 'poop💩'); |
|||
$this->assertEquals(5, $attributes->length); |
|||
$this->assertFalse($body->hasAttributeNS('https://poop💩.poop', 'poop💩')); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::removeNamedItem |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::removeNamedItemNS |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @covers \MensBeam\HTML\DOM\DOMException::__construct |
|||
* @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\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::__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_removeNamedItem__errors(): void { |
|||
$this->expectException(DOMException::class); |
|||
$this->expectExceptionCode(DOMException::NOT_FOUND); |
|||
$d = new Document('<!DOCTYPE html><html><body></body></html>', 'UTF-8'); |
|||
$body = $d->body; |
|||
$body->attributes->removeNamedItem('fail'); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::setNamedItem |
|||
* @covers \MensBeam\HTML\DOM\NamedNodeMap::setNamedItemNS |
|||
* |
|||
* @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\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_documentElement |
|||
* @covers \MensBeam\HTML\DOM\Document::createAttribute |
|||
* @covers \MensBeam\HTML\DOM\Document::createAttributeNS |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @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\NamedNodeMap::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__get_innerNode |
|||
* @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_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_setNamedItem_setNamedItemNS(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body a="ook" b="eek" c="ook" d="eek" e="ook"></body></html>', 'UTF-8'); |
|||
$body = $d->body; |
|||
$attributes = $body->attributes; |
|||
|
|||
$poop = $d->createAttribute('poop💩'); |
|||
$poop->value = 'poop💩'; |
|||
$attributes->setNamedItem($poop); |
|||
$this->assertSame($attributes['poop💩'], $poop); |
|||
|
|||
$x = $d->createAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns:href'); |
|||
$x->value = Node::HTML_NAMESPACE; |
|||
$attributes->setNamedItemNS($x); |
|||
$this->assertSame($attributes['xmlns:href'], $x); |
|||
} |
|||
} |
File diff suppressed because it is too large
@ -1,34 +0,0 @@ |
|||
<?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 |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\NonDocumentTypeChildNode */ |
|||
class TestNonDocumentTypeChildNode extends \PHPUnit\Framework\TestCase { |
|||
public function testProperty_nextElementSibling_previousElementSibling(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body></body></html>'); |
|||
$body = $d->body; |
|||
$br = $body->appendChild($d->createElement('br')); |
|||
$body->appendChild($d->createTextNode('eek')); |
|||
$ook = $body->appendChild($d->createTextNode('ook')); |
|||
$br2 = $body->appendChild($d->createElement('br')); |
|||
|
|||
$this->assertSame($br2, $br->nextElementSibling); |
|||
$this->assertNull($br2->nextElementSibling); |
|||
$this->assertSame($br, $ook->previousElementSibling); |
|||
$this->assertNull($br->previousElementSibling); |
|||
} |
|||
} |
@ -1,348 +0,0 @@ |
|||
<?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 |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\ParentNode */ |
|||
class TestParentNode extends \PHPUnit\Framework\TestCase { |
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\ParentNode::append |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createDocumentFragment |
|||
* @covers \MensBeam\HTML\DOM\Document::createElement |
|||
* @covers \MensBeam\HTML\DOM\Document::createTextNode |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @covers \MensBeam\HTML\DOM\DocumentFragment::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_innerHTML |
|||
* @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::convertNodesToNode |
|||
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument |
|||
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes |
|||
* @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\NonElementParentNode::getElementById |
|||
* @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_append(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><div>ook</div><div id="eek">eek</div></body></html>'); |
|||
$eek = $d->getElementById('eek'); |
|||
$eek->append('ook', $d->createElement('br')); |
|||
$eek->append('eek'); |
|||
$this->assertSame('eekook<br>eek', $eek->innerHTML); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\ParentNode::prepend |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createDocumentFragment |
|||
* @covers \MensBeam\HTML\DOM\Document::createElement |
|||
* @covers \MensBeam\HTML\DOM\Document::createTextNode |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @covers \MensBeam\HTML\DOM\DocumentFragment::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_innerHTML |
|||
* @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::convertNodesToNode |
|||
* @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\NonElementParentNode::getElementById |
|||
* @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_prepend(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><div>ook</div><div id="eek">eek</div></body></html>'); |
|||
$eek = $d->getElementById('eek'); |
|||
$eek->prepend('ook', $d->createElement('br')); |
|||
$this->assertSame('ook<br>eek', $eek->innerHTML); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\ParentNode::replaceChildren |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createDocumentFragment |
|||
* @covers \MensBeam\HTML\DOM\Document::createElement |
|||
* @covers \MensBeam\HTML\DOM\Document::createTextNode |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @covers \MensBeam\HTML\DOM\DocumentFragment::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_innerHTML |
|||
* @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::convertNodesToNode |
|||
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument |
|||
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes |
|||
* @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\NonElementParentNode::getElementById |
|||
* @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_replaceChildren(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><div>ook</div><div id="eek">eek</div></body></html>'); |
|||
$eek = $d->getElementById('eek'); |
|||
$eek->replaceChildren('ook', $d->createElement('br')); |
|||
$this->assertSame('ook<br>', $eek->innerHTML); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\ParentNode::querySelector |
|||
* @covers \MensBeam\HTML\DOM\ParentNode::querySelectorAll |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Attr::__get_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\Collection::offsetGet |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_localName |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_namespaceURI |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_prefix |
|||
* @covers \MensBeam\HTML\DOM\Element::__get_tagName |
|||
* @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::getInnerDocument |
|||
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes |
|||
* @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix |
|||
* @covers \MensBeam\HTML\DOM\ParentNode::scopeMatchSelector |
|||
* @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 |
|||
*/ |
|||
public function testMethod_querySelector_querySelectorAll(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><div>ook</div><div id="eek">eek</div></body></html>'); |
|||
$div = $d->body->querySelector('div'); |
|||
$this->assertSame('div', $div->tagName); |
|||
$this->assertNull($d->querySelector('body::before')); |
|||
|
|||
$divs = $d->body->querySelectorAll('div'); |
|||
$this->assertEquals(2, $divs->length); |
|||
$this->assertSame('eek', $divs[1]->getAttribute('id')); |
|||
$this->assertNull($d->querySelector('.ook')); |
|||
$this->assertEquals(0, $d->querySelectorAll('body::before')->length); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\ParentNode::querySelector |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMException::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\ParentNode::scopeMatchSelector |
|||
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct |
|||
*/ |
|||
public function testMethod_querySelector__errors(): void { |
|||
$this->expectException(DOMException::class); |
|||
$this->expectExceptionCode(DOMException::SYNTAX_ERROR); |
|||
$d = new Document(); |
|||
$d->querySelector('fail?'); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\ParentNode::walk |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @covers \MensBeam\HTML\DOM\DocumentType::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Element::__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\Text::__construct |
|||
* @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 |
|||
* @covers \MensBeam\HTML\DOM\Inner\Reflection::setProtectedProperties |
|||
*/ |
|||
public function testMethod_walk(): void { |
|||
$d = new Document(<<<HTML |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<body> |
|||
<div>ook</div> |
|||
<div> |
|||
<div><p>Eek</p></div> |
|||
<div> |
|||
<div><p>Ook</p></div> |
|||
</div> |
|||
</div> |
|||
</body> |
|||
</html> |
|||
HTML); |
|||
|
|||
// Empty filter -- walk over all nodes |
|||
$w = $d->walk(); |
|||
$this->assertSame($d->doctype, $w->current()); |
|||
foreach ($w as $node); |
|||
|
|||
// Simple accept on element and reject everything else filter |
|||
$w = $d->walk(function($n) { |
|||
return ($n instanceof Element) ? Node::WALK_ACCEPT : Node::WALK_REJECT; |
|||
}); |
|||
$this->assertSame($d->documentElement, $w->current()); |
|||
foreach ($w as $node); |
|||
|
|||
// Accept element but ignore children, simple reject otherwise |
|||
$w = $d->walk(function($n) { |
|||
return ($n instanceof Element) ? Node::WALK_ACCEPT | Node::WALK_SKIP_CHILDREN : Node::WALK_REJECT; |
|||
}); |
|||
$this->assertSame($d->documentElement, $w->current()); |
|||
$this->assertNull($w->next()); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\ParentNode::walk |
|||
* |
|||
* @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_walk__errors(): void { |
|||
$this->expectException(DOMException::class); |
|||
$this->expectExceptionCode(DOMException::SYNTAX_ERROR); |
|||
$d = new Document(); |
|||
$d->appendChild($d->createElement('html')); |
|||
$w = $d->walk(function($n) { |
|||
return 2112; |
|||
}); |
|||
$w->current(); |
|||
} |
|||
|
|||
|
|||
public function testProperty_childElementCount(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><div>ook</div><div id="eek">eek</div></body></html>'); |
|||
$this->assertEquals(2, $d->body->childElementCount); |
|||
} |
|||
|
|||
|
|||
public function testProperty_children(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><div>ook</div><div id="eek">eek</div></body></html>'); |
|||
$this->assertEquals(2, $d->body->children->length); |
|||
} |
|||
|
|||
|
|||
public function testProperty_firstElementChild(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body>ook<div id="ook">ook</div><div id="eek">eek</div></body></html>'); |
|||
$body = $d->body; |
|||
$this->assertSame($d->getElementById('ook'), $body->firstElementChild); |
|||
$this->assertNull($d->getElementById('eek')->firstElementChild); |
|||
} |
|||
|
|||
|
|||
public function testProperty_lastElementChild(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body>ook<div id="ook">ook</div><div id="eek">eek</div><div id="ack">ack</div></body></html>'); |
|||
$body = $d->body; |
|||
$this->assertSame($d->getElementById('ack'), $body->lastElementChild); |
|||
$this->assertNull($d->getElementById('eek')->lastElementChild); |
|||
} |
|||
} |
@ -1,21 +0,0 @@ |
|||
<?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; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\ProcessingInstruction */ |
|||
class TestProcessingInstruction extends \PHPUnit\Framework\TestCase { |
|||
public function testProperty_target(): void { |
|||
$d = new Document(); |
|||
$this->assertSame('ook', $d->createProcessingInstruction('ook', 'eek')->target); |
|||
$this->assertSame('poop💩', $d->createProcessingInstruction('poop💩', 'poop💩')->target); |
|||
} |
|||
} |
@ -1,263 +0,0 @@ |
|||
<?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; |
|||
use MensBeam\HTML\DOM\{ |
|||
Document, |
|||
DocumentFragment, |
|||
Node |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\Serializer */ |
|||
class TestSerializer extends \PHPUnit\Framework\TestCase { |
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\Serializer::isPreformattedContent |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::createDocumentFragment |
|||
* @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\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_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::hasChildNodes |
|||
* @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::__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 |
|||
* @covers \MensBeam\HTML\DOM\Inner\Reflection::setProtectedProperties |
|||
*/ |
|||
|
|||
public function testMethod_isPreformattedContent(): void { |
|||
$d = new Document('<pre><code></code></pre>'); |
|||
$this->assertSame(<<<HTML |
|||
<html> |
|||
<head></head> |
|||
|
|||
<body> |
|||
<pre><code></code></pre> |
|||
</body> |
|||
</html> |
|||
HTML, $d->serialize(null, [ 'reformatWhitespace' => true ])); |
|||
|
|||
$frag = $d->createDocumentFragment(); |
|||
$p = $frag->appendChild($d->createElement('pre')); |
|||
$t = $p->appendChild($d->createElement('template')); |
|||
$t->content->appendChild($d->createTextNode('ook')); |
|||
$t->content->appendChild($d->createElement('br')); |
|||
|
|||
$this->assertSame('<pre><template>ook<br></template></pre>', $d->serialize($frag, [ 'reformatWhitespace' => true ])); |
|||
|
|||
$div = $t->content->appendChild($d->createElement('div')); |
|||
$div->appendChild($d->createTextNode('ook')); |
|||
|
|||
$this->assertSame('<pre><template>ook<br><div>ook</div></template></pre>', $d->serialize($frag, [ 'reformatWhitespace' => true ])); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\Serializer::treatAsBlockWithTemplates |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @covers \MensBeam\HTML\DOM\Document::createDocumentFragment |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @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\HTMLTemplateElement::__construct |
|||
* @covers \MensBeam\HTML\DOM\HTMLTemplateElement::__get_content |
|||
* @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::appendChildInner |
|||
* @covers \MensBeam\HTML\DOM\Node::cloneInnerNode |
|||
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument |
|||
* @covers \MensBeam\HTML\DOM\Node::getRootNode |
|||
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes |
|||
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes |
|||
* @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix |
|||
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes |
|||
* @covers \MensBeam\HTML\DOM\Serializer::fragmentHasHost |
|||
* @covers \MensBeam\HTML\DOM\Serializer::getTemplateContent |
|||
* @covers \MensBeam\HTML\DOM\Serializer::isPreformattedContent |
|||
* @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 |
|||
* @covers \MensBeam\HTML\DOM\Inner\Reflection::setProtectedProperties |
|||
*/ |
|||
public function testMethod_treatAsBlockWithTemplates(): void { |
|||
$d = new Document('<span>ook</span><template><div><p>ook</p></div></template>'); |
|||
|
|||
$this->assertSame(<<<HTML |
|||
<body> |
|||
<span>ook</span> |
|||
|
|||
<template> |
|||
<div> |
|||
<p>ook</p> |
|||
</div> |
|||
</template> |
|||
</body> |
|||
HTML, $d->serialize($d->body, [ 'reformatWhitespace' => true ])); |
|||
} |
|||
|
|||
|
|||
public function provideMethod_treatForeignRootAsBlock(): iterable { |
|||
return [ |
|||
[ |
|||
function() { |
|||
$d = new Document(<<<HTML |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<body> |
|||
<span><template><svg><g><rect id="eek--a" width="5" height="5"/></g></svg><div>ook</div></template></span> |
|||
</body> |
|||
</html> |
|||
HTML, 'UTF-8'); |
|||
|
|||
return $d->serialize($d->getElementsByTagName('template')[0]->content->firstChild->firstChild, [ 'reformatWhitespace' => true ]); |
|||
}, |
|||
|
|||
<<<HTML |
|||
<g><rect id="eek--a" width="5" height="5"></rect></g> |
|||
HTML |
|||
], |
|||
|
|||
[ |
|||
function() { |
|||
$d = new Document(<<<HTML |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<body> |
|||
<svg role="img" viewBox="0 0 26 26"><title>Ook</title> |
|||
<rect id="eek--a" width="5" height="5"/></svg> |
|||
</body> |
|||
</html> |
|||
HTML, 'UTF-8'); |
|||
|
|||
return $d->serialize($d->body, [ 'reformatWhitespace' => true ]); |
|||
}, |
|||
|
|||
<<<HTML |
|||
<body><svg role="img" viewBox="0 0 26 26"><title>Ook</title> <rect id="eek--a" width="5" height="5"></rect></svg></body> |
|||
HTML |
|||
], |
|||
|
|||
[ |
|||
function() { |
|||
$d = new Document(<<<HTML |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<body> |
|||
<svg><g><g><rect id="eek--a" width="5" height="5"/></g></g></svg> |
|||
<div></div> |
|||
</body> |
|||
</html> |
|||
HTML, 'UTF-8'); |
|||
|
|||
$svg = $d->getElementsByTagNameNS(Node::SVG_NAMESPACE, 'svg')[0]; |
|||
$g = $svg->firstChild->firstChild; |
|||
|
|||
return $d->serialize($g, [ 'reformatWhitespace' => true ]); |
|||
}, |
|||
|
|||
<<<HTML |
|||
<g> |
|||
<rect id="eek--a" width="5" height="5"></rect> |
|||
</g> |
|||
HTML |
|||
], |
|||
]; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @dataProvider provideMethod_treatForeignRootAsBlock |
|||
* @covers \MensBeam\HTML\DOM\Serializer::treatForeignRootAsBlock |
|||
* |
|||
* @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::load |
|||
* @covers \MensBeam\HTML\DOM\Document::serialize |
|||
* @covers \MensBeam\HTML\DOM\DocumentFragment::__construct |
|||
* @covers \MensBeam\HTML\DOM\DocumentOrElement::getElementsByTagName |
|||
* @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\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::appendChildInner |
|||
* @covers \MensBeam\HTML\DOM\Node::cloneInnerNode |
|||
* @covers \MensBeam\HTML\DOM\Node::getInnerDocument |
|||
* @covers \MensBeam\HTML\DOM\Node::getRootNode |
|||
* @covers \MensBeam\HTML\DOM\Node::hasChildNodes |
|||
* @covers \MensBeam\HTML\DOM\Node::postInsertionBugFixes |
|||
* @covers \MensBeam\HTML\DOM\Node::postParsingTemplatesFix |
|||
* @covers \MensBeam\HTML\DOM\Node::preInsertionBugFixes |
|||
* @covers \MensBeam\HTML\DOM\Serializer::fragmentHasHost |
|||
* @covers \MensBeam\HTML\DOM\Serializer::isPreformattedContent |
|||
* @covers \MensBeam\HTML\DOM\Serializer::treatAsBlockWithTemplates |
|||
* @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 |
|||
* @covers \MensBeam\HTML\DOM\Inner\Reflection::setProtectedProperties |
|||
*/ |
|||
public function testMethod_treatForeignRootAsBlock(\Closure $closure, string $expected): void { |
|||
$this->assertSame($expected, $closure()); |
|||
} |
|||
} |
@ -1,42 +0,0 @@ |
|||
<?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 |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\Text */ |
|||
class TestText extends \PHPUnit\Framework\TestCase { |
|||
public function testMethod_splitText(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body>poop💩 ook eek</html>', 'UTF-8'); |
|||
$body = $d->body; |
|||
$body->firstChild->splitText(5); |
|||
$this->assertSame('poop💩', $body->firstChild->data); |
|||
} |
|||
|
|||
|
|||
public function testMethod_splitText__errors(): void { |
|||
$this->expectException(DOMException::class); |
|||
$this->expectExceptionCode(DOMException::INDEX_SIZE_ERROR); |
|||
$d = new Document('<!DOCTYPE html><html><body>poop💩 ook eek</html>', 'UTF-8'); |
|||
$body = $d->body; |
|||
$body->firstChild->splitText(2112); |
|||
} |
|||
|
|||
|
|||
public function testProperty_wholeText(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body>ook <strong>ack</strong> eek</body></html>'); |
|||
$body = $d->body; |
|||
$body->removeChild($body->getElementsByTagName('strong')[0]); |
|||
$this->assertSame('ook eek', $body->firstChild->wholeText); |
|||
} |
|||
} |
@ -1,32 +0,0 @@ |
|||
<?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\{ |
|||
DOMException, |
|||
Element, |
|||
XMLDocument |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\XMLDocument */ |
|||
class TestXMLDocument extends \PHPUnit\Framework\TestCase { |
|||
public function testMethod_load(): void { |
|||
$d = new XMLDocument('<ook><eek>Ook</eek></ook>'); |
|||
$this->assertSame(Element::class, $d->firstChild::class); |
|||
} |
|||
|
|||
|
|||
public function testMethod_load__errors(): void { |
|||
$this->expectException(DOMException::class); |
|||
$this->expectExceptionCode(DOMException::NO_MODIFICATION_ALLOWED); |
|||
$d = new XMLDocument('<ook><eek>Ook</eek></ook>'); |
|||
$d->load('fail'); |
|||
} |
|||
} |
@ -1,199 +0,0 @@ |
|||
<?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, |
|||
Node, |
|||
XPathException, |
|||
XPathResult |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\XPathEvaluate */ |
|||
class TestXPathEvaluate extends \PHPUnit\Framework\TestCase { |
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\XPathEvaluate::xpathEvaluate |
|||
* |
|||
* @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\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_documentElement |
|||
* @covers \MensBeam\HTML\DOM\Document::createAttributeNS |
|||
* @covers \MensBeam\HTML\DOM\Document::createElementNS |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @covers \MensBeam\HTML\DOM\Document::registerXPathFunctions |
|||
* @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\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::hasChildNodes |
|||
* @covers \MensBeam\HTML\DOM\Node::locateNamespace |
|||
* @covers \MensBeam\HTML\DOM\Node::lookupNamespaceURI |
|||
* @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\XPathEvaluate::xpathRegisterPhpFunctions |
|||
* @covers \MensBeam\HTML\DOM\XPathEvaluatorBase::createNSResolver |
|||
* @covers \MensBeam\HTML\DOM\XPathEvaluatorBase::evaluate |
|||
* @covers \MensBeam\HTML\DOM\XPathNSResolver::__construct |
|||
* @covers \MensBeam\HTML\DOM\XPathResult::__construct |
|||
* @covers \MensBeam\HTML\DOM\XPathResult::__get_booleanValue |
|||
* @covers \MensBeam\HTML\DOM\XPathResult::__get_numberValue |
|||
* @covers \MensBeam\HTML\DOM\XPathResult::__get_singleNodeValue |
|||
* @covers \MensBeam\HTML\DOM\XPathResult::__get_stringValue |
|||
* @covers \MensBeam\HTML\DOM\XPathResult::count |
|||
* @covers \MensBeam\HTML\DOM\XPathResult::validateStorage |
|||
* @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 |
|||
*/ |
|||
function testMethod_xpathEvaluate(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><span><span>Ook</span></span><span></span></body></html>'); |
|||
$d->registerXPathFunctions(); |
|||
$result = $d->evaluate('.//span', $d->body); |
|||
$this->assertEquals(3, count($result)); |
|||
|
|||
$result = $d->evaluate('count(.//span)', $d->body, null, XPathResult::NUMBER_TYPE); |
|||
$this->assertEquals(3, $result->numberValue); |
|||
$result = $d->evaluate('count(.//span)', $d->body, null); |
|||
$this->assertEquals(3, $result->numberValue); |
|||
$result = $d->evaluate('name(.//span)', $d->body, null, XPathResult::STRING_TYPE); |
|||
$this->assertEquals('span', $result->stringValue); |
|||
$result = $d->evaluate('name(.//span)', $d->body, null); |
|||
$this->assertEquals('span', $result->stringValue); |
|||
$result = $d->evaluate('.//span', $d->body, null, XPathResult::BOOLEAN_TYPE); |
|||
$this->assertTrue($result->booleanValue); |
|||
$result = $d->evaluate('not(.//span)', $d->body, null, XPathResult::BOOLEAN_TYPE); |
|||
$this->assertFalse($result->booleanValue); |
|||
$result = $d->evaluate('not(.//span)', $d->body, null); |
|||
$this->assertFalse($result->booleanValue); |
|||
$result = $d->evaluate('.//span', $d->body, null, XPathResult::ORDERED_NODE_ITERATOR_TYPE); |
|||
$this->assertEquals(3, count($result)); |
|||
$result = $d->evaluate('.//span', $d->body, null); |
|||
$this->assertEquals(3, count($result)); |
|||
$result = $d->evaluate('.//span', $d->body, null, XPathResult::UNORDERED_NODE_SNAPSHOT_TYPE); |
|||
$this->assertEquals(3, count($result)); |
|||
$result = $d->evaluate('.//span', $d->body, null, XPathResult::FIRST_ORDERED_NODE_TYPE); |
|||
$this->assertSame($d->body->firstChild, $result->singleNodeValue); |
|||
|
|||
$d->documentElement->setAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns:poop', 'https://poop.poop'); |
|||
$poop = $d->body->appendChild($d->createElementNS('https://poop.poop', 'poop:poop')); |
|||
$this->assertSame($poop, $d->evaluate('//poop:poop', $d->body, $d->createNSResolver($d->body), XPathResult::FIRST_ORDERED_NODE_TYPE)->singleNodeValue); |
|||
|
|||
$svg = $d->body->appendChild($d->createElementNS(Node::SVG_NAMESPACE, 'svg')); |
|||
$this->assertSame($svg, $d->evaluate('//svg:svg', $d->body, function(string $prefix): ?string { |
|||
return ($prefix === 'svg') ? Node::SVG_NAMESPACE : null; |
|||
}, XPathResult::FIRST_ORDERED_NODE_TYPE)->singleNodeValue); |
|||
} |
|||
|
|||
|
|||
function provideMethod_xpathEvaluate__errors(): iterable { |
|||
return [ |
|||
[ function() { |
|||
$d = new Document(); |
|||
$d->evaluate('fail?', $d); |
|||
}, |
|||
XPathException::class, |
|||
XPathException::INVALID_EXPRESSION ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$d->evaluate('//fail', $d, null, XPathResult::NUMBER_TYPE); |
|||
}, |
|||
XPathException::class, |
|||
XPathException::TYPE_ERROR ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$d->evaluate('//fail', $d, null, XPathResult::STRING_TYPE); |
|||
}, |
|||
XPathException::class, |
|||
XPathException::TYPE_ERROR ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$d->evaluate('count(//fail)', $d, null, XPathResult::UNORDERED_NODE_ITERATOR_TYPE); |
|||
}, |
|||
XPathException::class, |
|||
XPathException::TYPE_ERROR ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$d->evaluate('count(//fail)', $d, null, XPathResult::ORDERED_NODE_SNAPSHOT_TYPE); |
|||
}, |
|||
XPathException::class, |
|||
XPathException::TYPE_ERROR ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$d->evaluate('count(//fail)', $d, null, XPathResult::ANY_UNORDERED_NODE_TYPE); |
|||
}, |
|||
XPathException::class, |
|||
XPathException::TYPE_ERROR ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$d->evaluate('//svg:svg', $d, null); |
|||
}, |
|||
XPathException::class, |
|||
XPathException::UNRESOLVABLE_NAMESPACE_PREFIX ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$d->evaluate('count(//fail)', $d, null, 2112); |
|||
}, |
|||
DOMException::class, |
|||
DOMException::NOT_SUPPORTED ] |
|||
]; |
|||
} |
|||
|
|||
/** |
|||
* @dataProvider provideMethod_xpathEvaluate__errors |
|||
* @covers \MensBeam\HTML\DOM\XPathEvaluate::xpathEvaluate |
|||
* |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\XPathEvaluatorBase::evaluate |
|||
* @covers \MensBeam\HTML\DOM\XPathException::__construct |
|||
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_xpath |
|||
* @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::getProtectedProperty |
|||
*/ |
|||
function testMethod_xpathEvaluate__errors(\Closure $closure, string $errorClass, int $errorCode): void { |
|||
$this->expectException($errorClass); |
|||
$this->expectExceptionCode($errorCode); |
|||
$closure(); |
|||
} |
|||
} |
@ -1,24 +0,0 @@ |
|||
<?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, |
|||
XPathEvaluator |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\XPathEvaluator */ |
|||
class TestXPathEvaluator extends \PHPUnit\Framework\TestCase { |
|||
function testMethod_registerXPathFunctions(): void { |
|||
$d = new Document(); |
|||
$e = new XPathEvaluator(); |
|||
$this->assertNull($e->registerXPathFunctions($d)); |
|||
} |
|||
} |
@ -1,159 +0,0 @@ |
|||
<?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, |
|||
Node, |
|||
XPathException, |
|||
XPathExpression, |
|||
XPathResult |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\XPathExpression */ |
|||
class TestXPathExpression extends \PHPUnit\Framework\TestCase { |
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\XPathExpression::__construct |
|||
* |
|||
* @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\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_body |
|||
* @covers \MensBeam\HTML\DOM\Document::__get_documentElement |
|||
* @covers \MensBeam\HTML\DOM\Document::createAttributeNS |
|||
* @covers \MensBeam\HTML\DOM\Document::createElementNS |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @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\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::hasChildNodes |
|||
* @covers \MensBeam\HTML\DOM\Node::locateNamespace |
|||
* @covers \MensBeam\HTML\DOM\Node::lookupNamespaceURI |
|||
* @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\XPathEvaluatorBase::createExpression |
|||
* @covers \MensBeam\HTML\DOM\XPathEvaluatorBase::createNSResolver |
|||
* @covers \MensBeam\HTML\DOM\XPathNSResolver::__construct |
|||
* @covers \MensBeam\HTML\DOM\XPathNSResolver::lookupNamespaceURI |
|||
* @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 |
|||
*/ |
|||
function testMethod_constructor(): void { |
|||
$d = new Document('<!DOCTYPE><html></html>'); |
|||
$d->documentElement->setAttributeNS(Node::XMLNS_NAMESPACE, 'xmlns:poop', 'https://poop.poop'); |
|||
$poop = $d->body->appendChild($d->createElementNS('https://poop.poop', 'poop:poop')); |
|||
|
|||
$this->assertSame(XPathExpression::class, $d->createExpression('//poop:poop', $d->createNSResolver($d))::class); |
|||
$this->assertSame(XPathExpression::class, $d->createExpression('//span')::class); |
|||
} |
|||
|
|||
|
|||
function provideMethod_constructor__errors(): iterable { |
|||
return [ |
|||
[ function() { |
|||
$d = new Document(); |
|||
$d->createExpression('//fail:fail'); |
|||
}, |
|||
XPathException::UNRESOLVABLE_NAMESPACE_PREFIX ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$d->createExpression('//fail:fail', $d->createNSResolver($d)); |
|||
}, |
|||
XPathException::UNRESOLVABLE_NAMESPACE_PREFIX ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$d->createExpression('fail?'); |
|||
}, |
|||
XPathException::INVALID_EXPRESSION ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$d->createExpression('fail?', $d->createNSResolver($d)); |
|||
}, |
|||
XPathException::INVALID_EXPRESSION ], |
|||
]; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @dataProvider provideMethod_constructor__errors |
|||
* @covers \MensBeam\HTML\DOM\XPathExpression::__construct |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__construct |
|||
* @covers \MensBeam\HTML\DOM\Node::__construct |
|||
* @covers \MensBeam\HTML\DOM\XPathEvaluate::xpathErrorHandler |
|||
* @covers \MensBeam\HTML\DOM\XPathEvaluatorBase::createExpression |
|||
* @covers \MensBeam\HTML\DOM\XPathException::__construct |
|||
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct |
|||
* @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 |
|||
*/ |
|||
function testMethod_constructor__errors(\Closure $closure, int $errorCode): void { |
|||
$this->expectException(XPathException::class); |
|||
$this->expectExceptionCode($errorCode); |
|||
$closure(); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* @covers \MensBeam\HTML\DOM\XPathExpression::evaluate |
|||
* |
|||
* @covers \MensBeam\HTML\DOM\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Document::load |
|||
* @covers \MensBeam\HTML\DOM\DOMImplementation::__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\XPathEvaluate::xpathEvaluate |
|||
* @covers \MensBeam\HTML\DOM\XPathEvaluatorBase::createExpression |
|||
* @covers \MensBeam\HTML\DOM\XPathExpression::__construct |
|||
* @covers \MensBeam\HTML\DOM\XPathResult::__construct |
|||
* @covers \MensBeam\HTML\DOM\XPathResult::__get_booleanValue |
|||
* @covers \MensBeam\HTML\DOM\Inner\Document::__construct |
|||
* @covers \MensBeam\HTML\DOM\Inner\Document::__get_xpath |
|||
* @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 |
|||
*/ |
|||
function testMethod_evaluate(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><span><span>Ook</span></span><span></span></body></html>'); |
|||
$e = $d->createExpression('//span'); |
|||
$this->assertTrue($e->evaluate($d, XPathResult::BOOLEAN_TYPE)->booleanValue); |
|||
} |
|||
} |
@ -1,149 +0,0 @@ |
|||
<?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, |
|||
HTMLElement, |
|||
Node, |
|||
XPathException, |
|||
XPathResult |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\HTML\DOM\XPathResult */ |
|||
class TestXPathResult extends \PHPUnit\Framework\TestCase { |
|||
function testIteration(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><span><span>Ook</span></span><span></span></body></html>'); |
|||
$result = $d->evaluate('.//span', $d); |
|||
foreach ($result as $k => $r) { |
|||
$this->assertSame(HTMLElement::class, $r::class); |
|||
$this->assertSame(HTMLElement::class, $result[$k]::class); |
|||
} |
|||
} |
|||
|
|||
|
|||
function testMethod_iterateNext(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><span></span></body></html>'); |
|||
$result = $d->evaluate('.//span', $d); |
|||
$this->assertSame($d->getElementsByTagName('span')[0], $result->iterateNext()); |
|||
$this->assertNull($result->iterateNext()); |
|||
} |
|||
|
|||
|
|||
function testMethod_iterateNext__errors(): void { |
|||
$this->expectException(XPathException::class); |
|||
$this->expectExceptionCode(XPathException::TYPE_ERROR); |
|||
$d = new Document(); |
|||
$d->evaluate('.//fail', $d, null, XPathResult::ORDERED_NODE_SNAPSHOT_TYPE)->iterateNext(); |
|||
} |
|||
|
|||
|
|||
function testMethod_snapshotItem(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><span></span></body></html>'); |
|||
$this->assertSame($d->getElementsByTagName('span')[0], $d->evaluate('.//span', $d, null, XPathResult::ORDERED_NODE_SNAPSHOT_TYPE)->snapshotItem(0)); |
|||
$this->assertNull($d->evaluate('.//span', $d, null, XPathResult::ORDERED_NODE_SNAPSHOT_TYPE)->snapshotItem(42)); |
|||
} |
|||
|
|||
|
|||
function testMethod_snapshotItem__errors(): void { |
|||
$this->expectException(XPathException::class); |
|||
$this->expectExceptionCode(XPathException::TYPE_ERROR); |
|||
$d = new Document(); |
|||
$d->evaluate('.//fail', $d)->snapshotItem(0); |
|||
} |
|||
|
|||
function testMethod_validateStorage__errors(): void { |
|||
$this->expectException(XPathException::class); |
|||
$this->expectExceptionCode(XPathException::TYPE_ERROR); |
|||
$d = new Document(); |
|||
$result = $d->evaluate('count(.//fail)', $d, null, XPathResult::NUMBER_TYPE); |
|||
$result[0]; |
|||
} |
|||
|
|||
|
|||
function provideProperty__errors(): iterable { |
|||
return [ |
|||
[ function() { |
|||
$d = new Document(); |
|||
$result = $d->evaluate('name(//fail)', $d, null, XPathResult::NUMBER_TYPE); |
|||
$result->booleanValue; |
|||
} ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$result = $d->evaluate('//fail', $d, null, XPathResult::BOOLEAN_TYPE); |
|||
$result->numberValue; |
|||
} ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$result = $d->evaluate('//fail', $d, null, XPathResult::BOOLEAN_TYPE); |
|||
$result->singleNodeValue; |
|||
} ], |
|||
|
|||
[ function() { |
|||
$d = new Document(); |
|||
$result = $d->evaluate('//fail', $d, null, XPathResult::BOOLEAN_TYPE); |
|||
$result->stringValue; |
|||
} ] |
|||
]; |
|||
} |
|||
|
|||
/** @dataProvider provideProperty__errors */ |
|||
function testProperty__errors(\Closure $closure): void { |
|||
$this->expectException(XPathException::class); |
|||
$this->expectExceptionCode(XPathException::TYPE_ERROR); |
|||
$closure(); |
|||
} |
|||
|
|||
function testProperty_invalidIteratorState(): void { |
|||
$d = new Document(); |
|||
$this->assertFalse($d->evaluate('//span', $d)->invalidIteratorState); |
|||
} |
|||
|
|||
|
|||
function testProperty_offsetSet_offsetUnset(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><span><span>Ook</span></span><span></span></body></html>'); |
|||
$result = $d->evaluate('.//span', $d); |
|||
$result[1] = 'ook'; |
|||
$this->assertNotSame('ook', $result[1]); |
|||
unset($result[1]); |
|||
$this->assertSame(HTMLElement::class, $result[1]::class); |
|||
} |
|||
|
|||
|
|||
function testProperty_resultType(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><span><span>Ook</span></span><span></span></body></html>'); |
|||
$this->assertEquals(XPathResult::ORDERED_NODE_ITERATOR_TYPE, $d->evaluate('.//span', $d->body, null, XPathResult::ORDERED_NODE_ITERATOR_TYPE)->resultType); |
|||
$this->assertEquals(XPathResult::ORDERED_NODE_ITERATOR_TYPE, $d->evaluate('.//span', $d->body)->resultType); |
|||
$this->assertEquals(XPathResult::NUMBER_TYPE, $d->evaluate('count(.//span)', $d->body, null, XPathResult::NUMBER_TYPE)->resultType); |
|||
$this->assertEquals(XPathResult::NUMBER_TYPE, $d->evaluate('count(.//span)', $d->body)->resultType); |
|||
$this->assertEquals(XPathResult::STRING_TYPE, $d->evaluate('name(.//span)', $d->body, null, XPathResult::STRING_TYPE)->resultType); |
|||
$this->assertEquals(XPathResult::STRING_TYPE, $d->evaluate('name(.//span)', $d->body)->resultType); |
|||
$this->assertEquals(XPathResult::BOOLEAN_TYPE, $d->evaluate('.//span', $d->body, null, XPathResult::BOOLEAN_TYPE)->resultType); |
|||
$this->assertEquals(XPathResult::BOOLEAN_TYPE, $d->evaluate('not(.//span)', $d->body, null, XPathResult::BOOLEAN_TYPE)->resultType); |
|||
$this->assertEquals(XPathResult::BOOLEAN_TYPE, $d->evaluate('not(.//span)', $d->body)->resultType); |
|||
$this->assertEquals(XPathResult::UNORDERED_NODE_SNAPSHOT_TYPE, $d->evaluate('.//span', $d->body, null, XPathResult::UNORDERED_NODE_SNAPSHOT_TYPE)->resultType); |
|||
$this->assertEquals(XPathResult::FIRST_ORDERED_NODE_TYPE, $d->evaluate('.//span', $d->body, null, XPathResult::FIRST_ORDERED_NODE_TYPE)->resultType); |
|||
} |
|||
|
|||
function testProperty_snapshotLength(): void { |
|||
$d = new Document('<!DOCTYPE html><html><body><span><span>Ook</span></span><span></span></body></html>'); |
|||
$this->assertEquals(3, $d->evaluate('.//span', $d, null, XPathResult::ORDERED_NODE_SNAPSHOT_TYPE)->snapshotLength); |
|||
} |
|||
|
|||
|
|||
function testProperty_snapshotLength__errors(): void { |
|||
$this->expectException(XPathException::class); |
|||
$this->expectExceptionCode(XPathException::TYPE_ERROR); |
|||
$d = new Document(); |
|||
$d->evaluate('.//fail', $d)->snapshotLength; |
|||
} |
|||
} |
@ -1,49 +0,0 @@ |
|||
<?xml version="1.0"?> |
|||
<phpunit |
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
|||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd" |
|||
colors="true" |
|||
bootstrap="bootstrap.php" |
|||
convertErrorsToExceptions="false" |
|||
convertNoticesToExceptions="false" |
|||
convertWarningsToExceptions="false" |
|||
beStrictAboutTestsThatDoNotTestAnything="true" |
|||
forceCoversAnnotation="true"> |
|||
<coverage processUncoveredFiles="true"> |
|||
<include> |
|||
<directory suffix=".php">../lib</directory> |
|||
</include> |
|||
</coverage> |
|||
<testsuites> |
|||
<testsuite name="DOM"> |
|||
<file>cases/TestAttr.php</file> |
|||
<file>cases/TestCharacterData.php</file> |
|||
<file>cases/TestChildNode.php</file> |
|||
<file>cases/TestCollection.php</file> |
|||
<file>cases/TestDocument.php</file> |
|||
<file>cases/TestDocumentOrElement.php</file> |
|||
<file>cases/TestDOMImplementation.php</file> |
|||
<file>cases/TestDOMTokenList.php</file> |
|||
<file>cases/TestElement.php</file> |
|||
<file>cases/TestException.php</file> |
|||
<file>cases/TestHTMLCollection.php</file> |
|||
<file>cases/TestHTMLElement.php</file> |
|||
<file>cases/TestHTMLOrSVGElement.php</file> |
|||
<file>cases/TestInnerDocument.php</file> |
|||
<file>cases/TestNamedNodeMap.php</file> |
|||
<file>cases/TestNode.php</file> |
|||
<file>cases/TestNonDocumentTypeChildNode.php</file> |
|||
<file>cases/TestParentNode.php</file> |
|||
<file>cases/TestProcessingInstruction.php</file> |
|||
<file>cases/TestText.php</file> |
|||
<file>cases/TestXMLDocument.php</file> |
|||
<file>cases/TestXPathEvaluate.php</file> |
|||
<file>cases/TestXPathEvaluator.php</file> |
|||
<file>cases/TestXPathExpression.php</file> |
|||
<file>cases/TestXPathResult.php</file> |
|||
</testsuite> |
|||
<testsuite name="Serializer"> |
|||
<file>cases/TestSerializer.php</file> |
|||
</testsuite> |
|||
</testsuites> |
|||
</phpunit> |
@ -0,0 +1,22 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.2/phpunit.xsd" |
|||
beStrictAboutOutputDuringTests="true" |
|||
beStrictAboutTestsThatDoNotTestAnything="true" |
|||
bootstrap="bootstrap.php" |
|||
cacheDirectory=".phpunit.cache" |
|||
colors="true" |
|||
executionOrder="defects" |
|||
requireCoverageMetadata="true" |
|||
> |
|||
<testsuites> |
|||
<testsuite name="Main"> |
|||
<directory prefix="Test" suffix=".php">./cases</directory> |
|||
</testsuite> |
|||
</testsuites> |
|||
<coverage/> |
|||
<source> |
|||
<include> |
|||
<directory suffix=".php">../lib</directory> |
|||
</include> |
|||
</source> |
|||
</phpunit> |
Loading…
Reference in new issue