maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
76 lines (56 loc) • 3.15 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 {Style} from '../style/style.ts';
describe('SourceFeatureState', () => {
test('coalesceChanges tolerates removing a property without prior feature state', () => {
const sourceState = new SourceFeatureState();
const inViewTilesMock = {
setFeatureState: vi.fn()
} as unknown as InViewTiles;
sourceState.removeFeatureState('layer1', 'feature1', 'hover');
expect(() => sourceState.coalesceChanges(inViewTilesMock, {} as unknown as Style)).not.toThrow();
expect(sourceState.getState('layer1', 'feature1')).toEqual({});
});
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 styleMock = {} as unknown as Style;
sourceState.coalesceChanges(inViewTilesMock, styleMock);
expect(sourceState.revision).toBe(0);
sourceState.updateState('layer1', 'feature1', {prop: true});
sourceState.coalesceChanges(inViewTilesMock, styleMock);
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 Style);
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 Style);
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});
});
});