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 }