maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
358 lines (302 loc) • 13.4 kB
text/typescript
import {LngLat} from './lng_lat';
import {LngLatBounds} from './lng_lat_bounds';
describe('LngLatBounds', () => {
test('#constructor', () => {
const sw = new LngLat(0, 0);
const ne = new LngLat(-10, 10);
const bounds = new LngLatBounds(sw, ne);
expect(bounds.getSouth()).toBe(0);
expect(bounds.getWest()).toBe(0);
expect(bounds.getNorth()).toBe(10);
expect(bounds.getEast()).toBe(-10);
});
test('#constructor across dateline', () => {
const sw = new LngLat(170, 0);
const ne = new LngLat(-170, 10);
const bounds = new LngLatBounds(sw, ne);
expect(bounds.getSouth()).toBe(0);
expect(bounds.getWest()).toBe(170);
expect(bounds.getNorth()).toBe(10);
expect(bounds.getEast()).toBe(-170);
});
test('#constructor across pole', () => {
const sw = new LngLat(0, 85);
const ne = new LngLat(-10, -85);
const bounds = new LngLatBounds(sw, ne);
expect(bounds.getSouth()).toBe(85);
expect(bounds.getWest()).toBe(0);
expect(bounds.getNorth()).toBe(-85);
expect(bounds.getEast()).toBe(-10);
});
test('#constructor no args', () => {
const bounds = new LngLatBounds();
const t1 = () => {
bounds.getCenter();
};
expect(t1).toThrow();
});
test('#extend with coordinate', () => {
const bounds = new LngLatBounds([0, 0], [10, 10]);
bounds.extend([-10, -10]);
expect(bounds.getSouth()).toBe(-10);
expect(bounds.getWest()).toBe(-10);
expect(bounds.getNorth()).toBe(10);
expect(bounds.getEast()).toBe(10);
bounds.extend(new LngLat(-15, -15));
expect(bounds.getSouth()).toBe(-15);
expect(bounds.getWest()).toBe(-15);
expect(bounds.getNorth()).toBe(10);
expect(bounds.getEast()).toBe(10);
bounds.extend([-80, -80, 80, 80]);
expect(bounds.getSouth()).toBe(-80);
expect(bounds.getWest()).toBe(-80);
expect(bounds.getNorth()).toBe(80);
expect(bounds.getEast()).toBe(80);
bounds.extend({lng: -90, lat: -90});
expect(bounds.getSouth()).toBe(-90);
expect(bounds.getWest()).toBe(-90);
expect(bounds.getNorth()).toBe(80);
expect(bounds.getEast()).toBe(80);
bounds.extend({lon: 90, lat: 90});
expect(bounds.getSouth()).toBe(-90);
expect(bounds.getWest()).toBe(-90);
expect(bounds.getNorth()).toBe(90);
expect(bounds.getEast()).toBe(90);
});
test('#extend with bounds', () => {
const bounds1 = new LngLatBounds([0, 0], [10, 10]);
const bounds2 = new LngLatBounds([-10, -10], [10, 10]);
bounds1.extend(bounds2);
expect(bounds1.getSouth()).toBe(-10);
expect(bounds1.getWest()).toBe(-10);
expect(bounds1.getNorth()).toBe(10);
expect(bounds1.getEast()).toBe(10);
const bounds4 = new LngLatBounds([-20, -20, 20, 20]);
bounds1.extend(bounds4);
expect(bounds1.getSouth()).toBe(-20);
expect(bounds1.getWest()).toBe(-20);
expect(bounds1.getNorth()).toBe(20);
expect(bounds1.getEast()).toBe(20);
const bounds5 = new LngLatBounds();
bounds1.extend(bounds5);
expect(bounds1.getSouth()).toBe(-20);
expect(bounds1.getWest()).toBe(-20);
expect(bounds1.getNorth()).toBe(20);
expect(bounds1.getEast()).toBe(20);
});
test('#extend with null', () => {
const bounds = new LngLatBounds([0, 0], [10, 10]);
bounds.extend(null);
expect(bounds.getSouth()).toBe(0);
expect(bounds.getWest()).toBe(0);
expect(bounds.getNorth()).toBe(10);
expect(bounds.getEast()).toBe(10);
});
test('#extend undefined bounding box', () => {
const bounds1 = new LngLatBounds(undefined, undefined);
const bounds2 = new LngLatBounds([-10, -10], [10, 10]);
bounds1.extend(bounds2);
expect(bounds1.getSouth()).toBe(-10);
expect(bounds1.getWest()).toBe(-10);
expect(bounds1.getNorth()).toBe(10);
expect(bounds1.getEast()).toBe(10);
});
test('#extend same LngLat instance', () => {
const point = new LngLat(0, 0);
const bounds = new LngLatBounds(point, point);
bounds.extend(new LngLat(15, 15));
expect(bounds.getSouth()).toBe(0);
expect(bounds.getWest()).toBe(0);
expect(bounds.getNorth()).toBe(15);
expect(bounds.getEast()).toBe(15);
});
test('accessors', () => {
const sw = new LngLat(0, 0);
const ne = new LngLat(-10, -20);
const bounds = new LngLatBounds(sw, ne);
expect(bounds.getCenter()).toEqual(new LngLat(-5, -10));
expect(bounds.getSouth()).toBe(0);
expect(bounds.getWest()).toBe(0);
expect(bounds.getNorth()).toBe(-20);
expect(bounds.getEast()).toBe(-10);
expect(bounds.getSouthWest()).toEqual(new LngLat(0, 0));
expect(bounds.getSouthEast()).toEqual(new LngLat(-10, 0));
expect(bounds.getNorthEast()).toEqual(new LngLat(-10, -20));
expect(bounds.getNorthWest()).toEqual(new LngLat(0, -20));
});
test('#convert', () => {
const sw = new LngLat(0, 0);
const ne = new LngLat(-10, 10);
const bounds = new LngLatBounds(sw, ne);
expect(LngLatBounds.convert(undefined)).toBeUndefined();
expect(LngLatBounds.convert(bounds)).toEqual(bounds);
expect(LngLatBounds.convert([sw, ne])).toEqual(bounds);
expect(
LngLatBounds.convert([bounds.getWest(), bounds.getSouth(), bounds.getEast(), bounds.getNorth()])
).toEqual(bounds);
});
test('#toArray', () => {
const llb = new LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);
expect(llb.toArray()).toEqual([[-73.9876, 40.7661], [-73.9397, 40.8002]]);
});
test('#toString', () => {
const llb = new LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);
expect(llb.toString()).toBe('LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))');
});
test('#isEmpty', () => {
const nullBounds = new LngLatBounds();
expect(nullBounds.isEmpty()).toBe(true);
const sw = new LngLat(0, 0);
const ne = new LngLat(-10, 10);
const bounds = new LngLatBounds(sw, ne);
expect(bounds.isEmpty()).toBe(false);
});
test('#fromLngLat', () => {
const center0 = new LngLat(0, 0);
const center1 = new LngLat(-73.9749, 40.7736);
const center0Radius10 = LngLatBounds.fromLngLat(center0, 10);
const center1Radius10 = LngLatBounds.fromLngLat(center1, 10);
const center1Radius0 = LngLatBounds.fromLngLat(center1);
expect(center0Radius10.toArray()).toEqual(
[[-0.00008983152770714982, -0.00008983152770714982], [0.00008983152770714982, 0.00008983152770714982]]
);
expect(center1Radius10.toArray()).toEqual(
[[-73.97501862141328, 40.77351016847229], [-73.97478137858673, 40.77368983152771]]
);
expect(center1Radius0.toArray()).toEqual([[-73.9749, 40.7736], [-73.9749, 40.7736]]);
});
describe('LngLatBounds adjustAntiMeridian tests', () => {
test('kenya', () => {
const sw = new LngLat(32.958984, -5.353521);
const ne = new LngLat(43.50585, 5.615985);
const bounds = new LngLatBounds(sw, ne).adjustAntiMeridian();
expect(bounds.getSouth()).toBe(-5.353521);
expect(bounds.getWest()).toBe(32.958984);
expect(bounds.getNorth()).toBe(5.615985);
expect(bounds.getEast()).toBe(43.50585);
});
test('normal cross (crossing antimeridian)', () => {
const sw = new LngLat(170, 0);
const ne = new LngLat(-170, 10);
const bounds = new LngLatBounds(sw, ne).adjustAntiMeridian();
expect(bounds.getSouth()).toBe(0);
expect(bounds.getWest()).toBe(170);
expect(bounds.getNorth()).toBe(10);
expect(bounds.getEast()).toBe(190);
});
test('exactly meridian (crossing antimeridian)', () => {
const sw = new LngLat(180, -20);
const ne = new LngLat(-180, 20);
const bounds = new LngLatBounds(sw, ne).adjustAntiMeridian();
expect(bounds.getSouth()).toBe(-20);
expect(bounds.getWest()).toBe(180);
expect(bounds.getNorth()).toBe(20);
expect(bounds.getEast()).toBe(180);
});
test('small cross (crossing antimeridian)', () => {
const sw = new LngLat(179, -5);
const ne = new LngLat(-179, 5);
const bounds = new LngLatBounds(sw, ne).adjustAntiMeridian();
expect(bounds.getSouth()).toBe(-5);
expect(bounds.getWest()).toBe(179);
expect(bounds.getNorth()).toBe(5);
expect(bounds.getEast()).toBe(181);
});
test('large cross (crossing antimeridian)', () => {
const sw = new LngLat(100, -30);
const ne = new LngLat(-100, 30);
const bounds = new LngLatBounds(sw, ne).adjustAntiMeridian();
expect(bounds.getSouth()).toBe(-30);
expect(bounds.getWest()).toBe(100);
expect(bounds.getNorth()).toBe(30);
expect(bounds.getEast()).toBe(260);
});
test('reverse cross (crossing antimeridian)', () => {
const sw = new LngLat(-170, 0);
const ne = new LngLat(170, 10);
const bounds = new LngLatBounds(sw, ne).adjustAntiMeridian();
expect(bounds.getSouth()).toBe(0);
expect(bounds.getWest()).toBe(-170);
expect(bounds.getNorth()).toBe(10);
expect(bounds.getEast()).toBe(170);
});
test('reverse not cross', () => {
const sw = new LngLat(150, 0);
const ne = new LngLat(170, 10);
const bounds = new LngLatBounds(sw, ne).adjustAntiMeridian();
expect(bounds.getSouth()).toBe(0);
expect(bounds.getWest()).toBe(150);
expect(bounds.getNorth()).toBe(10);
expect(bounds.getEast()).toBe(170);
});
test('same longitude', () => {
const sw = new LngLat(175, -10);
const ne = new LngLat(175, 10);
const bounds = new LngLatBounds(sw, ne).adjustAntiMeridian();
expect(bounds.getSouth()).toBe(-10);
expect(bounds.getWest()).toBe(175);
expect(bounds.getNorth()).toBe(10);
expect(bounds.getEast()).toBe(175);
});
test('full world', () => {
const sw = new LngLat(-180, -90);
const ne = new LngLat(180, 90);
const bounds = new LngLatBounds(sw, ne).adjustAntiMeridian();
expect(bounds.getSouth()).toBe(-90);
expect(bounds.getWest()).toBe(-180);
expect(bounds.getNorth()).toBe(90);
expect(bounds.getEast()).toBe(180);
});
test('across pole', () => {
const sw = new LngLat(0, 85);
const ne = new LngLat(-10, -85);
const bounds = new LngLatBounds(sw, ne).adjustAntiMeridian();
expect(bounds.getSouth()).toBe(85);
expect(bounds.getWest()).toBe(0);
expect(bounds.getNorth()).toBe(-85);
expect(bounds.getEast()).toBe(350);
});
test('across pole reverse', () => {
const sw = new LngLat(-10, -85);
const ne = new LngLat(0, 85);
const bounds = new LngLatBounds(sw, ne).adjustAntiMeridian();
expect(bounds.getSouth()).toBe(-85);
expect(bounds.getWest()).toBe(-10);
expect(bounds.getNorth()).toBe(85);
expect(bounds.getEast()).toBe(0);
});
test('across dateline', () => {
const sw = new LngLat(170, 0);
const ne = new LngLat(-170, 10);
const bounds = new LngLatBounds(sw, ne).adjustAntiMeridian();
expect(bounds.getSouth()).toBe(0);
expect(bounds.getWest()).toBe(170);
expect(bounds.getNorth()).toBe(10);
expect(bounds.getEast()).toBe(190);
});
});
describe('contains', () => {
describe('point', () => {
test('point is in bounds', () => {
const llb = new LngLatBounds([-1, -1], [1, 1]);
const ll = {lng: 0, lat: 0};
expect(llb.contains(ll)).toBeTruthy();
});
test('point is not in bounds', () => {
const llb = new LngLatBounds([-1, -1], [1, 1]);
const ll = {lng: 3, lat: 3};
expect(llb.contains(ll)).toBeFalsy();
});
test('point is in bounds that spans dateline', () => {
const llb = new LngLatBounds([190, -10], [170, 10]);
const ll = {lng: 180, lat: 0};
expect(llb.contains(ll)).toBeTruthy();
});
test('point is not in bounds that spans dateline', () => {
const llb = new LngLatBounds([190, -10], [170, 10]);
const ll = {lng: 0, lat: 0};
expect(llb.contains(ll)).toBeFalsy();
});
});
});
});