maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
63 lines (47 loc) • 2.65 kB
text/typescript
import {describe, test, expect, vi} from 'vitest';
import {SourceFeatureState} from './source_state.ts';
import {type InViewTiles} from '../tile/tile_manager_in_view_tiles.ts';
import type {Painter} from '../render/painter.ts';
describe('SourceFeatureState', () => {
test('coalesceChanges updates revision when changes occur', () => {
const sourceState = new SourceFeatureState();
expect(sourceState.revision).toBe(0);
const inViewTilesMock = {
setFeatureState: vi.fn()
} as unknown as InViewTiles;
const painterMock = {} as unknown as Painter;
sourceState.coalesceChanges(inViewTilesMock, painterMock);
expect(sourceState.revision).toBe(0);
sourceState.updateState('layer1', 'feature1', {prop: true});
sourceState.coalesceChanges(inViewTilesMock, painterMock);
expect(sourceState.revision).toBe(1);
});
test('Feature state update after bulk remove does not keep initial values', () => {
const sourceState = new SourceFeatureState();
const inViewTilesMock = {
setFeatureState: vi.fn()
} as unknown as InViewTiles;
sourceState.updateState('layer1', 'feature1', {a: 1, b: 2});
sourceState.updateState('layer1', 'feature2', {c: 3});
sourceState.coalesceChanges(inViewTilesMock, {} as unknown as Painter);
sourceState.removeFeatureState('layer1');
// Now update feature1 with a partial state — this triggers the branch
// where deletedStates[sourceLayer] === null and we iterate existing features
sourceState.updateState('layer1', 'feature1', {a: 10});
expect(sourceState.deletedStates['layer1']['feature1']).toEqual({b: null});
expect(sourceState.deletedStates['layer1']['feature2']).toBeNull();
});
test('updateState after single feature deletion rebuilds deletedStates for that feature', () => {
const sourceState = new SourceFeatureState();
const inViewTilesMock = {
setFeatureState: vi.fn()
} as unknown as InViewTiles;
sourceState.updateState('layer1', 'feature1', {a: 1, b: 2, c: 3});
sourceState.coalesceChanges(inViewTilesMock, {} as unknown as Painter);
sourceState.removeFeatureState('layer1', 'feature1');
expect(sourceState.deletedStates['layer1']['feature1']).toBeNull();
// Now update feature1 with partial state — triggers the featureDeletionQueued branch
sourceState.updateState('layer1', 'feature1', {a: 10});
expect(sourceState.deletedStates['layer1']['feature1']).toEqual({b: null, c: null});
});
});