Add more tests for ol.extent

This commit is contained in:
Marc Jansen
2015-05-15 14:45:02 +02:00
parent 0f36d1a7c2
commit f0720b2f97

View File

@@ -24,6 +24,267 @@ describe('ol.extent', function() {
});
describe('closestSquaredDistanceXY', function() {
it('returns correct result when x left of extent', function() {
var extent = ol.extent.createOrUpdate(0, 0, 1, 1);
var x = -2;
var y = 0;
expect(ol.extent.closestSquaredDistanceXY(extent, x, y)).to.be(4);
});
it('returns correct result when x right of extent', function() {
var extent = ol.extent.createOrUpdate(0, 0, 1, 1);
var x = 3;
var y = 0;
expect(ol.extent.closestSquaredDistanceXY(extent, x, y)).to.be(4);
});
it('returns correct result for other x values', function() {
var extent = ol.extent.createOrUpdate(0, 0, 1, 1);
var x = 0.5;
var y = 3;
expect(ol.extent.closestSquaredDistanceXY(extent, x, y)).to.be(4);
});
it('returns correct result when y below extent', function() {
var extent = ol.extent.createOrUpdate(0, 0, 1, 1);
var x = 0;
var y = -2;
expect(ol.extent.closestSquaredDistanceXY(extent, x, y)).to.be(4);
});
it('returns correct result when y above extent', function() {
var extent = ol.extent.createOrUpdate(0, 0, 1, 1);
var x = 0;
var y = 3;
expect(ol.extent.closestSquaredDistanceXY(extent, x, y)).to.be(4);
});
it('returns correct result for other y values', function() {
var extent = ol.extent.createOrUpdate(0, 0, 1, 1);
var x = 3;
var y = 0.5;
expect(ol.extent.closestSquaredDistanceXY(extent, x, y)).to.be(4);
});
});
describe('createOrUpdateFromCoordinate', function() {
it('works when no extent passed', function() {
var coords = [0, 1];
var expected = [0, 1, 0, 1];
var got = ol.extent.createOrUpdateFromCoordinate(coords);
expect(got).to.eql(expected);
});
it('updates a passed extent', function() {
var extent = ol.extent.createOrUpdate(-4, -7, -3, -6);
var coords = [0, 1];
var expected = [0, 1, 0, 1];
ol.extent.createOrUpdateFromCoordinate(coords, extent);
expect(extent).to.eql(expected);
});
});
describe('createOrUpdateFromCoordinates', function() {
it('works when single coordinate and no extent passed', function() {
var coords = [[0, 1]];
var expected = [0, 1, 0, 1];
var got = ol.extent.createOrUpdateFromCoordinates(coords);
expect(got).to.eql(expected);
});
it('changes the passed extent when single coordinate', function() {
var extent = ol.extent.createOrUpdate(-4, -7, -3, -6);
var coords = [[0, 1]];
var expected = [0, 1, 0, 1];
ol.extent.createOrUpdateFromCoordinates(coords, extent);
expect(extent).to.eql(expected);
});
it('works when multiple coordinates and no extent passed', function() {
var coords = [[0, 1], [2, 3]];
var expected = [0, 1, 2, 3];
var got = ol.extent.createOrUpdateFromCoordinates(coords);
expect(got).to.eql(expected);
});
it('changes the passed extent when multiple coordinates given', function() {
var extent = ol.extent.createOrUpdate(-4, -7, -3, -6);
var coords = [[0, 1], [-2, -1]];
var expected = [-2, -1, 0, 1];
ol.extent.createOrUpdateFromCoordinates(coords, extent);
expect(extent).to.eql(expected);
});
});
describe('createOrUpdateFromRings', function() {
it('works when single ring and no extent passed', function() {
var ring = [[0, 0], [0, 2], [2, 2], [2, 0], [0, 0]];
var rings = [ring];
var expected = [0, 0, 2, 2];
var got = ol.extent.createOrUpdateFromRings(rings);
expect(got).to.eql(expected);
});
it('changes the passed extent when single ring given', function() {
var ring = [[0, 0], [0, 2], [2, 2], [2, 0], [0, 0]];
var rings = [ring];
var extent = [1, 1, 4, 7];
var expected = [0, 0, 2, 2];
ol.extent.createOrUpdateFromRings(rings, extent);
expect(extent).to.eql(expected);
});
it('works when multiple rings and no extent passed', function() {
var ring1 = [[0, 0], [0, 2], [2, 2], [2, 0], [0, 0]];
var ring2 = [[1, 1], [1, 3], [3, 3], [3, 1], [1, 1]];
var rings = [ring1, ring2];
var expected = [0, 0, 3, 3];
var got = ol.extent.createOrUpdateFromRings(rings);
expect(got).to.eql(expected);
});
it('changes the passed extent when multiple rings given', function() {
var ring1 = [[0, 0], [0, 2], [2, 2], [2, 0], [0, 0]];
var ring2 = [[1, 1], [1, 3], [3, 3], [3, 1], [1, 1]];
var rings = [ring1, ring2];
var extent = [1, 1, 4, 7];
var expected = [0, 0, 3, 3];
ol.extent.createOrUpdateFromRings(rings, extent);
expect(extent).to.eql(expected);
});
});
describe('empty', function() {
it('returns the empty extent', function() {
var extent = [1, 2, 3, 4];
var expected = [Infinity, Infinity, -Infinity, -Infinity];
var got = ol.extent.empty(extent);
expect(got).to.eql(expected);
});
it('empties a passed extent in place', function() {
var extent = [1, 2, 3, 4];
var expected = [Infinity, Infinity, -Infinity, -Infinity];
ol.extent.empty(extent);
expect(extent).to.eql(expected);
});
});
describe('forEachCorner', function() {
var callbackFalse;
var callbackTrue;
beforeEach(function() {
callbackFalse = sinon.spy(function() {
return false;
});
callbackTrue = sinon.spy(function() {
return true;
});
});
it('calls the passed callback for each corner', function() {
var extent = [1, 2, 3, 4];
ol.extent.forEachCorner(extent, callbackFalse);
expect(callbackFalse.callCount).to.be(4);
});
it('calls the passed callback with each corner', function() {
var extent = [1, 2, 3, 4];
ol.extent.forEachCorner(extent, callbackFalse);
var firstCallFirstArg = callbackFalse.args[0][0];
var secondCallFirstArg = callbackFalse.args[1][0];
var thirdCallFirstArg = callbackFalse.args[2][0];
var fourthCallFirstArg = callbackFalse.args[3][0];
expect(firstCallFirstArg).to.eql([1, 2]); // bl
expect(secondCallFirstArg).to.eql([3, 2]); // br
expect(thirdCallFirstArg).to.eql([3, 4]); // tr
expect(fourthCallFirstArg).to.eql([1, 4]); // tl
});
it('calls a truthy callback only once', function() {
var extent = [1, 2, 3, 4];
ol.extent.forEachCorner(extent, callbackTrue);
expect(callbackTrue.callCount).to.be(1);
});
it('ensures that any corner can cancel the callback execution', function() {
var extent = [1, 2, 3, 4];
var bottomLeftSpy = sinon.spy(function(corner) {
return (corner[0] === 1 && corner[1] === 2) ? true : false;
});
var bottomRightSpy = sinon.spy(function(corner) {
return (corner[0] === 3 && corner[1] === 2) ? true : false;
});
var topRightSpy = sinon.spy(function(corner) {
return (corner[0] === 3 && corner[1] === 4) ? true : false;
});
var topLeftSpy = sinon.spy(function(corner) {
return (corner[0] === 1 && corner[1] === 4) ? true : false;
});
ol.extent.forEachCorner(extent, bottomLeftSpy);
ol.extent.forEachCorner(extent, bottomRightSpy);
ol.extent.forEachCorner(extent, topRightSpy);
ol.extent.forEachCorner(extent, topLeftSpy);
expect(bottomLeftSpy.callCount).to.be(1);
expect(bottomRightSpy.callCount).to.be(2);
expect(topRightSpy.callCount).to.be(3);
expect(topLeftSpy.callCount).to.be(4);
});
it('returns false eventually, if no invocation returned a truthy value',
function() {
var extent = [1, 2, 3, 4];
var spy = sinon.spy(); // will return undefined for each corner
var got = ol.extent.forEachCorner(extent, spy);
expect(spy.callCount).to.be(4);
expect(got).to.be(false);
}
);
it('calls the callback with given scope', function() {
var extent = [1, 2, 3, 4];
var scope = {humpty: 'dumpty'};
ol.extent.forEachCorner(extent, callbackTrue, scope);
expect(callbackTrue.calledOn(scope)).to.be(true);
});
});
describe('getArea', function() {
it('returns zero for empty extents', function() {
var emptyExtent = ol.extent.createEmpty();
var areaEmpty = ol.extent.getArea(emptyExtent);
expect(areaEmpty).to.be(0);
var extentDeltaXZero = [45, 67, 45, 78];
var areaDeltaXZero = ol.extent.getArea(extentDeltaXZero);
expect(areaDeltaXZero).to.be(0);
var extentDeltaYZero = [11, 67, 45, 67];
var areaDeltaYZero = ol.extent.getArea(extentDeltaYZero);
expect(areaDeltaYZero).to.be(0);
});
it('calculates correct area for other extents', function() {
var extent = [0, 0, 10, 10];
var area = ol.extent.getArea(extent);
expect(area).to.be(100);
});
});
describe('getIntersection()', function() {
it('returns the intersection of two extents', function() {
var world = [-180, -90, 180, 90];
@@ -175,6 +436,12 @@ describe('ol.extent', function() {
expect(center[0]).to.eql(2);
expect(center[1]).to.eql(3);
});
it('returns [NaN, NaN] for empty extents', function() {
var extent = ol.extent.createEmpty();
var center = ol.extent.getCenter(extent);
expect('' + center[0]).to.be('NaN');
expect('' + center[1]).to.be('NaN');
});
});
describe('getCorner', function() {
@@ -200,6 +467,21 @@ describe('ol.extent', function() {
expect(ol.extent.getCorner(extent, corner)).to.eql([3, 4]);
});
it('throws exception for unexpected corner', function() {
expect(function() {
ol.extent.getCorner(extent, 'foobar');
}).to.throwException();
});
});
describe('getEnlargedArea', function() {
it('returns enlarged area of two extents', function() {
var extent1 = [-1, -1, 0, 0];
var extent2 = [0, 0, 1, 1];
var enlargedArea = ol.extent.getEnlargedArea(extent1, extent2);
expect(enlargedArea).to.be(4);
});
});
describe('getForViewAndSize', function() {
@@ -259,6 +541,28 @@ describe('ol.extent', function() {
});
});
describe('getIntersectionArea', function() {
it('returns correct area when extents intersect', function() {
var extent1 = [0, 0, 2, 2];
var extent2 = [1, 1, 3, 3];
var intersectionArea = ol.extent.getIntersectionArea(extent1, extent2);
expect(intersectionArea).to.be(1);
});
it('returns 0 when extents do not intersect', function() {
var extent1 = [0, 0, 1, 1];
var extent2 = [2, 2, 3, 3];
var intersectionArea = ol.extent.getIntersectionArea(extent1, extent2);
expect(intersectionArea).to.be(0);
});
});
describe('getMargin', function() {
it('returns the correct margin (sum of width and height)', function() {
var extent = [1, 2, 3, 4];
expect(ol.extent.getMargin(extent)).to.be(4);
});
});
describe('intersects', function() {
it('returns the expected value', function() {
@@ -294,6 +598,29 @@ describe('ol.extent', function() {
});
});
describe('isInfinite', function() {
it('returns true for infinite extents', function() {
var extents = [
[-Infinity, 0, 0, 0],
[0, -Infinity, 0, 0],
[0, 0, +Infinity, 0],
[0, 0, 0, +Infinity]
];
expect(ol.extent.isInfinite(extents[0])).to.be(true);
expect(ol.extent.isInfinite(extents[1])).to.be(true);
expect(ol.extent.isInfinite(extents[2])).to.be(true);
expect(ol.extent.isInfinite(extents[3])).to.be(true);
});
it('returns false for other extents', function() {
var extents = [
ol.extent.createEmpty(),
[1, 2, 3, 4]
];
expect(ol.extent.isInfinite(extents[0])).to.be(false);
expect(ol.extent.isInfinite(extents[1])).to.be(false);
});
});
describe('touches', function() {
it('returns the expected value', function() {