import { cutSpanWithSpans } from '../../src/utils/spans'; import 'jest'; function cutSpan(from: number, to: number, cuts: [number, number][]): [number, number][] { return cutSpanWithSpans( { from: from, to: to }, cuts.map(([from, to]) => ({ from, to })) ).map(({ from, to }) => [from, to]); } describe('cutSpanWithSpans', function() { it('should find spans in simple non-intersected borders', function() { let cutSpans = [[3, 5], [6, 8], [10, 20]] as [number, number][]; expect(cutSpan(4, 11, cutSpans)).toEqual([[5, 6], [8, 10]]); expect(cutSpan(5, 11, cutSpans)).toEqual([[5, 6], [8, 10]]); expect(cutSpan(4, 10, cutSpans)).toEqual([[5, 6], [8, 10]]); expect(cutSpan(5, 10, cutSpans)).toEqual([[5, 6], [8, 10]]); expect(cutSpan(4, 20, cutSpans)).toEqual([[5, 6], [8, 10]]); expect(cutSpan(4, 21, cutSpans)).toEqual([[5, 6], [8, 10], [20, 21]]); expect(cutSpan(2, 20, cutSpans)).toEqual([[2, 3], [5, 6], [8, 10]]); expect(cutSpan(2, 21, cutSpans)).toEqual([[2, 3], [5, 6], [8, 10], [20, 21]]); expect(cutSpan(3, 11, cutSpans)).toEqual([[5, 6], [8, 10]]); expect(cutSpan(3, 20, cutSpans)).toEqual([[5, 6], [8, 10]]); expect(cutSpan(4, 7, [[3, 5], [6, 8]])).toEqual([[5, 6]]); }); it('should handle empty input spans list case', function() { expect(cutSpan(4, 10, [])).toEqual([[4, 10]]); }); it('should handle case when from and to are inside of one big span', function() { expect(cutSpan(4, 10, [[1, 20]])).toEqual([]); expect(cutSpan(4, 10, [[1, 10]])).toEqual([]); expect(cutSpan(4, 10, [[4, 20]])).toEqual([]); expect(cutSpan(4, 10, [[4, 10]])).toEqual([]); }); it('should be ready to get not-sorted cuts', function() { expect(cutSpan(0, 20, [[3, 5], [1, 2]])).toEqual([[0, 1], [2, 3], [5, 20]]); expect(cutSpan(0, 20, [[3, 5], [1, 2], [0.1, 0.5]])).toEqual([[0, 0.1], [0.5, 1], [2, 3], [5, 20]]); }); it('should be ready to get overlayed cuts', function() { expect(cutSpan(0, 20, [[3, 5], [4, 10]])).toEqual([[0,3], [10, 20]]); }); });