mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
0cfe5ae526
Summary: VirtualizedList state is represented in terms of [first, last] ranges, where it is possible to express a zero-cell range by having [n, n-1]. This includes some awkward examples, like [0, -1] being valid. CellRenderMask assumes `addCells` is called with at least one cell, with VirtualizedList previously guarding against adding the no cell case. This guard is present for adding main cell regions, but not for `_initialRenderRegion()`, which can be overridden to have a zero length as well. This moves the `CellRenderMask` to be permissive of zero-length cell regions, and removes the caller guard. Changelog: [Internal][Fixed] - Allow empty cell ranges in CellRenderMask Reviewed By: rshest Differential Revision: D38184444 fbshipit-source-id: d2dadfdd9628b24f894126d63b1eb93f6387b877
189 lines
5.4 KiB
JavaScript
189 lines
5.4 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow strict
|
|
* @format
|
|
*/
|
|
|
|
import {CellRenderMask} from '../CellRenderMask';
|
|
|
|
describe('CellRenderMask', () => {
|
|
it('throws when constructed with invalid size', () => {
|
|
expect(() => new CellRenderMask(-1)).toThrow();
|
|
});
|
|
|
|
it('allows creation of empty mask', () => {
|
|
const renderMask = new CellRenderMask(0);
|
|
expect(renderMask.enumerateRegions()).toEqual([]);
|
|
});
|
|
|
|
it('allows creation of single-cell mask', () => {
|
|
const renderMask = new CellRenderMask(1);
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 0, isSpacer: true},
|
|
]);
|
|
});
|
|
|
|
it('throws when adding invalid cell ranges', () => {
|
|
const renderMask = new CellRenderMask(5);
|
|
|
|
expect(() => renderMask.addCells({first: -2, last: -1})).toThrow();
|
|
expect(() => renderMask.addCells({first: -2, last: 0})).toThrow();
|
|
expect(() => renderMask.addCells({first: 0, last: 5})).toThrow();
|
|
expect(() => renderMask.addCells({first: 6, last: 7})).toThrow();
|
|
});
|
|
|
|
it('allows adding single cell at beginning', () => {
|
|
const renderMask = new CellRenderMask(5);
|
|
renderMask.addCells({first: 0, last: 0});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 0, isSpacer: false},
|
|
{first: 1, last: 4, isSpacer: true},
|
|
]);
|
|
});
|
|
|
|
it('allows adding single cell at end', () => {
|
|
const renderMask = new CellRenderMask(5);
|
|
renderMask.addCells({first: 4, last: 4});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 3, isSpacer: true},
|
|
{first: 4, last: 4, isSpacer: false},
|
|
]);
|
|
});
|
|
|
|
it('allows adding single cell in middle', () => {
|
|
const renderMask = new CellRenderMask(5);
|
|
renderMask.addCells({first: 2, last: 2});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 1, isSpacer: true},
|
|
{first: 2, last: 2, isSpacer: false},
|
|
{first: 3, last: 4, isSpacer: true},
|
|
]);
|
|
});
|
|
|
|
it('allows marking entire cell range', () => {
|
|
const renderMask = new CellRenderMask(5);
|
|
renderMask.addCells({first: 0, last: 4});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 4, isSpacer: false},
|
|
]);
|
|
});
|
|
|
|
it('allows adding empty cell range', () => {
|
|
const renderMask = new CellRenderMask(5);
|
|
renderMask.addCells({first: 0, last: -1});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 4, isSpacer: true},
|
|
]);
|
|
});
|
|
|
|
it('correctly replaces fragmented cell ranges', () => {
|
|
const renderMask = new CellRenderMask(10);
|
|
|
|
renderMask.addCells({first: 3, last: 3});
|
|
renderMask.addCells({first: 5, last: 7});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 2, isSpacer: true},
|
|
{first: 3, last: 3, isSpacer: false},
|
|
{first: 4, last: 4, isSpacer: true},
|
|
{first: 5, last: 7, isSpacer: false},
|
|
{first: 8, last: 9, isSpacer: true},
|
|
]);
|
|
|
|
renderMask.addCells({first: 3, last: 7});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 2, isSpacer: true},
|
|
{first: 3, last: 7, isSpacer: false},
|
|
{first: 8, last: 9, isSpacer: true},
|
|
]);
|
|
});
|
|
|
|
it('left-expands region', () => {
|
|
const renderMask = new CellRenderMask(5);
|
|
|
|
renderMask.addCells({first: 3, last: 3});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 2, isSpacer: true},
|
|
{first: 3, last: 3, isSpacer: false},
|
|
{first: 4, last: 4, isSpacer: true},
|
|
]);
|
|
|
|
renderMask.addCells({first: 2, last: 3});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 1, isSpacer: true},
|
|
{first: 2, last: 3, isSpacer: false},
|
|
{first: 4, last: 4, isSpacer: true},
|
|
]);
|
|
});
|
|
|
|
it('right-expands region', () => {
|
|
const renderMask = new CellRenderMask(5);
|
|
|
|
renderMask.addCells({first: 3, last: 3});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 2, isSpacer: true},
|
|
{first: 3, last: 3, isSpacer: false},
|
|
{first: 4, last: 4, isSpacer: true},
|
|
]);
|
|
|
|
renderMask.addCells({first: 3, last: 4});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 2, isSpacer: true},
|
|
{first: 3, last: 4, isSpacer: false},
|
|
]);
|
|
});
|
|
|
|
it('left+right expands region', () => {
|
|
const renderMask = new CellRenderMask(5);
|
|
|
|
renderMask.addCells({first: 3, last: 3});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 2, isSpacer: true},
|
|
{first: 3, last: 3, isSpacer: false},
|
|
{first: 4, last: 4, isSpacer: true},
|
|
]);
|
|
|
|
renderMask.addCells({first: 2, last: 4});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 1, isSpacer: true},
|
|
{first: 2, last: 4, isSpacer: false},
|
|
]);
|
|
});
|
|
|
|
it('does nothing when adding existing cells', () => {
|
|
const renderMask = new CellRenderMask(5);
|
|
|
|
renderMask.addCells({first: 2, last: 3});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 1, isSpacer: true},
|
|
{first: 2, last: 3, isSpacer: false},
|
|
{first: 4, last: 4, isSpacer: true},
|
|
]);
|
|
|
|
renderMask.addCells({first: 3, last: 3});
|
|
|
|
expect(renderMask.enumerateRegions()).toEqual([
|
|
{first: 0, last: 1, isSpacer: true},
|
|
{first: 2, last: 3, isSpacer: false},
|
|
{first: 4, last: 4, isSpacer: true},
|
|
]);
|
|
});
|
|
});
|