lib/zen/src/slides/test.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const subject = @import("root.zig");
3 const print = subject.print;
4 const Deck = subject.Deck;
5
6 test "slide deck wraps sections and drops trailing empty slides" {
7 var out: std.ArrayList(u8) = .empty;
8 defer out.deinit(std.testing.allocator);
9 var deck = Deck{ .options = .{ .runtime = false } };
10 try deck.begin(&out, std.testing.allocator);
11 try out.appendSlice(std.testing.allocator, "<h1>First</h1>\n");
12 try deck.split(&out, std.testing.allocator);
13 try out.appendSlice(std.testing.allocator, "<h2>Second</h2>\n");
14 try deck.split(&out, std.testing.allocator);
15 try deck.finish(&out, std.testing.allocator);
16
17 try std.testing.expectEqualStrings(
18 "<div class=\"zen-slides\" data-zen-slides>\n" ++
19 "<section class=\"zen-slide\" id=\"slide-1\" aria-label=\"Slide 1\">\n" ++
20 "<div class=\"zen-slide-frame\">\n" ++
21 "<h1>First</h1>\n" ++
22 "</div>\n" ++
23 "</section>\n" ++
24 "<section class=\"zen-slide\" id=\"slide-2\" aria-label=\"Slide 2\">\n" ++
25 "<div class=\"zen-slide-frame\">\n" ++
26 "<h2>Second</h2>\n" ++
27 "</div>\n" ++
28 "</section>\n" ++
29 "</div>\n" ++
30 print.stylesheet,
31 out.items,
32 );
33 }
34
35 test "slide deck appends runtime by default" {
36 var out: std.ArrayList(u8) = .empty;
37 defer out.deinit(std.testing.allocator);
38 var deck: Deck = .{};
39 try deck.begin(&out, std.testing.allocator);
40 try out.appendSlice(std.testing.allocator, "<h1>First</h1>\n");
41 try deck.finish(&out, std.testing.allocator);
42
43 try std.testing.expect(std.mem.indexOf(u8, out.items, "<script>") != null);
44 try std.testing.expect(std.mem.indexOf(u8, out.items, print.stylesheet) != null);
45 try std.testing.expect(std.mem.indexOf(u8, out.items, "data-zen-speaker-notes") != null);
46 try std.testing.expect(std.mem.indexOf(u8, out.items, "BroadcastChannel") != null);
47 try std.testing.expect(std.mem.indexOf(u8, out.items, "localStorage") != null);
48 try std.testing.expect(std.mem.indexOf(u8, out.items, "zen-slide-overview-panel") != null);
49 try std.testing.expect(std.mem.indexOf(u8, out.items, "zen-presenter-next-preview") != null);
50 try std.testing.expect(std.mem.indexOf(u8, out.items, "zen-print-notes") != null);
51 try std.testing.expect(std.mem.indexOf(u8, out.items, "zen-slide-safe") != null);
52 try std.testing.expect(std.mem.indexOf(u8, out.items, "Toggle presenter dark mode") != null);
53 try std.testing.expect(std.mem.indexOf(u8, out.items, "img[data-zen-motion-src]") != null);
54 try std.testing.expect(std.mem.indexOf(u8, out.items, "document.createElement(\"object\")") != null);
55 try std.testing.expect(std.mem.indexOf(u8, out.items, "live.removeAttribute(\"data\")") != null);
56 try std.testing.expect(std.mem.indexOf(u8, out.items, "prefers-reduced-motion") != null);
57 try std.testing.expect(std.mem.indexOf(
58 u8,
59 out.items,
60 "document.addEventListener(\"keydown\", keydown, true)",
61 ) != null);
62 try std.testing.expect(std.mem.indexOf(
63 u8,
64 out.items,
65 "live.contentDocument.addEventListener(\"keydown\", keydown, true)",
66 ) != null);
67 try std.testing.expect(std.mem.indexOf(u8, out.items, "[contenteditable]") != null);
68 }
69
70 test "slide deck stamps a badge on every frame when configured" {
71 var out: std.ArrayList(u8) = .empty;
72 defer out.deinit(std.testing.allocator);
73 var deck = Deck{ .options = .{ .runtime = false, .badge = "SLOP" } };
74 try deck.begin(&out, std.testing.allocator);
75 try out.appendSlice(std.testing.allocator, "<h1>First</h1>\n");
76 try deck.split(&out, std.testing.allocator);
77 try out.appendSlice(std.testing.allocator, "<h2>Second</h2>\n");
78 try deck.finish(&out, std.testing.allocator);
79
80 const badge = "<span class=\"zen-slide-badge\" aria-label=\"Non-curated content\">SLOP</span>";
81 try std.testing.expectEqual(@as(usize, 2), std.mem.count(u8, out.items, badge));
82 }
83
84 test "slide deck drops the trailing empty slide badge and all" {
85 var out: std.ArrayList(u8) = .empty;
86 defer out.deinit(std.testing.allocator);
87 var deck = Deck{ .options = .{ .runtime = false, .badge = "SLOP" } };
88 try deck.begin(&out, std.testing.allocator);
89 try out.appendSlice(std.testing.allocator, "<h1>Only</h1>\n");
90 try deck.split(&out, std.testing.allocator);
91 try deck.finish(&out, std.testing.allocator);
92
93 try std.testing.expectEqual(@as(usize, 1), std.mem.count(u8, out.items, "zen-slide-badge"));
94 try std.testing.expectEqual(@as(usize, 1), std.mem.count(u8, out.items, "<section"));
95 }
96
97 test "slide deck omits the badge by default" {
98 var out: std.ArrayList(u8) = .empty;
99 defer out.deinit(std.testing.allocator);
100 var deck = Deck{ .options = .{ .runtime = false } };
101 try deck.begin(&out, std.testing.allocator);
102 try out.appendSlice(std.testing.allocator, "<h1>First</h1>\n");
103 try deck.finish(&out, std.testing.allocator);
104
105 try std.testing.expect(std.mem.indexOf(u8, out.items, "zen-slide-badge") == null);
106 }
107
108 test "slide deck print stylesheet is independent of runtime script" {
109 var out: std.ArrayList(u8) = .empty;
110 defer out.deinit(std.testing.allocator);
111 var deck = Deck{ .options = .{ .runtime = false } };
112 try deck.begin(&out, std.testing.allocator);
113 try out.appendSlice(std.testing.allocator, "<h1>First</h1>\n");
114 try deck.finish(&out, std.testing.allocator);
115
116 try std.testing.expect(std.mem.indexOf(u8, out.items, print.stylesheet) != null);
117 try std.testing.expect(std.mem.indexOf(u8, out.items, "<script>") == null);
118 }