|
@@ -4,24 +4,22 @@
|
|
|
* @author David Sehnal <david.sehnal@gmail.com>
|
|
|
*/
|
|
|
|
|
|
-import Iterator, * as I from '../collections/iterator'
|
|
|
+import Iterator from '../collections/iterator'
|
|
|
import IntPair from '../collections/int-pair'
|
|
|
import * as Sort from '../collections/sort'
|
|
|
+import RangeSet from '../collections/range-set'
|
|
|
|
|
|
describe('basic iterators', () => {
|
|
|
function check<T>(name: string, iter: Iterator<T>, expected: T[]) {
|
|
|
it(name, () => {
|
|
|
- expect(I.toArray(iter)).toEqual(expected);
|
|
|
+ expect(Iterator.toArray(iter)).toEqual(expected);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- check('empty', I.EmptyIterator, []);
|
|
|
- check('singleton', I.SingletonIterator(10), [10]);
|
|
|
- check('singleton reset', I.SingletonIterator(10).reset(13), [13]);
|
|
|
- check('array', I.ArrayIterator([1, 2, 3]), [1, 2, 3]);
|
|
|
- check('array reset', I.ArrayIterator([1, 2, 3]).reset([4]), [4]);
|
|
|
- check('range', I.RangeIterator({ min: 0, max: 3 }), [0, 1, 2]);
|
|
|
- check('range reset', I.RangeIterator().reset({ min: 1, max: 2 }), [1]);
|
|
|
+ check('empty', Iterator.Empty, []);
|
|
|
+ check('singleton', Iterator.Singleton(10), [10]);
|
|
|
+ check('array', Iterator.Array([1, 2, 3]), [1, 2, 3]);
|
|
|
+ check('range', Iterator.Range(0, 3), [0, 1, 2, 3]);
|
|
|
});
|
|
|
|
|
|
describe('int pair', () => {
|
|
@@ -117,4 +115,66 @@ describe('qsort-dual array', () => {
|
|
|
}
|
|
|
test('sorted', data, false);
|
|
|
test('shuffled', data, true);
|
|
|
-})
|
|
|
+})
|
|
|
+
|
|
|
+describe('range set', () => {
|
|
|
+ function testEq(name: string, set: RangeSet, expected: number[]) {
|
|
|
+ it(name, () => {
|
|
|
+ // copy the arrays to ensure "compatibility" between typed and native arrays
|
|
|
+ expect(Array.prototype.slice.call(Iterator.toArray(set.elements()))).toEqual(Array.prototype.slice.call(expected));
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ const empty = RangeSet.Empty;
|
|
|
+ const singleton = RangeSet.ofSingleton(10);
|
|
|
+ const range = RangeSet.ofRange(1, 4);
|
|
|
+ const arr = RangeSet.ofSortedArray([1, 3, 6]);
|
|
|
+
|
|
|
+ testEq('empty', empty, []);
|
|
|
+ testEq('singleton', singleton, [10]);
|
|
|
+ testEq('range', range, [1, 2, 3, 4]);
|
|
|
+ testEq('sorted array', arr, [1, 3, 6]);
|
|
|
+
|
|
|
+ expect(empty.has(10)).toBe(false);
|
|
|
+ expect(empty.indexOf(10)).toBe(-1);
|
|
|
+
|
|
|
+ expect(singleton.has(10)).toBe(true);
|
|
|
+ expect(singleton.has(11)).toBe(false);
|
|
|
+ expect(singleton.indexOf(10)).toBe(0);
|
|
|
+ expect(singleton.indexOf(11)).toBe(-1);
|
|
|
+
|
|
|
+ expect(range.has(4)).toBe(true);
|
|
|
+ expect(range.has(5)).toBe(false);
|
|
|
+ expect(range.indexOf(4)).toBe(3);
|
|
|
+ expect(range.indexOf(11)).toBe(-1);
|
|
|
+
|
|
|
+ expect(arr.has(3)).toBe(true);
|
|
|
+ expect(arr.has(4)).toBe(false);
|
|
|
+ expect(arr.indexOf(3)).toBe(1);
|
|
|
+ expect(arr.indexOf(11)).toBe(-1);
|
|
|
+
|
|
|
+ testEq('union ES', RangeSet.union(empty, singleton), [10]);
|
|
|
+ testEq('union ER', RangeSet.union(empty, range), [1, 2, 3, 4]);
|
|
|
+ testEq('union EA', RangeSet.union(empty, arr), [1, 3, 6]);
|
|
|
+ testEq('union SS', RangeSet.union(singleton, RangeSet.ofSingleton(16)), [10, 16]);
|
|
|
+ testEq('union SR', RangeSet.union(range, singleton), [1, 2, 3, 4, 10]);
|
|
|
+ testEq('union SA', RangeSet.union(arr, singleton), [1, 3, 6, 10]);
|
|
|
+ testEq('union SA1', RangeSet.union(arr, RangeSet.ofSingleton(3)), [1, 3, 6]);
|
|
|
+ testEq('union RR', RangeSet.union(range, range), [1, 2, 3, 4]);
|
|
|
+ testEq('union RR1', RangeSet.union(range, RangeSet.ofRange(6, 7)), [1, 2, 3, 4, 6, 7]);
|
|
|
+ testEq('union RR2', RangeSet.union(range, RangeSet.ofRange(3, 5)), [1, 2, 3, 4, 5]);
|
|
|
+ testEq('union RA', RangeSet.union(range, arr), [1, 2, 3, 4, 6]);
|
|
|
+ testEq('union AA', RangeSet.union(arr, RangeSet.ofSortedArray([2, 4, 6, 7])), [1, 2, 3, 4, 6, 7]);
|
|
|
+ testEq('union AA1', RangeSet.union(arr, RangeSet.ofSortedArray([2, 3, 4, 6, 7])), [1, 2, 3, 4, 6, 7]);
|
|
|
+
|
|
|
+ testEq('intersect ES', RangeSet.intersect(empty, singleton), []);
|
|
|
+ testEq('intersect ER', RangeSet.intersect(empty, range), []);
|
|
|
+ testEq('intersect EA', RangeSet.intersect(empty, arr), []);
|
|
|
+ testEq('intersect SS', RangeSet.intersect(singleton, RangeSet.ofSingleton(16)), []);
|
|
|
+ testEq('intersect SS', RangeSet.intersect(singleton, singleton), [10]);
|
|
|
+ testEq('intersect SR', RangeSet.intersect(range, singleton), []);
|
|
|
+ testEq('intersect RR', RangeSet.intersect(range, range), [1, 2, 3, 4]);
|
|
|
+ testEq('intersect RR2', RangeSet.intersect(range, RangeSet.ofRange(3, 5)), [3, 4]);
|
|
|
+ testEq('intersect RA', RangeSet.intersect(range, arr), [1, 3]);
|
|
|
+ testEq('intersect AA', RangeSet.intersect(arr, RangeSet.ofSortedArray([2, 3, 4, 6, 7])), [3, 6]);
|
|
|
+});
|