Skip to content

Commit a261621

Browse files
committed
Tests updates prior to ondrej
1 parent 9c60a2c commit a261621

File tree

3 files changed

+68
-6
lines changed

3 files changed

+68
-6
lines changed

stubs/dom.stub

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ class DOMElement extends DOMNode
6161
*/
6262
public function getElementsByTagNameNS ($namespaceURI, $localName) {}
6363

64+
/**
65+
* @template-covariant T of string
66+
* @param T $qualifiedName
67+
* @phpstan-assert-if-true DOMAttr|DOMNameSpaceNode $this->getAttributeNode($qualifiedName)
68+
*/
69+
public function hasAttribute(string $qualifiedName): bool {}
70+
71+
public function getAttributeNode(string $qualifiedName): DOMAttr|DOMNameSpaceNode|false {}
6472
}
6573

6674
/**

tests/PHPStan/Analyser/nsrt/DOMLegacyNamedNodeNap.php

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,45 @@
55
namespace DOMLegacyNamedNodeMap;
66

77
use DOMAttr;
8+
use DOMElement;
89
use DOMNode;
910
use DOMNamedNodeMap;
1011
use function PHPStan\Testing\assertType;
1112

1213
class Foo
1314
{
14-
public function checkAttributes(DOMNode $node): void {
15-
assertType('DOMNamedNodeMap<DOMAttr>', $node->attributes);
16-
if ($node->hasAttribute('attr')) {
17-
assertType('DOMAttr', $node->attributes->getNamedItem('attr'));
15+
public function basic_node(DOMNode $node): void {
16+
if ($node->hasAttributes()) {
17+
assertType('DOMNamedNodeMap<DOMAttr>', $node->attributes);
1818
} else {
19-
assertType('null', $node->attributes->getNamedItem('attr'));
19+
assertType('null', $node->attributes);
20+
}
21+
}
22+
23+
public function element_node(DOMElement $element): void
24+
{
25+
if ($element->hasAttribute('class')) {
26+
assertType('DOMNamedNodeMap<DOMAttr>', $element->attributes);
27+
$attribute = $element->getAttributeNode('class');
28+
assertType(DOMAttr::class, $attribute);
29+
assertType('string', $attribute->value);
30+
} else {
31+
assertType('DOMNamedNodeMap<DOMAttr>|null', $element->attributes);
32+
}
33+
}
34+
35+
public function element_node_attribute_fetch_via_attributes_property(DOMElement $element): void
36+
{
37+
if ($element->hasAttribute('class')) {
38+
assertType('DOMNamedNodeMap<DOMAttr>', $element->attributes);
39+
$attribute = $element->attributes->getNamedItem('class');
40+
if ($attribute === null) {
41+
return;
42+
}
43+
assertType(DOMAttr::class, $attribute);
44+
assertType('string', $attribute->value);
45+
} else {
46+
assertType('DOMNamedNodeMap<DOMAttr>|null', $element->attributes);
2047
}
2148
}
2249
}

tests/PHPStan/Rules/Properties/data/dom-legacy-ext-template-nodes.php

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,31 @@ function basic_node(\DOMNode $node): void {
88
} else {
99
assertType('null', $node->attributes);
1010
}
11-
};
11+
}
12+
13+
function element_node(\DOMElement $element): void
14+
{
15+
if ($element->hasAttribute('class')) {
16+
assertType(DOMNamedNodeMap::class . '<' . DOMAttr::class . '>', $element->attributes);
17+
$attribute = $element->getAttributeNode('class');
18+
assertType(DOMAttr::class, $attribute);
19+
assertType('string', $attribute->value);
20+
} else {
21+
assertType('DOMNamedNodeMap::class . '<' . DOMAttr::class . '>'|null', $element->attributes);
22+
}
23+
}
24+
25+
function element_node_attribute_fetch_via_attributes_property(\DOMElement $element): void
26+
{
27+
if ($element->hasAttribute('class')) {
28+
assertType(DOMNamedNodeMap::class . '<' . DOMAttr::class . '>', $element->attributes);
29+
$attribute = $element->attributes->getNamedItem('class');
30+
if ($attribute === null) {
31+
return;
32+
}
33+
assertType(DOMAttr::class, $attribute);
34+
assertType('string', $attribute->value);
35+
} else {
36+
assertType('DOMNamedNodeMap::class . '<' . DOMAttr::class . '>'|null', $element->attributes);
37+
}
38+
}

0 commit comments

Comments
 (0)