import { describe, expect, it } from 'vitest';
import { ListScroll } from '../listScroll';

describe('ListScroll — окно видимых строк', () => {
    it('курсор внутри окна — offset не меняется', () => {
        const s = new ListScroll(5);
        s.sync(0, 20);
        s.sync(3, 20);
        expect(s.offset).toBe(0);
        expect(s.first).toBe(0);
        expect(s.last).toBe(5);
    });

    it('движение вниз у нижнего края листает окно на 1', () => {
        const s = new ListScroll(5);
        s.sync(4, 20);
        s.sync(5, 20);
        expect(s.offset).toBe(1);
        expect(s.first).toBe(1);
        expect(s.last).toBe(6);
    });

    it('движение вверх у верхнего края листает окно на 1', () => {
        const s = new ListScroll(5);
        s.sync(5, 20);
        s.sync(4, 20);
        expect(s.offset).toBe(1);
        s.sync(0, 20);
        expect(s.offset).toBe(0);
    });

    it('прыжок в конец показывает хвост списка', () => {
        const s = new ListScroll(5);
        s.sync(19, 20);
        expect(s.offset).toBe(15);
        expect(s.last).toBe(20);
    });

    it('список короче окна — offset 0, clamped', () => {
        const s = new ListScroll(5);
        s.sync(3, 4);
        expect(s.offset).toBe(0);
        expect(s.last).toBe(4);
        expect(s.clamped).toBe(true);
    });

    it('пересборка списка короче — offset зажимается', () => {
        const s = new ListScroll(5);
        s.sync(15, 20);
        expect(s.offset).toBe(11); // окно [11..16), курсор в конце окна
        s.sync(2, 6); // после пересборки курсор в начале, список почти пуст
        expect(s.offset).toBe(1); // 6-5=1, курсор 2 в окне [1,6)
    });
});