Skip to content

Commit

Permalink
test: extend test coverage to DocumentBinder
Browse files Browse the repository at this point in the history
  • Loading branch information
g105b committed Apr 28, 2024
1 parent 0649566 commit e62e666
Showing 1 changed file with 138 additions and 0 deletions.
138 changes: 138 additions & 0 deletions test/phpunit/DocumentBinderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use DateInterval;
use Exception;
use Gt\Dom\Document;
use Gt\Dom\Element;
use Gt\Dom\HTMLCollection;
use Gt\Dom\HTMLDocument;
Expand Down Expand Up @@ -1400,6 +1401,143 @@ public function testBindList_arrayIterator():void {
}
}

public function testBindKeyValue_stringContext():void {
$document = new HTMLDocument(HTMLPageContent::HTML_COMPONENT_WITH_ATTRIBUTE_NESTED);
$documentElement = $document->documentElement;
$subComponent1 = $document->querySelector("#subcomponent-1");
$subComponent2 = $document->querySelector("#subcomponent-2");

$elementBinder = self::createMock(ElementBinder::class);
$bindMatcher = self::exactly(3);
$elementBinder->expects($bindMatcher)
->method("bind")
->willReturnCallback(function(string $key, string $value, Element $element)use($bindMatcher, $documentElement, $subComponent1, $subComponent2):void {
match($bindMatcher->numberOfInvocations()) {
1 => self::assertEquals(["title", "Title 1!", $subComponent1], [$key, $value, $element]),
2 => self::assertEquals(["title", "Title 2!", $subComponent2], [$key, $value, $element]),
3 => self::assertEquals(["title", "Main title!", $documentElement], [$key, $value, $element]),
};
});

$sut = new DocumentBinder($document);
$sut->setDependencies(
$elementBinder,
self::createMock(PlaceholderBinder::class),
self::createMock(TableBinder::class),
self::createMock(ListBinder::class),
self::createMock(ListElementCollection::class),
self::createMock(BindableCache::class),
);

$sut->bindKeyValue("title", "Title 1!", "#subcomponent-1");
$sut->bindKeyValue("title", "Title 2!", "#subcomponent-2");
$sut->bindKeyValue("title", "Main title!");
}

public function testBindData_stringContext():void {
$document = new HTMLDocument(HTMLPageContent::HTML_COMPONENT_WITH_ATTRIBUTE_NESTED);
$documentElement = $document->documentElement;
$subComponent1 = $document->querySelector("#subcomponent-1");
$subComponent2 = $document->querySelector("#subcomponent-2");

$elementBinder = self::createMock(ElementBinder::class);
$bindMatcher = self::exactly(6);
$elementBinder->expects($bindMatcher)
->method("bind")
->willReturnCallback(function(string $key, string $value, Element $element)use($bindMatcher, $documentElement, $subComponent1, $subComponent2):void {
match($bindMatcher->numberOfInvocations()) {
1 => self::assertEquals(["title", "Title 1!", $subComponent1], [$key, $value, $element]),
2 => self::assertEquals(["number", "1", $subComponent1], [$key, $value, $element]),
3 => self::assertEquals(["title", "Title 2!", $subComponent2], [$key, $value, $element]),
4 => self::assertEquals(["number", "2", $subComponent2], [$key, $value, $element]),
5 => self::assertEquals(["title", "Main title!", $documentElement], [$key, $value, $element]),
6 => self::assertEquals(["number", "3", $documentElement], [$key, $value, $element]),
};
});

$sut = new DocumentBinder($document);
$sut->setDependencies(
$elementBinder,
self::createMock(PlaceholderBinder::class),
self::createMock(TableBinder::class),
self::createMock(ListBinder::class),
self::createMock(ListElementCollection::class),
self::createMock(BindableCache::class),
);

$sut->bindData(["title" => "Title 1!", "number" => "1"], "#subcomponent-1");
$sut->bindData(["title" => "Title 2!", "number" => "2"], "#subcomponent-2");
$sut->bindData(["title" => "Main title!", "number" => "3"]);
}

public function testBindList_stringContext():void {
$document = new HTMLDocument(HTMLPageContent::HTML_COMPONENT_WITH_ATTRIBUTE_NESTED);
$documentElement = $document->documentElement;
$subComponent1 = $document->querySelector("#subcomponent-1");
$subComponent2 = $document->querySelector("#subcomponent-2");

$listBinder = self::createMock(ListBinder::class);
$bindMatcher = self::exactly(3);
$listBinder->expects($bindMatcher)
->method("bindListData")
->willReturnCallback(function(array $listData, Element|Document $context)use($bindMatcher, $documentElement, $subComponent1, $subComponent2):int {
match($bindMatcher->numberOfInvocations()) {
1 => self::assertEquals([["List", "for", "component 2"], $subComponent2], [$listData, $context]),
2 => self::assertEquals([["List", "for", "component 1"], $subComponent1], [$listData, $context]),
3 => self::assertEquals([["List", "for", "main component"], $documentElement], [$listData, $context]),
};

return 0;
});

$sut = new DocumentBinder($document);
$sut->setDependencies(
self::createMock(ElementBinder::class),
self::createMock(PlaceholderBinder::class),
self::createMock(TableBinder::class),
$listBinder,
self::createMock(ListElementCollection::class),
self::createMock(BindableCache::class),
);

$sut->bindList(["List", "for", "component 2"], "#subcomponent-2");
$sut->bindList(["List", "for", "component 1"], "#subcomponent-1");
$sut->bindList(["List", "for", "main component"]);
}

public function testBindValue_stringContext():void {
$document = new HTMLDocument(HTMLPageContent::HTML_COMPONENT_WITH_ATTRIBUTE_NESTED);
$documentElement = $document->documentElement;
$subComponent1 = $document->querySelector("#subcomponent-1");
$subComponent2 = $document->querySelector("#subcomponent-2");

$elementBinder = self::createMock(ElementBinder::class);
$bindMatcher = self::exactly(3);
$elementBinder->expects($bindMatcher)
->method("bind")
->willReturnCallback(function(?string $key, string $value, Element $element)use($bindMatcher, $documentElement, $subComponent1, $subComponent2):void {
match($bindMatcher->numberOfInvocations()) {
1 => self::assertEquals([null, "1", $subComponent1], [$key, $value, $element]),
2 => self::assertEquals([null, "2", $subComponent2], [$key, $value, $element]),
3 => self::assertEquals([null, "3", $documentElement], [$key, $value, $element]),
};
});

$sut = new DocumentBinder($document);
$sut->setDependencies(
$elementBinder,
self::createMock(PlaceholderBinder::class),
self::createMock(TableBinder::class),
self::createMock(ListBinder::class),
self::createMock(ListElementCollection::class),
self::createMock(BindableCache::class),
);

$sut->bindValue("1", "#subcomponent-1");
$sut->bindValue("2", "#subcomponent-2");
$sut->bindValue("3");
}

private function documentBinderDependencies(HTMLDocument $document, mixed...$otherObjectList):array {
$htmlAttributeBinder = new HTMLAttributeBinder();
$htmlAttributeCollection = new HTMLAttributeCollection();
Expand Down

0 comments on commit e62e666

Please sign in to comment.