Skip to content

Commit e2e2538

Browse files
authored
Split off ExperimentalSuites (#519)
- Add experimental/tests.mjs which exports ExperimentalSuites - Add "TodoMVC-LocalStorage" and "NewsSite-PostMessage" to ExperimentalSuites - ExperimentalSuites is merged into the default Suites - Add unit tests for Suites and ExperimentalSuites to ensure all tags are set correctly
1 parent 5744c55 commit e2e2538

File tree

6 files changed

+267
-147
lines changed

6 files changed

+267
-147
lines changed

experimental/tests.mjs

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
import { BenchmarkTestStep } from "../resources/benchmark-runner.mjs";
2+
import { getTodoText } from "../resources/shared/translations.mjs";
3+
import { numberOfItemsToAdd } from "../resources/shared/todomvc-utils.mjs";
4+
import { freezeSuites } from "../resources/suites-helper.mjs";
5+
6+
export const ExperimentalSuites = freezeSuites([
7+
{
8+
name: "TodoMVC-LocalStorage",
9+
url: "experimental/todomvc-localstorage/dist/index.html",
10+
tags: ["todomvc", "experimental"],
11+
async prepare(page) {
12+
(await page.waitForElement(".new-todo")).focus();
13+
page.getLocalStorage().getItem("javascript-es5");
14+
},
15+
tests: [
16+
new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => {
17+
const newTodo = page.querySelector(".new-todo");
18+
for (let i = 0; i < numberOfItemsToAdd; i++) {
19+
newTodo.setValue(getTodoText("ja", i));
20+
newTodo.dispatchEvent("change");
21+
newTodo.enter("keypress");
22+
}
23+
}),
24+
new BenchmarkTestStep("CompletingAllItems", (page) => {
25+
const checkboxes = page.querySelectorAll(".toggle");
26+
for (let i = 0; i < numberOfItemsToAdd; i++)
27+
checkboxes[i].click();
28+
}),
29+
new BenchmarkTestStep("DeletingAllItems", (page) => {
30+
const deleteButtons = page.querySelectorAll(".destroy");
31+
for (let i = numberOfItemsToAdd - 1; i >= 0; i--)
32+
deleteButtons[i].click();
33+
}),
34+
],
35+
},
36+
{
37+
name: "TodoMVC-Emoji",
38+
url: "resources/todomvc/vanilla-examples/javascript-web-components/dist/index.html",
39+
tags: ["todomvc", "experimental"],
40+
async prepare(page) {
41+
await page.waitForElement("todo-app");
42+
},
43+
tests: [
44+
new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => {
45+
const input = page.querySelector(".new-todo-input", ["todo-app", "todo-topbar"]);
46+
for (let i = 0; i < numberOfItemsToAdd; i++) {
47+
input.setValue(getTodoText("emoji", i));
48+
input.dispatchEvent("input");
49+
input.enter("keyup");
50+
}
51+
}),
52+
new BenchmarkTestStep("CompletingAllItems", (page) => {
53+
const items = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]);
54+
for (let i = 0; i < numberOfItemsToAdd; i++) {
55+
const item = items[i].querySelectorInShadowRoot(".toggle-todo-input");
56+
item.click();
57+
}
58+
}),
59+
new BenchmarkTestStep("DeletingAllItems", (page) => {
60+
const items = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]);
61+
for (let i = numberOfItemsToAdd - 1; i >= 0; i--) {
62+
const item = items[i].querySelectorInShadowRoot(".remove-todo-button");
63+
item.click();
64+
}
65+
}),
66+
],
67+
},
68+
{
69+
name: "TodoMVC-WebComponents-PostMessage",
70+
url: "resources/todomvc/vanilla-examples/javascript-web-components/dist/index.html",
71+
tags: ["experimental", "todomvc", "webcomponents"],
72+
async prepare() {},
73+
type: "remote",
74+
/* config: {
75+
name: "default", // optional param to target non-default tests locally
76+
}, */
77+
},
78+
{
79+
name: "TodoMVC-Jaspr-Dart2JS-O4",
80+
url: "experimental/todomvc-dart-jaspr/dist/out-dart2js-O4/index.html",
81+
tags: ["todomvc", "experimental"],
82+
async prepare(page) {
83+
(await page.waitForElement(".new-todo")).focus();
84+
},
85+
tests: [
86+
new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => {
87+
const newTodo = page.querySelector(".new-todo");
88+
for (let i = 0; i < numberOfItemsToAdd; i++) {
89+
newTodo.setValue(getTodoText("ja", i));
90+
newTodo.dispatchEvent("change");
91+
newTodo.enter("keypress");
92+
}
93+
}),
94+
new BenchmarkTestStep("CompletingAllItems", (page) => {
95+
const checkboxes = page.querySelectorAll(".toggle");
96+
for (let i = 0; i < numberOfItemsToAdd; i++)
97+
checkboxes[i].click();
98+
}),
99+
new BenchmarkTestStep("DeletingAllItems", (page) => {
100+
const deleteButtons = page.querySelectorAll(".destroy");
101+
for (let i = numberOfItemsToAdd - 1; i >= 0; i--)
102+
deleteButtons[i].click();
103+
}),
104+
],
105+
},
106+
{
107+
name: "TodoMVC-Jaspr-Dart2Wasm-O2",
108+
url: "experimental/todomvc-dart-jaspr/dist/out-dart2wasm-O2/index.html",
109+
tags: ["todomvc", "experimental"],
110+
disabled: true,
111+
async prepare(page) {
112+
(await page.waitForElement(".new-todo")).focus();
113+
},
114+
tests: [
115+
new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => {
116+
const newTodo = page.querySelector(".new-todo");
117+
for (let i = 0; i < numberOfItemsToAdd; i++) {
118+
newTodo.setValue(getTodoText("ja", i));
119+
newTodo.dispatchEvent("change");
120+
newTodo.enter("keypress");
121+
}
122+
}),
123+
new BenchmarkTestStep("CompletingAllItems", (page) => {
124+
const checkboxes = page.querySelectorAll(".toggle");
125+
for (let i = 0; i < numberOfItemsToAdd; i++)
126+
checkboxes[i].click();
127+
}),
128+
new BenchmarkTestStep("DeletingAllItems", (page) => {
129+
const deleteButtons = page.querySelectorAll(".destroy");
130+
for (let i = numberOfItemsToAdd - 1; i >= 0; i--)
131+
deleteButtons[i].click();
132+
}),
133+
],
134+
},
135+
{
136+
name: "NewsSite-PostMessage",
137+
url: "resources/newssite/news-next/dist/index.html",
138+
tags: ["experimental", "newssite", "language"],
139+
async prepare() {},
140+
type: "remote",
141+
/* config: {
142+
name: "default", // optional param to target non-default tests locally
143+
}, */
144+
},
145+
]);

