|
36 | 36 | use GT\DomTemplate\Test\TestHelper\Model\IteratorAggregate\Student\Module; |
37 | 37 | use GT\DomTemplate\Test\TestHelper\Model\IteratorAggregate\Student\Name; |
38 | 38 | use GT\DomTemplate\Test\TestHelper\Model\IteratorAggregate\Student\Student; |
| 39 | +use PHPUnit\Framework\Attributes\DataProvider; |
39 | 40 | use PHPUnit\Framework\TestCase; |
40 | 41 | use stdClass; |
41 | 42 | use IteratorAggregate; |
@@ -1526,6 +1527,78 @@ public function test_bindElementWithBindValue():void { |
1526 | 1527 | self::assertSame("There has been an error!", $errorDiv->textContent); |
1527 | 1528 | } |
1528 | 1529 |
|
| 1530 | + #[DataProvider("inverseElementPresenceProvider")] |
| 1531 | + public function testBindElement_inverseBoolean( |
| 1532 | + string $expression, |
| 1533 | + mixed $value, |
| 1534 | + bool $bind, |
| 1535 | + bool $retained, |
| 1536 | + ):void { |
| 1537 | + $document = new HTMLDocument('<div id="target" data-element="' . $expression . '">Static content</div>'); |
| 1538 | + $sut = new DocumentBinder($document); |
| 1539 | + $sut->setDependencies(...$this->documentBinderDependencies($document)); |
| 1540 | + if($bind) { |
| 1541 | + $sut->bindKeyValue("isAdmin", $value); |
| 1542 | + } |
| 1543 | + $sut->cleanupDocument(); |
| 1544 | + |
| 1545 | + $target = $document->getElementById("target"); |
| 1546 | + if(!$retained) { |
| 1547 | + self::assertNull($target); |
| 1548 | + return; |
| 1549 | + } |
| 1550 | + |
| 1551 | + self::assertNotNull($target); |
| 1552 | + self::assertSame("Static content", $target->textContent); |
| 1553 | + self::assertFalse($target->hasAttribute("data-element")); |
| 1554 | + self::assertFalse($target->hasAttribute("data-bound")); |
| 1555 | + } |
| 1556 | + |
| 1557 | + public static function inverseElementPresenceProvider():array { |
| 1558 | + $cases = []; |
| 1559 | + foreach(["isAdmin", "!isAdmin"] as $expression) { |
| 1560 | + $inverse = str_starts_with($expression, "!"); |
| 1561 | + foreach([true, false, 1, 0, "admin", "", "0"] as $index => $value) { |
| 1562 | + $cases["$expression value $index"] = [$expression, $value, true, $inverse ? !$value : (bool)$value]; |
| 1563 | + } |
| 1564 | + $cases["$expression unbound"] = [$expression, false, false, false]; |
| 1565 | + $cases["$expression null"] = [$expression, null, true, false]; |
| 1566 | + } |
| 1567 | + $cases["unrelated inverse key"] = ["!otherKey", false, true, false]; |
| 1568 | + return $cases; |
| 1569 | + } |
| 1570 | + |
| 1571 | + #[DataProvider("inverseAttributeElementProvider")] |
| 1572 | + public function testBindElement_inverseAttributeSurvivesCleanup( |
| 1573 | + string $modifier, |
| 1574 | + bool $value, |
| 1575 | + ):void { |
| 1576 | + $isToken = str_contains($modifier, ":"); |
| 1577 | + $property = $isToken ? "class" : "disabled"; |
| 1578 | + $expression = $modifier . "isEnabled" . ($isToken ? " hidden" : ""); |
| 1579 | + $document = new HTMLDocument('<button id="target" data-element data-bind:' . $property . '="' . $expression . '">Action</button>'); |
| 1580 | + $sut = new DocumentBinder($document); |
| 1581 | + $sut->setDependencies(...$this->documentBinderDependencies($document)); |
| 1582 | + $sut->bindKeyValue("isEnabled", $value); |
| 1583 | + $sut->cleanupDocument(); |
| 1584 | + |
| 1585 | + $target = $document->getElementById("target"); |
| 1586 | + self::assertNotNull($target); |
| 1587 | + self::assertSame(!$value, $isToken ? $target->classList->contains("hidden") : $target->hasAttribute("disabled")); |
| 1588 | + self::assertFalse($target->hasAttribute("data-element")); |
| 1589 | + self::assertFalse($target->hasAttribute("data-bound")); |
| 1590 | + } |
| 1591 | + |
| 1592 | + public static function inverseAttributeElementProvider():array { |
| 1593 | + $cases = []; |
| 1594 | + foreach(["?!", "!?", ":!", "!:"] as $modifier) { |
| 1595 | + foreach([true, false] as $value) { |
| 1596 | + $cases[$modifier . ($value ? " true" : " false")] = [$modifier, $value]; |
| 1597 | + } |
| 1598 | + } |
| 1599 | + return $cases; |
| 1600 | + } |
| 1601 | + |
1529 | 1602 | public function test_bindElementRemovesMultiple():void { |
1530 | 1603 | $document = new HTMLDocument(HTMLPageContent::HTML_ADMIN_PANEL); |
1531 | 1604 | $sut = new DocumentBinder($document); |
|
0 commit comments