| import { BenchmarkTestStep } from "./benchmark-runner.mjs"; |
| import { todos } from "./translations.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 Suites = []; |
| |
| Suites.enable = function (names, tags) { |
| if (names?.length) { |
| const lowerCaseNames = names.map((each) => each.toLowerCase()); |
| this.forEach((suite) => { |
| if (lowerCaseNames.includes(suite.name.toLowerCase())) |
| suite.disabled = false; |
| else |
| suite.disabled = true; |
| }); |
| } else if (tags?.length) { |
| tags.forEach((tag) => { |
| if (!Tags.has(tag)) |
| console.error(`Unknown Suites tag: "${tag}"`); |
| }); |
| const tagsSet = new Set(tags); |
| this.forEach((suite) => { |
| suite.disabled = !suite.tags.some((tag) => tagsSet.has(tag)); |
| }); |
| } else { |
| console.warn("Neither names nor tags provided. Enabling all default suites."); |
| this.forEach((suite) => { |
| suite.disabled = !("default" in suite.tags); |
| }); |
| } |
| if (this.some((suite) => !suite.disabled)) |
| return; |
| let message, debugInfo; |
| if (names?.length) { |
| message = `Suites "${names}" does not match any Suite. No tests to run.`; |
| debugInfo = { |
| providedNames: names, |
| validNames: this.map((each) => each.name), |
| }; |
| } else if (tags?.length) { |
| message = `Tags "${tags}" does not match any Suite. No tests to run.`; |
| debugInfo = { |
| providedTags: tags, |
| validTags: Array.from(Tags), |
| }; |
| } |
| alert(message); |
| console.error(message, debugInfo); |
| }; |
| |
| Suites.push({ |
| name: "TodoMVC-JavaScript-ES5", |
| url: "todomvc/vanilla-examples/javascript-es5/dist/index.html", |
| tags: ["todomvc"], |
| 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-JavaScript-ES5-Complex-DOM", |
| url: "todomvc/vanilla-examples/javascript-es5-complex/dist/index.html", |
| tags: ["todomvc", "complex"], |
| 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-JavaScript-ES6-Webpack", |
| url: "todomvc/vanilla-examples/javascript-es6-webpack/dist/index.html", |
| tags: ["todomvc"], |
| disabled: true, |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText("ru", 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-JavaScript-ES6-Webpack-Complex-DOM", |
| url: "todomvc/vanilla-examples/javascript-es6-webpack-complex/dist/index.html", |
| tags: ["todomvc", "complex", "complex-default"], |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText("ru", 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-WebComponents", |
| url: "todomvc/vanilla-examples/javascript-web-components/dist/index.html", |
| tags: ["todomvc", "webcomponents"], |
| 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(defaultLanguage, 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-WebComponents-Complex-DOM", |
| url: "todomvc/vanilla-examples/javascript-web-components-complex/dist/index.html", |
| tags: ["todomvc", "webcomponents", "complex"], |
| disabled: true, |
| 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(defaultLanguage, 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-React", |
| url: "todomvc/architecture-examples/react/dist/index.html#/home", |
| tags: ["todomvc"], |
| disabled: true, |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.dispatchEvent("input"); |
| newTodo.enter("keydown"); |
| } |
| }), |
| 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-React-Complex-DOM", |
| url: "todomvc/architecture-examples/react-complex/dist/index.html#/home", |
| tags: ["todomvc", "complex", "complex-default"], |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.dispatchEvent("input"); |
| newTodo.enter("keydown"); |
| } |
| }), |
| 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(); |
| }), |
| ], |
| }); |
| |
| // Downstream only. |
| Suites.push({ |
| name: "TodoMVC-React-Window", |
| url: "todomvc/architecture-examples/react/dist/index-window.html#/home", |
| tags: ["todomvc"], |
| disabled: true, |
| async prepare(page) { |
| await page.targetChildWindow(); |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.dispatchEvent("input"); |
| newTodo.enter("keydown"); |
| } |
| }), |
| 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-React-Redux", |
| url: "todomvc/architecture-examples/react-redux/dist/index.html", |
| tags: ["todomvc"], |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.enter("keydown"); |
| } |
| }), |
| 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-React-Redux-Complex-DOM", |
| url: "todomvc/architecture-examples/react-redux-complex/dist/index.html", |
| tags: ["todomvc", "complex"], |
| disabled: true, |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.enter("keydown"); |
| } |
| }), |
| 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-Backbone", |
| url: "todomvc/architecture-examples/backbone/dist/index.html", |
| tags: ["todomvc"], |
| async prepare(page) { |
| await page.waitForElement("#appIsReady"); |
| const newTodo = page.querySelector(".new-todo"); |
| newTodo.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, 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-Backbone-Complex-DOM", |
| url: "todomvc/architecture-examples/backbone-complex/dist/index.html", |
| tags: ["todomvc", "complex"], |
| disabled: true, |
| async prepare(page) { |
| await page.waitForElement("#appIsReady"); |
| const newTodo = page.querySelector(".new-todo"); |
| newTodo.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, 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-Angular", |
| url: "todomvc/architecture-examples/angular/dist/index.html", |
| tags: ["todomvc"], |
| disabled: true, |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.dispatchEvent("input"); |
| newTodo.enter("keyup"); |
| } |
| }), |
| 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-Angular-Complex-DOM", |
| url: "todomvc/architecture-examples/angular-complex/dist/index.html", |
| tags: ["todomvc", "complex", "complex-default"], |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.dispatchEvent("input"); |
| newTodo.enter("keyup"); |
| } |
| }), |
| 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-Vue", |
| url: "todomvc/architecture-examples/vue/dist/index.html", |
| tags: ["todomvc"], |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.dispatchEvent("input"); |
| newTodo.enter("keyup"); |
| } |
| }), |
| 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-Vue-Complex-DOM", |
| url: "todomvc/architecture-examples/vue-complex/dist/index.html", |
| tags: ["todomvc", "complex", "complex-default"], |
| disabled: true, |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.dispatchEvent("input"); |
| newTodo.enter("keyup"); |
| } |
| }), |
| 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-jQuery", |
| url: "todomvc/architecture-examples/jquery/dist/index.html", |
| tags: ["todomvc"], |
| async prepare(page) { |
| await page.waitForElement("#appIsReady"); |
| const newTodo = page.getElementById("new-todo"); |
| newTodo.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.enter("keyup"); |
| } |
| }), |
| new BenchmarkTestStep("CompletingAllItems", (page) => { |
| for (let i = 1; i <= numberOfItemsToAdd; i++) |
| page.querySelector(`li:nth-child(${i}) .toggle`).click(); |
| }), |
| new BenchmarkTestStep("DeletingAllItems", (page) => { |
| for (let i = numberOfItemsToAdd - 1; i >= 0; i--) |
| page.querySelector(".destroy").click(); |
| }), |
| ], |
| }); |
| |
| Suites.push({ |
| name: "TodoMVC-jQuery-Complex-DOM", |
| url: "todomvc/architecture-examples/jquery-complex/dist/index.html", |
| tags: ["todomvc", "complex"], |
| disabled: true, |
| async prepare(page) { |
| await page.waitForElement("#appIsReady"); |
| const newTodo = page.getElementById("new-todo"); |
| newTodo.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.enter("keyup"); |
| } |
| }), |
| new BenchmarkTestStep("CompletingAllItems", (page) => { |
| for (let i = 1; i <= numberOfItemsToAdd; i++) |
| page.querySelector(`li:nth-child(${i}) .toggle`).click(); |
| }), |
| new BenchmarkTestStep("DeletingAllItems", (page) => { |
| for (let i = numberOfItemsToAdd - 1; i >= 0; i--) |
| page.querySelector(".destroy").click(); |
| }), |
| ], |
| }); |
| |
| Suites.push({ |
| name: "TodoMVC-Preact", |
| url: "todomvc/architecture-examples/preact/dist/index.html#/home", |
| tags: ["todomvc"], |
| disabled: true, |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.enter("keydown"); |
| } |
| }), |
| 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-Preact-Complex-DOM", |
| url: "todomvc/architecture-examples/preact-complex/dist/index.html#/home", |
| tags: ["todomvc", "complex", "complex-default"], |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.enter("keydown"); |
| } |
| }), |
| 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-Svelte", |
| url: "todomvc/architecture-examples/svelte/dist/index.html", |
| tags: ["todomvc"], |
| disabled: true, |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.enter("keydown"); |
| } |
| }), |
| 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-Svelte-Complex-DOM", |
| url: "todomvc/architecture-examples/svelte-complex/dist/index.html", |
| tags: ["todomvc", "complex", "complex-default"], |
| async prepare(page) { |
| const element = await page.waitForElement(".new-todo"); |
| element.focus(); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo"); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.enter("keydown"); |
| } |
| }), |
| 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-Lit", |
| url: "todomvc/architecture-examples/lit/dist/index.html", |
| tags: ["todomvc", "webcomponents"], |
| disabled: true, |
| async prepare(page) { |
| await page.waitForElement("todo-app"); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo", ["todo-app", "todo-form"]); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.enter("keydown"); |
| } |
| }), |
| new BenchmarkTestStep("CompletingAllItems", (page) => { |
| const todoItems = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| const checkbox = todoItems[i].querySelectorInShadowRoot(".toggle"); |
| checkbox.click(); |
| } |
| }), |
| new BenchmarkTestStep("DeletingAllItems", (page) => { |
| const todoItems = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]); |
| for (let i = numberOfItemsToAdd - 1; i >= 0; i--) { |
| const deleteButton = todoItems[i].querySelectorInShadowRoot(".destroy"); |
| deleteButton.click(); |
| } |
| }), |
| ], |
| }); |
| |
| Suites.push({ |
| name: "TodoMVC-Lit-Complex-DOM", |
| url: "todomvc/architecture-examples/lit-complex/dist/index.html", |
| tags: ["todomvc", "webcomponents", "complex", "complex-default"], |
| async prepare(page) { |
| await page.waitForElement("todo-app"); |
| }, |
| tests: [ |
| new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { |
| const newTodo = page.querySelector(".new-todo", ["todo-app", "todo-form"]); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| newTodo.setValue(getTodoText(defaultLanguage, i)); |
| newTodo.enter("keydown"); |
| } |
| }), |
| new BenchmarkTestStep("CompletingAllItems", (page) => { |
| const todoItems = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]); |
| for (let i = 0; i < numberOfItemsToAdd; i++) { |
| const checkbox = todoItems[i].querySelectorInShadowRoot(".toggle"); |
| checkbox.click(); |
| } |
| }), |
| new BenchmarkTestStep("DeletingAllItems", (page) => { |
| const todoItems = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]); |
| for (let i = numberOfItemsToAdd - 1; i >= 0; i--) { |
| const deleteButton = todoItems[i].querySelectorInShadowRoot(".destroy"); |
| deleteButton.click(); |
| } |
| }), |
| ], |
| }); |
| |
| Suites.push({ |
| name: "NewsSite-Next", |
| url: "newssite/news-next/dist/index.html#/home", |
| tags: ["newssite", "language"], |
| async prepare(page) { |
| await page.waitForElement("#navbar-dropdown-toggle"); |
| }, |
| tests: [ |
| new BenchmarkTestStep("NavigateToUS", (page) => { |
| for (let i = 0; i < 25; i++) { |
| page.querySelector("#navbar-dropdown-toggle").click(); |
| page.layout(); |
| page.querySelector("#navbar-dropdown-toggle").click(); |
| page.layout(); |
| } |
| page.querySelector("#navbar-navlist-us-link").click(); |
| page.layout(); |
| }), |
| new BenchmarkTestStep("NavigateToWorld", (page) => { |
| for (let i = 0; i < 25; i++) { |
| page.querySelector("#navbar-dropdown-toggle").click(); |
| page.layout(); |
| page.querySelector("#navbar-dropdown-toggle").click(); |
| page.layout(); |
| } |
| page.querySelector("#navbar-navlist-world-link").click(); |
| page.layout(); |
| }), |
| new BenchmarkTestStep("NavigateToPolitics", (page) => { |
| for (let i = 0; i < 25; i++) { |
| page.querySelector("#navbar-dropdown-toggle").click(); |
| page.layout(); |
| page.querySelector("#navbar-dropdown-toggle").click(); |
| page.layout(); |
| } |
| page.querySelector("#navbar-navlist-politics-link").click(); |
| page.layout(); |
| }), |
| ], |
| }); |
| |
| Suites.push({ |
| name: "NewsSite-Nuxt", |
| url: "newssite/news-nuxt/dist/index.html", |
| tags: ["newssite"], |
| async prepare(page) { |
| await page.waitForElement("#navbar-dropdown-toggle"); |
| }, |
| tests: [ |
| new BenchmarkTestStep("NavigateToUS", (page) => { |
| for (let i = 0; i < 25; i++) { |
| page.querySelector("#navbar-dropdown-toggle").click(); |
| page.layout(); |
| page.querySelector("#navbar-dropdown-toggle").click(); |
| page.layout(); |
| } |
| page.querySelector("#navbar-navlist-us-link").click(); |
| page.layout(); |
| }), |
| new BenchmarkTestStep("NavigateToWorld", (page) => { |
| for (let i = 0; i < 25; i++) { |
| page.querySelector("#navbar-dropdown-toggle").click(); |
| page.layout(); |
| page.querySelector("#navbar-dropdown-toggle").click(); |
| page.layout(); |
| } |
| page.querySelector("#navbar-navlist-world-link").click(); |
| page.layout(); |
| }), |
| new BenchmarkTestStep("NavigateToPolitics", (page) => { |
| for (let i = 0; i < 25; i++) { |
| page.querySelector("#navbar-dropdown-toggle").click(); |
| page.layout(); |
| page.querySelector("#navbar-dropdown-toggle").click(); |
| page.layout(); |
| } |
| page.querySelector("#navbar-navlist-politics-link").click(); |
| page.layout(); |
| }), |
| ], |
| }); |
| |
| Suites.push({ |
| name: "Editor-CodeMirror", |
| url: "editors/dist/codemirror.html", |
| tags: ["editor"], |
| async prepare(page) {}, |
| tests: [ |
| new BenchmarkTestStep("Long", (page) => { |
| page.querySelector("#create").click(); |
| page.querySelector("#layout").click(); |
| page.querySelector("#long").click(); |
| page.querySelector("#layout").click(); |
| }), |
| new BenchmarkTestStep("Highlight", (page) => { |
| page.querySelector("#highlight").click(); |
| page.querySelector("#layout").click(); |
| }), |
| ], |
| }); |
| |
| Suites.push({ |
| name: "Editor-TipTap", |
| url: "editors/dist/tiptap.html", |
| tags: ["editor"], |
| async prepare(page) {}, |
| tests: [ |
| new BenchmarkTestStep("Long", (page) => { |
| page.querySelector("#create").click(); |
| page.querySelector("#layout").click(); |
| page.querySelector("#long").click(); |
| page.querySelector("#layout").click(); |
| }), |
| new BenchmarkTestStep("Highlight", (page) => { |
| page.querySelector("#highlight").click(); |
| page.querySelector("#layout").click(); |
| }), |
| ], |
| }); |
| |
| Suites.push({ |
| name: "Charts-observable-plot", |
| url: "charts/dist/observable-plot.html", |
| tags: ["chart"], |
| async prepare(page) {}, |
| tests: [ |
| new BenchmarkTestStep("Stacked by 6", (page) => { |
| page.querySelector("#prepare").click(); |
| page.querySelector("#reset").click(); |
| page.querySelector("#add-stacked-chart-button").click(); |
| }), |
| new BenchmarkTestStep("Stacked by 20", (page) => { |
| const sizeSlider = page.querySelector("#airport-group-size-input"); |
| sizeSlider.setValue(20); |
| sizeSlider.dispatchEvent("input"); |
| sizeSlider.dispatchEvent("change"); |
| page.querySelector("#prepare").click(); |
| page.querySelector("#reset").click(); |
| page.querySelector("#add-stacked-chart-button").click(); |
| }), |
| new BenchmarkTestStep("Dotted", (page) => { |
| page.querySelector("#reset").click(); |
| page.querySelector("#add-dotted-chart-button").click(); |
| }), |
| ], |
| }); |
| |
| Suites.push({ |
| name: "Charts-chartjs", |
| url: "charts/dist/chartjs.html", |
| tags: ["chart"], |
| async prepare(page) {}, |
| tests: [ |
| new BenchmarkTestStep("Draw scatter", (page) => { |
| page.querySelector("#prepare").click(); |
| page.querySelector("#add-scatter-chart-button").click(); |
| }), |
| new BenchmarkTestStep("Show tooltip", (page) => { |
| page.querySelector("#open-tooltip").click(); |
| }), |
| new BenchmarkTestStep("Draw opaque scatter", (page) => { |
| page.querySelector("#opaque-color").click(); |
| page.querySelector("#add-scatter-chart-button").click(); |
| }), |
| ], |
| }); |
| |
| Suites.push({ |
| name: "React-Stockcharts-SVG", |
| url: "react-stockcharts/build/index.html?type=svg", |
| tags: ["chart", "svg"], |
| async prepare(page) { |
| await page.waitForElement("#render"); |
| }, |
| tests: [ |
| new BenchmarkTestStep("Render", (page) => { |
| page.getElementById("render").click(); |
| }), |
| new BenchmarkTestStep("PanTheChart", (page) => { |
| const cursor = page.querySelector(".react-stockcharts-crosshair-cursor"); |
| let x = 150; |
| let y = 200; |
| const coords = (i) => ({ clientX: x + i * 10, clientY: y + i * 2, bubbles: true, cancelable: true }); |
| for (let i = 0; i < 5; i++) { |
| cursor.dispatchEvent("mousedown", coords(0), MouseEvent); |
| for (let j = 0; j < 10; j++) |
| cursor.dispatchEvent("mousemove", coords(j), MouseEvent); |
| cursor.dispatchEvent("mouseup", coords(10), MouseEvent); |
| } |
| }), |
| new BenchmarkTestStep("ZoomTheChart", (page) => { |
| const cursor = page.querySelector(".react-stockcharts-crosshair-cursor"); |
| let event = { |
| clientX: 200, |
| clientY: 200, |
| deltaMode: 0, |
| delta: -10, |
| deltaY: -10, |
| bubbles: true, |
| cancelable: true, |
| }; |
| for (let i = 0; i < 15; i++) |
| cursor.dispatchEvent("wheel", event, WheelEvent); |
| }), |
| ], |
| }); |
| |
| Suites.push({ |
| name: "Perf-Dashboard", |
| url: "perf.webkit.org/public/v3/#/charts/?since=1678991819934&paneList=((55-1974-null-null-(5-2.5-500)))", |
| tags: ["chart", "webcomponents"], |
| async prepare(page) { |
| await page.waitForElement("#app-is-ready"); |
| page.call("startTest"); |
| page.callAsync("serviceRAF"); |
| await new Promise((resolve) => setTimeout(resolve, 1)); |
| }, |
| tests: [ |
| new BenchmarkTestStep("Render", (page) => { |
| page.call("openCharts"); |
| page.call("serviceRAF"); |
| }), |
| new BenchmarkTestStep("SelectingPoints", (page) => { |
| const chartPane = page.callToGetElement("getChartPane"); |
| for (let i = 0; i < 20; ++i) { |
| chartPane.dispatchKeyEvent("keydown", 39 /* Right */, "ArrowRight"); |
| page.call("serviceRAF"); |
| } |
| }), |
| new BenchmarkTestStep("SelectingRange", (page) => { |
| const canvas = page.callToGetElement("getChartCanvas"); |
| const startingX = 118; |
| const startingY = 155; |
| const endingX = 210; |
| const endingY = 121; |
| canvas.dispatchMouseEvent("mousedown", startingX, startingY); |
| page.call("serviceRAF"); |
| const movementCount = 20; |
| for (let i = 0; i <= movementCount; ++i) { |
| canvas.dispatchMouseEvent("mousemove", startingX + ((endingX - startingX) * i) / movementCount, startingY + ((endingY - startingY) * i) / movementCount); |
| page.call("serviceRAF"); |
| } |
| canvas.dispatchMouseEvent("mouseup", endingX, endingY); |
| page.call("serviceRAF"); |
| }), |
| ], |
| }); |
| |
| |
| Object.freeze(Suites); |
| Suites.forEach((suite) => { |
| if (!suite.tags) |
| suite.tags = []; |
| if (suite.url.startsWith("tentative/")) |
| suite.tags.unshift("all", "tentative"); |
| else if (suite.disabled) |
| suite.tags.unshift("all"); |
| else |
| suite.tags.unshift("all", "default"); |
| Object.freeze(suite.tags); |
| Object.freeze(suite.steps); |
| }); |
| |
| export const Tags = new Set(["all", "default", "tentative", ...Suites.flatMap((suite) => suite.tags)]); |
| Object.freeze(Tags); |
| |
| globalThis.Suites = Suites; |
| globalThis.Tags = Tags; |