import QueryRange from '../../src/flux/models/query-range'; describe('QueryRange', function QueryRangeSpecs() { describe('@infinite', () => it('should return a query range with a null limit and offset', () => { const infinite = QueryRange.infinite(); expect(infinite.limit).toBe(null); expect(infinite.offset).toBe(null); })); describe('@rangesBySubtracting', () => { it('should throw an exception if either range is infinite', () => { const infinite = QueryRange.infinite(); expect(() => QueryRange.rangesBySubtracting(infinite, new QueryRange({ offset: 0, limit: 10 })) ).toThrow(); expect(() => QueryRange.rangesBySubtracting(new QueryRange({ offset: 0, limit: 10 }), infinite) ).toThrow(); }); it('should return one or more ranges created by punching the provided range', () => { const test = ({ a, b, result }) => expect(QueryRange.rangesBySubtracting(a, b)).toEqual(result); test({ a: new QueryRange({ offset: 0, limit: 10 }), b: new QueryRange({ offset: 3, limit: 3 }), result: [new QueryRange({ offset: 0, limit: 3 }), new QueryRange({ offset: 6, limit: 4 })], }); test({ a: new QueryRange({ offset: 0, limit: 10 }), b: new QueryRange({ offset: 3, limit: 10 }), result: [new QueryRange({ offset: 0, limit: 3 })], }); test({ a: new QueryRange({ offset: 0, limit: 10 }), b: new QueryRange({ offset: 0, limit: 10 }), result: [], }); test({ a: new QueryRange({ offset: 5, limit: 10 }), b: new QueryRange({ offset: 0, limit: 4 }), result: [new QueryRange({ offset: 5, limit: 10 })], }); test({ a: new QueryRange({ offset: 5, limit: 10 }), b: new QueryRange({ offset: 0, limit: 8 }), result: [new QueryRange({ offset: 8, limit: 7 })], }); }); }); describe('isInfinite', () => it('should return true for an infinite range, false otherwise', () => { const infinite = QueryRange.infinite(); expect(infinite.isInfinite()).toBe(true); expect(new QueryRange({ offset: 0, limit: 4 }).isInfinite()).toBe(false); })); describe('start', () => it('should be an alias for offset', () => expect(new QueryRange({ offset: 3, limit: 4 }).start).toBe(3))); describe('end', () => it('should be offset + limit', () => expect(new QueryRange({ offset: 3, limit: 4 }).end).toBe(7))); describe('isContiguousWith', () => { it('should return true if either range is infinite', () => { const a = new QueryRange({ offset: 3, limit: 4 }); expect(a.isContiguousWith(QueryRange.infinite())).toBe(true); expect(QueryRange.infinite().isContiguousWith(a)).toBe(true); }); it('should return true if the ranges intersect or touch, false otherwise', () => { const a = new QueryRange({ offset: 3, limit: 4 }); const b = new QueryRange({ offset: 0, limit: 2 }); const c = new QueryRange({ offset: 0, limit: 3 }); const d = new QueryRange({ offset: 7, limit: 10 }); const e = new QueryRange({ offset: 8, limit: 10 }); // True expect(a.isContiguousWith(d)).toBe(true); expect(d.isContiguousWith(a)).toBe(true); expect(a.isContiguousWith(c)).toBe(true); expect(c.isContiguousWith(a)).toBe(true); // False expect(a.isContiguousWith(b)).toBe(false); expect(b.isContiguousWith(a)).toBe(false); expect(a.isContiguousWith(e)).toBe(false); expect(e.isContiguousWith(a)).toBe(false); expect(b.isContiguousWith(e)).toBe(false); expect(e.isContiguousWith(b)).toBe(false); }); }); });