resources/benchmark-configurator.mjs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// example url for local testing:
22
// http://localhost:8080/?developerMode=true&config=http://localhost:8080/resources/config.json
33
// since the json doesn't contain a default suite, dismiss warning popups and select from the developerMenu
4-
import { defaultSuites } from "./default-tests.mjs";
4+
import { DefaultSuites } from "./default-tests.mjs";
5+
import { ExperimentalSuites } from "../experimental/tests.mjs";
56
import { params } from "./shared/params.mjs";
67

78
const DEFAULT_TAGS = ["all", "default", "experimental"];
@@ -75,7 +76,7 @@ export class BenchmarkConfigurator {
7576
const benchmarkUrl = new URL(window.location);
7677
if (DISALLOWED_DOMAINS.some((domain) => benchmarkUrl.hostname.endsWith(domain))) {
7778
console.warn("Configuration fetch not allowed. Loading default suites.");
78-
this._loadDefaultSuites();
79+
this._loadSuites();
7980
return;
8081
}
8182

@@ -98,19 +99,24 @@ export class BenchmarkConfigurator {
9899
});
99100
} catch (error) {
100101
console.warn(`Error loading custom configuration: ${error.message}. Loading default suites.`);
101-
this._loadDefaultSuites();
102+
this._loadSuites();
102103
}
103104
} else {
104-
this._loadDefaultSuites();
105+
this._loadSuites();
105106
}
106107

107108
this._freezeTags();
108109
this._freezeSuites();
109110
}
110111

