mirror of
https://github.com/penpot/penpot.git
synced 2026-10-29 14:00:37 +00:00
Record manifest-default features without adding A/B selection. Keep scored builds free of the optional function-name profiling switch. Exercise CLI persistence, interruption, browser failure and legacy page interactions through separate diagnostics. Share readable reports and warn when offline comparisons include failed runs. Validate with 50 focused tests, browser and CLI fault checks, two full corpus workflow runs, and headed rectangle cases. Shadow graphics and sampling calibration remain open. AI-assisted-by: GPT-6
130 lines
4.1 KiB
JavaScript
130 lines
4.1 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import {
|
|
summarize,
|
|
summarizeRun,
|
|
formatSummary,
|
|
} from "../../../resources/wasm-playground/benchmarks/statistics.js";
|
|
|
|
test("summaries use sample deviation and unscaled median absolute deviation", () => {
|
|
const summary = summarize([1, 2, 3, 4, 5]);
|
|
assert.equal(summary.mean, 3);
|
|
assert.equal(summary.median, 3);
|
|
assert.equal(summary.standardDeviation, Math.sqrt(2.5));
|
|
assert.equal(summary.mad, 1);
|
|
assert.equal(summary.min, 1);
|
|
assert.equal(summary.max, 5);
|
|
});
|
|
|
|
test("invalid numbers are counted and zero observations survive", () => {
|
|
const summary = summarize([0, 2, NaN, Infinity, "3", null, -1]);
|
|
assert.equal(summary.n, 2);
|
|
assert.equal(summary.invalid, 5);
|
|
assert.equal(summary.median, 1);
|
|
assert.equal(summary.medianInterval, null);
|
|
assert.match(summary.suppressed.medianInterval, /10/);
|
|
});
|
|
|
|
test("empty and singleton observations have no invented spread", () => {
|
|
assert.equal(summarize([]).median, null);
|
|
assert.equal(summarize([]).standardDeviation, null);
|
|
assert.equal(summarize([2]).standardDeviation, null);
|
|
assert.equal(summarize([2]).mad, 0);
|
|
});
|
|
|
|
test("bootstrap intervals are deterministic and tail support is explicit", () => {
|
|
const values = Array.from({ length: 100 }, (_, index) => index + 1);
|
|
const first = summarize(values);
|
|
assert.deepEqual(first, summarize(values));
|
|
assert.ok(first.medianInterval.low < first.median);
|
|
assert.ok(first.medianInterval.high > first.median);
|
|
assert.equal(first.p95, 95.05);
|
|
assert.equal(first.p99, null);
|
|
assert.match(first.suppressed.p99, /500/);
|
|
assert.equal(summarize(Array(500).fill(3)).p99, 3);
|
|
});
|
|
|
|
test("run summaries exclude warmups, failed attempts and invalid metrics", () => {
|
|
const result = summarizeRun({
|
|
cases: [
|
|
{
|
|
id: "rects/load",
|
|
status: "complete",
|
|
attempts: [
|
|
{ warmup: true, status: "ok", metrics: { render: 1000 } },
|
|
{ warmup: false, status: "ok", metrics: { render: 10, upload: 0 } },
|
|
{
|
|
warmup: false,
|
|
status: "invalid",
|
|
metrics: { render: 0, upload: 2 },
|
|
invalidMetrics: { render: "below resolution" },
|
|
},
|
|
{ warmup: false, status: "failed", metrics: { render: 300 } },
|
|
],
|
|
},
|
|
],
|
|
});
|
|
const summary = result.cases[0];
|
|
assert.deepEqual(summary.attempts, {
|
|
measured: 3,
|
|
warmup: 1,
|
|
ok: 1,
|
|
invalid: 1,
|
|
failed: 1,
|
|
});
|
|
assert.equal(summary.metrics.render.median, 10);
|
|
assert.equal(summary.metrics.render.invalid, 2);
|
|
assert.equal(summary.metrics.upload.median, 1);
|
|
assert.equal(summary.metrics.upload.invalid, 1);
|
|
assert.match(result.warnings.join(" "), /conditional/);
|
|
});
|
|
|
|
test("statistics reject unsafe bootstrap settings", () => {
|
|
assert.throws(() => summarize([1], { resamples: Infinity }), /resamples/);
|
|
assert.throws(() => summarize([1], { seed: NaN }), /seed/);
|
|
});
|
|
|
|
test("text summaries display the same observations and support limits as JSON", () => {
|
|
const summary = summarizeRun({
|
|
cases: [
|
|
{
|
|
id: "rects/load",
|
|
status: "complete",
|
|
attempts: [{ warmup: false, status: "ok", metrics: { render: 2 } }],
|
|
},
|
|
],
|
|
});
|
|
const report = formatSummary(summary);
|
|
assert.match(report, /median 2\.000/);
|
|
assert.match(report, /1 valid, 0 invalid/);
|
|
assert.match(report, /Requires at least 10 valid attempts/);
|
|
assert.match(report, /2000 resamples/);
|
|
});
|
|
|
|
test("reports expose missing attempts and explain support limits once", () => {
|
|
const summary = summarizeRun({
|
|
cases: [
|
|
{
|
|
id: "rects/load",
|
|
status: "failed",
|
|
unattempted: 9,
|
|
attempts: [
|
|
{
|
|
warmup: false,
|
|
status: "failed",
|
|
metrics: { render: 3, upload: 2 },
|
|
},
|
|
],
|
|
},
|
|
],
|
|
});
|
|
assert.equal(summary.cases[0].unattempted, 9);
|
|
const report = formatSummary(summary);
|
|
assert.match(report, /9 unattempted/);
|
|
assert.match(report, /1 failed/);
|
|
assert.equal(
|
|
report.split("Requires at least 10 valid attempts").length - 1,
|
|
1,
|
|
);
|
|
});
|