From 7c675c3fdc10ce3c4351e3747678b2edc67b5929 Mon Sep 17 00:00:00 2001 From: Camillo Bruni Date: Wed, 2 Jul 2025 13:20:16 +0200 Subject: [PATCH 1/6] adding tests --- experimental/tests.mjs | 59 ++++++++++++++++++++ resources/tests.mjs | 48 +--------------- tests/index.html | 1 + tests/unittests/suites.mjs | 109 +++++++++++++++++++++++++++++++++++++ 4 files changed, 172 insertions(+), 45 deletions(-) create mode 100644 experimental/tests.mjs create mode 100644 tests/unittests/suites.mjs diff --git a/experimental/tests.mjs b/experimental/tests.mjs new file mode 100644 index 000000000..f836ed4b7 --- /dev/null +++ b/experimental/tests.mjs @@ -0,0 +1,59 @@ +import { BenchmarkTestStep } from "../resources/benchmark-runner.mjs"; +import { todos } from "../resources/translations.mjs"; + +// TODO: merge with main tests.mjs +const numberOfItemsToAdd = 100; +const defaultLanguage = "en"; + +function getTodoText(lang, index) { + const todosSelection = todos[lang] ?? todos[defaultLanguage]; + const currentIndex = index % todosSelection.length; + return todosSelection[currentIndex]; +} + +export const ExperimentalSuites = []; + +ExperimentalSuites.push({ + name: "TodoMVC-LocalStorage", + url: "experimental/todomvc-localstorage/dist/index.html", + tags: ["todomvc", "experimental"], + disabled: true, + async prepare(page) { + (await page.waitForElement(".new-todo")).focus(); + page.getLocalStorage().getItem("javascript-es5"); + }, + tests: [ + new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + const newTodo = page.querySelector(".new-todo"); + for (let i = 0; i < numberOfItemsToAdd; i++) { + newTodo.setValue(getTodoText("ja", i)); + newTodo.dispatchEvent("change"); + newTodo.enter("keypress"); + } + }), + new BenchmarkTestStep("CompletingAllItems", (page) => { + const checkboxes = page.querySelectorAll(".toggle"); + for (let i = 0; i < numberOfItemsToAdd; i++) + checkboxes[i].click(); + }), + new BenchmarkTestStep("DeletingAllItems", (page) => { + const deleteButtons = page.querySelectorAll(".destroy"); + for (let i = numberOfItemsToAdd - 1; i >= 0; i--) + deleteButtons[i].click(); + }), + ], +}); + +ExperimentalSuites.push({ + name: "NewsSite-PostMessage", + url: "resources/newssite/news-next/dist/index.html", + tags: ["experimental", "newssite", "language"], + disabled: true, + async prepare() {}, + type: "remote", + /* config: { + name: "default", // optional param to target non-default tests locally + }, */ +}); + +Object.freeze(ExperimentalSuites); diff --git a/resources/tests.mjs b/resources/tests.mjs index d7cf6794a..1c155cb60 100644 --- a/resources/tests.mjs +++ b/resources/tests.mjs @@ -1,5 +1,6 @@ import { BenchmarkTestStep } from "./benchmark-runner.mjs"; import { todos } from "./translations.mjs"; +import { ExperimentalSuites } from "../experimental/tests.mjs"; const numberOfItemsToAdd = 100; const defaultLanguage = "en"; @@ -56,37 +57,6 @@ Suites.enable = function (names, tags) { console.error(message, debugInfo); }; -Suites.push({ - name: "TodoMVC-LocalStorage", - url: "experimental/todomvc-localstorage/dist/index.html", - tags: ["todomvc"], - disabled: true, - async prepare(page) { - (await page.waitForElement(".new-todo")).focus(); - page.getLocalStorage().getItem("javascript-es5"); - }, - tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { - const newTodo = page.querySelector(".new-todo"); - for (let i = 0; i < numberOfItemsToAdd; i++) { - newTodo.setValue(getTodoText("ja", i)); - newTodo.dispatchEvent("change"); - newTodo.enter("keypress"); - } - }), - new BenchmarkTestStep("CompletingAllItems", (page) => { - const checkboxes = page.querySelectorAll(".toggle"); - for (let i = 0; i < numberOfItemsToAdd; i++) - checkboxes[i].click(); - }), - new BenchmarkTestStep("DeletingAllItems", (page) => { - const deleteButtons = page.querySelectorAll(".destroy"); - for (let i = numberOfItemsToAdd - 1; i >= 0; i--) - deleteButtons[i].click(); - }), - ], -}); - Suites.push({ name: "TodoMVC-Emoji", url: "resources/todomvc/vanilla-examples/javascript-web-components/dist/index.html", @@ -894,18 +864,6 @@ Suites.push({ ], }); -Suites.push({ - name: "NewsSite-PostMessage", - url: "resources/newssite/news-next/dist/index.html", - tags: ["experimental", "newssite", "language"], - disabled: true, - async prepare() {}, - type: "remote", - /* config: { - name: "default", // optional param to target non-default tests locally - }, */ -}); - Suites.push({ name: "NewsSite-Nuxt", url: "resources/newssite/news-nuxt/dist/index.html", @@ -1113,12 +1071,12 @@ Suites.push({ ], }); +Suites.push(...ExperimentalSuites); + Object.freeze(Suites); Suites.forEach((suite) => { if (!suite.tags) suite.tags = []; - if (suite.url.startsWith("experimental/")) - suite.tags.unshift("all", "experimental"); else if (suite.disabled) suite.tags.unshift("all"); else diff --git a/tests/index.html b/tests/index.html index d11801ecb..a6bc60a3b 100644 --- a/tests/index.html +++ b/tests/index.html @@ -29,6 +29,7 @@ await import("./unittests/benchmark-runner.mjs"); await import("./unittests/params.mjs"); + await import("./unittests/suites.mjs"); globalThis.testResults = undefined; globalThis.testRunner = mocha.run(); diff --git a/tests/unittests/suites.mjs b/tests/unittests/suites.mjs new file mode 100644 index 000000000..01df2b2e3 --- /dev/null +++ b/tests/unittests/suites.mjs @@ -0,0 +1,109 @@ +import { ExperimentalSuites } from "../../experimental/tests.mjs"; +import { Suites } from "../../resources/tests.mjs"; + +describe("ExperimentalSuites", () => { + it("should be frozen", () => { + expect(Object.isFrozen(ExperimentalSuites)).to.be(true); + }); + it("should have tags array", () => { + ExperimentalSuites.forEach((suite) => { + expect(suite.tags).to.be.an("array"); + }); + }); + it("should have frozen tags array", () => { + ExperimentalSuites.forEach((suite) => { + expect(Object.isFrozen(suite.tags)).to.be(true); + }); + }); + it("should have frozen steps array", () => { + ExperimentalSuites.forEach((suite) => { + expect(Object.isFrozen(suite.tags)).to.be(true); + }); + }); + it("should have 'experimental' tag", () => { + ExperimentalSuites.forEach((suite) => { + expect(suite.tags.includes("experimental")); + }); + }); + it("should be disabled by default", () => { + ExperimentalSuites.forEach((suite) => { + expect(suite.disabled).to.be(true); + }); + }); + it("should have experimental url", () => { + ExperimentalSuites.forEach((suite) => { + expect(suite.url.startsWith("experimental/")); + }); + }); + it("should have unique names", () => { + const uniqueNames = new Set(); + ExperimentalSuites.forEach((suite) => { + expect(uniqueNames.has(suite.name)).to.be(false); + uniqueNames.add(suite.name); + }); + }); +}); + +describe("Suites", () => { + it("should be frozen", () => { + expect(Object.isFrozen(Suites)).to.be(true); + }); + it("should have tags array", () => { + Suites.forEach((suite) => { + expect(suite.tags).to.be.an("array"); + }); + }); + it("should have frozen tags array", () => { + Suites.forEach((suite) => { + expect(Object.isFrozen(suite.tags)).to.be(true); + }); + }); + it("should have frozen steps array", () => { + Suites.forEach((suite) => { + expect(Object.isFrozen(suite.tags)).to.be(true); + }); + }); + it("should have 'all' tags", () => { + Suites.forEach((suite) => { + expect(suite.tags.includes("all")).to.be(true); + expect(suite.tags[0]).to.be("all"); + }); + }); + it("default suites should be enabled by default", () => { + Suites.forEach((suite) => { + if (suite.tags.includes("default")) + expect(!suite.disabled); + }); + }); + it("should have 'default' and not 'experimental' tag", () => { + Suites.forEach((suite) => { + if (suite.tags.includes("experimental")) + expect(!suite.tags.includes("default")); + }); + }); + it("should not have duplicate tags", () => { + Suites.forEach((suite) => { + const uniqueTags = new Set(suite.tags); + expect(suite.tags).to.eql(Array.from(uniqueTags)); + }); + }); + it("should have a name string", () => { + Suites.forEach((suite) => { + expect(suite.name).to.be.a("string"); + expect(suite.name.length).to.be.greaterThan(0); + }); + }); + it("should have a url string", () => { + Suites.forEach((suite) => { + expect(suite.url).to.be.a("string"); + expect(suite.url.length).to.be.greaterThan(0); + }); + }); + it("should have unique names", () => { + const uniqueNames = new Set(); + Suites.forEach((suite) => { + expect(uniqueNames.has(suite.name)).to.be(false); + uniqueNames.add(suite.name); + }); + }); +}); From b1072e67b40bda4aa5d01114071b00062b9dd615 Mon Sep 17 00:00:00 2001 From: Camillo Bruni Date: Wed, 30 Jul 2025 12:42:05 +0200 Subject: [PATCH 2/6] cleanup --- experimental/tests.mjs | 13 ++----------- resources/tests.mjs | 3 --- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/experimental/tests.mjs b/experimental/tests.mjs index fb9e83c30..fe4cd3e9a 100644 --- a/experimental/tests.mjs +++ b/experimental/tests.mjs @@ -1,15 +1,6 @@ import { BenchmarkTestStep } from "../resources/benchmark-runner.mjs"; -import { todos } from "../resources/translations.mjs"; - -// TODO: merge with main tests.mjs -const numberOfItemsToAdd = 100; -const defaultLanguage = "en"; - -function getTodoText(lang, index) { - const todosSelection = todos[lang] ?? todos[defaultLanguage]; - const currentIndex = index % todosSelection.length; - return todosSelection[currentIndex]; -} +import { getTodoText } from "./shared/translations.mjs"; +import { numberOfItemsToAdd } from "./shared/todomvc-utils.mjs"; export const ExperimentalSuites = []; diff --git a/resources/tests.mjs b/resources/tests.mjs index ffeecb530..9ea70f2a9 100644 --- a/resources/tests.mjs +++ b/resources/tests.mjs @@ -3,9 +3,6 @@ import { ExperimentalSuites } from "../experimental/tests.mjs"; import { getTodoText, defaultLanguage } from "./shared/translations.mjs"; import { numberOfItemsToAdd } from "./shared/todomvc-utils.mjs"; -const numberOfItemsToAdd = 100; -const defaultLanguage = "en"; - export const Suites = []; Suites.enable = function (names, tags) { From 54178f755f2339ed8fb79de7459520b644f9721d Mon Sep 17 00:00:00 2001 From: Camillo Bruni Date: Wed, 30 Jul 2025 15:31:38 +0200 Subject: [PATCH 3/6] fix module --- experimental/tests.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/experimental/tests.mjs b/experimental/tests.mjs index fe4cd3e9a..8f9ec1975 100644 --- a/experimental/tests.mjs +++ b/experimental/tests.mjs @@ -1,6 +1,6 @@ import { BenchmarkTestStep } from "../resources/benchmark-runner.mjs"; -import { getTodoText } from "./shared/translations.mjs"; -import { numberOfItemsToAdd } from "./shared/todomvc-utils.mjs"; +import { getTodoText } from "../resources/shared/translations.mjs"; +import { numberOfItemsToAdd } from "../resources/shared/todomvc-utils.mjs"; export const ExperimentalSuites = []; From 969206677ee472307f87388d081e8d517ab3972d Mon Sep 17 00:00:00 2001 From: Camillo Bruni Date: Wed, 30 Jul 2025 15:35:30 +0200 Subject: [PATCH 4/6] fix --- tests/unittests/suites.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unittests/suites.mjs b/tests/unittests/suites.mjs index 01df2b2e3..1f287578e 100644 --- a/tests/unittests/suites.mjs +++ b/tests/unittests/suites.mjs @@ -27,7 +27,8 @@ describe("ExperimentalSuites", () => { }); it("should be disabled by default", () => { ExperimentalSuites.forEach((suite) => { - expect(suite.disabled).to.be(true); + expect(suite.enabled).to.be(false); + expect(suite.tags.includes("default")).to.be(false); }); }); it("should have experimental url", () => { From 9f186b9eb3500bd2ec5f0c26c910b0a7c26d2ba0 Mon Sep 17 00:00:00 2001 From: Camillo Bruni Date: Wed, 30 Jul 2025 15:39:00 +0200 Subject: [PATCH 5/6] move newer experimental workloads --- experimental/tests.mjs | 93 ++++++++++++++++++++++++++++++++++++ resources/tests.mjs | 105 ----------------------------------------- 2 files changed, 93 insertions(+), 105 deletions(-) diff --git a/experimental/tests.mjs b/experimental/tests.mjs index 8f9ec1975..08ec7ab12 100644 --- a/experimental/tests.mjs +++ b/experimental/tests.mjs @@ -34,6 +34,39 @@ ExperimentalSuites.push({ ], }); +ExperimentalSuites.push({ + name: "TodoMVC-Emoji", + url: "resources/todomvc/vanilla-examples/javascript-web-components/dist/index.html", + tags: ["todomvc", "experimental"], + async prepare(page) { + await page.waitForElement("todo-app"); + }, + tests: [ + new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + const input = page.querySelector(".new-todo-input", ["todo-app", "todo-topbar"]); + for (let i = 0; i < numberOfItemsToAdd; i++) { + input.setValue(getTodoText("emoji", i)); + input.dispatchEvent("input"); + input.enter("keyup"); + } + }), + new BenchmarkTestStep("CompletingAllItems", (page) => { + const items = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]); + for (let i = 0; i < numberOfItemsToAdd; i++) { + const item = items[i].querySelectorInShadowRoot(".toggle-todo-input"); + item.click(); + } + }), + new BenchmarkTestStep("DeletingAllItems", (page) => { + const items = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]); + for (let i = numberOfItemsToAdd - 1; i >= 0; i--) { + const item = items[i].querySelectorInShadowRoot(".remove-todo-button"); + item.click(); + } + }), + ], +}); + ExperimentalSuites.push({ name: "NewsSite-PostMessage", url: "resources/newssite/news-next/dist/index.html", @@ -45,4 +78,64 @@ ExperimentalSuites.push({ }, */ }); +ExperimentalSuites.push({ + name: "TodoMVC-Jaspr-Dart2JS-O4", + url: "experimental/todomvc-dart-jaspr/dist/out-dart2js-O4/index.html", + tags: ["todomvc", "experimental"], + disabled: true, + async prepare(page) { + (await page.waitForElement(".new-todo")).focus(); + }, + tests: [ + new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + const newTodo = page.querySelector(".new-todo"); + for (let i = 0; i < numberOfItemsToAdd; i++) { + newTodo.setValue(getTodoText("ja", i)); + newTodo.dispatchEvent("change"); + newTodo.enter("keypress"); + } + }), + new BenchmarkTestStep("CompletingAllItems", (page) => { + const checkboxes = page.querySelectorAll(".toggle"); + for (let i = 0; i < numberOfItemsToAdd; i++) + checkboxes[i].click(); + }), + new BenchmarkTestStep("DeletingAllItems", (page) => { + const deleteButtons = page.querySelectorAll(".destroy"); + for (let i = numberOfItemsToAdd - 1; i >= 0; i--) + deleteButtons[i].click(); + }), + ], +}); + +ExperimentalSuites.push({ + name: "TodoMVC-Jaspr-Dart2Wasm-O2", + url: "experimental/todomvc-dart-jaspr/dist/out-dart2wasm-O2/index.html", + tags: ["todomvc", "experimental"], + disabled: true, + async prepare(page) { + (await page.waitForElement(".new-todo")).focus(); + }, + tests: [ + new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + const newTodo = page.querySelector(".new-todo"); + for (let i = 0; i < numberOfItemsToAdd; i++) { + newTodo.setValue(getTodoText("ja", i)); + newTodo.dispatchEvent("change"); + newTodo.enter("keypress"); + } + }), + new BenchmarkTestStep("CompletingAllItems", (page) => { + const checkboxes = page.querySelectorAll(".toggle"); + for (let i = 0; i < numberOfItemsToAdd; i++) + checkboxes[i].click(); + }), + new BenchmarkTestStep("DeletingAllItems", (page) => { + const deleteButtons = page.querySelectorAll(".destroy"); + for (let i = numberOfItemsToAdd - 1; i >= 0; i--) + deleteButtons[i].click(); + }), + ], +}); + Object.freeze(ExperimentalSuites); diff --git a/resources/tests.mjs b/resources/tests.mjs index d63893ef4..7540fa79c 100644 --- a/resources/tests.mjs +++ b/resources/tests.mjs @@ -46,39 +46,6 @@ Suites.enable = function (names, tags) { console.error(message, debugInfo); }; -Suites.push({ - name: "TodoMVC-Emoji", - url: "resources/todomvc/vanilla-examples/javascript-web-components/dist/index.html", - tags: ["todomvc", "experimental"], - async prepare(page) { - await page.waitForElement("todo-app"); - }, - tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { - const input = page.querySelector(".new-todo-input", ["todo-app", "todo-topbar"]); - for (let i = 0; i < numberOfItemsToAdd; i++) { - input.setValue(getTodoText("emoji", i)); - input.dispatchEvent("input"); - input.enter("keyup"); - } - }), - new BenchmarkTestStep("CompletingAllItems", (page) => { - const items = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]); - for (let i = 0; i < numberOfItemsToAdd; i++) { - const item = items[i].querySelectorInShadowRoot(".toggle-todo-input"); - item.click(); - } - }), - new BenchmarkTestStep("DeletingAllItems", (page) => { - const items = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]); - for (let i = numberOfItemsToAdd - 1; i >= 0; i--) { - const item = items[i].querySelectorInShadowRoot(".remove-todo-button"); - item.click(); - } - }), - ], -}); - Suites.push({ name: "TodoMVC-JavaScript-ES5", url: "resources/todomvc/vanilla-examples/javascript-es5/dist/index.html", @@ -230,18 +197,6 @@ Suites.push({ ], }); -Suites.push({ - name: "TodoMVC-WebComponents-PostMessage", - url: "resources/todomvc/vanilla-examples/javascript-web-components/dist/index.html", - tags: ["experimental", "todomvc", "webcomponents"], - disabled: true, - async prepare() {}, - type: "remote", - /* config: { - name: "default", // optional param to target non-default tests locally - }, */ -}); - Suites.push({ name: "TodoMVC-WebComponents-Complex-DOM", url: "resources/todomvc/vanilla-examples/javascript-web-components-complex/dist/index.html", @@ -811,66 +766,6 @@ Suites.push({ ], }); -Suites.push({ - name: "TodoMVC-Jaspr-Dart2JS-O4", - url: "experimental/todomvc-dart-jaspr/dist/out-dart2js-O4/index.html", - tags: ["todomvc", "experimental"], - disabled: true, - async prepare(page) { - (await page.waitForElement(".new-todo")).focus(); - }, - tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { - const newTodo = page.querySelector(".new-todo"); - for (let i = 0; i < numberOfItemsToAdd; i++) { - newTodo.setValue(getTodoText("ja", i)); - newTodo.dispatchEvent("change"); - newTodo.enter("keypress"); - } - }), - new BenchmarkTestStep("CompletingAllItems", (page) => { - const checkboxes = page.querySelectorAll(".toggle"); - for (let i = 0; i < numberOfItemsToAdd; i++) - checkboxes[i].click(); - }), - new BenchmarkTestStep("DeletingAllItems", (page) => { - const deleteButtons = page.querySelectorAll(".destroy"); - for (let i = numberOfItemsToAdd - 1; i >= 0; i--) - deleteButtons[i].click(); - }), - ], -}); - -Suites.push({ - name: "TodoMVC-Jaspr-Dart2Wasm-O2", - url: "experimental/todomvc-dart-jaspr/dist/out-dart2wasm-O2/index.html", - tags: ["todomvc", "experimental"], - disabled: true, - async prepare(page) { - (await page.waitForElement(".new-todo")).focus(); - }, - tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { - const newTodo = page.querySelector(".new-todo"); - for (let i = 0; i < numberOfItemsToAdd; i++) { - newTodo.setValue(getTodoText("ja", i)); - newTodo.dispatchEvent("change"); - newTodo.enter("keypress"); - } - }), - new BenchmarkTestStep("CompletingAllItems", (page) => { - const checkboxes = page.querySelectorAll(".toggle"); - for (let i = 0; i < numberOfItemsToAdd; i++) - checkboxes[i].click(); - }), - new BenchmarkTestStep("DeletingAllItems", (page) => { - const deleteButtons = page.querySelectorAll(".destroy"); - for (let i = numberOfItemsToAdd - 1; i >= 0; i--) - deleteButtons[i].click(); - }), - ], -}); - Suites.push({ name: "NewsSite-Next", url: "resources/newssite/news-next/dist/index.html", From 331bc526c339b2f8fa7414af98d819c225838208 Mon Sep 17 00:00:00 2001 From: Camillo Bruni Date: Wed, 30 Jul 2025 15:44:10 +0200 Subject: [PATCH 6/6] fix tests --- tests/unittests/suites.mjs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tests/unittests/suites.mjs b/tests/unittests/suites.mjs index 1f287578e..e0fbcb181 100644 --- a/tests/unittests/suites.mjs +++ b/tests/unittests/suites.mjs @@ -22,7 +22,7 @@ describe("ExperimentalSuites", () => { }); it("should have 'experimental' tag", () => { ExperimentalSuites.forEach((suite) => { - expect(suite.tags.includes("experimental")); + expect(suite.tags.includes("experimental")).to.be(true); }); }); it("should be disabled by default", () => { @@ -31,11 +31,7 @@ describe("ExperimentalSuites", () => { expect(suite.tags.includes("default")).to.be(false); }); }); - it("should have experimental url", () => { - ExperimentalSuites.forEach((suite) => { - expect(suite.url.startsWith("experimental/")); - }); - }); + it("should have unique names", () => { const uniqueNames = new Set(); ExperimentalSuites.forEach((suite) => { @@ -73,13 +69,19 @@ describe("Suites", () => { it("default suites should be enabled by default", () => { Suites.forEach((suite) => { if (suite.tags.includes("default")) - expect(!suite.disabled); + expect(suite.enabled).to.be(true); }); }); it("should have 'default' and not 'experimental' tag", () => { Suites.forEach((suite) => { if (suite.tags.includes("experimental")) - expect(!suite.tags.includes("default")); + expect(suite.tags.includes("default")).to.be(false); + }); + }); + it("should have experimental tag for experimental url", () => { + ExperimentalSuites.forEach((suite) => { + if (suite.tags.includes("experimental")) + expect(suite.tags.includes("experimental")).to.be(true); }); }); it("should not have duplicate tags", () => {