Skip to content

Commit

Permalink
feature: expose and test callback functions
Browse files Browse the repository at this point in the history
closes #261
  • Loading branch information
g105b committed Oct 12, 2021
1 parent cb4e12f commit 445def0
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 0 deletions.
43 changes: 43 additions & 0 deletions test/phpunit/DocumentBinderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -663,4 +663,47 @@ public function testBindList_complexHTML():void {
}
}
}

public function testBindListData_callback():void {
$salesData = [
[
"name" => "Cactus",
"count" => 14,
"price" => 5.50,
"cost" => 3.55,
],
[
"name" => "Succulent",
"count" => 9,
"price" => 3.50,
"cost" => 2.10,
]
];
$salesCallback = function(Element $template, array $listItem, string $key):array {
$totalPrice = $listItem["price"] * $listItem["count"];
$totalCost = $listItem["cost"] * $listItem["count"];

$listItem["profit"] = round($totalPrice - $totalCost, 2);
return $listItem;
};

$document = DocumentTestFactory::createHTML(DocumentTestFactory::HTML_SALES);
$sut = new DocumentBinder($document);
$sut->bindListCallback(
$salesData,
$salesCallback
);

$salesLiList = $document->querySelectorAll("ul>li");
self::assertCount(count($salesData), $salesLiList);
foreach($salesData as $i => $sale) {
$li = $salesLiList[$i];
$profitValue = round(($sale["count"] * $sale["price"]) - ($sale["count"] * $sale["cost"]), 2);
self::assertEquals($sale["name"], $li->querySelector(".name span")->textContent);
self::assertEquals($sale["count"], $li->querySelector(".count span")->textContent);
self::assertEquals($sale["price"], $li->querySelector(".price span")->textContent);
self::assertEquals($sale["cost"], $li->querySelector(".cost span")->textContent);
self::assertEquals($profitValue, $li->querySelector(".profit span")->textContent);
}
}
}
45 changes: 45 additions & 0 deletions test/phpunit/ListBinderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -498,4 +498,49 @@ public function testBindListData_multipleTemplateSiblings():void {
self::assertEquals($expected[$i], $li->querySelector("span")->textContent);
}
}

public function testBindListData_callback():void {
$salesData = [
[
"name" => "Cactus",
"count" => 14,
"price" => 5.50,
"cost" => 3.55,
],
[
"name" => "Succulent",
"count" => 9,
"price" => 3.50,
"cost" => 2.10,
]
];
$salesCallback = function(Element $template, array $listItem, string $key):array {
$totalPrice = $listItem["price"] * $listItem["count"];
$totalCost = $listItem["cost"] * $listItem["count"];

$listItem["profit"] = round($totalPrice - $totalCost, 2);
return $listItem;
};

$document = DocumentTestFactory::createHTML(DocumentTestFactory::HTML_SALES);
$templateCollection = new TemplateCollection($document);
$sut = new ListBinder($templateCollection);
$sut->bindListData(
$salesData,
$document,
callback: $salesCallback
);

$salesLiList = $document->querySelectorAll("ul>li");
self::assertCount(count($salesData), $salesLiList);
foreach($salesData as $i => $sale) {
$li = $salesLiList[$i];
$profitValue = round(($sale["count"] * $sale["price"]) - ($sale["count"] * $sale["cost"]), 2);
self::assertEquals($sale["name"], $li->querySelector(".name span")->textContent);
self::assertEquals($sale["count"], $li->querySelector(".count span")->textContent);
self::assertEquals($sale["price"], $li->querySelector(".price span")->textContent);
self::assertEquals($sale["cost"], $li->querySelector(".cost span")->textContent);
self::assertEquals($profitValue, $li->querySelector(".profit span")->textContent);
}
}
}
13 changes: 13 additions & 0 deletions test/phpunit/TestFactory/DocumentTestFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,19 @@ class DocumentTestFactory {
</ul>
HTML;

const HTML_SALES = <<<HTML
<!doctype html>
<h1>Sales</h1>
<ul>
<li data-template>
<p class="name">Item: <span data-bind:text="name">Item name</span></p>
<p class="count">Sale count: <span data-bind:text="count">0</span></p>
<p class="price">Price per item: £<span data-bind:text="price">0.00</span></p>
<p class="cost">Cost per item: £<span data-bind:text="cost">0.00</span></p>
<p class="profit">Total profit: £<span data-bind:text="profit">0.00</span></p>
</li>
</ul>
HTML;



Expand Down

0 comments on commit 445def0

Please sign in to comment.