maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
99 lines (82 loc) • 3.6 kB
text/typescript
import CollisionFeature from './collision_feature';
import Anchor from './anchor';
import Point from '@mapbox/point-geometry';
import {CollisionBoxArray} from '../data/array_types.g';
import {SymbolPadding} from '../style/style_layer/symbol_style_layer';
describe('CollisionFeature', () => {
const collisionBoxArray = new CollisionBoxArray();
const shapedText = {
left: -50,
top: -10,
right: 50,
bottom: 10
};
const padding: SymbolPadding = [0, 0, 0, 0];
test('point label', () => {
const point = new Point(500, 0);
const anchor = new Anchor(point.x, point.y, 0, undefined);
const cf = new CollisionFeature(collisionBoxArray, anchor, 0, 0, 0, shapedText, 1, padding, false, 0);
expect(cf.circleDiameter).toBeFalsy();
expect(cf.boxEndIndex - cf.boxStartIndex).toBe(1);
const box = collisionBoxArray.get(cf.boxStartIndex);
expect(box.x1).toBe(-50);
expect(box.x2).toBe(50);
expect(box.y1).toBe(-10);
expect(box.y2).toBe(10);
});
test('point label with padding', () => {
const point = new Point(500, 0);
const anchor = new Anchor(point.x, point.y, 0, undefined);
const pointPadding: SymbolPadding = [10, 20, -5, -10]; // top, right, bottom, left
const cf = new CollisionFeature(collisionBoxArray, anchor, 0, 0, 0, shapedText, 1, pointPadding, false, 0);
expect(cf.boxEndIndex - cf.boxStartIndex).toBe(1);
const box = collisionBoxArray.get(cf.boxStartIndex);
expect(box.x1).toBe(-40);
expect(box.x2).toBe(70);
expect(box.y1).toBe(-20);
expect(box.y2).toBe(5);
});
test('Compute line height for runtime collision circles (line label)', () => {
const anchor = new Anchor(505, 95, 0, 1);
const cf = new CollisionFeature(collisionBoxArray, anchor, 0, 0, 0, shapedText, 1, padding, true, 0);
expect(cf.circleDiameter).toBeTruthy();
expect(cf.circleDiameter).toBe(shapedText.bottom - shapedText.top);
expect(cf.boxEndIndex - cf.boxStartIndex).toBe(0);
});
test('Collision circle diameter is not computed for features with zero height', () => {
const shapedText = {
left: -50,
top: -10,
right: 50,
bottom: -10
};
const anchor = new Anchor(505, 95, 0, 1);
const cf = new CollisionFeature(collisionBoxArray, anchor, 0, 0, 0, shapedText, 1, padding, true, 0);
expect(cf.boxEndIndex - cf.boxStartIndex).toBe(0);
expect(cf.circleDiameter).toBeFalsy();
});
test('Collision circle diameter is not computed for features with negative height', () => {
const shapedText = {
left: -50,
top: 10,
right: 50,
bottom: -10
};
const anchor = new Anchor(505, 95, 0, 1);
const cf = new CollisionFeature(collisionBoxArray, anchor, 0, 0, 0, shapedText, 1, padding, true, 0);
expect(cf.boxEndIndex - cf.boxStartIndex).toBe(0);
expect(cf.circleDiameter).toBeFalsy();
});
test('Use minimum collision circle diameter', () => {
const shapedText = {
left: -50,
top: 10,
right: 50,
bottom: 10.00001
};
const anchor = new Anchor(505, 95, 0, 1);
const cf = new CollisionFeature(collisionBoxArray, anchor, 0, 0, 0, shapedText, 1, padding, true, 0);
expect(cf.boxEndIndex - cf.boxStartIndex).toBe(0);
expect(cf.circleDiameter).toBe(10);
});
});