atom-set.spec.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /**
  2. * Copyright (c) 2017 molio contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import IntTuple from '../../mol-base/collections/int-tuple'
  7. import OrderedSet from '../../mol-base/collections/ordered-set'
  8. import AtomSet from '../atom-set'
  9. describe('atom set', () => {
  10. const p = (i: number, j: number) => IntTuple.create(i, j);
  11. const r = (i: number, j: number) => IntTuple.pack(i, j);
  12. function setToPairs(set: AtomSet): ArrayLike<IntTuple.Unpacked> {
  13. const ret = [];
  14. const it = AtomSet.atoms(set);
  15. for (let v = it.move(); !it.done; v = it.move()) ret[ret.length] = IntTuple.create(v.fst, v.snd);
  16. return ret;
  17. }
  18. it('singleton pair', () => {
  19. const set = AtomSet.create(p(10, 11));
  20. expect(setToPairs(set)).toEqual([p(10, 11)]);
  21. expect(AtomSet.hasAtom(set, r(10, 11))).toBe(true);
  22. expect(AtomSet.hasAtom(set, r(11, 11))).toBe(false);
  23. expect(AtomSet.getAtomAt(set, 0)).toBe(r(10, 11));
  24. expect(AtomSet.atomCount(set)).toBe(1);
  25. });
  26. it('singleton number', () => {
  27. const set = AtomSet.create(r(10, 11));
  28. expect(setToPairs(set)).toEqual([p(10, 11)]);
  29. });
  30. it('multi', () => {
  31. const set = AtomSet.create({
  32. 1: OrderedSet.ofSortedArray([4, 6, 7]),
  33. 3: OrderedSet.ofRange(0, 1),
  34. });
  35. const ret = [p(1, 4), p(1, 6), p(1, 7), p(3, 0), p(3, 1)];
  36. expect(AtomSet.atomCount(set)).toBe(ret.length);
  37. expect(setToPairs(set)).toEqual([p(1, 4), p(1, 6), p(1, 7), p(3, 0), p(3, 1)]);
  38. expect(AtomSet.hasAtom(set, r(10, 11))).toBe(false);
  39. expect(AtomSet.hasAtom(set, r(3, 0))).toBe(true);
  40. expect(AtomSet.hasAtom(set, r(1, 7))).toBe(true);
  41. for (let i = 0; i < AtomSet.atomCount(set); i++) {
  42. expect(AtomSet.getAtomAt(set, i)).toBe(IntTuple.pack1(ret[i]));
  43. }
  44. });
  45. it('element at / index of', () => {
  46. const control: IntTuple[] = [];
  47. const sets = Object.create(null);
  48. for (let i = 1; i < 10; i++) {
  49. const set = [];
  50. for (let j = 1; j < 7; j++) {
  51. control[control.length] = r(i * i, j * j + 1);
  52. set[set.length] = j * j + 1;
  53. }
  54. sets[i * i] = OrderedSet.ofSortedArray(set);
  55. }
  56. const ms = AtomSet.create(sets);
  57. for (let i = 0; i < control.length; i++) {
  58. expect(IntTuple.areEqual(AtomSet.getAtomAt(ms, i), control[i])).toBe(true);
  59. }
  60. for (let i = 0; i < control.length; i++) {
  61. expect(AtomSet.indexOfAtom(ms, control[i])).toBe(i);
  62. }
  63. });
  64. it('packed pairs', () => {
  65. const set = AtomSet.create([r(1, 3), r(0, 1), r(0, 6), r(0, 2)]);
  66. expect(setToPairs(set)).toEqual([p(0, 1), p(0, 2), p(0, 6), p(1, 3)]);
  67. });
  68. it('equality', () => {
  69. const a = AtomSet.create([r(1, 3), r(0, 1), r(0, 6), r(0, 2)]);
  70. const b = AtomSet.create([r(1, 3), r(0, 1), r(0, 6), r(0, 2)]);
  71. const c = AtomSet.create([r(1, 3), r(0, 4), r(0, 6), r(0, 2)]);
  72. const d = AtomSet.create([r(1, 3)]);
  73. const e = AtomSet.create([r(1, 3)]);
  74. const f = AtomSet.create([r(3, 3)]);
  75. expect(AtomSet.areEqual(a, a)).toBe(true);
  76. expect(AtomSet.areEqual(a, b)).toBe(true);
  77. expect(AtomSet.areEqual(a, c)).toBe(false);
  78. expect(AtomSet.areEqual(a, d)).toBe(false);
  79. expect(AtomSet.areEqual(d, d)).toBe(true);
  80. expect(AtomSet.areEqual(d, e)).toBe(true);
  81. expect(AtomSet.areEqual(d, f)).toBe(false);
  82. });
  83. it('are intersecting', () => {
  84. const a = AtomSet.create([r(1, 3), r(0, 1), r(0, 6), r(0, 2)]);
  85. const b = AtomSet.create([r(1, 3), r(0, 1), r(0, 6), r(0, 2)]);
  86. const c = AtomSet.create([r(1, 3), r(0, 4), r(0, 6), r(0, 2)]);
  87. const d = AtomSet.create([r(1, 3)]);
  88. const e = AtomSet.create([r(1, 3)]);
  89. const f = AtomSet.create([r(3, 3)]);
  90. const g = AtomSet.create([r(10, 3), r(8, 1), r(7, 6), r(3, 2)]);
  91. expect(AtomSet.areIntersecting(a, a)).toBe(true);
  92. expect(AtomSet.areIntersecting(a, b)).toBe(true);
  93. expect(AtomSet.areIntersecting(a, c)).toBe(true);
  94. expect(AtomSet.areIntersecting(a, d)).toBe(true);
  95. expect(AtomSet.areIntersecting(a, g)).toBe(false);
  96. expect(AtomSet.areIntersecting(d, d)).toBe(true);
  97. expect(AtomSet.areIntersecting(d, e)).toBe(true);
  98. expect(AtomSet.areIntersecting(d, f)).toBe(false);
  99. });
  100. it('intersection', () => {
  101. const a = AtomSet.create([r(1, 3), r(0, 1), r(0, 6), r(0, 2)]);
  102. const b = AtomSet.create([r(10, 3), r(0, 1), r(0, 6), r(4, 2)]);
  103. const c = AtomSet.create([r(1, 3)]);
  104. const d = AtomSet.create([r(2, 3)]);
  105. expect(AtomSet.intersect(a, a)).toBe(a);
  106. expect(setToPairs(AtomSet.intersect(a, b))).toEqual([p(0, 1), p(0, 6)]);
  107. expect(setToPairs(AtomSet.intersect(a, c))).toEqual([p(1, 3)]);
  108. expect(setToPairs(AtomSet.intersect(c, d))).toEqual([]);
  109. });
  110. it('subtract', () => {
  111. const a = AtomSet.create([r(1, 3), r(0, 1), r(0, 6), r(0, 2)]);
  112. const a1 = AtomSet.create([r(1, 3), r(0, 1), r(0, 6), r(0, 2)]);
  113. const b = AtomSet.create([r(10, 3), r(0, 1), r(0, 6), r(4, 2)]);
  114. const c = AtomSet.create([r(1, 3)]);
  115. const d = AtomSet.create([r(2, 3)]);
  116. expect(setToPairs(AtomSet.subtract(a, a))).toEqual([]);
  117. expect(setToPairs(AtomSet.subtract(a, a1))).toEqual([]);
  118. expect(setToPairs(AtomSet.subtract(a, b))).toEqual([p(0, 2), p(1, 3)]);
  119. expect(setToPairs(AtomSet.subtract(c, d))).toEqual([p(1, 3)]);
  120. expect(setToPairs(AtomSet.subtract(a, c))).toEqual([p(0, 1), p(0, 2), p(0, 6)]);
  121. expect(setToPairs(AtomSet.subtract(c, a))).toEqual([]);
  122. expect(setToPairs(AtomSet.subtract(d, a))).toEqual([p(2, 3)]);
  123. });
  124. it('union', () => {
  125. const a = AtomSet.create([r(1, 3), r(0, 1)]);
  126. const a1 = AtomSet.create([r(1, 3), r(0, 1)]);
  127. const b = AtomSet.create([r(10, 3), r(0, 1)]);
  128. const c = AtomSet.create([r(1, 3)]);
  129. const d = AtomSet.create([r(2, 3)]);
  130. expect(AtomSet.unionMany([a])).toBe(a);
  131. expect(AtomSet.union(a, a)).toBe(a);
  132. expect(setToPairs(AtomSet.union(a, a))).toEqual([p(0, 1), p(1, 3)]);
  133. expect(setToPairs(AtomSet.union(a, a1))).toEqual([p(0, 1), p(1, 3)]);
  134. expect(setToPairs(AtomSet.union(a, b))).toEqual([p(0, 1), p(1, 3), p(10, 3)]);
  135. expect(setToPairs(AtomSet.union(c, d))).toEqual([p(1, 3), p(2, 3)]);
  136. expect(setToPairs(AtomSet.unionMany([a, b, c, d]))).toEqual([p(0, 1), p(1, 3), p(2, 3), p(10, 3)]);
  137. });
  138. });