ordered-set.spec.ts 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /**
  2. * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import OrderedSet from '../ordered-set'
  7. import Interval from '../interval'
  8. describe('ordered set', () => {
  9. function ordSetToArray(set: OrderedSet) {
  10. const ret = [];
  11. for (let i = 0, _i = OrderedSet.size(set); i < _i; i++) ret.push(OrderedSet.getAt(set, i));
  12. return ret;
  13. }
  14. function testEq(name: string, set: OrderedSet, expected: number[]) {
  15. it(name, () => {
  16. // copy the arrays to ensure "compatibility" between typed and native arrays
  17. expect(Array.prototype.slice.call(ordSetToArray(set))).toEqual(Array.prototype.slice.call(expected));
  18. });
  19. }
  20. const empty = OrderedSet.Empty;
  21. const singleton10 = OrderedSet.ofSingleton(10);
  22. const range1_4 = OrderedSet.ofRange(1, 4);
  23. const arr136 = OrderedSet.ofSortedArray([1, 3, 6]);
  24. const iB = (s: number, e: number) => Interval.ofBounds(s, e);
  25. testEq('empty', empty, []);
  26. testEq('singleton', singleton10, [10]);
  27. testEq('range', range1_4, [1, 2, 3, 4]);
  28. testEq('sorted array', arr136, [1, 3, 6]);
  29. it('equality', () => {
  30. expect(OrderedSet.areEqual(empty, singleton10)).toBe(false);
  31. expect(OrderedSet.areEqual(singleton10, singleton10)).toBe(true);
  32. expect(OrderedSet.areEqual(range1_4, singleton10)).toBe(false);
  33. expect(OrderedSet.areEqual(arr136, OrderedSet.ofSortedArray([1, 3, 6]))).toBe(true);
  34. expect(OrderedSet.areEqual(arr136, OrderedSet.ofSortedArray([1, 4, 6]))).toBe(false);
  35. });
  36. it('areIntersecting', () => {
  37. expect(OrderedSet.areIntersecting(range1_4, arr136)).toBe(true);
  38. expect(OrderedSet.areIntersecting(empty, empty)).toBe(true);
  39. expect(OrderedSet.areIntersecting(empty, singleton10)).toBe(false);
  40. expect(OrderedSet.areIntersecting(empty, range1_4)).toBe(false);
  41. expect(OrderedSet.areIntersecting(empty, arr136)).toBe(false);
  42. });
  43. it('isSubset', () => {
  44. expect(OrderedSet.isSubset(singleton10, empty)).toBe(true);
  45. expect(OrderedSet.isSubset(range1_4, empty)).toBe(true);
  46. expect(OrderedSet.isSubset(arr136, empty)).toBe(true);
  47. expect(OrderedSet.isSubset(empty, empty)).toBe(true);
  48. expect(OrderedSet.isSubset(empty, singleton10)).toBe(false);
  49. expect(OrderedSet.isSubset(empty, range1_4)).toBe(false);
  50. expect(OrderedSet.isSubset(empty, arr136)).toBe(false);
  51. expect(OrderedSet.isSubset(singleton10, range1_4)).toBe(false);
  52. expect(OrderedSet.isSubset(range1_4, OrderedSet.ofRange(2, 3))).toBe(true);
  53. expect(OrderedSet.isSubset(arr136, range1_4)).toBe(false);
  54. expect(OrderedSet.isSubset(arr136, arr136)).toBe(true);
  55. expect(OrderedSet.isSubset(arr136, OrderedSet.ofSortedArray([1, 3]))).toBe(true);
  56. expect(OrderedSet.isSubset(arr136, OrderedSet.ofSortedArray([1, 3, 7]))).toBe(false);
  57. expect(OrderedSet.isSubset(OrderedSet.ofSortedArray([0, 1, 2, 3, 7, 10]), OrderedSet.ofSortedArray([1, 3, 7]))).toBe(true);
  58. expect(OrderedSet.isSubset(arr136, OrderedSet.ofSortedArray([1, 3, 10, 45]))).toBe(false);
  59. expect(OrderedSet.isSubset(arr136, OrderedSet.ofSortedArray([12, 13, 16]))).toBe(false);
  60. });
  61. it('access/membership', () => {
  62. expect(OrderedSet.has(empty, 10)).toBe(false);
  63. expect(OrderedSet.indexOf(empty, 10)).toBe(-1);
  64. expect(OrderedSet.has(singleton10, 10)).toBe(true);
  65. expect(OrderedSet.has(singleton10, 11)).toBe(false);
  66. expect(OrderedSet.indexOf(singleton10, 10)).toBe(0);
  67. expect(OrderedSet.indexOf(singleton10, 11)).toBe(-1);
  68. expect(OrderedSet.has(range1_4, 4)).toBe(true);
  69. expect(OrderedSet.has(range1_4, 5)).toBe(false);
  70. expect(OrderedSet.indexOf(range1_4, 4)).toBe(3);
  71. expect(OrderedSet.indexOf(range1_4, 11)).toBe(-1);
  72. expect(OrderedSet.has(arr136, 3)).toBe(true);
  73. expect(OrderedSet.has(arr136, 4)).toBe(false);
  74. expect(OrderedSet.indexOf(arr136, 3)).toBe(1);
  75. expect(OrderedSet.indexOf(arr136, 11)).toBe(-1);
  76. });
  77. it('interval range', () => {
  78. expect(OrderedSet.findRange(empty, 9, 11)).toEqual(iB(0, 0));
  79. expect(OrderedSet.findRange(empty, -9, -6)).toEqual(iB(0, 0));
  80. expect(OrderedSet.findRange(singleton10, 9, 11)).toEqual(iB(0, 1));
  81. expect(OrderedSet.findRange(range1_4, 2, 3)).toEqual(iB(1, 3));
  82. expect(OrderedSet.findRange(range1_4, -10, 2)).toEqual(iB(0, 2));
  83. expect(OrderedSet.findRange(range1_4, -10, 20)).toEqual(iB(0, 4));
  84. expect(OrderedSet.findRange(range1_4, 3, 20)).toEqual(iB(2, 4));
  85. expect(OrderedSet.findRange(arr136, 0, 1)).toEqual(iB(0, 1));
  86. expect(OrderedSet.findRange(arr136, 0, 3)).toEqual(iB(0, 2));
  87. expect(OrderedSet.findRange(arr136, 0, 4)).toEqual(iB(0, 2));
  88. expect(OrderedSet.findRange(arr136, 2, 4)).toEqual(iB(1, 2));
  89. expect(OrderedSet.findRange(arr136, 2, 7)).toEqual(iB(1, 3));
  90. })
  91. testEq('union ES', OrderedSet.union(empty, singleton10), [10]);
  92. testEq('union ER', OrderedSet.union(empty, range1_4), [1, 2, 3, 4]);
  93. testEq('union EA', OrderedSet.union(empty, arr136), [1, 3, 6]);
  94. testEq('union SS', OrderedSet.union(singleton10, OrderedSet.ofSingleton(16)), [10, 16]);
  95. testEq('union SR', OrderedSet.union(range1_4, singleton10), [1, 2, 3, 4, 10]);
  96. testEq('union SA', OrderedSet.union(arr136, singleton10), [1, 3, 6, 10]);
  97. testEq('union SA1', OrderedSet.union(arr136, OrderedSet.ofSingleton(3)), [1, 3, 6]);
  98. testEq('union RR', OrderedSet.union(range1_4, range1_4), [1, 2, 3, 4]);
  99. testEq('union RR1', OrderedSet.union(range1_4, OrderedSet.ofRange(6, 7)), [1, 2, 3, 4, 6, 7]);
  100. testEq('union RR2', OrderedSet.union(range1_4, OrderedSet.ofRange(3, 5)), [1, 2, 3, 4, 5]);
  101. testEq('union RA', OrderedSet.union(range1_4, arr136), [1, 2, 3, 4, 6]);
  102. testEq('union AA', OrderedSet.union(arr136, OrderedSet.ofSortedArray([2, 4, 6, 7])), [1, 2, 3, 4, 6, 7]);
  103. testEq('union AA1', OrderedSet.union(arr136, OrderedSet.ofSortedArray([2, 3, 4, 6, 7])), [1, 2, 3, 4, 6, 7]);
  104. testEq('union AA2', OrderedSet.union(arr136, OrderedSet.ofSortedArray([2, 4, 5, 6, 7])), [1, 2, 3, 4, 5, 6, 7]);
  105. testEq('union AA3', OrderedSet.union(OrderedSet.ofSortedArray([1, 3]), OrderedSet.ofSortedArray([2, 4])), [1, 2, 3, 4]);
  106. testEq('union AA4', OrderedSet.union(OrderedSet.ofSortedArray([1, 3]), OrderedSet.ofSortedArray([1, 3, 4])), [1, 3, 4]);
  107. testEq('union AA5', OrderedSet.union(OrderedSet.ofSortedArray([1, 3, 4]), OrderedSet.ofSortedArray([1, 3])), [1, 3, 4]);
  108. it('union AA6', () => expect(OrderedSet.union(arr136, OrderedSet.ofSortedArray([1, 3, 6]))).toBe(arr136));
  109. testEq('intersect ES', OrderedSet.intersect(empty, singleton10), []);
  110. testEq('intersect ER', OrderedSet.intersect(empty, range1_4), []);
  111. testEq('intersect EA', OrderedSet.intersect(empty, arr136), []);
  112. testEq('intersect SS', OrderedSet.intersect(singleton10, OrderedSet.ofSingleton(16)), []);
  113. testEq('intersect SS1', OrderedSet.intersect(singleton10, singleton10), [10]);
  114. testEq('intersect SR', OrderedSet.intersect(range1_4, singleton10), []);
  115. testEq('intersect RR', OrderedSet.intersect(range1_4, range1_4), [1, 2, 3, 4]);
  116. testEq('intersect RR2', OrderedSet.intersect(range1_4, OrderedSet.ofRange(3, 5)), [3, 4]);
  117. testEq('intersect RA', OrderedSet.intersect(range1_4, arr136), [1, 3]);
  118. testEq('intersect AA', OrderedSet.intersect(arr136, OrderedSet.ofSortedArray([2, 3, 4, 6, 7])), [3, 6]);
  119. it('intersect AA1', () => expect(OrderedSet.union(arr136, OrderedSet.ofSortedArray([1, 3, 6]))).toBe(arr136));
  120. testEq('subtract ES', OrderedSet.subtract(empty, singleton10), []);
  121. testEq('subtract ER', OrderedSet.subtract(empty, range1_4), []);
  122. testEq('subtract EA', OrderedSet.subtract(empty, arr136), []);
  123. testEq('subtract SS', OrderedSet.subtract(singleton10, OrderedSet.ofSingleton(16)), [10]);
  124. testEq('subtract SS1', OrderedSet.subtract(singleton10, singleton10), []);
  125. testEq('subtract SR', OrderedSet.subtract(range1_4, singleton10), [1, 2, 3, 4]);
  126. testEq('subtract SR1', OrderedSet.subtract(range1_4, OrderedSet.ofSingleton(4)), [1, 2, 3]);
  127. testEq('subtract SR2', OrderedSet.subtract(range1_4, OrderedSet.ofSingleton(3)), [1, 2, 4]);
  128. testEq('subtract RR', OrderedSet.subtract(range1_4, range1_4), []);
  129. testEq('subtract RR1', OrderedSet.subtract(range1_4, OrderedSet.ofRange(3, 5)), [1, 2]);
  130. testEq('subtract RA', OrderedSet.subtract(range1_4, arr136), [2, 4]);
  131. testEq('subtract RA1', OrderedSet.subtract(range1_4, OrderedSet.ofSortedArray([0, 1, 2, 3, 4, 7])), []);
  132. testEq('subtract RA2', OrderedSet.subtract(range1_4, OrderedSet.ofSortedArray([0, 2, 3])), [1, 4]);
  133. testEq('subtract AR', OrderedSet.subtract(arr136, range1_4), [6]);
  134. testEq('subtract AR1', OrderedSet.subtract(arr136, OrderedSet.ofRange(0, 10)), []);
  135. testEq('subtract AR1', OrderedSet.subtract(arr136, OrderedSet.ofRange(2, 10)), [1]);
  136. testEq('subtract AA', OrderedSet.subtract(arr136, arr136), []);
  137. testEq('subtract AA1', OrderedSet.subtract(arr136, OrderedSet.ofSortedArray([2, 3, 4, 6, 7])), [1]);
  138. testEq('subtract AA2', OrderedSet.subtract(arr136, OrderedSet.ofSortedArray([0, 1, 6])), [3]);
  139. });