239 lines
7.8 KiB
JavaScript
239 lines
7.8 KiB
JavaScript
import {add as addCoordinate, scale as scaleCoordinate, rotate as rotateCoordinate, equals as coordinatesEqual, format as formatCoordinate, closestOnCircle, closestOnSegment, createStringXY, squaredDistanceToSegment, toStringXY, toStringHDMS} from '../../../src/ol/coordinate.js';
|
||
import Circle from '../../../src/ol/geom/Circle.js';
|
||
|
||
|
||
describe('ol.coordinate', function() {
|
||
|
||
describe('#add', function() {
|
||
let coordinate, delta;
|
||
|
||
beforeEach(function() {
|
||
coordinate = [50.73, 7.1];
|
||
delta = [-2, 3];
|
||
});
|
||
|
||
it('returns a coordinate', function() {
|
||
const returnedCoordinate = addCoordinate(coordinate, delta);
|
||
expect(returnedCoordinate).to.be.an('array');
|
||
expect(returnedCoordinate).to.have.length(2);
|
||
});
|
||
|
||
it('adds the delta', function() {
|
||
const returnedCoordinate = addCoordinate(coordinate, delta);
|
||
expect(returnedCoordinate[0]).to.eql(48.73);
|
||
expect(returnedCoordinate[1]).to.eql(10.1);
|
||
});
|
||
|
||
it('modifies in place', function() {
|
||
addCoordinate(coordinate, delta);
|
||
expect(coordinate[0]).to.eql(48.73);
|
||
expect(coordinate[1]).to.eql(10.1);
|
||
});
|
||
|
||
it('does not produce unexpected results with string delta values', function() {
|
||
addCoordinate(coordinate, delta.map(function(n) {
|
||
return String(n);
|
||
}));
|
||
expect(coordinate[0]).to.eql(48.73);
|
||
expect(coordinate[1]).to.eql(10.1);
|
||
});
|
||
});
|
||
|
||
describe('#equals', function() {
|
||
const cologne = [50.93333, 6.95];
|
||
const bonn1 = [50.73, 7.1];
|
||
const bonn2 = [50.73000, 7.10000];
|
||
|
||
it('compares correctly', function() {
|
||
const bonnEqualsBonn = coordinatesEqual(bonn1, bonn2);
|
||
const bonnEqualsCologne = coordinatesEqual(bonn1, cologne);
|
||
expect(bonnEqualsBonn).to.be(true);
|
||
expect(bonnEqualsCologne).to.be(false);
|
||
});
|
||
});
|
||
|
||
describe('#format', function() {
|
||
let coordinate;
|
||
beforeEach(function() {
|
||
coordinate = [6.6123, 46.7919];
|
||
});
|
||
|
||
it('rounds the values', function() {
|
||
const string = formatCoordinate(coordinate, '{x} {y}', 0);
|
||
expect(string).to.eql('7 47');
|
||
});
|
||
|
||
it('handles the optional fractionDigits param', function() {
|
||
const string = formatCoordinate(coordinate, '{x} {y}', 3);
|
||
expect(string).to.eql('6.612 46.792');
|
||
});
|
||
});
|
||
|
||
describe('#createStringXY', function() {
|
||
let coordinate, created, formatted;
|
||
beforeEach(function() {
|
||
coordinate = [6.6123, 46.7919];
|
||
created = null;
|
||
formatted = null;
|
||
});
|
||
|
||
it('returns a CoordinateFormatType', function() {
|
||
created = createStringXY();
|
||
expect(created).to.be.a('function');
|
||
|
||
formatted = created(coordinate);
|
||
expect(formatted).to.be.a('string');
|
||
expect(formatted).to.eql('7, 47');
|
||
});
|
||
|
||
it('respects opt_fractionDigits', function() {
|
||
created = createStringXY(3);
|
||
expect(created).to.be.a('function');
|
||
|
||
formatted = created(coordinate);
|
||
expect(formatted).to.be.a('string');
|
||
expect(formatted).to.eql('6.612, 46.792');
|
||
});
|
||
});
|
||
|
||
describe('#closestOnCircle', function() {
|
||
const center = [5, 10];
|
||
const circle = new Circle(center, 10);
|
||
it('can find the closest point on circle', function() {
|
||
expect(closestOnCircle([-20, 10], circle))
|
||
.to.eql([-5, 10]);
|
||
});
|
||
it('can handle coordinate equal circle center', function() {
|
||
expect(closestOnCircle(center, circle))
|
||
.to.eql([15, 10]);
|
||
});
|
||
});
|
||
|
||
describe('#closestOnSegment', function() {
|
||
it('can handle points where the foot of the perpendicular is closest',
|
||
function() {
|
||
const point = [2, 5];
|
||
const segment = [[-5, 0], [10, 0]];
|
||
expect(closestOnSegment(point, segment))
|
||
.to.eql([2, 0]);
|
||
});
|
||
it('can handle points where the foot of the perpendicular is not closest',
|
||
function() {
|
||
const point = [0, -6];
|
||
const segment = [[-5, 0], [0, -1]];
|
||
expect(closestOnSegment(point, segment))
|
||
.to.eql([0, -1]);
|
||
});
|
||
});
|
||
|
||
describe('#format', function() {
|
||
it('can deal with undefined coordinate', function() {
|
||
expect(formatCoordinate()).to.be('');
|
||
});
|
||
it('formats a coordinate into a template (default precision is 0)',
|
||
function() {
|
||
const coord = [7.85, 47.983333];
|
||
const template = 'Coordinate is ({x}|{y}).';
|
||
const got = formatCoordinate(coord, template);
|
||
const expected = 'Coordinate is (8|48).';
|
||
expect(got).to.be(expected);
|
||
});
|
||
it('formats a coordinate into a template and respects precision)',
|
||
function() {
|
||
const coord = [7.85, 47.983333];
|
||
const template = 'Coordinate is ({x}|{y}).';
|
||
const got = formatCoordinate(coord, template, 2);
|
||
const expected = 'Coordinate is (7.85|47.98).';
|
||
expect(got).to.be(expected);
|
||
});
|
||
});
|
||
|
||
describe('#rotate', function() {
|
||
it('can rotate point in place', function() {
|
||
const coord = [7.85, 47.983333];
|
||
const rotateRadians = Math.PI / 2; // 90 degrees
|
||
rotateCoordinate(coord, rotateRadians);
|
||
expect(coord[0].toFixed(6)).to.eql('-47.983333');
|
||
expect(coord[1].toFixed(6)).to.eql('7.850000');
|
||
});
|
||
it('returns the rotated point', function() {
|
||
const coord = [7.85, 47.983333];
|
||
const rotateRadians = Math.PI / 2; // 90 degrees
|
||
const rotated = rotateCoordinate(coord, rotateRadians);
|
||
expect(rotated[0].toFixed(7)).to.eql('-47.9833330');
|
||
expect(rotated[1].toFixed(7)).to.eql('7.8500000');
|
||
});
|
||
});
|
||
|
||
describe('#scale', function() {
|
||
it('can scale point in place', function() {
|
||
const coord = [7.85, 47.983333];
|
||
const scale = 1.2;
|
||
scaleCoordinate(coord, scale);
|
||
expect(coord[0].toFixed(7)).to.eql('9.4200000');
|
||
expect(coord[1].toFixed(7)).to.eql('57.5799996');
|
||
});
|
||
it('returns the scaled point', function() {
|
||
const coord = [7.85, 47.983333];
|
||
const scale = 1.2;
|
||
const scaledCoord = scaleCoordinate(coord, scale);
|
||
expect(scaledCoord[0].toFixed(7)).to.eql('9.4200000');
|
||
expect(scaledCoord[1].toFixed(7)).to.eql('57.5799996');
|
||
});
|
||
});
|
||
|
||
describe('#squaredDistanceToSegment', function() {
|
||
it('can handle points where the foot of the perpendicular is closest',
|
||
function() {
|
||
const point = [2, 5];
|
||
const segment = [[-5, 0], [10, 0]];
|
||
expect(squaredDistanceToSegment(point, segment))
|
||
.to.eql(25);
|
||
});
|
||
it('can handle points where the foot of the perpendicular is not closest',
|
||
function() {
|
||
const point = [0, -6];
|
||
const segment = [[-5, 0], [0, -1]];
|
||
expect(squaredDistanceToSegment(point, segment))
|
||
.to.eql(25);
|
||
});
|
||
|
||
});
|
||
|
||
describe('#toStringHDMS', function() {
|
||
it('returns the empty string on undefined input', function() {
|
||
const got = toStringHDMS();
|
||
const expected = '';
|
||
expect(got).to.be(expected);
|
||
});
|
||
it('formats with zero fractional digits as default', function() {
|
||
const coord = [7.85, 47.983333];
|
||
const got = toStringHDMS(coord);
|
||
const expected = '47° 59′ 00″ N 7° 51′ 00″ E';
|
||
expect(got).to.be(expected);
|
||
});
|
||
it('formats with given fractional digits, if passed', function() {
|
||
const coord = [7.85, 47.983333];
|
||
const got = toStringHDMS(coord, 3);
|
||
const expected = '47° 58′ 59.999″ N 7° 51′ 00.000″ E';
|
||
expect(got).to.be(expected);
|
||
});
|
||
});
|
||
|
||
describe('#toStringXY', function() {
|
||
it('formats with zero fractional digits as default', function() {
|
||
const coord = [7.85, 47.983333];
|
||
const got = toStringXY(coord);
|
||
const expected = '8, 48';
|
||
expect(got).to.be(expected);
|
||
});
|
||
it('formats with given fractional digits, if passed', function() {
|
||
const coord = [7.85, 47.983333];
|
||
const got = toStringXY(coord, 2);
|
||
const expected = '7.85, 47.98';
|
||
expect(got).to.be(expected);
|
||
});
|
||
});
|
||
|
||
});
|