UNPKG

range-ts

Version:

RangeMap implementation based on Guava

251 lines 14.9 kB
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