diff --git a/resources/developer-mode.mjs b/resources/developer-mode.mjs index 9b67d1e7e..ec906d4a6 100644 --- a/resources/developer-mode.mjs +++ b/resources/developer-mode.mjs @@ -1,5 +1,6 @@ -import { params, LAYOUT_MODES } from "./shared/params.mjs"; +import { params, LAYOUT_MODES, defaultParams } from "./shared/params.mjs"; import { benchmarkConfigurator } from "./benchmark-configurator.mjs"; +import { handleComplexityChange } from "./shared/todomvc-utils.mjs"; const { suites, tags } = benchmarkConfigurator; @@ -28,6 +29,7 @@ export function createDeveloperModeContainer() { settings.append(createUIForWaitAfterSuite()); settings.append(createUIForAsyncSteps()); settings.append(createUIForLayoutMode()); + settings.append(createUIForComplexity()); content.append(document.createElement("hr")); content.append(settings); @@ -70,7 +72,7 @@ function createCheckboxUI(labelValue, initialValue, paramsUpdateCallback) { checkbox.checked = !!initialValue; checkbox.onchange = () => { paramsUpdateCallback(checkbox.checked); - updateURL(); + handleParamsChange(); }; const label = document.createElement("label"); @@ -80,31 +82,57 @@ function createCheckboxUI(labelValue, initialValue, paramsUpdateCallback) { } function createUIForIterationCount() { - return createTimeRangeUI("Iterations: ", "iterationCount", "#", 1, 200); + return createLinearRangeUI("Iterations: ", "iterationCount", "#", 1, 200); } function createUIForWarmupBeforeSync() { - return createTimeRangeUI("Warmup time: ", "warmupBeforeSync"); + return createLinearRangeUI("Warmup time: ", "warmupBeforeSync"); } function createUIForSyncStepDelay() { - return createTimeRangeUI("Sync step delay: ", "waitBeforeSync"); + return createLinearRangeUI("Sync step delay: ", "waitBeforeSync"); } function createUIForWaitAfterSetup() { - return createTimeRangeUI("Post setup delay: ", "waitAfterSetup"); + return createLinearRangeUI("Post setup delay: ", "waitAfterSetup"); } function createUIForWaitAfterSuite() { - return createTimeRangeUI("Post suite delay: ", "waitAfterSuite"); + return createLinearRangeUI("Post suite delay: ", "waitAfterSuite"); } -function createTimeRangeUI(labelText, paramKey, unit = "ms", min = 0, max = 1000) { - const range = document.createElement("input"); - range.type = "range"; +function createUIForComplexity() { + return createExpRangeUI("Relative complexity: ", "complexity", "x", 0.01, 100, 0.01); +} + +function createLinearRangeUI(labelText, paramKey, unit = "ms", min = 0, max = 1000, step = 1) { + const initialValue = params[paramKey]; + const linearMap = (value) => value; + const { range, label } = createTimeRangeUI(labelText, paramKey, unit, linearMap, 0); range.min = min; range.max = max; - range.value = params[paramKey]; + range.step = step; + range.value = initialValue; + return label; +} + +function createExpRangeUI(labelText, paramKey, unit = "ms", min = 0, max = 1000, step = 1) { + const defaultValue = defaultParams[paramKey]; + const initialValue = params[paramKey]; + const b = defaultValue - 1; + const a = -Math.log(min - b); + const logMap = (value) => Math.round((Math.exp(value * a) + b) / step) * step; + const { range, label } = createTimeRangeUI(labelText, paramKey, unit, logMap, 2); + range.min = -1; + range.max = Math.log(max - b) / a; + range.step = 0.01; + range.value = Math.log(initialValue - b) / a; + return label; +} + +function createTimeRangeUI(labelText, paramKey, unit = "ms", map, decimals) { + const range = document.createElement("input"); + range.type = "range"; const rangeValueAndUnit = document.createElement("span"); rangeValueAndUnit.className = "range-label-data"; @@ -117,14 +145,14 @@ function createTimeRangeUI(labelText, paramKey, unit = "ms", min = 0, max = 1000 label.append(span(labelText), range, rangeValueAndUnit); range.oninput = () => { - rangeValue.textContent = range.value; + rangeValue.textContent = map(Number(range.value)).toFixed(decimals); }; range.onchange = () => { - params[paramKey] = parseInt(range.value); - updateURL(); + params[paramKey] = map(Number(range.value)); + handleParamsChange(); }; - return label; + return { range, label }; } function createUIForLayoutMode() { @@ -137,7 +165,7 @@ function createSelectUI(labelValue, initialValue, choices, paramsUpdateCallback) const select = document.createElement("select"); select.onchange = () => { paramsUpdateCallback(select.value); - updateURL(); + handleParamsChange(); }; choices.forEach((choice) => { @@ -172,7 +200,7 @@ function createUIForSuites() { checkbox.checked = suite.enabled; checkbox.onchange = () => { suite.enabled = checkbox.checked; - updateURL(); + handleParamsChange(); }; checkboxes.push(checkbox); @@ -208,7 +236,7 @@ function createSuitesGlobalSelectButtons(setSuiteEnabled) { for (let suiteIndex = 0; suiteIndex < suites.length; suiteIndex++) setSuiteEnabled(suiteIndex, true); - updateURL(); + handleParamsChange(); }; buttons.appendChild(button); @@ -219,7 +247,7 @@ function createSuitesGlobalSelectButtons(setSuiteEnabled) { for (let suiteIndex = 0; suiteIndex < suites.length; suiteIndex++) setSuiteEnabled(suiteIndex, false); - updateURL(); + handleParamsChange(); }; buttons.appendChild(button); return buttons; @@ -255,7 +283,7 @@ function createSuitesTagsButton(setSuiteEnabled) { continue; setSuiteEnabled(suiteIndex, enabled); } - updateURL(); + handleParamsChange(); }; buttons.appendChild(button); } @@ -305,8 +333,9 @@ function updateParamsSuitesAndTags() { params.suites = selectedSuites.map((suite) => suite.name); } -function updateURL() { +function handleParamsChange() { updateParamsSuitesAndTags(); + handleComplexityChange(); const url = new URL(window.location.href); url.search = params.toSearchParams(); diff --git a/resources/shared/params.mjs b/resources/shared/params.mjs index 5e6246320..466f48959 100644 --- a/resources/shared/params.mjs +++ b/resources/shared/params.mjs @@ -33,6 +33,10 @@ export class Params { // "generate": generate a random seed // : use the provided integer as a seed shuffleSeed = "off"; + // Param to tweak the relative complexity of all suites. + // The default is 1.0, and for suites supporting this param, the duration + // roughly scales with the complexity. + complexity = 1.0; // Choices: "getBoundingClientRect" or "getBoundingRectAndElementFromPoint" layoutMode = LAYOUT_MODES[0]; // Measure more workload prepare time. @@ -49,8 +53,17 @@ export class Params { } } - _parseInt(value, errorMessage) { + _parseNumber(value, errorMessage, minValue = 0) { const number = Number(value); + if (!Number.isFinite(number) && errorMessage) + throw new Error(`Invalid ${errorMessage} param: '${value}', expected Number.`); + if (number < minValue) + throw new Error(`Invalid ${errorMessage} param: '${value}', value must be >= ${minValue}.`); + return number; + } + + _parseInt(value, errorMessage, minValue = 0) { + const number = this._parseNumber(value, errorMessage, minValue); if (!Number.isInteger(number) && errorMessage) throw new Error(`Invalid ${errorMessage} param: '${value}', expected int.`); return parseInt(number); @@ -71,6 +84,7 @@ export class Params { this.warmupBeforeSync = this._parseIntParam(searchParams, "warmupBeforeSync", 0); this.measurementMethod = this._parseEnumParam(searchParams, "measurementMethod", ["raf"]); this.shuffleSeed = this._parseShuffleSeed(searchParams); + this.complexity = this._parserNumberParam(searchParams, "complexity", 0); this.layoutMode = this._parseEnumParam(searchParams, "layoutMode", LAYOUT_MODES); this.measurePrepare = this._parseBooleanParam(searchParams, "measurePrepare"); this.config = this._parseConfig(searchParams); @@ -89,13 +103,18 @@ export class Params { return true; } - _parseIntParam(searchParams, paramKey, minValue) { + _parserNumberParam(searchParams, paramKey, minValue) { if (!searchParams.has(paramKey)) return defaultParams[paramKey]; + const parsedValue = this._parseNumber(searchParams.get(paramKey), "waitBeforeSync", minValue); + searchParams.delete(paramKey); + return parsedValue; + } - const parsedValue = this._parseInt(searchParams.get(paramKey), "waitBeforeSync"); - if (parsedValue < minValue) - throw new Error(`Invalid ${paramKey} param: '${parsedValue}', value must be >= ${minValue}.`); + _parseIntParam(searchParams, paramKey, minValue) { + if (!searchParams.has(paramKey)) + return defaultParams[paramKey]; + const parsedValue = this._parseInt(searchParams.get(paramKey), "waitBeforeSync", minValue); searchParams.delete(paramKey); return parsedValue; } diff --git a/resources/shared/todomvc-utils.mjs b/resources/shared/todomvc-utils.mjs index dca451575..d10da163d 100644 --- a/resources/shared/todomvc-utils.mjs +++ b/resources/shared/todomvc-utils.mjs @@ -1 +1,12 @@ -export const numberOfItemsToAdd = 100; +import { params } from "./params.mjs"; + +export const defaultNumberOfItemsToAdd = 100; +export let numberOfItemsToAdd = defaultNumberOfItemsToAdd; + +export function getNumberOfItemsToAdd() { + return numberOfItemsToAdd; +} + +export function handleComplexityChange() { + numberOfItemsToAdd = Math.round(defaultNumberOfItemsToAdd * params.complexity); +} diff --git a/suites-experimental/suites.mjs b/suites-experimental/suites.mjs index a47d6aa89..2f740e4bd 100644 --- a/suites-experimental/suites.mjs +++ b/suites-experimental/suites.mjs @@ -1,6 +1,6 @@ import { BenchmarkTestStep } from "../resources/benchmark-runner.mjs"; import { getTodoText } from "../resources/shared/translations.mjs"; -import { numberOfItemsToAdd } from "../resources/shared/todomvc-utils.mjs"; +import { getNumberOfItemsToAdd } from "../resources/shared/todomvc-utils.mjs"; import { freezeSuites } from "../resources/suites-helper.mjs"; export const ExperimentalSuites = freezeSuites([ @@ -14,7 +14,8 @@ export const ExperimentalSuites = freezeSuites([ page.getLocalStorage().getItem("javascript-es5"); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText("ja", i)); @@ -23,11 +24,13 @@ export const ExperimentalSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -43,7 +46,8 @@ export const ExperimentalSuites = freezeSuites([ await page.waitForElement("todo-app"); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const input = page.querySelector(".new-todo-input", ["todo-app", "todo-topbar"]); for (let i = 0; i < numberOfItemsToAdd; i++) { input.setValue(getTodoText("emoji", i)); @@ -52,6 +56,7 @@ export const ExperimentalSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); 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"); @@ -59,6 +64,7 @@ export const ExperimentalSuites = freezeSuites([ } }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); 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"); @@ -87,7 +93,8 @@ export const ExperimentalSuites = freezeSuites([ (await page.waitForElement(".new-todo")).focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText("ja", i)); @@ -96,11 +103,13 @@ export const ExperimentalSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -117,7 +126,8 @@ export const ExperimentalSuites = freezeSuites([ (await page.waitForElement(".new-todo")).focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText("ja", i)); @@ -126,11 +136,13 @@ export const ExperimentalSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); diff --git a/suites/default-suites.mjs b/suites/default-suites.mjs index 89f7660d0..2e9522bc6 100644 --- a/suites/default-suites.mjs +++ b/suites/default-suites.mjs @@ -1,6 +1,6 @@ import { BenchmarkTestStep } from "../resources/benchmark-runner.mjs"; import { getTodoText, defaultLanguage } from "../resources/shared/translations.mjs"; -import { numberOfItemsToAdd } from "../resources/shared/todomvc-utils.mjs"; +import { getNumberOfItemsToAdd } from "../resources/shared/todomvc-utils.mjs"; import { freezeSuites } from "../resources/suites-helper.mjs"; export const DefaultSuites = freezeSuites([ @@ -14,7 +14,8 @@ export const DefaultSuites = freezeSuites([ (await page.waitForElement(".new-todo")).focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText("ja", i)); @@ -23,11 +24,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -43,7 +46,8 @@ export const DefaultSuites = freezeSuites([ (await page.waitForElement(".new-todo")).focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText("ja", i)); @@ -52,11 +56,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -73,7 +79,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText("ru", i)); @@ -82,11 +89,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -103,7 +112,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText("ru", i)); @@ -112,11 +122,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -132,7 +144,8 @@ export const DefaultSuites = freezeSuites([ await page.waitForElement("todo-app"); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const input = page.querySelector(".new-todo-input", ["todo-app", "todo-topbar"]); for (let i = 0; i < numberOfItemsToAdd; i++) { input.setValue(getTodoText(defaultLanguage, i)); @@ -141,6 +154,7 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); 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"); @@ -148,6 +162,7 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); 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"); @@ -165,7 +180,8 @@ export const DefaultSuites = freezeSuites([ await page.waitForElement("todo-app"); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const input = page.querySelector(".new-todo-input", ["todo-app", "todo-topbar"]); for (let i = 0; i < numberOfItemsToAdd; i++) { input.setValue(getTodoText(defaultLanguage, i)); @@ -174,6 +190,7 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); 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"); @@ -181,6 +198,7 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); 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"); @@ -199,7 +217,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -208,11 +227,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -229,7 +250,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -238,11 +260,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -259,7 +283,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -267,11 +292,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -288,7 +315,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -296,11 +324,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -318,7 +348,8 @@ export const DefaultSuites = freezeSuites([ newTodo.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -327,11 +358,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -349,7 +382,8 @@ export const DefaultSuites = freezeSuites([ newTodo.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -358,11 +392,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -379,7 +415,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -388,11 +425,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -409,7 +448,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -418,11 +458,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -439,7 +481,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -448,11 +491,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -469,7 +514,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -478,11 +524,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -500,7 +548,8 @@ export const DefaultSuites = freezeSuites([ newTodo.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -508,10 +557,12 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); for (let i = 1; i <= numberOfItemsToAdd; i++) page.querySelector(`li:nth-child(${i}) .toggle`).click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) page.querySelector(".destroy").click(); }), @@ -528,7 +579,8 @@ export const DefaultSuites = freezeSuites([ newTodo.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -536,10 +588,12 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); for (let i = 1; i <= numberOfItemsToAdd; i++) page.querySelector(`li:nth-child(${i}) .toggle`).click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) page.querySelector(".destroy").click(); }), @@ -555,7 +609,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -563,11 +618,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -584,7 +641,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -592,11 +650,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -613,7 +673,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -621,11 +682,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -642,7 +705,8 @@ export const DefaultSuites = freezeSuites([ element.focus(); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo"); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -650,11 +714,13 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const checkboxes = page.querySelectorAll(".toggle"); for (let i = 0; i < numberOfItemsToAdd; i++) checkboxes[i].click(); }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const deleteButtons = page.querySelectorAll(".destroy"); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) deleteButtons[i].click(); @@ -670,7 +736,8 @@ export const DefaultSuites = freezeSuites([ await page.waitForElement("todo-app"); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo", ["todo-app", "todo-form"]); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -678,6 +745,7 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const todoItems = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]); for (let i = 0; i < numberOfItemsToAdd; i++) { const checkbox = todoItems[i].querySelectorInShadowRoot(".toggle"); @@ -685,6 +753,7 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const todoItems = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) { const deleteButton = todoItems[i].querySelectorInShadowRoot(".destroy"); @@ -702,7 +771,8 @@ export const DefaultSuites = freezeSuites([ await page.waitForElement("todo-app"); }, tests: [ - new BenchmarkTestStep(`Adding${numberOfItemsToAdd}Items`, (page) => { + new BenchmarkTestStep(`Adding${getNumberOfItemsToAdd()}Items`, (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const newTodo = page.querySelector(".new-todo", ["todo-app", "todo-form"]); for (let i = 0; i < numberOfItemsToAdd; i++) { newTodo.setValue(getTodoText(defaultLanguage, i)); @@ -710,6 +780,7 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("CompletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const todoItems = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]); for (let i = 0; i < numberOfItemsToAdd; i++) { const checkbox = todoItems[i].querySelectorInShadowRoot(".toggle"); @@ -717,6 +788,7 @@ export const DefaultSuites = freezeSuites([ } }), new BenchmarkTestStep("DeletingAllItems", (page) => { + const numberOfItemsToAdd = getNumberOfItemsToAdd(); const todoItems = page.querySelectorAll("todo-item", ["todo-app", "todo-list"]); for (let i = numberOfItemsToAdd - 1; i >= 0; i--) { const deleteButton = todoItems[i].querySelectorInShadowRoot(".destroy");