atom-set.spec.ts 6.6 KB

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