import assert from 'node:assert/strict'; import test from 'node:test'; import { createFixedRowVirtualizerOptions, getRootFontSizePx } from './virtualizerOptions.js'; const throwingElement = new Proxy( {}, { get(_target, prop) { throw new Error(`Чтение свойства элемента запрещено: ${String(prop)}`); }, }, ); test('measureElement не обращается к элементу и возвращает фиксированную высоту', () => { const { measureElement } = createFixedRowVirtualizerOptions({ rowHeight: 40, overscan: 3 }); assert.equal(measureElement(throwingElement), 40); assert.equal(measureElement(null), 40); }); test('estimateSize возвращает высоту для любого индекса, overscan пробрасывается', () => { const options = createFixedRowVirtualizerOptions({ rowHeight: 40, overscan: 3 }); assert.equal(options.estimateSize(0), 40); assert.equal(options.estimateSize(999), 40); assert.equal(options.overscan, 3); }); test('rowHeight-функция вычисляется при каждом вызове (rem зависит от ширины окна)', () => { let height = 40; const options = createFixedRowVirtualizerOptions({ rowHeight: () => height, overscan: 5 }); assert.equal(options.estimateSize(0), 40); height = 48; assert.equal(options.estimateSize(0), 48); assert.equal(options.measureElement(throwingElement), 48); }); test('дополнительные опции добавляются и не перекрывают основные', () => { const options = createFixedRowVirtualizerOptions({ rowHeight: 40, overscan: 5, extra: { scrollPaddingStart: 0, estimateSize: () => 1 }, }); assert.equal(options.scrollPaddingStart, 0); assert.equal(options.estimateSize(0), 40); }); test('getRootFontSizePx повторяет правило App.css', () => { assert.equal(getRootFontSizePx(2560), 16); assert.equal(getRootFontSizePx(1920), 1920 * 0.0083); assert.ok(Math.abs(getRootFontSizePx(1600) * 3 - 39.84) < 0.01); assert.equal(getRootFontSizePx(undefined), 16); });