Check that a thinned tick row still ends where the range does
fitMarks picks a stride that divides the interval count, so the last label lands on the end rather than short of it. Five marks cannot reach that guard — find() settles on a divisor first — so the check carries a six-mark case that does. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K1moruzue2kTJd3uVisgNk
This commit is contained in:
@@ -0,0 +1,60 @@
|
|||||||
|
/**
|
||||||
|
* The tick-label thinning, checked.
|
||||||
|
*
|
||||||
|
* ponytail: a script rather than a suite, matching `color.check.ts` — pure
|
||||||
|
* arithmetic needs no browser:
|
||||||
|
*
|
||||||
|
* cd frontend && bun run src/components/Dashboard/ui/core/controls.check.ts
|
||||||
|
*/
|
||||||
|
import assert from "node:assert/strict"
|
||||||
|
import { fitMarks } from "./controls"
|
||||||
|
|
||||||
|
const marks = (...labels: string[]) => labels.map((label) => ({ label }))
|
||||||
|
const labels = (kept: { label: string }[]) => kept.map((m) => m.label)
|
||||||
|
|
||||||
|
const five = marks("20", "20.5", "21", "21.5", "22")
|
||||||
|
|
||||||
|
// Unmeasured, so nothing is thinned yet.
|
||||||
|
assert.deepEqual(fitMarks(five, 0), five)
|
||||||
|
|
||||||
|
// Two labels are the ends themselves and can never crowd.
|
||||||
|
assert.deepEqual(fitMarks(marks("0", "1"), 1), marks("0", "1"))
|
||||||
|
|
||||||
|
// The default four columns keeps all five.
|
||||||
|
assert.deepEqual(labels(fitMarks(five, 261)), [
|
||||||
|
"20",
|
||||||
|
"20.5",
|
||||||
|
"21",
|
||||||
|
"21.5",
|
||||||
|
"22",
|
||||||
|
])
|
||||||
|
|
||||||
|
// Three columns thins to the whole numbers, ends included.
|
||||||
|
assert.deepEqual(labels(fitMarks(five, 177)), ["20", "21", "22"])
|
||||||
|
|
||||||
|
// Across every width: the ends survive, and the stride divides the intervals
|
||||||
|
// so the last label lands on the end rather than short of it. Four intervals
|
||||||
|
// may thin by 1, 2 or 4 — never 3.
|
||||||
|
for (let width = 1; width <= 600; width++) {
|
||||||
|
const kept = labels(fitMarks(five, width))
|
||||||
|
assert.equal(kept[0], "20", `first lost at ${width}px`)
|
||||||
|
assert.equal(kept[kept.length - 1], "22", `last lost at ${width}px`)
|
||||||
|
assert.ok(
|
||||||
|
[2, 3, 5].includes(kept.length),
|
||||||
|
`${kept.length} labels at ${width}px`,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Six marks reach the divisor guard that five cannot: at this width the
|
||||||
|
// narrowest stride that fits is 3, which does not divide five intervals and
|
||||||
|
// would drop the last label. It must fall through to 5 and keep both ends.
|
||||||
|
const six = marks("0", "1", "2", "3", "4", "5")
|
||||||
|
assert.deepEqual(labels(fitMarks(six, 60)), ["0", "5"])
|
||||||
|
|
||||||
|
// Wider labels thin sooner than narrow ones at the same width.
|
||||||
|
assert.ok(
|
||||||
|
fitMarks(marks("1000.5", "1001", "1001.5"), 120).length <=
|
||||||
|
fitMarks(marks("1", "2", "3"), 120).length,
|
||||||
|
)
|
||||||
|
|
||||||
|
console.log("fitMarks: ok")
|
||||||
Reference in New Issue
Block a user