@@ -143,3 +143,140 @@ pub fn getReader(self: DataMap, name: []const u8) ?std.io.AnyReader {
}
comptime unreachable;
}
test "directive For" {
var a = std.testing.allocator;
const blob =
\\<div><For Loop><span><Name></span></For></div>
;
const expected: []const u8 =
\\<div><span>not that</span></div>
;
const dbl_expected: []const u8 =
\\<div><span>first</span><span>second</span></div>
;
var t = Template{
//.path = "/dev/null",
.name = "test",
.blob = blob,
};
var ctx = DataMap.init(a);
defer ctx.raze();
var blocks: [1]DataMap = [1]DataMap{
DataMap.init(a),
};
try blocks[0].putSlice("Name", "not that");
// We have to raze because it will be over written
defer blocks[0].raze();
try ctx.putBlock("Loop", &blocks);
const p = try t.page(ctx).build(a);
defer a.free(p);
try std.testing.expectEqualStrings(expected, p);
// many
var many_blocks: [2]DataMap = [_]DataMap{
DataMap.init(a),
DataMap.init(a),
};
// what... 2 is many
try many_blocks[0].putSlice("Name", "first");
try many_blocks[1].putSlice("Name", "second");
try ctx.putBlock("Loop", &many_blocks);
const dbl_page = try t.page(ctx).build(a);
defer a.free(dbl_page);
try std.testing.expectEqualStrings(dbl_expected, dbl_page);
//many_blocks[0].raze();
//many_blocks[1].raze();
}
test "directive For & For" {
var a = std.testing.allocator;
const blob =
\\<div>
\\ <For Loop>
\\ <span><Name></span>
\\ <For Numbers>
\\ <Number>
\\ </For>
\\ </For>
\\</div>
;
const expected: []const u8 =
\\<div>
\\ <span>Alice</span>
\\ A0
\\ A1
\\ A2
++ "\n \n" ++
\\ <span>Bob</span>
\\ B0
\\ B1
\\ B2
++ "\n \n \n" ++
\\</div>
;
var t = Template{
//.path = "/dev/null",
.name = "test",
.blob = blob,
};
var ctx = DataMap.init(a);
defer ctx.raze();
var outer = [2]DataMap{
DataMap.init(a),
DataMap.init(a),
};
try outer[0].putSlice("Name", "Alice");
//defer outer[0].raze();
var arena = std.heap.ArenaAllocator.init(a);
defer arena.deinit();
const aa = arena.allocator();
const lput = "Number";
var alice_inner: [3]DataMap = undefined;
try outer[0].putBlock("Numbers", &alice_inner);
for (0..3) |i| {
alice_inner[i] = DataMap.init(a);
try alice_inner[i].putSlice(
lput,
try std.fmt.allocPrint(aa, "A{}", .{i}),
);
}
try outer[1].putSlice("Name", "Bob");
//defer outer[1].raze();
var bob_inner: [3]DataMap = undefined;
try outer[1].putBlock("Numbers", &bob_inner);
for (0..3) |i| {
bob_inner[i] = DataMap.init(a);
try bob_inner[i].putSlice(
lput,
try std.fmt.allocPrint(aa, "B{}", .{i}),
);
}
try ctx.putBlock("Loop", &outer);
const p = try t.page(ctx).build(a);
defer a.free(p);
try std.testing.expectEqualStrings(expected, p);
}