import { describe, expect, it } from "vitest"; import { planWheelScroll } from "../web/chat-scroll.js"; describe("planWheelScroll", () => { it("rolls the card first and leaves the big scroller alone", () => { const plan = planWheelScroll({ cardScrollTop: 0, cardScrollMax: 400, deltaY: 100, streamScrollTop: 0, streamScrollMax: 2000, }); expect(plan.cardDelta).toBe(100); expect(plan.streamDelta).toBe(0); expect(plan.rest).toBe(0); }); it("hands the leftover to the big scroller once the card hits its bottom", () => { const plan = planWheelScroll({ cardScrollTop: 380, cardScrollMax: 400, deltaY: 100, streamScrollTop: 0, streamScrollMax: 2000, }); expect(plan.cardDelta).toBe(20); expect(plan.streamDelta).toBe(80); expect(plan.rest).toBe(0); }); it("skips the card when it is already at the bottom", () => { const plan = planWheelScroll({ cardScrollTop: 400, cardScrollMax: 400, deltaY: 100, streamScrollTop: 0, streamScrollMax: 2000, }); expect(plan.cardDelta).toBe(0); expect(plan.streamDelta).toBe(100); }); it("scrolls up the card first, then the big scroller", () => { const plan = planWheelScroll({ cardScrollTop: 10, cardScrollMax: 400, deltaY: -100, streamScrollTop: 500, streamScrollMax: 2000, }); expect(plan.cardDelta).toBe(-10); expect(plan.streamDelta).toBe(-90); }); it("treats a card that cannot scroll as no card at all", () => { const plan = planWheelScroll({ cardScrollTop: 0, cardScrollMax: 0, deltaY: 120, streamScrollTop: 0, streamScrollMax: 2000, }); expect(plan.cardDelta).toBe(0); expect(plan.streamDelta).toBe(120); }); it("stops at the ends of both scrollers", () => { const down = planWheelScroll({ cardScrollTop: 400, cardScrollMax: 400, deltaY: 100, streamScrollTop: 2000, streamScrollMax: 2000, }); expect(down.cardDelta).toBe(0); expect(down.streamDelta).toBe(0); expect(down.rest).toBe(100); const up = planWheelScroll({ cardScrollTop: 0, cardScrollMax: 400, deltaY: -100, streamScrollTop: 0, streamScrollMax: 2000, }); expect(up.rest).toBe(-100); }); it("keeps fractional trackpad deltas", () => { const plan = planWheelScroll({ cardScrollTop: 12.5, cardScrollMax: 400, deltaY: 7.25, }); expect(plan.cardDelta).toBeCloseTo(7.25, 5); expect(plan.rest).toBeCloseTo(0, 5); }); it("does nothing without a delta", () => { const plan = planWheelScroll({ cardScrollMax: 400, streamScrollMax: 800 }); expect(plan).toEqual({ cardDelta: 0, streamDelta: 0, rest: 0 }); }); });