111-
_loadDefaultSuites() {
112-
defaultSuites.flatMap((suite) => suite.tags).forEach((tag) => this.#tags.add(tag));
113-
defaultSuites.forEach((suite) => this.#suites.push(suite));
112+
_loadSuites() {
113+
DefaultSuites.forEach((suite) => this._loadSuite(suite));
114+
ExperimentalSuites.forEach((suite) => this._loadSuite(suite));
115+
}
116+
117+
_loadSuite(suite) {
118+
suite.tags.forEach((tag) => this.#tags.add(tag));
119+
this.#suites.push(suite);
114120
}
115121

116122
enableSuites(names, tags) {

resources/default-tests.mjs

Lines changed: 3 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,9 @@
11
import { BenchmarkTestStep } from "./benchmark-runner.mjs";
22
import { getTodoText, defaultLanguage } from "./shared/translations.mjs";
33
import { numberOfItemsToAdd } from "./shared/todomvc-utils.mjs";
4+
import { freezeSuites } from "../resources/suites-helper.mjs";
45

5-
export const defaultSuites = [
6-
{
7-
name: "TodoMVC-LocalStorage",
8-
url: "experimental/todomvc-localstorage/dist/index.html",
9-
tags: ["todomvc"],
10-
async prepare(page) {
11-
(await page.waitForElement(".new-todo")).focus();
12-
page.getLocalStorage().getItem("javascript-es5");
13-
},
14-
tests: [
15-
new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => {
16-
const newTodo = page.querySelector(".new-todo");
17-
for (let i = 0; i < numberOfItemsToAdd; i++) {
18-
newTodo.setValue(getTodoText("ja", i));
19-
newTodo.dispatchEvent("change");
20-
newTodo.enter("keypress");
21-
}
22-
}),
23-
new BenchmarkTestStep("CompletingAllItems", (page) => {
24-
const checkboxes = page.querySelectorAll(".toggle");
25-
for (let i = 0; i < numberOfItemsToAdd; i++)
26-
checkboxes[i].click();
27-
}),
28-
new BenchmarkTestStep("DeletingAllItems", (page) => {
29-
const deleteButtons = page.querySelectorAll(".destroy");
30-
for (let i = numberOfItemsToAdd - 1; i >= 0; i--)
31-
deleteButtons[i].click();
32-
}),
33-
],
34-
},
35-
{
36-
name: "TodoMVC-Emoji",
37-
url: "resources/todomvc/vanilla-examples/javascript-web-components/dist/index.html",
38-
tags: ["todomvc", "experimental"],
39-
async prepare(page) {
40-
await page.waitForElement("todo-app");
41-
},
42-
tests: [
43-
new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => {
44-
const input = page.querySelector(".new-todo-input", ["todo-app", "todo-topbar"]);
45-
for (let i = 0; i < numberOfItemsToAdd; i++) {
46-
input.setValue(getTodoText("emoji", i));
47-
input.dispatchEvent("input");
48-
input.enter("keyup");
49-
}
50-
}),
51-
new BenchmarkTestStep("CompletingAllItems", (page) => {
52-
const items = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]);
53-
for (let i = 0; i < numberOfItemsToAdd; i++) {
54-
const item = items[i].querySelectorInShadowRoot(".toggle-todo-input");
55-
item.click();
56-
}
57-
}),
58-
new BenchmarkTestStep("DeletingAllItems", (page) => {
59-
const items = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]);
60-
for (let i = numberOfItemsToAdd - 1; i >= 0; i--) {
61-
const item = items[i].querySelectorInShadowRoot(".remove-todo-button");
62-
item.click();
63-
}
64-
}),
65-
],
66-
},
6+
export const DefaultSuites = freezeSuites([
677
{
688
name: "TodoMVC-JavaScript-ES5",
699
url: "resources/todomvc/vanilla-examples/javascript-es5/dist/index.html",
@@ -210,16 +150,6 @@ export const defaultSuites = [
210150
}),
211151
],
212152
},
213-
{
214-
name: "TodoMVC-WebComponents-PostMessage",
215-
url: "resources/todomvc/vanilla-examples/javascript-web-components/dist/index.html",
216-
tags: ["experimental", "todomvc", "webcomponents"],
217-
async prepare() {},
218-
type: "remote",
219-
/* config: {
220-
name: "default", // optional param to target non-default tests locally
221-
}, */
222-
},
223153
{
224154
name: "TodoMVC-WebComponents-Complex-DOM",
225155
url: "resources/todomvc/vanilla-examples/javascript-web-components-complex/dist/index.html",
@@ -770,63 +700,6 @@ export const defaultSuites = [
770700
}),
771701
],
772702
},
773-
{
774-
name: "TodoMVC-Jaspr-Dart2JS-O4",
775-
url: "experimental/todomvc-dart-jaspr/dist/out-dart2js-O4/index.html",
776-
tags: ["todomvc", "experimental"],
777-
async prepare(page) {
778-
(await page.waitForElement(".new-todo")).focus();
779-
},
780-
tests: [
781-
new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => {
782-
const newTodo = page.querySelector(".new-todo");
783-
for (let i = 0; i < numberOfItemsToAdd; i++) {
784-
newTodo.setValue(getTodoText("ja", i));
785-
newTodo.dispatchEvent("change");
786-
newTodo.enter("keypress");
787-
}
788-
}),
789-
new BenchmarkTestStep("CompletingAllItems", (page) => {
790-
const checkboxes = page.querySelectorAll(".toggle");
791-
for (let i = 0; i < numberOfItemsToAdd; i++)
792-
checkboxes[i].click();
793-
}),
794-
new BenchmarkTestStep("DeletingAllItems", (page) => {
795-
const deleteButtons = page.querySelectorAll(".destroy");
796-
for (let i = numberOfItemsToAdd - 1; i >= 0; i--)
797-
deleteButtons[i].click();
798-
}),
799-
],
800-
},
801-
{
802-
name: "TodoMVC-Jaspr-Dart2Wasm-O2",
803-
url: "experimental/todomvc-dart-jaspr/dist/out-dart2wasm-O2/index.html",
804-
tags: ["todomvc", "experimental"],
805-
disabled: true,
806-
async prepare(page) {
807-
(await page.waitForElement(".new-todo")).focus();
808-
},
809-
tests: [
810-
new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => {
811-
const newTodo = page.querySelector(".new-todo");
812-
for (let i = 0; i < numberOfItemsToAdd; i++) {
813-
newTodo.setValue(getTodoText("ja", i));
814-
newTodo.dispatchEvent("change");
815-
newTodo.enter("keypress");
816-
}
817-
}),
818-
new BenchmarkTestStep("CompletingAllItems", (page) => {
819-
const checkboxes = page.querySelectorAll(".toggle");
820-
for (let i = 0; i < numberOfItemsToAdd; i++)
821-
checkboxes[i].click();
822-
}),
823-
new BenchmarkTestStep("DeletingAllItems", (page) => {
824-
const deleteButtons = page.querySelectorAll(".destroy");
825-
for (let i = numberOfItemsToAdd - 1; i >= 0; i--)
826-
deleteButtons[i].click();
827-
}),
828-
],
829-
},
830703
{
831704
name: "NewsSite-Next",
832705
url: "resources/newssite/news-next/dist/index.html",
@@ -867,16 +740,6 @@ export const defaultSuites = [
867740
}),
868741
],
869742
},
870-
{
871-
name: "NewsSite-PostMessage",
872-
url: "resources/newssite/news-next/dist/index.html",
873-
tags: ["experimental", "newssite", "language"],
874-
async prepare() {},
875-
type: "remote",
876-
/* config: {
877-
name: "default", // optional param to target non-default tests locally
878-
}, */
879-
},
880743
{
881744
name: "NewsSite-Nuxt",
882745
url: "resources/newssite/news-nuxt/dist/index.html",
@@ -1077,4 +940,4 @@ export const defaultSuites = [
1077940
}),
1078941
],
1079942
},
1080-
];
943+
]);

resources/suites-helper.mjs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export function freezeSuites(suites) {
2+
suites = suites.map((suite) => {
3+
// FIXME: freeze tags
4+
// suite.tags = Object.freeze(suite.tags);
5+
suite.steps = Object.freeze(suite.steps);
6+
// FIXME: freeze suite after fixing the benchmark-configurator.
7+
// return Object.freeze(suite);
8+
return suite;
9+
});
10+
return suites;
11+
}

tests/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
await import("./unittests/benchmark-runner.mjs");
3131
await import("./unittests/params.mjs");
32+
await import("./unittests/suites.mjs");
3233

3334
globalThis.testResults = undefined;
3435
globalThis.testRunner = mocha.run();

0 commit comments

Comments
 (0)