+ +
+And
+diff --git a/src/browser/dom/Animation.zig b/src/browser/dom/Animation.zig index a638e1a8..090c8aa7 100644 --- a/src/browser/dom/Animation.zig +++ b/src/browser/dom/Animation.zig @@ -104,23 +104,6 @@ pub fn _reverse(self: *const Animation) void { } const testing = @import("../../testing.zig"); -test "Browser.Animation" { - var runner = try testing.jsRunner(testing.tracking_allocator, .{ .html = "" }); - defer runner.deinit(); - - try runner.testCases(&.{ - .{ "let a1 = document.createElement('div').animate(null, null)", null }, - .{ "a1.playState", "finished" }, - .{ "let cb = [];", null }, - .{ "a1.ready.then(() => { cb.push('ready') })", null }, - .{ - \\ a1.finished.then((x) => { - \\ cb.push('finished'); - \\ cb.push(x == a1); - \\ }) - , - null, - }, - .{ "cb", "finished,true" }, - }, .{}); +test "Browser: DOM.Animation" { + try testing.htmlRunner("dom/animation.html"); } diff --git a/src/browser/dom/attribute.zig b/src/browser/dom/attribute.zig index 604c663f..0c719c63 100644 --- a/src/browser/dom/attribute.zig +++ b/src/browser/dom/attribute.zig @@ -70,32 +70,6 @@ pub const Attr = struct { // ----- const testing = @import("../../testing.zig"); -test "Browser.DOM.Attribute" { - var runner = try testing.jsRunner(testing.tracking_allocator, .{}); - defer runner.deinit(); - - try runner.testCases(&.{ - .{ "let a = document.createAttributeNS('foo', 'bar')", "undefined" }, - .{ "a.namespaceURI", "foo" }, - .{ "a.prefix", "null" }, - .{ "a.localName", "bar" }, - .{ "a.name", "bar" }, - .{ "a.value", "" }, - // TODO: libdom has a bug here: the created attr has no parent, it - // causes a panic w/ libdom when setting the value. - //.{ "a.value = 'nok'", "nok" }, - .{ "a.ownerElement", "null" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let b = document.getElementById('link').getAttributeNode('class')", "undefined" }, - .{ "b.name", "class" }, - .{ "b.value", "ok" }, - .{ "b.value = 'nok'", "nok" }, - .{ "b.value", "nok" }, - .{ "b.value = null", "null" }, - .{ "b.value", "null" }, - .{ "b.value = 'ok'", "ok" }, - .{ "b.ownerElement.id", "link" }, - }, .{}); +test "Browser: DOM.Attribute" { + try testing.htmlRunner("dom/attribute.html"); } diff --git a/src/browser/dom/character_data.zig b/src/browser/dom/character_data.zig index b230d777..405313b1 100644 --- a/src/browser/dom/character_data.zig +++ b/src/browser/dom/character_data.zig @@ -129,69 +129,6 @@ pub const CharacterData = struct { // ----- const testing = @import("../../testing.zig"); -test "Browser.DOM.CharacterData" { - var runner = try testing.jsRunner(testing.tracking_allocator, .{}); - defer runner.deinit(); - - try runner.testCases(&.{ - .{ "let link = document.getElementById('link')", "undefined" }, - .{ "let cdata = link.firstChild", "undefined" }, - .{ "cdata.data", "OK" }, - }, .{}); - - try runner.testCases(&.{ - .{ "cdata.data = 'OK modified'", "OK modified" }, - .{ "cdata.data === 'OK modified'", "true" }, - .{ "cdata.data = 'OK'", "OK" }, - }, .{}); - - try runner.testCases(&.{ - .{ "cdata.length === 2", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "cdata.nextElementSibling === null", "true" }, - // create a next element - .{ "let next = document.createElement('a')", "undefined" }, - .{ "link.appendChild(next, cdata) !== undefined", "true" }, - .{ "cdata.nextElementSibling.localName === 'a' ", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "cdata.previousElementSibling === null", "true" }, - // create a prev element - .{ "let prev = document.createElement('div')", "undefined" }, - .{ "link.insertBefore(prev, cdata) !== undefined", "true" }, - .{ "cdata.previousElementSibling.localName === 'div' ", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "cdata.appendData(' modified')", "undefined" }, - .{ "cdata.data === 'OK modified' ", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "cdata.deleteData('OK'.length, ' modified'.length)", "undefined" }, - .{ "cdata.data == 'OK'", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "cdata.insertData('OK'.length-1, 'modified')", "undefined" }, - .{ "cdata.data == 'OmodifiedK'", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "cdata.replaceData('OK'.length-1, 'modified'.length, 'replaced')", "undefined" }, - .{ "cdata.data == 'OreplacedK'", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "cdata.substringData('OK'.length-1, 'replaced'.length) == 'replaced'", "true" }, - .{ "cdata.substringData('OK'.length-1, 0) == ''", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "cdata.substringData('OK'.length-1, 'replaced'.length) == 'replaced'", "true" }, - .{ "cdata.substringData('OK'.length-1, 0) == ''", "true" }, - }, .{}); +test "Browser: DOM.CharacterData" { + try testing.htmlRunner("dom/character_data.html"); } diff --git a/src/browser/dom/comment.zig b/src/browser/dom/comment.zig index 62c6bd4a..34105342 100644 --- a/src/browser/dom/comment.zig +++ b/src/browser/dom/comment.zig @@ -40,15 +40,6 @@ pub const Comment = struct { // ----- const testing = @import("../../testing.zig"); -test "Browser.DOM.Comment" { - var runner = try testing.jsRunner(testing.tracking_allocator, .{}); - defer runner.deinit(); - - try runner.testCases(&.{ - .{ "let comment = new Comment('foo')", "undefined" }, - .{ "comment.data", "foo" }, - - .{ "let emptycomment = new Comment()", "undefined" }, - .{ "emptycomment.data", "" }, - }, .{}); +test "Browser: DOM.Comment" { + try testing.htmlRunner("dom/comment.html"); } diff --git a/src/browser/dom/document.zig b/src/browser/dom/document.zig index 62e633b5..f9a5e5b9 100644 --- a/src/browser/dom/document.zig +++ b/src/browser/dom/document.zig @@ -314,214 +314,22 @@ pub const Document = struct { }; const testing = @import("../../testing.zig"); -test "Browser.DOM.Document" { - var runner = try testing.jsRunner(testing.tracking_allocator, .{ - .url = "about:blank", - }); - defer runner.deinit(); +test "Browser: DOM.Document" { + try testing.htmlRunner("dom/document.html"); - try runner.testCases(&.{ - .{ "document.__proto__.__proto__.constructor.name", "Document" }, - .{ "document.__proto__.__proto__.__proto__.constructor.name", "Node" }, - .{ "document.__proto__.__proto__.__proto__.__proto__.constructor.name", "EventTarget" }, - - .{ "let newdoc = new Document()", "undefined" }, - .{ "newdoc.documentElement", "null" }, - .{ "newdoc.children.length", "0" }, - .{ "newdoc.getElementsByTagName('*').length", "0" }, - .{ "newdoc.getElementsByTagName('*').item(0)", "null" }, - .{ "newdoc.inputEncoding === document.inputEncoding", "true" }, - .{ "newdoc.documentURI === document.documentURI", "true" }, - .{ "newdoc.URL === document.URL", "true" }, - .{ "newdoc.compatMode === document.compatMode", "true" }, - .{ "newdoc.characterSet === document.characterSet", "true" }, - .{ "newdoc.charset === document.charset", "true" }, - .{ "newdoc.contentType === document.contentType", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let getElementById = document.getElementById('content')", "undefined" }, - .{ "getElementById.constructor.name", "HTMLDivElement" }, - .{ "getElementById.localName", "div" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let getElementsByTagName = document.getElementsByTagName('p')", "undefined" }, - .{ "getElementsByTagName.length", "2" }, - .{ "getElementsByTagName.item(0).localName", "p" }, - .{ "getElementsByTagName.item(1).localName", "p" }, - .{ "let getElementsByTagNameAll = document.getElementsByTagName('*')", "undefined" }, - .{ "getElementsByTagNameAll.length", "8" }, - .{ "getElementsByTagNameAll.item(0).localName", "html" }, - .{ "getElementsByTagNameAll.item(7).localName", "p" }, - .{ "getElementsByTagNameAll.namedItem('para-empty-child').localName", "span" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let ok = document.getElementsByClassName('ok')", "undefined" }, - .{ "ok.length", "2" }, - .{ "let empty = document.getElementsByClassName('empty')", "undefined" }, - .{ "empty.length", "1" }, - .{ "let emptyok = document.getElementsByClassName('empty ok')", "undefined" }, - .{ "emptyok.length", "1" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let e = document.documentElement", "undefined" }, - .{ "e.localName", "html" }, - }, .{}); - - try runner.testCases(&.{ - .{ "document.characterSet", "UTF-8" }, - .{ "document.charset", "UTF-8" }, - .{ "document.inputEncoding", "UTF-8" }, - }, .{}); - - try runner.testCases(&.{ - .{ "document.compatMode", "CSS1Compat" }, - }, .{}); - - try runner.testCases(&.{ - .{ "document.contentType", "text/html" }, - }, .{}); - - try runner.testCases(&.{ - .{ "document.documentURI", "about:blank" }, - .{ "document.URL", "about:blank" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let impl = document.implementation", "undefined" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let d = new Document()", "undefined" }, - .{ "d.characterSet", "UTF-8" }, - .{ "d.URL", "about:blank" }, - .{ "d.documentURI", "about:blank" }, - .{ "d.compatMode", "CSS1Compat" }, - .{ "d.contentType", "text/html" }, - }, .{}); - - try runner.testCases(&.{ - .{ "var v = document.createDocumentFragment()", "undefined" }, - .{ "v.nodeName", "#document-fragment" }, - }, .{}); - - try runner.testCases(&.{ - .{ "var v = document.createTextNode('foo')", "undefined" }, - .{ "v.nodeName", "#text" }, - }, .{}); - - try runner.testCases(&.{ - .{ "var v = document.createCDATASection('foo')", "undefined" }, - .{ "v.nodeName", "#cdata-section" }, - }, .{}); - - try runner.testCases(&.{ - .{ "var v = document.createComment('foo')", "undefined" }, - .{ "v.nodeName", "#comment" }, - .{ "let v2 = v.cloneNode()", "undefined" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let pi = document.createProcessingInstruction('foo', 'bar')", "undefined" }, - .{ "pi.target", "foo" }, - .{ "let pi2 = pi.cloneNode()", "undefined" }, - }, .{}); - - try runner.testCases(&.{ - .{ "let nimp = document.getElementById('content')", "undefined" }, - .{ "var v = document.importNode(nimp)", "undefined" }, - .{ "v.nodeName", "DIV" }, - }, .{}); - - try runner.testCases(&.{ - .{ "var v = document.createAttribute('foo')", "undefined" }, - .{ "v.nodeName", "foo" }, - }, .{}); - - try runner.testCases(&.{ - .{ "document.children.length", "1" }, - .{ "document.children.item(0).nodeName", "HTML" }, - .{ "document.firstElementChild.nodeName", "HTML" }, - .{ "document.lastElementChild.nodeName", "HTML" }, - .{ "document.childElementCount", "1" }, - - .{ "let nd = new Document()", "undefined" }, - .{ "nd.children.length", "0" }, - .{ "nd.children.item(0)", "null" }, - .{ "nd.firstElementChild", "null" }, - .{ "nd.lastElementChild", "null" }, - .{ "nd.childElementCount", "0" }, - - .{ "let emptydoc = document.createElement('html')", "undefined" }, - .{ "emptydoc.prepend(document.createElement('html'))", "undefined" }, - - .{ "let emptydoc2 = document.createElement('html')", "undefined" }, - .{ "emptydoc2.append(document.createElement('html'))", "undefined" }, - }, .{}); - - try runner.testCases(&.{ - .{ "document.querySelector('')", "null" }, - .{ "document.querySelector('*').nodeName", "HTML" }, - .{ "document.querySelector('#content').id", "content" }, - .{ "document.querySelector('#para').id", "para" }, - .{ "document.querySelector('.ok').id", "link" }, - .{ "document.querySelector('a ~ p').id", "para-empty" }, - .{ "document.querySelector(':root').nodeName", "HTML" }, - - .{ "document.querySelectorAll('p').length", "2" }, - .{ - \\ Array.from(document.querySelectorAll('#content > p#para-empty')) - \\ .map(row => row.querySelector('span').textContent) - \\ .length; - , - "1", - }, - - .{ "document.querySelectorAll('.\\\\:popover-open').length", "0" }, - .{ "document.querySelectorAll('.foo\\\\:bar').length", "0" }, - }, .{}); - - try runner.testCases(&.{ - .{ "document.activeElement === document.body", "true" }, - .{ "document.getElementById('link').focus()", "undefined" }, - .{ "document.activeElement === document.getElementById('link')", "true" }, - }, .{}); - - try runner.testCases(&.{ - .{ "document.styleSheets.length", "0" }, - }, .{}); - - // this test breaks the doc structure, keep it at the end of the test - // suite. - try runner.testCases(&.{ - .{ "let nadop = document.getElementById('content')", "undefined" }, - .{ "var v = document.adoptNode(nadop)", "undefined" }, - .{ "v.nodeName", "DIV" }, - }, .{}); - - try runner.testCases(&.{ - .{ "const acss = document.adoptedStyleSheets", null }, - .{ "acss.length", "0" }, - .{ "acss.push(new CSSStyleSheet())", null }, - .{ "document.adoptedStyleSheets.length", "1" }, - }, .{}); - - const Case = testing.JsRunner.Case; - const tags = comptime parser.Tag.all(); - var createElements: [(tags.len) * 2]Case = undefined; - inline for (tags, 0..) |tag, i| { - const tag_name = @tagName(tag); - createElements[i * 2] = Case{ - "var " ++ tag_name ++ "Elem = document.createElement('" ++ tag_name ++ "')", - "undefined", - }; - createElements[(i * 2) + 1] = Case{ - tag_name ++ "Elem.localName", - tag_name, - }; - } - try runner.testCases(&createElements, .{}); + // const Case = testing.JsRunner.Case; + // const tags = comptime parser.Tag.all(); + // var createElements: [(tags.len) * 2]Case = undefined; + // inline for (tags, 0..) |tag, i| { + // const tag_name = @tagName(tag); + // createElements[i * 2] = Case{ + // "var " ++ tag_name ++ "Elem = document.createElement('" ++ tag_name ++ "')", + // "undefined", + // }; + // createElements[(i * 2) + 1] = Case{ + // tag_name ++ "Elem.localName", + // tag_name, + // }; + // } + // try runner.testCases(&createElements, .{}); } diff --git a/src/tests/dom/animation.html b/src/tests/dom/animation.html new file mode 100644 index 00000000..eeed6f5d --- /dev/null +++ b/src/tests/dom/animation.html @@ -0,0 +1,14 @@ + + + diff --git a/src/tests/dom/attribute.html b/src/tests/dom/attribute.html new file mode 100644 index 00000000..2c7040e8 --- /dev/null +++ b/src/tests/dom/attribute.html @@ -0,0 +1,32 @@ + + +OK + + diff --git a/src/tests/dom/character_data.html b/src/tests/dom/character_data.html new file mode 100644 index 00000000..3b39a9ff --- /dev/null +++ b/src/tests/dom/character_data.html @@ -0,0 +1,47 @@ + + +OK + + diff --git a/src/tests/dom/comment.html b/src/tests/dom/comment.html new file mode 100644 index 00000000..5bbe870b --- /dev/null +++ b/src/tests/dom/comment.html @@ -0,0 +1,8 @@ + + diff --git a/src/tests/dom/document.html b/src/tests/dom/document.html new file mode 100644 index 00000000..6eb61f34 --- /dev/null +++ b/src/tests/dom/document.html @@ -0,0 +1,169 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/testing.js b/src/tests/testing.js index 30d6306a..39894095 100644 --- a/src/tests/testing.js +++ b/src/tests/testing.js @@ -42,6 +42,10 @@ expectEqual('an error', null); } + function skip() { + _recordExecution(); + } + // Should only be called by the test runner function getStatus() { // if we're already in a fail state, return fail, nothing can recover this @@ -156,6 +160,7 @@ _eventually: [], _executed_scripts: {}, _captured: null, + skip: skip, getStatus: getStatus, eventually: eventually, expectEqual: expectEqual,