chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
import { test } from "node:test";
|
||||
import assert from "node:assert";
|
||||
import {
|
||||
parseTypeCoverageOutput,
|
||||
evaluateTypeCoverage,
|
||||
} from "../../scripts/check/check-type-coverage.mjs";
|
||||
|
||||
// The .mjs module has no .d.ts; type the exported functions locally.
|
||||
type TypeCoverageVerdict = { regressed: boolean; improved: boolean };
|
||||
|
||||
const parse = parseTypeCoverageOutput as (jsonText: string) => number;
|
||||
const evaluate = evaluateTypeCoverage as (
|
||||
current: number,
|
||||
baseline: number,
|
||||
eps?: number
|
||||
) => TypeCoverageVerdict;
|
||||
|
||||
// --- parseTypeCoverageOutput tests ---
|
||||
|
||||
test("parseTypeCoverageOutput: parses valid JSON with percent field", () => {
|
||||
const pct = parse(JSON.stringify({ percent: 92.17, atLeast: 90 }));
|
||||
assert.equal(pct, 92.17);
|
||||
});
|
||||
|
||||
test("parseTypeCoverageOutput: throws on invalid JSON", () => {
|
||||
assert.throws(() => parse("not json"), /Failed to parse JSON output/);
|
||||
});
|
||||
|
||||
test("parseTypeCoverageOutput: throws if percent field is missing", () => {
|
||||
assert.throws(() => parse(JSON.stringify({ atLeast: 90 })), /missing numeric 'percent' field/);
|
||||
});
|
||||
|
||||
test("parseTypeCoverageOutput: throws if percent is not a number", () => {
|
||||
assert.throws(
|
||||
() => parse(JSON.stringify({ percent: "92.17" })),
|
||||
/missing numeric 'percent' field/
|
||||
);
|
||||
});
|
||||
|
||||
// --- evaluateTypeCoverage tests (direction = up: drops are regressions) ---
|
||||
|
||||
const FROZEN = 92.17;
|
||||
const EPS = 0.05; // small tolerance for float noise
|
||||
|
||||
test("evaluateTypeCoverage: equal to baseline passes (within eps)", () => {
|
||||
const r = evaluate(FROZEN, FROZEN, EPS);
|
||||
assert.equal(r.regressed, false);
|
||||
assert.equal(r.improved, false);
|
||||
});
|
||||
|
||||
test("evaluateTypeCoverage: drop beyond eps is a regression", () => {
|
||||
const r = evaluate(FROZEN - 0.1, FROZEN, EPS);
|
||||
assert.equal(r.regressed, true);
|
||||
assert.equal(r.improved, false);
|
||||
});
|
||||
|
||||
test("evaluateTypeCoverage: drop within eps is not a regression", () => {
|
||||
const r = evaluate(FROZEN - 0.03, FROZEN, EPS);
|
||||
assert.equal(r.regressed, false);
|
||||
});
|
||||
|
||||
test("evaluateTypeCoverage: improvement passes and is flagged", () => {
|
||||
const r = evaluate(FROZEN + 1, FROZEN, EPS);
|
||||
assert.equal(r.regressed, false);
|
||||
assert.equal(r.improved, true);
|
||||
});
|
||||
|
||||
test("evaluateTypeCoverage: 100% coverage is maximum improvement", () => {
|
||||
const r = evaluate(100, FROZEN, EPS);
|
||||
assert.equal(r.regressed, false);
|
||||
assert.equal(r.improved, true);
|
||||
});
|
||||
|
||||
test("evaluateTypeCoverage: no eps defaults to 0 (exact comparison)", () => {
|
||||
// With eps=0, even a tiny drop regresses
|
||||
const r = evaluate(FROZEN - 0.01, FROZEN);
|
||||
assert.equal(r.regressed, true);
|
||||
});
|
||||
Reference in New Issue
Block a user