From a5d9b658fbc6b9303104072575d1675fd822b8eb Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Wed, 10 Sep 2025 11:54:03 +0800 Subject: [PATCH] migrate more tests to htmlRunner --- src/browser/dom/performance.zig | 20 +----- src/browser/dom/performance_observer.zig | 9 +-- src/browser/dom/processing_instruction.zig | 28 +------- src/browser/dom/range.zig | 42 +----------- src/browser/dom/shadow_root.zig | 58 +---------------- src/browser/dom/text.zig | 28 +------- src/browser/dom/token_list.zig | 74 +--------------------- src/runtime/js.zig | 32 +++++----- src/tests/dom/performance.html | 15 +++++ src/tests/dom/performance_observer.html | 4 ++ src/tests/dom/processing_instruction.html | 21 ++++++ src/tests/dom/range.html | 40 ++++++++++++ src/tests/dom/shadow_root.html | 48 ++++++++++++++ src/tests/dom/text.html | 18 ++++++ src/tests/dom/token_list.html | 63 ++++++++++++++++++ 15 files changed, 239 insertions(+), 261 deletions(-) create mode 100644 src/tests/dom/performance.html create mode 100644 src/tests/dom/performance_observer.html create mode 100644 src/tests/dom/processing_instruction.html create mode 100644 src/tests/dom/range.html create mode 100644 src/tests/dom/shadow_root.html create mode 100644 src/tests/dom/text.html create mode 100644 src/tests/dom/token_list.html diff --git a/src/browser/dom/performance.zig b/src/browser/dom/performance.zig index 655df0c1..6a971b4d 100644 --- a/src/browser/dom/performance.zig +++ b/src/browser/dom/performance.zig @@ -203,22 +203,6 @@ test "Performance: now" { } } -test "Browser.Performance.Mark" { - var runner = try testing.jsRunner(testing.tracking_allocator, .{}); - defer runner.deinit(); - - try runner.testCases(&.{ - .{ "let performance = window.performance", null }, - .{ "performance instanceof Performance", "true" }, - - .{ "let mark1 = performance.mark(\"start\")", null }, - .{ "mark1 instanceof PerformanceMark", "true" }, - .{ "mark1.name", "start" }, - .{ "mark1.entryType", "mark" }, - .{ "mark1.duration", "0" }, - .{ "mark1.detail", "null" }, - - .{ "let mark2 = performance.mark(\"start\", {startTime: 32939393.9})", null }, - .{ "mark2.startTime", "32939393.9" }, - }, .{}); +test "Browser: Performance.Mark" { + try testing.htmlRunner("dom/performance.html"); } diff --git a/src/browser/dom/performance_observer.zig b/src/browser/dom/performance_observer.zig index bc290086..5a53090d 100644 --- a/src/browser/dom/performance_observer.zig +++ b/src/browser/dom/performance_observer.zig @@ -53,11 +53,6 @@ const Options = struct { }; const testing = @import("../../testing.zig"); -test "Browser.DOM.PerformanceObserver" { - var runner = try testing.jsRunner(testing.tracking_allocator, .{}); - defer runner.deinit(); - - try runner.testCases(&.{ - .{ "PerformanceObserver.supportedEntryTypes.length", "0" }, - }, .{}); +test "Browser: DOM.PerformanceObserver" { + try testing.htmlRunner("dom/performance_observer.html"); } diff --git a/src/browser/dom/processing_instruction.zig b/src/browser/dom/processing_instruction.zig index 8165e69d..1859e3f1 100644 --- a/src/browser/dom/processing_instruction.zig +++ b/src/browser/dom/processing_instruction.zig @@ -87,30 +87,6 @@ pub const ProcessingInstruction = struct { }; const testing = @import("../../testing.zig"); -test "Browser.DOM.ProcessingInstruction" { - var runner = try testing.jsRunner(testing.tracking_allocator, .{}); - defer runner.deinit(); - - try runner.testCases(&.{ - .{ "let pi = document.createProcessingInstruction('foo', 'bar')", "undefined" }, - .{ "pi.target", "foo" }, - .{ "pi.data", "bar" }, - .{ "pi.data = 'foo'", "foo" }, - .{ "pi.data", "foo" }, - - .{ "let pi2 = pi.cloneNode()", "undefined" }, - .{ "pi2.nodeType", "7" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let pi11 = document.createProcessingInstruction('target1', 'data1');", "undefined" }, - .{ "let pi12 = document.createProcessingInstruction('target2', 'data2');", "undefined" }, - .{ "let pi13 = document.createProcessingInstruction('target1', 'data1');", "undefined" }, - .{ "pi11.isEqualNode(pi11)", "true" }, - .{ "pi11.isEqualNode(pi13)", "true" }, - .{ "pi11.isEqualNode(pi12)", "false" }, - .{ "pi12.isEqualNode(pi13)", "false" }, - .{ "pi11.isEqualNode(document)", "false" }, - .{ "document.isEqualNode(pi11)", "false" }, - }, .{}); +test "Browser: DOM.ProcessingInstruction" { + try testing.htmlRunner("dom/processing_instruction.html"); } diff --git a/src/browser/dom/range.zig b/src/browser/dom/range.zig index 9cd29abf..7da6dbc9 100644 --- a/src/browser/dom/range.zig +++ b/src/browser/dom/range.zig @@ -385,44 +385,6 @@ fn compare(node_a: *parser.Node, offset_a: u32, node_b: *parser.Node, offset_b: } const testing = @import("../../testing.zig"); -test "Browser.Range" { - var runner = try testing.jsRunner(testing.tracking_allocator, .{}); - defer runner.deinit(); - - try runner.testCases(&.{ - // Test Range constructor - .{ "let range = new Range()", "undefined" }, - .{ "range instanceof Range", "true" }, - .{ "range instanceof AbstractRange", "true" }, - - // Test initial state - collapsed range - .{ "range.collapsed", "true" }, - .{ "range.startOffset", "0" }, - .{ "range.endOffset", "0" }, - .{ "range.startContainer instanceof HTMLDocument", "true" }, - .{ "range.endContainer instanceof HTMLDocument", "true" }, - - // Test document.createRange() - .{ "let docRange = document.createRange()", "undefined" }, - .{ "docRange instanceof Range", "true" }, - .{ "docRange.collapsed", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "const container = document.getElementById('content');", null }, - - // Test text range - .{ "const commentNode = container.childNodes[7];", null }, - .{ "commentNode.nodeValue", "comment" }, - .{ "const textRange = document.createRange();", null }, - .{ "textRange.selectNodeContents(commentNode)", "undefined" }, - .{ "textRange.startOffset", "0" }, - .{ "textRange.endOffset", "7" }, // length of `comment` - - // Test Node range - .{ "const nodeRange = document.createRange();", null }, - .{ "nodeRange.selectNodeContents(container)", "undefined" }, - .{ "nodeRange.startOffset", "0" }, - .{ "nodeRange.endOffset", "9" }, // length of container.childNodes - }, .{}); +test "Browser: Range" { + try testing.htmlRunner("dom/range.html"); } diff --git a/src/browser/dom/shadow_root.zig b/src/browser/dom/shadow_root.zig index 76353b73..f75aed6f 100644 --- a/src/browser/dom/shadow_root.zig +++ b/src/browser/dom/shadow_root.zig @@ -96,60 +96,6 @@ pub const ShadowRoot = struct { }; const testing = @import("../../testing.zig"); -test "Browser.DOM.ShadowRoot" { - defer testing.reset(); - - var runner = try testing.jsRunner(testing.tracking_allocator, .{ .html = - \\
nope
- }); - defer runner.deinit(); - - try runner.testCases(&.{ - .{ "const div1 = document.createElement('div');", null }, - .{ "let sr1 = div1.attachShadow({mode: 'open'})", null }, - .{ "sr1.host == div1", "true" }, - .{ "div1.attachShadow({mode: 'open'}) == sr1", "true" }, - .{ "div1.shadowRoot == sr1", "true" }, - - .{ "try { div1.attachShadow({mode: 'closed'}) } catch (e) { e }", "Error: NotSupportedError" }, - - .{ " sr1.append(document.createElement('div'))", null }, - .{ " sr1.append(document.createElement('span'))", null }, - .{ "sr1.childElementCount", "2" }, - // re-attaching clears it - .{ "div1.attachShadow({mode: 'open'}) == sr1", "true" }, - .{ "sr1.childElementCount", "0" }, - }, .{}); - - try runner.testCases(&.{ - .{ "const div2 = document.createElement('di2');", null }, - .{ "let sr2 = div2.attachShadow({mode: 'closed'})", null }, - .{ "sr2.host == div2", "true" }, - .{ "div2.shadowRoot", "null" }, // null when attached with 'closed' - }, .{}); - - try runner.testCases(&.{ - .{ "sr2.getElementById('conflict')", "null" }, - .{ "const n1 = document.createElement('div')", null }, - .{ "n1.id = 'conflict'", null }, - .{ "sr2.append(n1)", null }, - .{ "sr2.getElementById('conflict') == n1", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "const acss = sr2.adoptedStyleSheets", null }, - .{ "acss.length", "0" }, - .{ "acss.push(new CSSStyleSheet())", null }, - .{ "sr2.adoptedStyleSheets.length", "1" }, - }, .{}); - - try runner.testCases(&.{ - .{ "sr1.innerHTML = '

hello

'", null }, - .{ "sr1.innerHTML", "

hello

" }, - .{ "sr1.querySelector('*')", "[object HTMLParagraphElement]" }, - - .{ "sr1.innerHTML = null", null }, - .{ "sr1.innerHTML", "" }, - .{ "sr1.querySelector('*')", "null" }, - }, .{}); +test "Browser: DOM.ShadowRoot" { + try testing.htmlRunner("dom/shadow_root.html"); } diff --git a/src/browser/dom/text.zig b/src/browser/dom/text.zig index b1334db5..ac930cab 100644 --- a/src/browser/dom/text.zig +++ b/src/browser/dom/text.zig @@ -56,31 +56,7 @@ pub const Text = struct { } }; -// Tests -// ----- - const testing = @import("../../testing.zig"); -test "Browser.DOM.Text" { - var runner = try testing.jsRunner(testing.tracking_allocator, .{}); - defer runner.deinit(); - - try runner.testCases(&.{ - .{ "let t = new Text('foo')", "undefined" }, - .{ "t.data", "foo" }, - - .{ "let emptyt = new Text()", "undefined" }, - .{ "emptyt.data", "" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let text = document.getElementById('link').firstChild", "undefined" }, - .{ "text.wholeText === 'OK'", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "text.data = 'OK modified'", "OK modified" }, - .{ "let split = text.splitText('OK'.length)", "undefined" }, - .{ "split.data === ' modified'", "true" }, - .{ "text.data === 'OK'", "true" }, - }, .{}); +test "Browser: DOM.Text" { + try testing.htmlRunner("dom/text.html"); } diff --git a/src/browser/dom/token_list.zig b/src/browser/dom/token_list.zig index 6f12c406..37a78df5 100644 --- a/src/browser/dom/token_list.zig +++ b/src/browser/dom/token_list.zig @@ -169,77 +169,7 @@ pub const Iterator = struct { } }; -// Tests -// ----- - const testing = @import("../../testing.zig"); -test "Browser.DOM.TokenList" { - var runner = try testing.jsRunner(testing.tracking_allocator, .{}); - defer runner.deinit(); - - try runner.testCases(&.{ - .{ "let gs = document.getElementById('para-empty')", "undefined" }, - .{ "let cl = gs.classList", "undefined" }, - .{ "gs.className", "ok empty" }, - .{ "cl.value", "ok empty" }, - .{ "cl.length", "2" }, - .{ "gs.className = 'foo bar baz'", "foo bar baz" }, - .{ "gs.className", "foo bar baz" }, - .{ "cl.length", "3" }, - .{ "gs.className = 'ok empty'", "ok empty" }, - .{ "cl.length", "2" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let cl2 = gs.classList", "undefined" }, - .{ "cl2.length", "2" }, - .{ "cl2.item(0)", "ok" }, - .{ "cl2.item(1)", "empty" }, - .{ "cl2.contains('ok')", "true" }, - .{ "cl2.contains('nok')", "false" }, - .{ "cl2.add('foo', 'bar', 'baz')", "undefined" }, - .{ "cl2.length", "5" }, - .{ "cl2.remove('foo', 'bar', 'baz')", "undefined" }, - .{ "cl2.length", "2" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let cl3 = gs.classList", "undefined" }, - .{ "cl3.toggle('ok')", "false" }, - .{ "cl3.toggle('ok')", "true" }, - .{ "cl3.length", "2" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let cl4 = gs.classList", "undefined" }, - .{ "cl4.replace('ok', 'nok')", "true" }, - .{ "cl4.value", "empty nok" }, - .{ "cl4.replace('nok', 'ok')", "true" }, - .{ "cl4.value", "empty ok" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let cl5 = gs.classList", "undefined" }, - .{ "let keys = [...cl5.keys()]", "undefined" }, - .{ "keys.length", "2" }, - .{ "keys[0]", "0" }, - .{ "keys[1]", "1" }, - - .{ "let values = [...cl5.values()]", "undefined" }, - .{ "values.length", "2" }, - .{ "values[0]", "empty" }, - .{ "values[1]", "ok" }, - - .{ "let entries = [...cl5.entries()]", "undefined" }, - .{ "entries.length", "2" }, - .{ "entries[0]", "0,empty" }, - .{ "entries[1]", "1,ok" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let cl6 = gs.classList", "undefined" }, - .{ "cl6.value = 'a b ccc'", "a b ccc" }, - .{ "cl6.value", "a b ccc" }, - .{ "cl6.toString()", "a b ccc" }, - }, .{}); +test "Browser: DOM.TokenList" { + try testing.htmlRunner("dom/token_list.html"); } diff --git a/src/runtime/js.zig b/src/runtime/js.zig index 190ac91f..dcc92efd 100644 --- a/src/runtime/js.zig +++ b/src/runtime/js.zig @@ -332,22 +332,22 @@ pub fn Env(comptime State: type, comptime WebApis: type) type { pub fn dumpMemoryStats(self: *Self) void { const stats = self.isolate.getHeapStatistics(); std.debug.print( - \\ Total Heap Size: {d} - \\ Total Heap Size Executable: {d} - \\ Total Physical Size: {d} - \\ Total Available Size: {d} - \\ Used Heap Size: {d} - \\ Heap Size Limit: {d} - \\ Malloced Memory: {d} - \\ External Memory: {d} - \\ Peak Malloced Memory: {d} - \\ Number Of Native Contexts: {d} - \\ Number Of Detached Contexts: {d} - \\ Total Global Handles Size: {d} - \\ Used Global Handles Size: {d} - \\ Zap Garbage: {any} - \\ - , .{stats.total_heap_size, stats.total_heap_size_executable, stats.total_physical_size, stats.total_available_size, stats.used_heap_size, stats.heap_size_limit, stats.malloced_memory, stats.external_memory, stats.peak_malloced_memory, stats.number_of_native_contexts, stats.number_of_detached_contexts, stats.total_global_handles_size, stats.used_global_handles_size, stats.does_zap_garbage}); + \\ Total Heap Size: {d} + \\ Total Heap Size Executable: {d} + \\ Total Physical Size: {d} + \\ Total Available Size: {d} + \\ Used Heap Size: {d} + \\ Heap Size Limit: {d} + \\ Malloced Memory: {d} + \\ External Memory: {d} + \\ Peak Malloced Memory: {d} + \\ Number Of Native Contexts: {d} + \\ Number Of Detached Contexts: {d} + \\ Total Global Handles Size: {d} + \\ Used Global Handles Size: {d} + \\ Zap Garbage: {any} + \\ + , .{ stats.total_heap_size, stats.total_heap_size_executable, stats.total_physical_size, stats.total_available_size, stats.used_heap_size, stats.heap_size_limit, stats.malloced_memory, stats.external_memory, stats.peak_malloced_memory, stats.number_of_native_contexts, stats.number_of_detached_contexts, stats.total_global_handles_size, stats.used_global_handles_size, stats.does_zap_garbage }); } fn promiseRejectCallback(v8_msg: v8.C_PromiseRejectMessage) callconv(.c) void { diff --git a/src/tests/dom/performance.html b/src/tests/dom/performance.html new file mode 100644 index 00000000..1020ffaa --- /dev/null +++ b/src/tests/dom/performance.html @@ -0,0 +1,15 @@ + + diff --git a/src/tests/dom/performance_observer.html b/src/tests/dom/performance_observer.html new file mode 100644 index 00000000..4aff3f53 --- /dev/null +++ b/src/tests/dom/performance_observer.html @@ -0,0 +1,4 @@ + + diff --git a/src/tests/dom/processing_instruction.html b/src/tests/dom/processing_instruction.html new file mode 100644 index 00000000..6925616d --- /dev/null +++ b/src/tests/dom/processing_instruction.html @@ -0,0 +1,21 @@ + + diff --git a/src/tests/dom/range.html b/src/tests/dom/range.html new file mode 100644 index 00000000..e76010a0 --- /dev/null +++ b/src/tests/dom/range.html @@ -0,0 +1,40 @@ + + +

over 9000

+ + + + + + + + diff --git a/src/tests/dom/shadow_root.html b/src/tests/dom/shadow_root.html new file mode 100644 index 00000000..0072fa59 --- /dev/null +++ b/src/tests/dom/shadow_root.html @@ -0,0 +1,48 @@ +
node
+ + + diff --git a/src/tests/dom/text.html b/src/tests/dom/text.html new file mode 100644 index 00000000..812ca258 --- /dev/null +++ b/src/tests/dom/text.html @@ -0,0 +1,18 @@ +OK + + + diff --git a/src/tests/dom/token_list.html b/src/tests/dom/token_list.html new file mode 100644 index 00000000..b07f0b6b --- /dev/null +++ b/src/tests/dom/token_list.html @@ -0,0 +1,63 @@ +

+ + +