Add complexity param (#430)
Depends on params.mjs changes in #469
Work in progress proposal for adding a variable complexity param.
- complexity === 1.0: workloads run in default configuration
- complexity > 1.0: workloads run proportionally slower
- complexity < 1.0: workloads run proportionally faster
Background:
We're occasionally seeing issues with gc timing / optimisations heuristics with the current workloads. If we can dynamically change the duration / complexity of workloads it's a bit easier to assess how good these heuristics are and how much we're potentially overfitting.
Current Limitations:
DeveloperMode UI cannot reload tests.mjs causing stale BenchmarkTestStep titles
Only TodoMVC are currently scaling the workload size (other workloads are depend on whether we're fine with the general idea here)
diff --git a/resources/developer-mode.mjs b/resources/developer-mode.mjs
index 9b67d1e..ec906d4 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 @@
settings.append(createUIForWaitAfterSuite());
settings.append(createUIForAsyncSteps());
settings.append(createUIForLayoutMode());
+ settings.append(createUIForComplexity());
content.append(document.createElement("hr"));
content.append(settings);
@@ -70,7 +72,7 @@
checkbox.checked = !!initialValue;
checkbox.onchange = () => {
paramsUpdateCallback(checkbox.checked);
- updateURL();
+ handleParamsChange();
};
const label = document.createElement("label");
@@ -80,31 +82,57 @@
}
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 @@
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 @@
const select = document.createElement("select");
select.onchange = () => {
paramsUpdateCallback(select.value);
- updateURL();
+ handleParamsChange();
};
choices.forEach((choice) => {
@@ -172,7 +200,7 @@
checkbox.checked = suite.enabled;
checkbox.onchange = () => {
suite.enabled = checkbox.checked;
- updateURL();
+ handleParamsChange();
};
checkboxes.push(checkbox);
@@ -208,7 +236,7 @@
for (let suiteIndex = 0; suiteIndex < suites.length; suiteIndex++)
setSuiteEnabled(suiteIndex, true);
- updateURL();
+ handleParamsChange();
};
buttons.appendChild(button);
@@ -219,7 +247,7 @@
for (let suiteIndex = 0; suiteIndex < suites.length; suiteIndex++)
setSuiteEnabled(suiteIndex, false);
- updateURL();
+ handleParamsChange();
};
buttons.appendChild(button);
return buttons;
@@ -255,7 +283,7 @@
continue;
setSuiteEnabled(suiteIndex, enabled);
}
- updateURL();
+ handleParamsChange();
};
buttons.appendChild(button);
}
@@ -305,8 +333,9 @@
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 350ca62..f9e0a05 100644
--- a/resources/shared/params.mjs
+++ b/resources/shared/params.mjs
@@ -33,6 +33,10 @@
// "generate": generate a random seed
// <integer>: 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 @@
}
}
- _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 @@
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 @@
return true;
}
+ _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;
+ }
+
_parseIntParam(searchParams, paramKey, minValue) {
if (!searchParams.has(paramKey))
return defaultParams[paramKey];
-
- const parsedValue = this._parseInt(searchParams.get(paramKey), "waitBeforeSync");
- if (parsedValue < minValue)
- throw new Error(`Invalid ${paramKey} param: '${parsedValue}', value must be >= ${minValue}.`);
+ 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 dca4515..d10da16 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 a47d6aa..2f740e4 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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
}
}),
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 @@
(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 @@
}
}),
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 @@
(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 @@
}
}),
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 89f7660..2e9522b 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 @@
(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 @@
}
}),
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 @@
(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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
}
}),
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 @@
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 @@
}
}),
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 @@
}
}),
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");