range-ts
Version:
RangeMap implementation based on Guava
251 lines • 14.9 kB
JavaScript
import { BoundType } from '../core/bound-type';
import { NumberRange } from './number-range';
describe('Range', function () {
describe('toString', function () {
it('should print open ranges', function () {
expect(NumberRange.open(4, 9).toString()).toBe('(4..9)');
});
it('should print closed ranges', function () {
expect(NumberRange.closed(4, 9).toString()).toBe('[4..9]');
});
it('should print closed open ranges', function () {
expect(NumberRange.closedOpen(4, 9).toString()).toBe('[4..9)');
});
it('should print all', function () {
expect(NumberRange.all().toString()).toBe('(-∞..+∞)');
});
it('should print Dates using toISOString()', function () {
expect(NumberRange.open(new Date(4), new Date(9)).toString()).toBe('(1970-01-01T00:00:00.004Z..1970-01-01T00:00:00.009Z)');
});
});
describe('contains', function () {
describe('closed open', function () {
it('should match on a closed endpoint', function () {
expect(NumberRange.closedOpen(2, 4).contains(2)).toBeTrue();
expect(NumberRange.closedOpen(new Date(2), new Date(4)).contains(2)).toBeTrue();
expect(NumberRange.closedOpen(new Date(2), new Date(4)).contains(new Date(2))).toBeTrue();
});
it('should not match on an open endpoint', function () {
expect(NumberRange.closedOpen(2, 4).contains(4)).toBeFalse();
expect(NumberRange.closedOpen(new Date(2), new Date(4)).contains(new Date(4))).toBeFalse();
});
it('should match on a number inside', function () {
expect(NumberRange.closedOpen(2, 4).contains(3)).toBeTrue();
expect(NumberRange.closedOpen(new Date(2), new Date(4)).contains(new Date(3))).toBeTrue();
});
it('should not match on a number before', function () {
expect(NumberRange.closedOpen(2, 4).contains(1)).toBeFalse();
});
it('should not match on a number after', function () {
expect(NumberRange.closedOpen(2, 4).contains(5)).toBeFalse();
});
});
describe('closed', function () {
it('should match on a closed lower endpoint', function () {
expect(NumberRange.closed(2, 4).contains(2)).toBeTrue();
});
it('should match on a closed upper endpoint', function () {
expect(NumberRange.closed(2, 4).contains(4)).toBeTrue();
});
it('should match on a number inside', function () {
expect(NumberRange.closed(2, 4).contains(3)).toBeTrue();
});
it('should not match on a number before', function () {
expect(NumberRange.closed(2, 4).contains(1)).toBeFalse();
});
it('should not match on a number after', function () {
expect(NumberRange.closed(2, 4).contains(5)).toBeFalse();
});
});
describe('atMost', function () {
it('should match equal to the bound', function () {
expect(NumberRange.atMost(5).contains(5)).toBeTrue();
});
it('should match below', function () {
expect(NumberRange.atMost(5).contains(4)).toBeTrue();
});
it('should not match above', function () {
expect(NumberRange.atMost(5).contains(6)).toBeFalse();
});
});
describe('atLeast', function () {
it('should match equal to the bound', function () {
expect(NumberRange.atLeast(5).contains(5)).toBeTrue();
});
it('should not match below', function () {
expect(NumberRange.atLeast(5).contains(4)).toBeFalse();
});
it('should match above', function () {
expect(NumberRange.atLeast(5).contains(6)).toBeTrue();
});
});
});
describe('isConnected', function () {
it('should be false when there is a gap between two closed open ranges', function () {
expect(NumberRange.closedOpen(2, 4).isConnected(NumberRange.closedOpen(5, 7))).toBeFalse();
expect(NumberRange.closedOpen(5, 7).isConnected(NumberRange.closedOpen(2, 4))).toBeFalse();
});
it('should be true when two closed open ranges overlap', function () {
expect(NumberRange.closedOpen(2, 4).isConnected(NumberRange.closedOpen(3, 4))).toBeTrue();
expect(NumberRange.closedOpen(3, 4).isConnected(NumberRange.closedOpen(2, 4))).toBeTrue();
});
it('should be true when a closed and open range touch on the same value', function () {
expect(NumberRange.closedOpen(2, 4).isConnected(NumberRange.closedOpen(4, 6))).toBeTrue();
expect(NumberRange.closedOpen(4, 6).isConnected(NumberRange.closedOpen(2, 4))).toBeTrue();
});
it('should be false when two open ranges do not touch', function () {
expect(NumberRange.upTo(4, BoundType.OPEN).isConnected(NumberRange.atLeast(6))).toBeFalse();
expect(NumberRange.atLeast(6).isConnected(NumberRange.upTo(4, BoundType.OPEN))).toBeFalse();
});
it('should be true when one closedOpen range encloses the other', function () {
expect(NumberRange.closedOpen(2, 10).isConnected(NumberRange.closedOpen(4, 6))).toBeTrue();
expect(NumberRange.closedOpen(4, 6).isConnected(NumberRange.closedOpen(2, 10))).toBeTrue();
});
});
describe('intersecting', function () {
it('should intersect with closedOpen and atLeast', function () {
var result = NumberRange.closedOpen(2, 4).intersection(NumberRange.atLeast(3));
expect(result === null || result === void 0 ? void 0 : result.toString()).toBe('[3..4)');
});
it('should intersect with Date closedOpen and Date atLeast', function () {
var result = NumberRange.closedOpen(new Date(2), new Date(4)).intersection(NumberRange.atLeast(new Date(3)));
expect(result === null || result === void 0 ? void 0 : result.toString()).toBe('[1970-01-01T00:00:00.003Z..1970-01-01T00:00:00.004Z)');
});
it('should intersect with Date closedOpen and number atLeast', function () {
var result = NumberRange.closedOpen(new Date(2), new Date(4)).intersection(NumberRange.atLeast(3));
expect(result === null || result === void 0 ? void 0 : result.toString()).toBe('[3..1970-01-01T00:00:00.004Z)');
});
it('should intersect with closedOpen and atMost', function () {
var result = NumberRange.closedOpen(2, 4).intersection(NumberRange.atMost(3));
expect(result === null || result === void 0 ? void 0 : result.toString()).toBe('[2..3]');
});
it('should be able to handle an empty range', function () {
var result = NumberRange.closedOpen(2, 4).intersection(NumberRange.closedOpen(4, 6));
expect(result === null || result === void 0 ? void 0 : result.toString()).toBe('[4..4)');
});
it('should be able to handle a range containing one value', function () {
var result = NumberRange.closed(2, 4).intersection(NumberRange.closedOpen(4, 6));
expect(result === null || result === void 0 ? void 0 : result.toString()).toBe('[4..4]');
});
});
describe('span', function () {
it('should work for two non connecting closedOpen ranges', function () {
var range1 = NumberRange.closedOpen(1, 5);
var range2 = NumberRange.closedOpen(8, 12);
var result = range1.span(range2);
expect(result.toString()).toBe('[1..12)');
});
it('should work for two overlapping closedOpen ranges', function () {
var range1 = NumberRange.closedOpen(1, 10);
var range2 = NumberRange.closedOpen(7, 12);
var result = range1.span(range2);
expect(result.toString()).toBe('[1..12)');
});
it('should work for a closedOpen and open range', function () {
var range1 = NumberRange.closedOpen(1, 5);
var range2 = NumberRange.atLeast(7);
var result = range1.span(range2);
expect(result.toString()).toBe('[1..+∞)');
});
it('should work for with two non connecting open ranges', function () {
var range1 = NumberRange.atMost(4);
var range2 = NumberRange.atLeast(7);
var result = range1.span(range2);
expect(result.toString()).toBe('(-∞..+∞)');
expect(result.lowerBoundType).toBe(BoundType.OPEN);
expect(result.lowerEndpoint).toBe(Number.NEGATIVE_INFINITY);
expect(result.upperBoundType).toBe(BoundType.OPEN);
expect(result.upperEndpoint).toBe(Number.POSITIVE_INFINITY);
});
});
describe('overlaps', function () {
it('should be false when there is no overlap', function () {
expect(NumberRange.closedOpen(2, 4).overlaps(NumberRange.closedOpen(6, 8))).toBeFalse();
expect(NumberRange.closedOpen(2, 4).overlaps(NumberRange.closedOpen(4, 8))).toBeFalse();
expect(NumberRange.closed(2, 4).overlaps(NumberRange.closedOpen(5, 8))).toBeFalse();
expect(NumberRange.closedOpen(10, 20).overlaps(NumberRange.closedOpen(21, 30))).toBeFalse();
expect(NumberRange.closedOpen(10, 20).overlaps(NumberRange.closedOpen(25, 30))).toBeFalse();
expect(NumberRange.closedOpen(10, 20).overlaps(NumberRange.closed(20, 30))).toBeFalse();
});
it('should be true when the ranges overlap in any way', function () {
expect(NumberRange.closedOpen(10, 20).overlaps(NumberRange.closedOpen(19, 30))).toBeTrue();
expect(NumberRange.closedOpen(10, 20).overlaps(NumberRange.closedOpen(18, 30))).toBeTrue();
expect(NumberRange.closed(10, 20).overlaps(NumberRange.closedOpen(20, 30))).toBeTrue();
expect(NumberRange.closed(10, 20).overlaps(NumberRange.closedOpen(19, 30))).toBeTrue();
expect(NumberRange.closedOpen(10, 20).overlaps(NumberRange.closedOpen(10, 20))).toBeTrue();
expect(NumberRange.closedOpen(10, 20).overlaps(NumberRange.closedOpen(11, 19))).toBeTrue();
expect(NumberRange.closed(10, 20).overlaps(NumberRange.closedOpen(10, 20))).toBeTrue();
expect(NumberRange.closed(10, 20).overlaps(NumberRange.closedOpen(11, 20))).toBeTrue();
expect(NumberRange.closed(10, 20).overlaps(NumberRange.closedOpen(10, 19))).toBeTrue();
expect(NumberRange.closedOpen(20, 30).overlaps(NumberRange.closedOpen(10, 21))).toBeTrue();
expect(NumberRange.closedOpen(20, 30).overlaps(NumberRange.closedOpen(11, 22))).toBeTrue();
expect(NumberRange.closed(20, 30).overlaps(NumberRange.closedOpen(10, 21))).toBeTrue();
expect(NumberRange.closed(20, 30).overlaps(NumberRange.closedOpen(11, 22))).toBeTrue();
expect(NumberRange.closedOpen(20, 30).overlaps(NumberRange.closed(10, 20))).toBeTrue();
expect(NumberRange.closedOpen(20, 30).overlaps(NumberRange.closed(11, 21))).toBeTrue();
expect(NumberRange.closed(20, 30).overlaps(NumberRange.closed(10, 20))).toBeTrue();
expect(NumberRange.closed(20, 30).overlaps(NumberRange.closed(11, 21))).toBeTrue();
expect(NumberRange.closedOpen(20, 30).overlaps(NumberRange.closedOpen(20, 29))).toBeTrue();
expect(NumberRange.closedOpen(20, 30).overlaps(NumberRange.closedOpen(20, 30))).toBeTrue();
expect(NumberRange.closedOpen(20, 30).overlaps(NumberRange.closedOpen(20, 31))).toBeTrue();
expect(NumberRange.closedOpen(20, 30).overlaps(NumberRange.closedOpen(19, 31))).toBeTrue();
expect(NumberRange.closed(20, 30).overlaps(NumberRange.closedOpen(20, 30))).toBeTrue();
expect(NumberRange.closed(20, 30).overlaps(NumberRange.closedOpen(19, 30))).toBeTrue();
expect(NumberRange.closed(20, 30).overlaps(NumberRange.closedOpen(20, 31))).toBeTrue();
expect(NumberRange.closed(20, 30).overlaps(NumberRange.closed(20, 30))).toBeTrue();
expect(NumberRange.closed(20, 30).overlaps(NumberRange.closed(19, 31))).toBeTrue();
expect(NumberRange.closed(20, 30).overlaps(NumberRange.closed(19, 30))).toBeTrue();
expect(NumberRange.closed(20, 30).overlaps(NumberRange.closed(20, 31))).toBeTrue();
});
});
describe('encloses', function () {
it('a closedOpen should enclose itself', function () {
var range = NumberRange.closedOpen(1, 20);
expect(range.encloses(range)).toBeTrue();
});
it('should work on two closedOpen ranges', function () {
var largeRange = NumberRange.closedOpen(3, 10);
var smallRange = NumberRange.closedOpen(4, 6);
expect(largeRange.encloses(smallRange)).toBeTrue();
expect(smallRange.encloses(largeRange)).toBeFalse();
});
describe('docs specifications', function () {
it('[3...6] encloses [4..5]', function () {
var r1 = NumberRange.closed(3, 6);
var r2 = NumberRange.closed(4, 5);
expect(r1.encloses(r2)).toBeTrue();
});
it('(3..6) encloses (3..6)', function () {
var r1 = NumberRange.open(3, 6);
var r2 = NumberRange.open(3, 6);
expect(r1.encloses(r2)).toBeTrue();
});
it('[3..6] encloses [4..4)', function () {
var r1 = NumberRange.closed(3, 6);
var r2 = NumberRange.closedOpen(4, 4);
expect(r1.encloses(r2)).toBeTrue();
});
it('(3..6] does not enclose [3..6] ', function () {
var r1 = NumberRange.openClosed(3, 6);
var r2 = NumberRange.closed(3, 6);
expect(r1.encloses(r2)).toBeFalse();
});
it('[4..5] does not enclose (3..6)', function () {
var r1 = NumberRange.closed(4, 5);
var r2 = NumberRange.open(3, 6);
expect(r1.encloses(r2)).toBeFalse();
});
it('[3..6] does not enclose (1..1]', function () {
var r1 = NumberRange.closed(3, 6);
var r2 = NumberRange.openClosed(1, 1);
expect(r1.encloses(r2)).toBeFalse();
});
});
});
describe('isEmpty', function () {
it('should support Dates', function () {
expect(NumberRange.closedOpen(new Date(0), new Date(0)).isEmpty()).toBeTrue();
});
});
});
//# sourceMappingURL=number-range.spec.js.map