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)
});
});