Compare commits
2 Commits
Author | SHA1 | Date |
---|---|---|
Dustin Wilson | e2f8592682 | 6 months ago |
Dustin Wilson | c0ff4395d0 | 6 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 |
<?php |
||||
/** @license MIT |
|
||||
* Copyright 2017 , Dustin Wilson, J. King et al. |
|
||||
* See LICENSE and AUTHORS files for details */ |
|
||||
|
|
||||
declare(strict_types=1); |
declare(strict_types=1); |
||||
namespace MensBeam\HTML\DOM; |
namespace MensBeam\HTML\DOM\Test; |
||||
|
|
||||
const NS_BASE = __NAMESPACE__."\\"; |
ini_set('memory_limit', '2G'); |
||||
define(NS_BASE."BASE", dirname(__DIR__).DIRECTORY_SEPARATOR); |
ini_set('zend.assertions', '1'); |
||||
const DOCROOT = BASE."tests".DIRECTORY_SEPARATOR."docroot".DIRECTORY_SEPARATOR; |
ini_set('assert.exception', 'true'); |
||||
ini_set("memory_limit", "-1"); |
|
||||
ini_set("zend.assertions", "1"); |
|
||||
ini_set("assert.exception", "true"); |
|
||||
error_reporting(\E_ALL); |
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 (extension_loaded('xdebug') && ini_get('xdebug.mode') !== 'off' && function_exists('xdebug_set_filter')) { |
||||
if (defined("XDEBUG_PATH_INCLUDE")) { |
if (defined('XDEBUG_PATH_INCLUDE')) { |
||||
xdebug_set_filter(\XDEBUG_FILTER_CODE_COVERAGE, XDEBUG_PATH_INCLUDE, [BASE."lib/"]); |
xdebug_set_filter(\XDEBUG_FILTER_CODE_COVERAGE, \XDEBUG_PATH_INCLUDE, [ CWD . '/lib/' ]); |
||||
} else { |
} 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 |
<?php |
||||
/** |
/** |
||||
* @license MIT |
* @license MIT |
||||
* Copyright 2017 Dustin Wilson, J. King, et al. |
* Copyright 2022 Dustin Wilson, et al. |
||||
* See LICENSE and AUTHORS files for details |
* See LICENSE and AUTHORS files for details |
||||
*/ |
*/ |
||||
|
|
||||
declare(strict_types=1); |
declare(strict_types=1); |
||||
namespace MensBeam\HTML\DOM\TestCase; |
namespace MensBeam\HTML\DOM\Test; |
||||
|
use MensBeam\HTML\DOM\Document; |
||||
use MensBeam\HTML\DOM\{ |
use MensBeam\HTML\DOM\DOMException\{ |
||||
Document, |
InvalidCharacterError, |
||||
DOMException, |
NamespaceError |
||||
Element, |
}; |
||||
Node, |
use PHPUnit\Framework\{ |
||||
Text, |
TestCase, |
||||
XMLDocument |
Attributes\CoversClass, |
||||
|
Attributes\DataProvider |
||||
}; |
}; |
||||
|
|
||||
|
|
||||
/** @covers \MensBeam\HTML\DOM\DocumentOrElement */ |
#[CoversClass('MensBeam\HTML\DOM\DocumentOrElement')] |
||||
class TestDocumentOrElement extends \PHPUnit\Framework\TestCase { |
#[CoversClass('MensBeam\HTML\DOM\Document')] |
||||
public function testMethod_getElementsByClassName() { |
#[CoversClass('MensBeam\HTML\DOM\DOMException\InvalidCharacterError')] |
||||
$d = new Document('<!DOCTYPE html><html><body><div class="ook eek"><span class="ook eek"><i class="ookeek eek"></i></span></div></body></html>'); |
#[CoversClass('MensBeam\HTML\DOM\DOMException\NamespaceError')] |
||||
|
class TestDocumentOrElement extends TestCase { |
||||
// Empty class |
#[DataProvider('provideFatalErrors')] |
||||
$ook = $d->getElementsByClassName(''); |
public function testFatalErrors(string $throwableClassName, \Closure $closure): void { |
||||
$this->assertEquals(0, $ook->length); |
$this->expectException($throwableClassName); |
||||
|
$d = new Document(); |
||||
// Whitespace |
$closure($d); |
||||
$ook = $d->getElementsByClassName(' '); |
$d->destroy(); |
||||
$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); |
|
||||
} |
} |
||||
|
|
||||
|
public static function provideFatalErrors(): iterable { |
||||
public function provideMethod_validateAndExtract__errors(): iterable { |
$iterable = [ |
||||
return [ |
// Invalid attribute name |
||||
[ function() { |
[ |
||||
$d = new Document(); |
InvalidCharacterError::class, |
||||
$d->createElementNS(Node::HTML_NAMESPACE, 'this will fail'); |
function (Document $d): void { |
||||
}, DOMException::INVALID_CHARACTER ], |
$d->createAttributeNS('fail', ' '); |
||||
[ function() { |
} |
||||
$d = new Document(); |
], |
||||
$d->createAttributeNS(Node::HTML_NAMESPACE, 'xmlns'); |
// Attribute: non-null prefix, null/empty namespace |
||||
}, DOMException::NAMESPACE_ERROR ] |
[ |
||||
|
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'); |
||||
|
} |
||||
|
] |
||||
]; |
]; |
||||
} |
|
||||
|
|
||||
/** |
foreach ($iterable as $i) { |
||||
* @dataProvider provideMethod_validateAndExtract__errors |
yield $i; |
||||
*/ |
} |
||||
public function testMethod_validateAndExtract__errors(\Closure $closure, int $errorCode): void { |
|
||||
$this->expectException(DOMException::class); |
|
||||
$this->expectExceptionCode($errorCode); |
|
||||
$closure(); |
|
||||
} |
} |
||||
} |
} |
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