import { describe, expect, it } from "vitest"; import { getToolcraftSliderStepPositionCount, getToolcraftVisualDiscreteSliderMarkerIssue, TOOLCRAFT_VISUAL_DISCRETE_POSITION_LIMIT, } from "./slider-marker-policy"; describe("Toolcraft slider marker policy", () => { it("counts integer step positions including both endpoints", () => { expect( getToolcraftSliderStepPositionCount({ min: 0, max: 31, step: 1 }), ).toBe(32); }); it("counts exact fractional step positions", () => { expect( getToolcraftSliderStepPositionCount({ min: 0, max: 0.5, step: 0.1 }), ).toBe(6); }); it("preserves the existing position count for a non-divisible range", () => { expect( getToolcraftSliderStepPositionCount({ min: 0, max: 1, step: 0.3 }), ).toBe(5); }); it("scales near-integer tolerance for larger fractional domains", () => { const domain = { min: 61.3, max: 64.4, step: 0.1 }; expect(getToolcraftSliderStepPositionCount(domain)).toBe(32); expect( getToolcraftVisualDiscreteSliderMarkerIssue({ ...domain, type: "slider", variant: "discrete", }), ).toBeNull(); }); it("defines a 32-position visual-discrete budget", () => { expect(TOOLCRAFT_VISUAL_DISCRETE_POSITION_LIMIT).toBe(32); }); it("accepts a visual-discrete slider at the position budget", () => { expect( getToolcraftVisualDiscreteSliderMarkerIssue({ type: "slider", variant: "discrete", min: 0, max: 31, step: 1, }), ).toBeNull(); }); it("reports a visual-discrete slider above the position budget", () => { expect( getToolcraftVisualDiscreteSliderMarkerIssue({ type: "slider", variant: "discrete", min: 0, max: 32, step: 1, }), ).toEqual({ kind: "budget", limit: 32, positionCount: 33 }); }); it.each(["slider", "rangeSlider"] as const)( "reports invalid %s visual-discrete domains", (type) => { const invalidDomains = [ { max: 10, step: 1 }, { min: 0, step: 1 }, { min: 0, max: 10 }, { min: Number.NaN, max: 10, step: 1 }, { min: 0, max: Number.POSITIVE_INFINITY, step: 1 }, { min: 0, max: 10, step: Number.NEGATIVE_INFINITY }, { min: 10, max: 0, step: 1 }, { min: 0, max: 0, step: 1 }, { min: 0, max: 10, step: 0 }, { min: 0, max: 10, step: -1 }, ]; for (const domain of invalidDomains) { expect( getToolcraftVisualDiscreteSliderMarkerIssue({ type, variant: "discrete", ...domain, }), ).toEqual({ kind: "domain" }); } }, ); it.each(["slider", "rangeSlider"] as const)( "does not apply the marker budget to a continuous %s", (type) => { expect( getToolcraftVisualDiscreteSliderMarkerIssue({ type, variant: "continuous", min: 0, max: 64, step: 1, }), ).toBeNull(); }, ); });