from std/template/z import ZTemplate;
from test/more import *;
let template := new ZTemplate( string: """<!doctype html>
<html>
<head>
<title>{{ metadata/title }}</title>
{{# metadata/author }}
<meta name="author" content="{{.}}" />
{{/ metadata/author }}
</head>
<body>
{{# /items/* }}
{{# is-first() }}
<table>
{{/ is-first() }}
<tr>
<td>
{{ name }}
</td>
<td>
{{ format("%1.2f", price * quantity) }}
</td>
</tr>
{{# is-last() }}
<tr class="total">
<th>
Number of items: {{ count() }}
</th>
<th>
{{ format("%1.2f", sum(../*/value(number(price) * number(quantity)))) }}
</th>
</tr>
</table>
{{/ is-last() }}
{{/}}
</body>
</html>""" );
let data := {
metadata: {
title: "Basket",
author: "Me",
},
items: [
{ name: "Foo", price: 1.99, quantity: 3 },
{ name: "Bar", price: 2.99, quantity: 2 },
],
};
let got := template.process( data );
ok( got ~ /<title>Basket<\/title>/, "renders title tag" );
ok( got ~ /<meta name=\"author\" content=\"Me\" \/>/, "renders author tag" );
ok( got ~ /<table>/, "renders table tag" );
ok( got ~ /<tr class=\"total\">/, "renders total row" );
ok( got ~ /Number of items: 2/, "renders count in total row" );
ok( got ~ /11\.95/, "renders computed total value" );
done_testing();