65 lines
2.0 KiB
TypeScript
65 lines
2.0 KiB
TypeScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import { summarizeDistribution } from '../src/lib/performance.ts'
|
|
|
|
test('zero usage is measured and ties do not count as better performance', () => {
|
|
const summary = summarizeDistribution(
|
|
[
|
|
{ value: 0, count: 3 },
|
|
{ value: 12, count: 2 },
|
|
{ value: 24, count: 5 },
|
|
],
|
|
12,
|
|
)
|
|
assert.equal(summary.total, 10)
|
|
assert.equal(summary.betterThan, 50)
|
|
assert.equal(summary.tied, 2)
|
|
assert.equal(summarizeDistribution([{ value: 0, count: 3 }], 0).betterThan, 0)
|
|
})
|
|
|
|
test('bin boundaries and the final upper endpoint preserve every sample', () => {
|
|
const summary = summarizeDistribution(
|
|
[
|
|
{ value: 0, count: 2 },
|
|
{ value: 5, count: 3 },
|
|
{ value: 100, count: 7 },
|
|
],
|
|
100,
|
|
)
|
|
assert.equal(summary.bins[0].count, 2)
|
|
assert.equal(summary.bins[1].count, 3)
|
|
assert.equal(summary.bins.at(-1)!.count, 7)
|
|
assert.equal(
|
|
summary.bins.reduce((sum, bin) => sum + bin.count, 0),
|
|
summary.total,
|
|
)
|
|
assert.ok(Math.abs(summary.bins.reduce((sum, bin) => sum + bin.percent, 0) - 100) < 1e-9)
|
|
})
|
|
|
|
test('missing measurements and invalid samples produce no percentile', () => {
|
|
const summary = summarizeDistribution(
|
|
[
|
|
{ value: -1, count: 3 },
|
|
{ value: NaN, count: 2 },
|
|
{ value: Infinity, count: 1 },
|
|
{ value: 10, count: -1 },
|
|
{ value: 20, count: 1.5 },
|
|
{ value: 24, count: 0 },
|
|
],
|
|
null,
|
|
)
|
|
assert.equal(summary.total, 0)
|
|
assert.equal(summary.betterThan, null)
|
|
assert.equal(summary.current, null)
|
|
assert.ok(summary.bins.every((bin) => bin.percent === 0))
|
|
assert.equal(summarizeDistribution([{ value: 12, count: 2 }], null).betterThan, null)
|
|
assert.equal(summarizeDistribution([{ value: 12, count: 2 }], NaN).current, null)
|
|
})
|
|
|
|
test('current measurements outside the cohort remain within the plot', () => {
|
|
const summary = summarizeDistribution([{ value: 12, count: 2 }], 140)
|
|
assert.ok(summary.end >= 140)
|
|
assert.equal(summary.betterThan, 0)
|
|
assert.equal(summary.total, 2)
|
|
})
|