38 lines
1.4 KiB
TypeScript
38 lines
1.4 KiB
TypeScript
import assert from "node:assert/strict"
|
|
import { describe, it } from "node:test"
|
|
import {
|
|
computePageTopInViewport,
|
|
resolveCurrentPageAtViewportTop,
|
|
resolveCurrentPageInViewport,
|
|
} from "./docs-ruler-sync-math.ts"
|
|
|
|
describe("docs ruler vertical sync", () => {
|
|
const stride = 1000
|
|
const viewport = 800
|
|
|
|
it("keeps page 0 while viewport center is on page 1", () => {
|
|
assert.equal(resolveCurrentPageInViewport(48, viewport, stride, 3), 0)
|
|
assert.equal(computePageTopInViewport(48, 0, stride), 48)
|
|
})
|
|
|
|
it("advances page when viewport center crosses page boundary", () => {
|
|
// centerInStack = 400 - (-700) = 1100 → page 1
|
|
assert.equal(resolveCurrentPageInViewport(-700, viewport, stride, 3), 1)
|
|
assert.equal(computePageTopInViewport(-700, 1, stride), 300)
|
|
|
|
// Old top-edge rule still on page 0 here
|
|
assert.equal(resolveCurrentPageAtViewportTop(-700, stride, 3), 0)
|
|
})
|
|
|
|
it("switches before page 1 fully leaves viewport (vs top-edge rule)", () => {
|
|
// centerInStack = 400 - (-750) = 1150 → page 1; page 1 bottom still visible
|
|
assert.equal(resolveCurrentPageInViewport(-750, viewport, stride, 2), 1)
|
|
assert.equal(resolveCurrentPageAtViewportTop(-750, stride, 2), 0)
|
|
})
|
|
|
|
it("clamps to last page", () => {
|
|
assert.equal(resolveCurrentPageInViewport(-5000, viewport, stride, 3), 2)
|
|
assert.equal(computePageTopInViewport(-5000, 2, stride), -3000)
|
|
})
|
|
})
|