atom-set.spec.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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 'mol-data/int'
  7. import ElementSet from '../structure/element/set'
  8. import Element from '../structure/element'
  9. import ElementGroup from '../structure/element/group'
  10. describe('atom set', () => {
  11. const p = (i: number, j: number) => Element.create(i, j);
  12. function setToPairs(set: ElementSet): ArrayLike<Element> {
  13. const ret: Element[] = [];
  14. const it = ElementSet.elements(set);
  15. while (it.hasNext) {
  16. ret[ret.length] = it.move();
  17. }
  18. return ret;
  19. }
  20. it('singleton pair', () => {
  21. const set = ElementSet.ofAtoms([p(10, 11)], ElementSet.Empty);
  22. expect(setToPairs(set)).toEqual([p(10, 11)]);
  23. expect(ElementSet.elementHas(set, p(10, 11))).toBe(true);
  24. expect(ElementSet.elementHas(set, p(11, 11))).toBe(false);
  25. expect(ElementSet.elementAt(set, 0)).toBe(p(10, 11));
  26. expect(ElementSet.elementCount(set)).toBe(1);
  27. });
  28. it('singleton atom', () => {
  29. const set = ElementSet.singleton(p(10, 11), ElementSet.Empty);
  30. expect(setToPairs(set)).toEqual([p(10, 11)]);
  31. expect(ElementSet.elementHas(set, p(10, 11))).toBe(true);
  32. expect(ElementSet.elementHas(set, p(11, 11))).toBe(false);
  33. expect(ElementSet.elementAt(set, 0)).toBe(p(10, 11));
  34. expect(ElementSet.elementCount(set)).toBe(1);
  35. });
  36. it('multi', () => {
  37. const gen = ElementSet.Generator();
  38. gen.add(1, ElementGroup.createNew(OrderedSet.ofSortedArray([4, 6, 7])));
  39. gen.add(3, ElementGroup.createNew(OrderedSet.ofRange(0, 1)));
  40. const set = gen.getSet();
  41. const ret = [p(1, 4), p(1, 6), p(1, 7), p(3, 0), p(3, 1)];
  42. expect(ElementSet.elementCount(set)).toBe(ret.length);
  43. expect(setToPairs(set)).toEqual([p(1, 4), p(1, 6), p(1, 7), p(3, 0), p(3, 1)]);
  44. expect(ElementSet.elementHas(set, p(10, 11))).toBe(false);
  45. expect(ElementSet.elementHas(set, p(3, 0))).toBe(true);
  46. expect(ElementSet.elementHas(set, p(1, 7))).toBe(true);
  47. for (let i = 0; i < ElementSet.elementCount(set); i++) {
  48. expect(Element.areEqual(ElementSet.elementAt(set, i), ret[i])).toBe(true);
  49. }
  50. });
  51. it('template', () => {
  52. const template = ElementSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], ElementSet.Empty)
  53. const gen = ElementSet.TemplateGenerator(template);
  54. gen.add(0, OrderedSet.ofSortedArray([1, 2, 6]));
  55. gen.add(1, OrderedSet.ofSingleton(3));
  56. const set = gen.getSet();
  57. expect(ElementSet.groupFromUnitIndex(set, 0)).toBe(ElementSet.groupFromUnitIndex(template, 0));
  58. expect(ElementSet.groupFromUnitIndex(set, 1)).toBe(ElementSet.groupFromUnitIndex(template, 1));
  59. expect(set).toBe(template);
  60. });
  61. it('template 1', () => {
  62. const template = ElementSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], ElementSet.Empty)
  63. const gen = ElementSet.TemplateGenerator(template);
  64. gen.add(0, OrderedSet.ofSortedArray([1, 2, 6]));
  65. gen.add(1, OrderedSet.ofSingleton(4));
  66. const set = gen.getSet();
  67. expect(ElementSet.groupFromUnitIndex(set, 0)).toBe(ElementSet.groupFromUnitIndex(template, 0));
  68. expect(ElementSet.groupFromUnitIndex(set, 1) === ElementSet.groupFromUnitIndex(template, 1)).toBe(false);
  69. expect(set === template).toBe(false);
  70. });
  71. it('template union', () => {
  72. const template = ElementSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], ElementSet.Empty)
  73. const p13 = ElementSet.ofAtoms([p(1, 3)], ElementSet.Empty);
  74. const p01 = ElementSet.ofAtoms([p(0, 1)], ElementSet.Empty);
  75. const p02 = ElementSet.ofAtoms([p(0, 2)], ElementSet.Empty);
  76. const p06 = ElementSet.ofAtoms([p(0, 6)], ElementSet.Empty);
  77. const u0 = ElementSet.union([p01, p02, p06], template);
  78. const u1 = ElementSet.union([p01, p02, p06, p13], template);
  79. expect(ElementSet.groupFromUnitIndex(u0, 0)).toBe(ElementSet.groupFromUnitIndex(template, 0));
  80. expect(ElementSet.groupFromUnitIndex(u1, 0)).toBe(ElementSet.groupFromUnitIndex(template, 0));
  81. expect(ElementSet.groupFromUnitIndex(u1, 1)).toBe(ElementSet.groupFromUnitIndex(template, 1));
  82. expect(u1).toBe(template);
  83. });
  84. it('element at / index of', () => {
  85. const control: Element[] = [];
  86. const gen = ElementSet.Generator();
  87. for (let i = 1; i < 10; i++) {
  88. const set = [];
  89. for (let j = 1; j < 7; j++) {
  90. control[control.length] = p(i * i, j * j + 1);
  91. set[set.length] = j * j + 1;
  92. }
  93. gen.add(i * i, ElementGroup.createNew(OrderedSet.ofSortedArray(set)));
  94. }
  95. const ms = gen.getSet();
  96. for (let i = 0; i < control.length; i++) {
  97. expect(Element.areEqual(ElementSet.elementAt(ms, i), control[i])).toBe(true);
  98. }
  99. for (let i = 0; i < control.length; i++) {
  100. expect(ElementSet.elementIndexOf(ms, control[i])).toBe(i);
  101. }
  102. });
  103. it('packed pairs', () => {
  104. const set = ElementSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], ElementSet.Empty);
  105. expect(setToPairs(set)).toEqual([p(0, 1), p(0, 2), p(0, 6), p(1, 3)]);
  106. });
  107. it('equality', () => {
  108. const a = ElementSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], ElementSet.Empty);
  109. const b = ElementSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], ElementSet.Empty);
  110. const c = ElementSet.ofAtoms([p(1, 3), p(0, 4), p(0, 6), p(0, 2)], ElementSet.Empty);
  111. const d = ElementSet.ofAtoms([p(1, 3)], ElementSet.Empty);
  112. const e = ElementSet.ofAtoms([p(1, 3)], ElementSet.Empty);
  113. const f = ElementSet.ofAtoms([p(3, 3)], ElementSet.Empty);
  114. expect(ElementSet.areEqual(a, a)).toBe(true);
  115. expect(ElementSet.areEqual(a, b)).toBe(true);
  116. expect(ElementSet.areEqual(a, c)).toBe(false);
  117. expect(ElementSet.areEqual(a, d)).toBe(false);
  118. expect(ElementSet.areEqual(d, d)).toBe(true);
  119. expect(ElementSet.areEqual(d, e)).toBe(true);
  120. expect(ElementSet.areEqual(d, f)).toBe(false);
  121. });
  122. it('are intersecting', () => {
  123. const a = ElementSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], ElementSet.Empty);
  124. const b = ElementSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], ElementSet.Empty);
  125. const c = ElementSet.ofAtoms([p(1, 3), p(0, 4), p(0, 6), p(0, 2)], ElementSet.Empty);
  126. const d = ElementSet.ofAtoms([p(1, 3)], ElementSet.Empty);
  127. const e = ElementSet.ofAtoms([p(1, 3)], ElementSet.Empty);
  128. const f = ElementSet.ofAtoms([p(3, 3)], ElementSet.Empty);
  129. const g = ElementSet.ofAtoms([p(10, 3), p(8, 1), p(7, 6), p(3, 2)], ElementSet.Empty);
  130. expect(ElementSet.areIntersecting(a, a)).toBe(true);
  131. expect(ElementSet.areIntersecting(a, b)).toBe(true);
  132. expect(ElementSet.areIntersecting(a, c)).toBe(true);
  133. expect(ElementSet.areIntersecting(a, d)).toBe(true);
  134. expect(ElementSet.areIntersecting(a, g)).toBe(false);
  135. expect(ElementSet.areIntersecting(d, d)).toBe(true);
  136. expect(ElementSet.areIntersecting(d, e)).toBe(true);
  137. expect(ElementSet.areIntersecting(d, f)).toBe(false);
  138. });
  139. it('intersection', () => {
  140. const a = ElementSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], ElementSet.Empty);
  141. const b = ElementSet.ofAtoms([p(10, 3), p(0, 1), p(0, 6), p(4, 2)], ElementSet.Empty);
  142. const c = ElementSet.ofAtoms([p(1, 3)], ElementSet.Empty);
  143. const d = ElementSet.ofAtoms([p(2, 3)], ElementSet.Empty);
  144. expect(ElementSet.intersect(a, a)).toBe(a);
  145. expect(setToPairs(ElementSet.intersect(a, b))).toEqual([p(0, 1), p(0, 6)]);
  146. expect(setToPairs(ElementSet.intersect(a, c))).toEqual([p(1, 3)]);
  147. expect(setToPairs(ElementSet.intersect(c, d))).toEqual([]);
  148. });
  149. it('subtract', () => {
  150. const a = ElementSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], ElementSet.Empty);
  151. const a1 = ElementSet.ofAtoms([p(1, 3), p(0, 1), p(0, 6), p(0, 2)], ElementSet.Empty);
  152. const b = ElementSet.ofAtoms([p(10, 3), p(0, 1), p(0, 6), p(4, 2)], ElementSet.Empty);
  153. const c = ElementSet.ofAtoms([p(1, 3)], ElementSet.Empty);
  154. const d = ElementSet.ofAtoms([p(2, 3)], ElementSet.Empty);
  155. const e = ElementSet.ofAtoms([p(0, 2)], ElementSet.Empty);
  156. expect(setToPairs(ElementSet.subtract(a, a))).toEqual([]);
  157. expect(setToPairs(ElementSet.subtract(a, a1))).toEqual([]);
  158. expect(setToPairs(ElementSet.subtract(a, b))).toEqual([p(0, 2), p(1, 3)]);
  159. expect(setToPairs(ElementSet.subtract(c, d))).toEqual([p(1, 3)]);
  160. expect(setToPairs(ElementSet.subtract(a, c))).toEqual([p(0, 1), p(0, 2), p(0, 6)]);
  161. expect(setToPairs(ElementSet.subtract(c, a))).toEqual([]);
  162. expect(setToPairs(ElementSet.subtract(d, a))).toEqual([p(2, 3)]);
  163. expect(setToPairs(ElementSet.subtract(a, e))).toEqual([p(0, 1), p(0, 6), p(1, 3)]);
  164. });
  165. it('union', () => {
  166. const a = ElementSet.ofAtoms([p(1, 3), p(0, 1)], ElementSet.Empty);
  167. const a1 = ElementSet.ofAtoms([p(1, 3), p(0, 1)], ElementSet.Empty);
  168. const b = ElementSet.ofAtoms([p(10, 3), p(0, 1)], ElementSet.Empty);
  169. const c = ElementSet.ofAtoms([p(1, 3)], ElementSet.Empty);
  170. const d = ElementSet.ofAtoms([p(2, 3)], ElementSet.Empty);
  171. expect(ElementSet.union([a], ElementSet.Empty)).toBe(a);
  172. expect(ElementSet.union([a, a], ElementSet.Empty)).toBe(a);
  173. expect(setToPairs(ElementSet.union([a, a], ElementSet.Empty))).toEqual([p(0, 1), p(1, 3)]);
  174. expect(setToPairs(ElementSet.union([a, a1], ElementSet.Empty))).toEqual([p(0, 1), p(1, 3)]);
  175. expect(setToPairs(ElementSet.union([a, b], ElementSet.Empty))).toEqual([p(0, 1), p(1, 3), p(10, 3)]);
  176. expect(setToPairs(ElementSet.union([c, d], ElementSet.Empty))).toEqual([p(1, 3), p(2, 3)]);
  177. expect(setToPairs(ElementSet.union([a, b, c, d], ElementSet.Empty))).toEqual([p(0, 1), p(1, 3), p(2, 3), p(10, 3)]);
  178. });
  179. });