@fluidframework/sequence 2.0.0-rc.2.0.2 → 2.0.0-rc.3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +1 -1
  3. package/api-report/sequence.api.md +32 -32
  4. package/beta.d.ts +11 -0
  5. package/dist/{localValues.d.ts → IntervalCollectionValues.d.ts} +13 -12
  6. package/dist/IntervalCollectionValues.d.ts.map +1 -0
  7. package/dist/{localValues.js → IntervalCollectionValues.js} +6 -6
  8. package/dist/IntervalCollectionValues.js.map +1 -0
  9. package/dist/beta.d.ts +12 -0
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +10 -10
  13. package/dist/index.js.map +1 -1
  14. package/dist/intervalCollection.d.ts +10 -10
  15. package/dist/intervalCollection.d.ts.map +1 -1
  16. package/dist/intervalCollection.js +103 -99
  17. package/dist/intervalCollection.js.map +1 -1
  18. package/dist/{defaultMap.d.ts → intervalCollectionMap.d.ts} +11 -44
  19. package/dist/intervalCollectionMap.d.ts.map +1 -0
  20. package/dist/{defaultMap.js → intervalCollectionMap.js} +15 -70
  21. package/dist/intervalCollectionMap.js.map +1 -0
  22. package/dist/{defaultMapInterfaces.d.ts → intervalCollectionMapInterfaces.d.ts} +17 -16
  23. package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -0
  24. package/dist/{defaultMapInterfaces.js → intervalCollectionMapInterfaces.js} +1 -1
  25. package/dist/intervalCollectionMapInterfaces.js.map +1 -0
  26. package/dist/intervalIndex/endpointInRangeIndex.d.ts +1 -1
  27. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  28. package/dist/intervalIndex/endpointInRangeIndex.js +3 -3
  29. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  30. package/dist/intervalIndex/endpointIndex.d.ts +1 -1
  31. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  32. package/dist/intervalIndex/endpointIndex.js +3 -3
  33. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  34. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  35. package/dist/intervalIndex/idIntervalIndex.js +3 -3
  36. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  37. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +3 -3
  38. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  39. package/dist/intervalIndex/overlappingIntervalsIndex.js +2 -3
  40. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  41. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  42. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +6 -6
  43. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  44. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  45. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  46. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  47. package/dist/intervalIndex/startpointInRangeIndex.d.ts +1 -1
  48. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  49. package/dist/intervalIndex/startpointInRangeIndex.js +3 -3
  50. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  51. package/dist/intervalTree.d.ts +1 -1
  52. package/dist/intervalTree.d.ts.map +1 -1
  53. package/dist/intervalTree.js +2 -2
  54. package/dist/intervalTree.js.map +1 -1
  55. package/dist/intervals/interval.d.ts +1 -1
  56. package/dist/intervals/interval.d.ts.map +1 -1
  57. package/dist/intervals/interval.js +10 -10
  58. package/dist/intervals/interval.js.map +1 -1
  59. package/dist/intervals/intervalUtils.d.ts +1 -1
  60. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  61. package/dist/intervals/intervalUtils.js +5 -5
  62. package/dist/intervals/intervalUtils.js.map +1 -1
  63. package/dist/intervals/sequenceInterval.d.ts +1 -1
  64. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  65. package/dist/intervals/sequenceInterval.js +34 -34
  66. package/dist/intervals/sequenceInterval.js.map +1 -1
  67. package/dist/legacy.d.ts +61 -0
  68. package/dist/packageVersion.d.ts +1 -1
  69. package/dist/packageVersion.js +1 -1
  70. package/dist/packageVersion.js.map +1 -1
  71. package/dist/public.d.ts +12 -0
  72. package/dist/revertibles.d.ts +2 -2
  73. package/dist/revertibles.d.ts.map +1 -1
  74. package/dist/revertibles.js +34 -34
  75. package/dist/revertibles.js.map +1 -1
  76. package/dist/sequence.d.ts +7 -6
  77. package/dist/sequence.d.ts.map +1 -1
  78. package/dist/sequence.js +34 -34
  79. package/dist/sequence.js.map +1 -1
  80. package/dist/sequenceDeltaEvent.d.ts +1 -1
  81. package/dist/sequenceDeltaEvent.d.ts.map +1 -1
  82. package/dist/sequenceDeltaEvent.js +4 -4
  83. package/dist/sequenceDeltaEvent.js.map +1 -1
  84. package/dist/sequenceFactory.d.ts +1 -1
  85. package/dist/sequenceFactory.d.ts.map +1 -1
  86. package/dist/sequenceFactory.js +3 -3
  87. package/dist/sequenceFactory.js.map +1 -1
  88. package/dist/sharedIntervalCollection.d.ts +4 -3
  89. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  90. package/dist/sharedIntervalCollection.js +5 -5
  91. package/dist/sharedIntervalCollection.js.map +1 -1
  92. package/dist/sharedSequence.d.ts +3 -2
  93. package/dist/sharedSequence.d.ts.map +1 -1
  94. package/dist/sharedSequence.js +4 -4
  95. package/dist/sharedSequence.js.map +1 -1
  96. package/dist/sharedString.d.ts +2 -2
  97. package/dist/sharedString.d.ts.map +1 -1
  98. package/dist/sharedString.js +9 -9
  99. package/dist/sharedString.js.map +1 -1
  100. package/internal.d.ts +11 -0
  101. package/legacy.d.ts +11 -0
  102. package/lib/{localValues.d.ts → IntervalCollectionValues.d.ts} +13 -12
  103. package/lib/IntervalCollectionValues.d.ts.map +1 -0
  104. package/lib/{localValues.js → IntervalCollectionValues.js} +3 -3
  105. package/lib/IntervalCollectionValues.js.map +1 -0
  106. package/lib/beta.d.ts +12 -0
  107. package/lib/index.d.ts +2 -2
  108. package/lib/index.d.ts.map +1 -1
  109. package/lib/index.js +1 -1
  110. package/lib/index.js.map +1 -1
  111. package/lib/intervalCollection.d.ts +10 -10
  112. package/lib/intervalCollection.d.ts.map +1 -1
  113. package/lib/intervalCollection.js +8 -4
  114. package/lib/intervalCollection.js.map +1 -1
  115. package/lib/{defaultMap.d.ts → intervalCollectionMap.d.ts} +11 -44
  116. package/lib/intervalCollectionMap.d.ts.map +1 -0
  117. package/lib/{defaultMap.js → intervalCollectionMap.js} +8 -63
  118. package/lib/intervalCollectionMap.js.map +1 -0
  119. package/lib/{defaultMapInterfaces.d.ts → intervalCollectionMapInterfaces.d.ts} +17 -16
  120. package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -0
  121. package/lib/{defaultMapInterfaces.js → intervalCollectionMapInterfaces.js} +1 -1
  122. package/lib/intervalCollectionMapInterfaces.js.map +1 -0
  123. package/lib/intervalIndex/endpointInRangeIndex.d.ts +1 -1
  124. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  125. package/lib/intervalIndex/endpointInRangeIndex.js +1 -1
  126. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  127. package/lib/intervalIndex/endpointIndex.d.ts +1 -1
  128. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
  129. package/lib/intervalIndex/endpointIndex.js +1 -1
  130. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  131. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  132. package/lib/intervalIndex/idIntervalIndex.js +1 -1
  133. package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
  134. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +3 -3
  135. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  136. package/lib/intervalIndex/overlappingIntervalsIndex.js +2 -3
  137. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  138. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  139. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +2 -2
  140. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  141. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  142. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  143. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  144. package/lib/intervalIndex/startpointInRangeIndex.d.ts +1 -1
  145. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  146. package/lib/intervalIndex/startpointInRangeIndex.js +1 -1
  147. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  148. package/lib/intervalTree.d.ts +1 -1
  149. package/lib/intervalTree.d.ts.map +1 -1
  150. package/lib/intervalTree.js +1 -1
  151. package/lib/intervalTree.js.map +1 -1
  152. package/lib/intervals/interval.d.ts +1 -1
  153. package/lib/intervals/interval.d.ts.map +1 -1
  154. package/lib/intervals/interval.js +3 -3
  155. package/lib/intervals/interval.js.map +1 -1
  156. package/lib/intervals/intervalUtils.d.ts +1 -1
  157. package/lib/intervals/intervalUtils.d.ts.map +1 -1
  158. package/lib/intervals/intervalUtils.js +1 -1
  159. package/lib/intervals/intervalUtils.js.map +1 -1
  160. package/lib/intervals/sequenceInterval.d.ts +1 -1
  161. package/lib/intervals/sequenceInterval.d.ts.map +1 -1
  162. package/lib/intervals/sequenceInterval.js +3 -3
  163. package/lib/intervals/sequenceInterval.js.map +1 -1
  164. package/lib/legacy.d.ts +61 -0
  165. package/lib/packageVersion.d.ts +1 -1
  166. package/lib/packageVersion.js +1 -1
  167. package/lib/packageVersion.js.map +1 -1
  168. package/lib/public.d.ts +12 -0
  169. package/lib/revertibles.d.ts +2 -2
  170. package/lib/revertibles.d.ts.map +1 -1
  171. package/lib/revertibles.js +3 -4
  172. package/lib/revertibles.js.map +1 -1
  173. package/lib/sequence.d.ts +7 -6
  174. package/lib/sequence.d.ts.map +1 -1
  175. package/lib/sequence.js +11 -12
  176. package/lib/sequence.js.map +1 -1
  177. package/lib/sequenceDeltaEvent.d.ts +1 -1
  178. package/lib/sequenceDeltaEvent.d.ts.map +1 -1
  179. package/lib/sequenceDeltaEvent.js +3 -4
  180. package/lib/sequenceDeltaEvent.js.map +1 -1
  181. package/lib/sequenceFactory.d.ts +1 -1
  182. package/lib/sequenceFactory.d.ts.map +1 -1
  183. package/lib/sequenceFactory.js +1 -1
  184. package/lib/sequenceFactory.js.map +1 -1
  185. package/lib/sharedIntervalCollection.d.ts +4 -3
  186. package/lib/sharedIntervalCollection.d.ts.map +1 -1
  187. package/lib/sharedIntervalCollection.js +4 -4
  188. package/lib/sharedIntervalCollection.js.map +1 -1
  189. package/lib/sharedSequence.d.ts +3 -2
  190. package/lib/sharedSequence.d.ts.map +1 -1
  191. package/lib/sharedSequence.js +2 -2
  192. package/lib/sharedSequence.js.map +1 -1
  193. package/lib/sharedString.d.ts +2 -2
  194. package/lib/sharedString.d.ts.map +1 -1
  195. package/lib/sharedString.js +1 -1
  196. package/lib/sharedString.js.map +1 -1
  197. package/package.json +41 -58
  198. package/src/{localValues.ts → IntervalCollectionValues.ts} +26 -18
  199. package/src/index.ts +2 -2
  200. package/src/intervalCollection.ts +46 -47
  201. package/src/{defaultMap.ts → intervalCollectionMap.ts} +42 -105
  202. package/src/{defaultMapInterfaces.ts → intervalCollectionMapInterfaces.ts} +26 -16
  203. package/src/intervalIndex/endpointInRangeIndex.ts +4 -1
  204. package/src/intervalIndex/endpointIndex.ts +4 -1
  205. package/src/intervalIndex/idIntervalIndex.ts +4 -2
  206. package/src/intervalIndex/overlappingIntervalsIndex.ts +8 -5
  207. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +6 -3
  208. package/src/intervalIndex/sequenceIntervalIndexes.ts +3 -1
  209. package/src/intervalIndex/startpointInRangeIndex.ts +4 -1
  210. package/src/intervalTree.ts +4 -3
  211. package/src/intervals/interval.ts +6 -3
  212. package/src/intervals/intervalUtils.ts +4 -2
  213. package/src/intervals/sequenceInterval.ts +5 -3
  214. package/src/packageVersion.ts +1 -1
  215. package/src/revertibles.ts +10 -10
  216. package/src/sequence.ts +24 -31
  217. package/src/sequenceDeltaEvent.ts +3 -4
  218. package/src/sequenceFactory.ts +4 -3
  219. package/src/sharedIntervalCollection.ts +12 -18
  220. package/src/sharedSequence.ts +9 -6
  221. package/src/sharedString.ts +4 -3
  222. package/api-extractor-cjs.json +0 -8
  223. package/dist/defaultMap.d.ts.map +0 -1
  224. package/dist/defaultMap.js.map +0 -1
  225. package/dist/defaultMapInterfaces.d.ts.map +0 -1
  226. package/dist/defaultMapInterfaces.js.map +0 -1
  227. package/dist/localValues.d.ts.map +0 -1
  228. package/dist/localValues.js.map +0 -1
  229. package/dist/sequence-alpha.d.ts +0 -1432
  230. package/dist/sequence-beta.d.ts +0 -246
  231. package/dist/sequence-public.d.ts +0 -246
  232. package/dist/sequence-untrimmed.d.ts +0 -1820
  233. package/lib/defaultMap.d.ts.map +0 -1
  234. package/lib/defaultMap.js.map +0 -1
  235. package/lib/defaultMapInterfaces.d.ts.map +0 -1
  236. package/lib/defaultMapInterfaces.js.map +0 -1
  237. package/lib/localValues.d.ts.map +0 -1
  238. package/lib/localValues.js.map +0 -1
  239. package/lib/sequence-alpha.d.ts +0 -1432
  240. package/lib/sequence-beta.d.ts +0 -246
  241. package/lib/sequence-public.d.ts +0 -246
  242. package/lib/sequence-untrimmed.d.ts +0 -1820
  243. package/lib/test/collections.intervalTree.js +0 -73
  244. package/lib/test/collections.intervalTree.js.map +0 -1
  245. package/lib/test/createSnapshotFiles.js +0 -15
  246. package/lib/test/createSnapshotFiles.js.map +0 -1
  247. package/lib/test/dirname.cjs +0 -16
  248. package/lib/test/dirname.cjs.map +0 -1
  249. package/lib/test/endpointInRangeIndex.spec.js +0 -182
  250. package/lib/test/endpointInRangeIndex.spec.js.map +0 -1
  251. package/lib/test/fuzz/fuzzUtils.js +0 -250
  252. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  253. package/lib/test/fuzz/intervalCollection.fuzz.spec.js +0 -200
  254. package/lib/test/fuzz/intervalCollection.fuzz.spec.js.map +0 -1
  255. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js +0 -129
  256. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js.map +0 -1
  257. package/lib/test/fuzz/sharedString.fuzz.spec.js +0 -91
  258. package/lib/test/fuzz/sharedString.fuzz.spec.js.map +0 -1
  259. package/lib/test/generateSharedStrings.js +0 -138
  260. package/lib/test/generateSharedStrings.js.map +0 -1
  261. package/lib/test/intervalCollection.detached.spec.js +0 -126
  262. package/lib/test/intervalCollection.detached.spec.js.map +0 -1
  263. package/lib/test/intervalCollection.events.spec.js +0 -491
  264. package/lib/test/intervalCollection.events.spec.js.map +0 -1
  265. package/lib/test/intervalCollection.perf.spec.js +0 -88
  266. package/lib/test/intervalCollection.perf.spec.js.map +0 -1
  267. package/lib/test/intervalCollection.snapshot.spec.js +0 -171
  268. package/lib/test/intervalCollection.snapshot.spec.js.map +0 -1
  269. package/lib/test/intervalCollection.spec.js +0 -1660
  270. package/lib/test/intervalCollection.spec.js.map +0 -1
  271. package/lib/test/intervalIndexTestUtils.js +0 -49
  272. package/lib/test/intervalIndexTestUtils.js.map +0 -1
  273. package/lib/test/intervalRebasing.spec.js +0 -589
  274. package/lib/test/intervalRebasing.spec.js.map +0 -1
  275. package/lib/test/intervalStashedOps.spec.js +0 -142
  276. package/lib/test/intervalStashedOps.spec.js.map +0 -1
  277. package/lib/test/intervalTestUtils.js +0 -81
  278. package/lib/test/intervalTestUtils.js.map +0 -1
  279. package/lib/test/marshalling.spec.js +0 -55
  280. package/lib/test/marshalling.spec.js.map +0 -1
  281. package/lib/test/memory/sharedSequence.spec.js +0 -82
  282. package/lib/test/memory/sharedSequence.spec.js.map +0 -1
  283. package/lib/test/memory/sharedString.spec.js +0 -134
  284. package/lib/test/memory/sharedString.spec.js.map +0 -1
  285. package/lib/test/overlappingSequenceIntervalsIndex.spec.js +0 -348
  286. package/lib/test/overlappingSequenceIntervalsIndex.spec.js.map +0 -1
  287. package/lib/test/partialLoad.spec.js +0 -211
  288. package/lib/test/partialLoad.spec.js.map +0 -1
  289. package/lib/test/rebasing.spec.js +0 -81
  290. package/lib/test/rebasing.spec.js.map +0 -1
  291. package/lib/test/reentrancy.spec.js +0 -174
  292. package/lib/test/reentrancy.spec.js.map +0 -1
  293. package/lib/test/revertibles.spec.js +0 -971
  294. package/lib/test/revertibles.spec.js.map +0 -1
  295. package/lib/test/sequenceDeltaEvent.spec.js +0 -2144
  296. package/lib/test/sequenceDeltaEvent.spec.js.map +0 -1
  297. package/lib/test/sharedIntervalCollection.spec.js +0 -159
  298. package/lib/test/sharedIntervalCollection.spec.js.map +0 -1
  299. package/lib/test/sharedString.spec.js +0 -532
  300. package/lib/test/sharedString.spec.js.map +0 -1
  301. package/lib/test/snapshotEmptyProps.spec.js +0 -45
  302. package/lib/test/snapshotEmptyProps.spec.js.map +0 -1
  303. package/lib/test/snapshotVersion.spec.js +0 -149
  304. package/lib/test/snapshotVersion.spec.js.map +0 -1
  305. package/lib/test/startpointInRangeIndex.spec.js +0 -182
  306. package/lib/test/startpointInRangeIndex.spec.js.map +0 -1
  307. package/lib/test/subSequence.spec.js +0 -92
  308. package/lib/test/subSequence.spec.js.map +0 -1
  309. package/lib/test/types/validateSequencePrevious.generated.js +0 -162
  310. package/lib/test/types/validateSequencePrevious.generated.js.map +0 -1
  311. package/lib/test/v1IntervalCollectionHelpers.js +0 -93
  312. package/lib/test/v1IntervalCollectionHelpers.js.map +0 -1
  313. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -1,134 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { MockFluidDataStoreRuntime } from "@fluidframework/test-runtime-utils";
6
- import { benchmarkMemory } from "@fluid-tools/benchmark";
7
- import { ReferenceType, reservedMarkerIdKey } from "@fluidframework/merge-tree";
8
- import { SharedString } from "../../sharedString.js";
9
- import { SharedStringFactory } from "../../sequenceFactory.js";
10
- function createLocalSharedString(id) {
11
- return new SharedString(new MockFluidDataStoreRuntime(), id, SharedStringFactory.Attributes);
12
- }
13
- describe("SharedString memory usage", () => {
14
- // IMPORTANT: variables scoped to the test suite are a big problem for memory-profiling tests
15
- // because they won't be out of scope when we garbage-collect between runs of the same test,
16
- // and that will skew measurements. Tests should allocate all the memory they need using local
17
- // variables scoped to the test function itself, so several iterations of a given test can
18
- // measure from the same baseline (as much as possible).
19
- beforeEach(async () => {
20
- // CAREFUL: usually beforeEach/afterEach hooks are used to initialize or interact with variables
21
- // whose scope is the encompasing test suite, but that's a problem for memory-profiling tests.
22
- // See the comment at the top of the test suite for more details.
23
- });
24
- afterEach(() => {
25
- // CAREFUL: usually beforeEach/afterEach hooks are used to initialize or interact with variables
26
- // whose scope is the encompasing test suite, but that's a problem for memory-profiling tests.
27
- // See the comment at the top of the test suite for more details.
28
- });
29
- benchmarkMemory(new (class {
30
- constructor() {
31
- this.title = "Create empty SharedString";
32
- this.minSampleCount = 500;
33
- this.sharedString = createLocalSharedString("testSharedString");
34
- }
35
- async run() {
36
- this.sharedString = createLocalSharedString("testSharedString");
37
- }
38
- })());
39
- const numbersOfEntriesForTests = [100, 1000, 10000];
40
- numbersOfEntriesForTests.forEach((x) => {
41
- benchmarkMemory(new (class {
42
- constructor() {
43
- this.title = `Insert and remove text ${x} times`;
44
- this.sharedString = createLocalSharedString("testSharedString");
45
- }
46
- async run() {
47
- for (let i = 0; i < x; i++) {
48
- this.sharedString.insertText(0, "my-test-text");
49
- this.sharedString.removeText(0, 12);
50
- }
51
- }
52
- beforeIteration() {
53
- this.sharedString = createLocalSharedString("testestSharedString");
54
- }
55
- })());
56
- benchmarkMemory(new (class {
57
- constructor() {
58
- this.title = `Replace text ${x} times`;
59
- this.sharedString = createLocalSharedString("testSharedString");
60
- }
61
- async run() {
62
- for (let i = 0; i < x; i++) {
63
- this.sharedString.replaceText(0, 4, i.toString().padStart(4, "0"));
64
- }
65
- }
66
- beforeIteration() {
67
- this.sharedString = createLocalSharedString("testestSharedString");
68
- this.sharedString.insertText(0, "0000");
69
- }
70
- })());
71
- benchmarkMemory(new (class {
72
- constructor() {
73
- this.title = `Get text annotation ${x} times`;
74
- this.sharedString = createLocalSharedString("testSharedString");
75
- this.text = "hello world";
76
- this.styleProps = { style: "bold" };
77
- }
78
- async run() {
79
- for (let i = 0; i < x; i++) {
80
- this.sharedString.getPropertiesAtPosition(i);
81
- }
82
- }
83
- beforeIteration() {
84
- this.sharedString = createLocalSharedString("testSharedString");
85
- this.text = "hello world";
86
- this.styleProps = { style: "bold" };
87
- this.sharedString.insertText(0, this.text, this.styleProps);
88
- }
89
- })());
90
- benchmarkMemory(new (class {
91
- constructor() {
92
- this.title = `Get marker ${x} times`;
93
- this.markerId = "myMarkerId";
94
- this.sharedString = createLocalSharedString("testSharedString");
95
- }
96
- async run() {
97
- for (let i = 0; i < x; i++) {
98
- this.sharedString.getMarkerFromId(this.markerId);
99
- }
100
- }
101
- beforeIteration() {
102
- this.markerId = "myMarkerId";
103
- this.sharedString = createLocalSharedString("testSharedString");
104
- this.sharedString.insertText(0, "my-test-text");
105
- this.sharedString.insertMarker(0, ReferenceType.Simple, {
106
- [reservedMarkerIdKey]: this.markerId,
107
- });
108
- }
109
- })());
110
- benchmarkMemory(new (class {
111
- constructor() {
112
- this.title = `Annotate marker ${x} times with same options`;
113
- this.markerId = "myMarkerId";
114
- this.sharedString = createLocalSharedString("testSharedString");
115
- this.simpleMarker = this.sharedString.getMarkerFromId(this.markerId);
116
- }
117
- async run() {
118
- for (let i = 0; i < x; i++) {
119
- this.sharedString.annotateMarker(this.simpleMarker, { color: "blue" });
120
- }
121
- }
122
- beforeIteration() {
123
- this.markerId = "myMarkerId";
124
- this.sharedString = createLocalSharedString("testSharedString");
125
- this.sharedString.insertText(0, "my-test-text");
126
- this.sharedString.insertMarker(0, ReferenceType.Simple, {
127
- [reservedMarkerIdKey]: this.markerId,
128
- });
129
- this.simpleMarker = this.sharedString.getMarkerFromId(this.markerId);
130
- }
131
- })());
132
- });
133
- });
134
- //# sourceMappingURL=sharedString.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sharedString.spec.js","sourceRoot":"","sources":["../../../src/test/memory/sharedString.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAqB,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAU,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,SAAS,uBAAuB,CAAC,EAAU;IAC1C,OAAO,IAAI,YAAY,CAAC,IAAI,yBAAyB,EAAE,EAAE,EAAE,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;AAC9F,CAAC;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IAC1C,6FAA6F;IAC7F,4FAA4F;IAC5F,8FAA8F;IAC9F,0FAA0F;IAC1F,wDAAwD;IAExD,UAAU,CAAC,KAAK,IAAI,EAAE;QACrB,gGAAgG;QAChG,8FAA8F;QAC9F,iEAAiE;IAClE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACd,gGAAgG;QAChG,8FAA8F;QAC9F,iEAAiE;IAClE,CAAC,CAAC,CAAC;IAEH,eAAe,CACd,IAAI,CAAC;QAAA;YACJ,UAAK,GAAG,2BAA2B,CAAC;YACpC,mBAAc,GAAG,GAAG,CAAC;YAEb,iBAAY,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;QAKpE,CAAC;QAHA,KAAK,CAAC,GAAG;YACR,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;QACjE,CAAC;KACD,CAAC,EAAE,CACJ,CAAC;IAEF,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAM,CAAC,CAAC;IAErD,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACtC,eAAe,CACd,IAAI,CAAC;YAAA;gBACJ,UAAK,GAAG,0BAA0B,CAAC,QAAQ,CAAC;gBACpC,iBAAY,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;YAYpE,CAAC;YAVA,KAAK,CAAC,GAAG;gBACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC3B,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;oBAChD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;iBACpC;YACF,CAAC;YAED,eAAe;gBACd,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC,qBAAqB,CAAC,CAAC;YACpE,CAAC;SACD,CAAC,EAAE,CACJ,CAAC;QAEF,eAAe,CACd,IAAI,CAAC;YAAA;gBACJ,UAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC;gBAC1B,iBAAY,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;YAYpE,CAAC;YAVA,KAAK,CAAC,GAAG;gBACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC3B,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;iBACnE;YACF,CAAC;YAED,eAAe;gBACd,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC,qBAAqB,CAAC,CAAC;gBACnE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACzC,CAAC;SACD,CAAC,EAAE,CACJ,CAAC;QAEF,eAAe,CACd,IAAI,CAAC;YAAA;gBACJ,UAAK,GAAG,uBAAuB,CAAC,QAAQ,CAAC;gBACjC,iBAAY,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;gBAC3D,SAAI,GAAG,aAAa,CAAC;gBACrB,eAAU,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YAcxC,CAAC;YAZA,KAAK,CAAC,GAAG;gBACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC3B,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;iBAC7C;YACF,CAAC;YAED,eAAe;gBACd,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;gBAChE,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;gBAC1B,IAAI,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;gBACpC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7D,CAAC;SACD,CAAC,EAAE,CACJ,CAAC;QAEF,eAAe,CACd,IAAI,CAAC;YAAA;gBACJ,UAAK,GAAG,cAAc,CAAC,QAAQ,CAAC;gBACxB,aAAQ,GAAG,YAAY,CAAC;gBACxB,iBAAY,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;YAgBpE,CAAC;YAdA,KAAK,CAAC,GAAG;gBACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC3B,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACjD;YACF,CAAC;YAED,eAAe;gBACd,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC;gBAC7B,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;gBAChE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;gBAChD,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE;oBACvD,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,QAAQ;iBACpC,CAAC,CAAC;YACJ,CAAC;SACD,CAAC,EAAE,CACJ,CAAC;QAEF,eAAe,CACd,IAAI,CAAC;YAAA;gBACJ,UAAK,GAAG,mBAAmB,CAAC,0BAA0B,CAAC;gBAC/C,aAAQ,GAAG,YAAY,CAAC;gBACxB,iBAAY,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;gBAC3D,iBAAY,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAW,CAAC;YAiBnF,CAAC;YAfA,KAAK,CAAC,GAAG;gBACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC3B,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;iBACvE;YACF,CAAC;YAED,eAAe;gBACd,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC;gBAC7B,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;gBAChE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;gBAChD,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE;oBACvD,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,QAAQ;iBACpC,CAAC,CAAC;gBACH,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAW,CAAC;YAChF,CAAC;SACD,CAAC,EAAE,CACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { MockFluidDataStoreRuntime } from \"@fluidframework/test-runtime-utils\";\nimport { benchmarkMemory, IMemoryTestObject } from \"@fluid-tools/benchmark\";\nimport { Marker, ReferenceType, reservedMarkerIdKey } from \"@fluidframework/merge-tree\";\nimport { SharedString } from \"../../sharedString.js\";\nimport { SharedStringFactory } from \"../../sequenceFactory.js\";\n\nfunction createLocalSharedString(id: string) {\n\treturn new SharedString(new MockFluidDataStoreRuntime(), id, SharedStringFactory.Attributes);\n}\n\ndescribe(\"SharedString memory usage\", () => {\n\t// IMPORTANT: variables scoped to the test suite are a big problem for memory-profiling tests\n\t// because they won't be out of scope when we garbage-collect between runs of the same test,\n\t// and that will skew measurements. Tests should allocate all the memory they need using local\n\t// variables scoped to the test function itself, so several iterations of a given test can\n\t// measure from the same baseline (as much as possible).\n\n\tbeforeEach(async () => {\n\t\t// CAREFUL: usually beforeEach/afterEach hooks are used to initialize or interact with variables\n\t\t// whose scope is the encompasing test suite, but that's a problem for memory-profiling tests.\n\t\t// See the comment at the top of the test suite for more details.\n\t});\n\n\tafterEach(() => {\n\t\t// CAREFUL: usually beforeEach/afterEach hooks are used to initialize or interact with variables\n\t\t// whose scope is the encompasing test suite, but that's a problem for memory-profiling tests.\n\t\t// See the comment at the top of the test suite for more details.\n\t});\n\n\tbenchmarkMemory(\n\t\tnew (class implements IMemoryTestObject {\n\t\t\ttitle = \"Create empty SharedString\";\n\t\t\tminSampleCount = 500;\n\n\t\t\tprivate sharedString = createLocalSharedString(\"testSharedString\");\n\n\t\t\tasync run() {\n\t\t\t\tthis.sharedString = createLocalSharedString(\"testSharedString\");\n\t\t\t}\n\t\t})(),\n\t);\n\n\tconst numbersOfEntriesForTests = [100, 1000, 10_000];\n\n\tnumbersOfEntriesForTests.forEach((x) => {\n\t\tbenchmarkMemory(\n\t\t\tnew (class implements IMemoryTestObject {\n\t\t\t\ttitle = `Insert and remove text ${x} times`;\n\t\t\t\tprivate sharedString = createLocalSharedString(\"testSharedString\");\n\n\t\t\t\tasync run() {\n\t\t\t\t\tfor (let i = 0; i < x; i++) {\n\t\t\t\t\t\tthis.sharedString.insertText(0, \"my-test-text\");\n\t\t\t\t\t\tthis.sharedString.removeText(0, 12);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbeforeIteration() {\n\t\t\t\t\tthis.sharedString = createLocalSharedString(\"testestSharedString\");\n\t\t\t\t}\n\t\t\t})(),\n\t\t);\n\n\t\tbenchmarkMemory(\n\t\t\tnew (class implements IMemoryTestObject {\n\t\t\t\ttitle = `Replace text ${x} times`;\n\t\t\t\tprivate sharedString = createLocalSharedString(\"testSharedString\");\n\n\t\t\t\tasync run() {\n\t\t\t\t\tfor (let i = 0; i < x; i++) {\n\t\t\t\t\t\tthis.sharedString.replaceText(0, 4, i.toString().padStart(4, \"0\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbeforeIteration() {\n\t\t\t\t\tthis.sharedString = createLocalSharedString(\"testestSharedString\");\n\t\t\t\t\tthis.sharedString.insertText(0, \"0000\");\n\t\t\t\t}\n\t\t\t})(),\n\t\t);\n\n\t\tbenchmarkMemory(\n\t\t\tnew (class implements IMemoryTestObject {\n\t\t\t\ttitle = `Get text annotation ${x} times`;\n\t\t\t\tprivate sharedString = createLocalSharedString(\"testSharedString\");\n\t\t\t\tprivate text = \"hello world\";\n\t\t\t\tprivate styleProps = { style: \"bold\" };\n\n\t\t\t\tasync run() {\n\t\t\t\t\tfor (let i = 0; i < x; i++) {\n\t\t\t\t\t\tthis.sharedString.getPropertiesAtPosition(i);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbeforeIteration() {\n\t\t\t\t\tthis.sharedString = createLocalSharedString(\"testSharedString\");\n\t\t\t\t\tthis.text = \"hello world\";\n\t\t\t\t\tthis.styleProps = { style: \"bold\" };\n\t\t\t\t\tthis.sharedString.insertText(0, this.text, this.styleProps);\n\t\t\t\t}\n\t\t\t})(),\n\t\t);\n\n\t\tbenchmarkMemory(\n\t\t\tnew (class implements IMemoryTestObject {\n\t\t\t\ttitle = `Get marker ${x} times`;\n\t\t\t\tprivate markerId = \"myMarkerId\";\n\t\t\t\tprivate sharedString = createLocalSharedString(\"testSharedString\");\n\n\t\t\t\tasync run() {\n\t\t\t\t\tfor (let i = 0; i < x; i++) {\n\t\t\t\t\t\tthis.sharedString.getMarkerFromId(this.markerId);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbeforeIteration() {\n\t\t\t\t\tthis.markerId = \"myMarkerId\";\n\t\t\t\t\tthis.sharedString = createLocalSharedString(\"testSharedString\");\n\t\t\t\t\tthis.sharedString.insertText(0, \"my-test-text\");\n\t\t\t\t\tthis.sharedString.insertMarker(0, ReferenceType.Simple, {\n\t\t\t\t\t\t[reservedMarkerIdKey]: this.markerId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})(),\n\t\t);\n\n\t\tbenchmarkMemory(\n\t\t\tnew (class implements IMemoryTestObject {\n\t\t\t\ttitle = `Annotate marker ${x} times with same options`;\n\t\t\t\tprivate markerId = \"myMarkerId\";\n\t\t\t\tprivate sharedString = createLocalSharedString(\"testSharedString\");\n\t\t\t\tprivate simpleMarker = this.sharedString.getMarkerFromId(this.markerId) as Marker;\n\n\t\t\t\tasync run() {\n\t\t\t\t\tfor (let i = 0; i < x; i++) {\n\t\t\t\t\t\tthis.sharedString.annotateMarker(this.simpleMarker, { color: \"blue\" });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbeforeIteration() {\n\t\t\t\t\tthis.markerId = \"myMarkerId\";\n\t\t\t\t\tthis.sharedString = createLocalSharedString(\"testSharedString\");\n\t\t\t\t\tthis.sharedString.insertText(0, \"my-test-text\");\n\t\t\t\t\tthis.sharedString.insertMarker(0, ReferenceType.Simple, {\n\t\t\t\t\t\t[reservedMarkerIdKey]: this.markerId,\n\t\t\t\t\t});\n\t\t\t\t\tthis.simpleMarker = this.sharedString.getMarkerFromId(this.markerId) as Marker;\n\t\t\t\t}\n\t\t\t})(),\n\t\t);\n\t});\n});\n"]}
@@ -1,348 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- /* eslint-disable jsdoc/check-indentation */
6
- import { strict as assert } from "assert";
7
- import { MockFluidDataStoreRuntime } from "@fluidframework/test-runtime-utils";
8
- import { compareReferencePositions } from "@fluidframework/merge-tree";
9
- import { makeRandom } from "@fluid-private/stochastic-test-utils";
10
- import { SequenceInterval } from "../intervals/index.js";
11
- import { SharedString } from "../sharedString.js";
12
- import { SharedStringFactory } from "../sequenceFactory.js";
13
- import { createOverlappingIntervalsIndex, createOverlappingSequenceIntervalsIndex, } from "../intervalIndex/index.js";
14
- function assertSequenceIntervalsEqual(string, results, expected) {
15
- assert.equal(results.length, expected.length, "Mismatched result count");
16
- for (let i = 0; i < results.length; ++i) {
17
- assert(results[i]);
18
- const resultStart = string.localReferencePositionToPosition(results[i].start);
19
- const resultEnd = string.localReferencePositionToPosition(results[i].end);
20
- let expectedStart;
21
- let expectedEnd;
22
- if (expected[i] instanceof SequenceInterval) {
23
- expectedStart = string.localReferencePositionToPosition(expected[i].start);
24
- expectedEnd = string.localReferencePositionToPosition(expected[i].end);
25
- }
26
- else {
27
- expectedStart = expected[i].start;
28
- expectedEnd = expected[i].end;
29
- }
30
- assert.equal(resultStart, expectedStart, "mismatched start");
31
- assert.equal(resultEnd, expectedEnd, "mismatched end");
32
- }
33
- }
34
- describe("findOverlappingIntervalsBySegoff", () => {
35
- // sort the query results by the local reference position of interval endpoints
36
- const compareFn = (a, b) => {
37
- if (compareReferencePositions(a.start, b.start) !== 0) {
38
- return compareReferencePositions(a.start, b.start);
39
- }
40
- return compareReferencePositions(a.end, b.end);
41
- };
42
- let testSharedString;
43
- let dataStoreRuntime;
44
- let overlappingSequenceIntervalsIndex;
45
- let collection;
46
- let results;
47
- const queryIntervalsByPositions = (start, end) => {
48
- const startSegOff = testSharedString.getContainingSegment(start);
49
- const endSegOff = testSharedString.getContainingSegment(end);
50
- const intervals = overlappingSequenceIntervalsIndex.findOverlappingIntervalsBySegoff(startSegOff, endSegOff);
51
- intervals.sort(compareFn);
52
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
53
- return intervals;
54
- };
55
- beforeEach(() => {
56
- dataStoreRuntime = new MockFluidDataStoreRuntime({ clientId: "1" });
57
- dataStoreRuntime.options = { intervalStickinessEnabled: true };
58
- testSharedString = new SharedString(dataStoreRuntime, "test-shared-string", SharedStringFactory.Attributes);
59
- overlappingSequenceIntervalsIndex =
60
- createOverlappingSequenceIntervalsIndex(testSharedString);
61
- testSharedString.initializeLocal();
62
- collection = testSharedString.getIntervalCollection("test");
63
- collection.attachIndex(overlappingSequenceIntervalsIndex);
64
- });
65
- describe("find no intervals", () => {
66
- beforeEach(() => {
67
- testSharedString.insertText(0, "ab");
68
- testSharedString.insertText(2, "cde");
69
- testSharedString.insertText(5, "fg");
70
- });
71
- it("when the index is empty", () => {
72
- results = queryIntervalsByPositions(0, 2);
73
- assert.equal(results.length, 0);
74
- });
75
- it("when all intervals in index are above the query range", () => {
76
- collection.add({ start: 5, end: 6 });
77
- results = queryIntervalsByPositions(0, 2);
78
- assert.equal(results.length, 0);
79
- });
80
- it("when all intervals in index are below the query range", () => {
81
- collection.add({ start: 1, end: 1 });
82
- results = queryIntervalsByPositions(2, 5);
83
- assert.equal(results.length, 0);
84
- });
85
- it("when startSegment occurs `after` the endSegment", () => {
86
- collection.add({ start: 1, end: 1 });
87
- results = queryIntervalsByPositions(2, 0);
88
- assert.equal(results.length, 0);
89
- });
90
- it("when the segments are the same but startOffset occurs `after` the endOffset", () => {
91
- collection.add({ start: 1, end: 1 });
92
- results = queryIntervalsByPositions(1, 0);
93
- assert.equal(results.length, 0);
94
- });
95
- it("when the endSegment does not exist (out of bound)", () => {
96
- collection.add({ start: 1, end: 1 });
97
- results = queryIntervalsByPositions(1, 1000);
98
- assert.equal(results.length, 0);
99
- });
100
- });
101
- describe("find correct results", () => {
102
- let interval1;
103
- let interval2;
104
- let interval3;
105
- beforeEach(() => {
106
- testSharedString.insertText(0, "ab");
107
- testSharedString.insertText(2, "cde");
108
- testSharedString.insertText(5, "fg");
109
- interval1 = collection.add({ start: 1, end: 1 }).getIntervalId();
110
- interval2 = collection.add({ start: 2, end: 3 }).getIntervalId();
111
- interval3 = collection.add({ start: 5, end: 6 }).getIntervalId();
112
- });
113
- it("when each interval is within a single segment", () => {
114
- results = queryIntervalsByPositions(0, 1);
115
- assertSequenceIntervalsEqual(testSharedString, results, [{ start: 1, end: 1 }]);
116
- results = queryIntervalsByPositions(1, 1);
117
- assertSequenceIntervalsEqual(testSharedString, results, [{ start: 1, end: 1 }]);
118
- results = queryIntervalsByPositions(1, 3);
119
- assertSequenceIntervalsEqual(testSharedString, results, [
120
- { start: 1, end: 1 },
121
- { start: 2, end: 3 },
122
- ]);
123
- results = queryIntervalsByPositions(2, 4);
124
- assertSequenceIntervalsEqual(testSharedString, results, [{ start: 2, end: 3 }]);
125
- results = queryIntervalsByPositions(5, 6);
126
- assertSequenceIntervalsEqual(testSharedString, results, [{ start: 5, end: 6 }]);
127
- results = queryIntervalsByPositions(1, 6);
128
- assertSequenceIntervalsEqual(testSharedString, results, [
129
- { start: 1, end: 1 },
130
- { start: 2, end: 3 },
131
- { start: 5, end: 6 },
132
- ]);
133
- });
134
- it("when existing interval across multiple segments", () => {
135
- // Add intervals which are across more than one segments
136
- collection.add({ start: 1, end: 3 });
137
- collection.add({ start: 2, end: 5 });
138
- collection.add({ start: 1, end: 6 });
139
- results = queryIntervalsByPositions(0, 1);
140
- assertSequenceIntervalsEqual(testSharedString, results, [
141
- { start: 1, end: 1 },
142
- { start: 1, end: 3 },
143
- { start: 1, end: 6 },
144
- ]);
145
- results = queryIntervalsByPositions(1, 3);
146
- assertSequenceIntervalsEqual(testSharedString, results, [
147
- { start: 1, end: 1 },
148
- { start: 1, end: 3 },
149
- { start: 1, end: 6 },
150
- { start: 2, end: 3 },
151
- { start: 2, end: 5 },
152
- ]);
153
- results = queryIntervalsByPositions(5, 5);
154
- assertSequenceIntervalsEqual(testSharedString, results, [
155
- { start: 1, end: 6 },
156
- { start: 2, end: 5 },
157
- { start: 5, end: 6 },
158
- ]);
159
- });
160
- it("when adding duplicate intervals to the index", () => {
161
- collection.add({ start: 1, end: 1 });
162
- collection.add({ start: 2, end: 3 });
163
- collection.add({ start: 1, end: 1 });
164
- results = queryIntervalsByPositions(1, 6);
165
- assertSequenceIntervalsEqual(testSharedString, results, [
166
- { start: 1, end: 1 },
167
- { start: 1, end: 1 },
168
- { start: 1, end: 1 },
169
- { start: 2, end: 3 },
170
- { start: 2, end: 3 },
171
- { start: 5, end: 6 },
172
- ]);
173
- });
174
- it("when removing intervals from the index", () => {
175
- collection.removeIntervalById(interval2);
176
- results = queryIntervalsByPositions(1, 6);
177
- assertSequenceIntervalsEqual(testSharedString, results, [
178
- { start: 1, end: 1 },
179
- { start: 5, end: 6 },
180
- ]);
181
- // Add and remove duplicate intervals
182
- const interval4 = collection.add({ start: 1, end: 1 }).getIntervalId();
183
- collection.removeIntervalById(interval1);
184
- results = queryIntervalsByPositions(1, 6);
185
- assertSequenceIntervalsEqual(testSharedString, results, [
186
- { start: 1, end: 1 },
187
- { start: 5, end: 6 },
188
- ]);
189
- collection.removeIntervalById(interval4);
190
- results = queryIntervalsByPositions(1, 6);
191
- assertSequenceIntervalsEqual(testSharedString, results, [{ start: 5, end: 6 }]);
192
- });
193
- it("when inserting or appending additional segments to the string", () => {
194
- // Append a segment to the end of the string
195
- testSharedString.insertText(7, "hijk");
196
- collection.add({ start: 7, end: 9 }); // `interval4` in below graphs
197
- /**
198
- * Visualization of intervals within the string after the last insertion:
199
- *
200
- * 0 1 2 3 4 5 6 7 8 9 10
201
- * a b c d e f g h i j k
202
- * interval1 ^
203
- * interval2 [-]
204
- * interval3 [-]
205
- * interval4 [---]
206
- */
207
- results = queryIntervalsByPositions(5, 7);
208
- assertSequenceIntervalsEqual(testSharedString, results, [
209
- { start: 5, end: 6 },
210
- { start: 7, end: 9 },
211
- ]);
212
- // Insert a segment in the middle of the string
213
- testSharedString.insertText(3, "xx");
214
- /**
215
- * Visualization of intervals within the string after the last insertion:
216
- *
217
- * interval2's endpoint slides forwards
218
- * interval3 and interval4 shift forwards
219
- *
220
- * 0 1 2 3 4 5 6 7 8 9 10 11 12
221
- * a b c x x d e f g h i j k
222
- * interval1 ^
223
- * interval2 [-----]
224
- * interval3 [-]
225
- * interval4 [----]
226
- */
227
- results = queryIntervalsByPositions(2, 4);
228
- assertSequenceIntervalsEqual(testSharedString, results, [{ start: 2, end: 5 }]);
229
- results = queryIntervalsByPositions(5, 7);
230
- assertSequenceIntervalsEqual(testSharedString, results, [
231
- { start: 2, end: 5 },
232
- { start: 7, end: 8 },
233
- ]);
234
- results = queryIntervalsByPositions(6, 9);
235
- assertSequenceIntervalsEqual(testSharedString, results, [
236
- { start: 7, end: 8 },
237
- { start: 9, end: 11 },
238
- ]);
239
- // Insert a segment at the head of the string
240
- testSharedString.insertText(0, "yy");
241
- /**
242
- * Visualization of intervals within the string after the last insertion:
243
- * All intervals shift forwards
244
- *
245
- * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
246
- * y y a b c x x d e f g h i j k
247
- * interval1 ^
248
- * interval2 [-----]
249
- * interval3 [-]
250
- * interval4 [-----]
251
- */
252
- results = queryIntervalsByPositions(0, 14);
253
- assertSequenceIntervalsEqual(testSharedString, results, [
254
- { start: 3, end: 3 },
255
- { start: 4, end: 7 },
256
- { start: 9, end: 10 },
257
- { start: 11, end: 13 },
258
- ]);
259
- });
260
- it("when removing segments from the string", () => {
261
- // Remove the middle part of the string
262
- testSharedString.removeText(2, 4);
263
- /**
264
- * Visualization of intervals within the string after the last deletion:
265
- *
266
- * interval2's startpoint slides forwards but the remains in the original segment
267
- * interval3 shifts forwards
268
- *
269
- * 0 1 2 3 4
270
- * a b e f g
271
- * interval1 ^
272
- * interval2 ^
273
- * interval3 [-]
274
- */
275
- results = queryIntervalsByPositions(0, 4);
276
- assertSequenceIntervalsEqual(testSharedString, results, [
277
- { start: 1, end: 1 },
278
- { start: 2, end: 2 },
279
- { start: 3, end: 4 },
280
- ]);
281
- // Remove the end part of the string
282
- testSharedString.removeText(2, 5);
283
- /**
284
- * Visualization of intervals within the string after the last deletion:
285
- *
286
- * There does not exist a next valid segment for interval2 and interval3
287
- *
288
- * 0 1
289
- * a b
290
- * interval1 ^
291
- * interval2
292
- * interval3
293
- */
294
- results = queryIntervalsByPositions(0, 1);
295
- assertSequenceIntervalsEqual(testSharedString, results,
296
- // TODO: At this point, this test should expect interval2 and interval3 to slide to an EndOfString segment
297
- // rather than back, and so should expect results:
298
- // [{ start: 1, end: 1 }]
299
- // However, currently intervals attempt to slide back when sliding forward fails.
300
- [
301
- { start: 1, end: 1 },
302
- { start: 1, end: 1 },
303
- { start: 1, end: 1 },
304
- ]);
305
- });
306
- });
307
- describe("find consistent results with `naive` method", () => {
308
- /**
309
- * Fills in random sequence intervals to the index and interval collection
310
- * @param options - The options object containing random, count, and min properties.
311
- */
312
- const fillInRandomSequenceIntervals = ({ random, count, min, }) => {
313
- // Generate random text, and insert them into random positions of the string
314
- for (let i = 0; i < count / 2; ++i) {
315
- testSharedString.insertText(random.integer(0, Math.max(testSharedString.getLength() - 1, 0)), random.string(random.bool() ? 2 : 1));
316
- }
317
- const max = testSharedString.getLength() - 1;
318
- // Genereate random sequence intervals
319
- for (let i = 0; i < count; ++i) {
320
- const start = random.integer(min, max);
321
- const end = random.integer(start, max);
322
- collection.add({ start, end });
323
- }
324
- };
325
- it("when given massive random inputs", () => {
326
- const random = makeRandom(0);
327
- const count = 100;
328
- const min = 0;
329
- // Attach the default overlapping interval index for comparison purposes
330
- const overlappingIntervalsIndex = createOverlappingIntervalsIndex(testSharedString);
331
- collection.attachIndex(overlappingIntervalsIndex);
332
- fillInRandomSequenceIntervals({ random, count, min });
333
- // Test with running 100 random queries
334
- const max = testSharedString.getLength() - 1;
335
- for (let i = 0; i < 100; ++i) {
336
- const start = random.integer(min, max);
337
- const end = random.integer(start, max);
338
- // Query intervals using two distinct methods
339
- results = queryIntervalsByPositions(start, end);
340
- const expected = overlappingIntervalsIndex.findOverlappingIntervals(start, end);
341
- results.sort(compareFn);
342
- expected.sort(compareFn);
343
- assertSequenceIntervalsEqual(testSharedString, results, expected);
344
- }
345
- });
346
- });
347
- });
348
- //# sourceMappingURL=overlappingSequenceIntervalsIndex.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlappingSequenceIntervalsIndex.spec.js","sourceRoot":"","sources":["../../src/test/overlappingSequenceIntervalsIndex.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable jsdoc/check-indentation */\n\nimport { strict as assert } from \"assert\";\nimport { MockFluidDataStoreRuntime } from \"@fluidframework/test-runtime-utils\";\nimport { LocalReferencePosition, compareReferencePositions } from \"@fluidframework/merge-tree\";\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { SequenceInterval } from \"../intervals/index.js\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport {\n\tcreateOverlappingIntervalsIndex,\n\tcreateOverlappingSequenceIntervalsIndex,\n} from \"../intervalIndex/index.js\";\nimport { RandomIntervalOptions } from \"./intervalIndexTestUtils.js\";\n\nfunction assertSequenceIntervalsEqual(\n\tstring: SharedString,\n\tresults: SequenceInterval[],\n\texpected: { start: number; end: number }[] | SequenceInterval[],\n): void {\n\tassert.equal(results.length, expected.length, \"Mismatched result count\");\n\n\tfor (let i = 0; i < results.length; ++i) {\n\t\tassert(results[i]);\n\t\tconst resultStart = string.localReferencePositionToPosition(results[i].start);\n\t\tconst resultEnd = string.localReferencePositionToPosition(results[i].end);\n\t\tlet expectedStart;\n\t\tlet expectedEnd;\n\n\t\tif (expected[i] instanceof SequenceInterval) {\n\t\t\texpectedStart = string.localReferencePositionToPosition(\n\t\t\t\texpected[i].start as LocalReferencePosition,\n\t\t\t);\n\t\t\texpectedEnd = string.localReferencePositionToPosition(\n\t\t\t\texpected[i].end as LocalReferencePosition,\n\t\t\t);\n\t\t} else {\n\t\t\texpectedStart = expected[i].start;\n\t\t\texpectedEnd = expected[i].end;\n\t\t}\n\n\t\tassert.equal(resultStart, expectedStart, \"mismatched start\");\n\t\tassert.equal(resultEnd, expectedEnd, \"mismatched end\");\n\t}\n}\n\ndescribe(\"findOverlappingIntervalsBySegoff\", () => {\n\t// sort the query results by the local reference position of interval endpoints\n\tconst compareFn = (a: SequenceInterval, b: SequenceInterval) => {\n\t\tif (compareReferencePositions(a.start, b.start) !== 0) {\n\t\t\treturn compareReferencePositions(a.start, b.start);\n\t\t}\n\t\treturn compareReferencePositions(a.end, b.end);\n\t};\n\tlet testSharedString: SharedString;\n\tlet dataStoreRuntime: MockFluidDataStoreRuntime;\n\tlet overlappingSequenceIntervalsIndex;\n\tlet collection;\n\tlet results;\n\n\tconst queryIntervalsByPositions = (start: number, end: number): Iterable<SequenceInterval> => {\n\t\tconst startSegOff = testSharedString.getContainingSegment(start);\n\t\tconst endSegOff = testSharedString.getContainingSegment(end);\n\n\t\tconst intervals = overlappingSequenceIntervalsIndex.findOverlappingIntervalsBySegoff(\n\t\t\tstartSegOff,\n\t\t\tendSegOff,\n\t\t);\n\t\tintervals.sort(compareFn);\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn intervals;\n\t};\n\n\tbeforeEach(() => {\n\t\tdataStoreRuntime = new MockFluidDataStoreRuntime({ clientId: \"1\" });\n\t\tdataStoreRuntime.options = { intervalStickinessEnabled: true };\n\t\ttestSharedString = new SharedString(\n\t\t\tdataStoreRuntime,\n\t\t\t\"test-shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\t\toverlappingSequenceIntervalsIndex =\n\t\t\tcreateOverlappingSequenceIntervalsIndex(testSharedString);\n\n\t\ttestSharedString.initializeLocal();\n\t\tcollection = testSharedString.getIntervalCollection(\"test\");\n\t\tcollection.attachIndex(overlappingSequenceIntervalsIndex);\n\t});\n\n\tdescribe(\"find no intervals\", () => {\n\t\tbeforeEach(() => {\n\t\t\ttestSharedString.insertText(0, \"ab\");\n\t\t\ttestSharedString.insertText(2, \"cde\");\n\t\t\ttestSharedString.insertText(5, \"fg\");\n\t\t});\n\n\t\tit(\"when the index is empty\", () => {\n\t\t\tresults = queryIntervalsByPositions(0, 2);\n\t\t\tassert.equal(results.length, 0);\n\t\t});\n\n\t\tit(\"when all intervals in index are above the query range\", () => {\n\t\t\tcollection.add({ start: 5, end: 6 });\n\t\t\tresults = queryIntervalsByPositions(0, 2);\n\t\t\tassert.equal(results.length, 0);\n\t\t});\n\n\t\tit(\"when all intervals in index are below the query range\", () => {\n\t\t\tcollection.add({ start: 1, end: 1 });\n\t\t\tresults = queryIntervalsByPositions(2, 5);\n\t\t\tassert.equal(results.length, 0);\n\t\t});\n\n\t\tit(\"when startSegment occurs `after` the endSegment\", () => {\n\t\t\tcollection.add({ start: 1, end: 1 });\n\t\t\tresults = queryIntervalsByPositions(2, 0);\n\t\t\tassert.equal(results.length, 0);\n\t\t});\n\n\t\tit(\"when the segments are the same but startOffset occurs `after` the endOffset\", () => {\n\t\t\tcollection.add({ start: 1, end: 1 });\n\t\t\tresults = queryIntervalsByPositions(1, 0);\n\t\t\tassert.equal(results.length, 0);\n\t\t});\n\n\t\tit(\"when the endSegment does not exist (out of bound)\", () => {\n\t\t\tcollection.add({ start: 1, end: 1 });\n\t\t\tresults = queryIntervalsByPositions(1, 1000);\n\t\t\tassert.equal(results.length, 0);\n\t\t});\n\t});\n\n\tdescribe(\"find correct results\", () => {\n\t\tlet interval1;\n\t\tlet interval2;\n\t\tlet interval3;\n\n\t\tbeforeEach(() => {\n\t\t\ttestSharedString.insertText(0, \"ab\");\n\t\t\ttestSharedString.insertText(2, \"cde\");\n\t\t\ttestSharedString.insertText(5, \"fg\");\n\t\t\tinterval1 = collection.add({ start: 1, end: 1 }).getIntervalId();\n\t\t\tinterval2 = collection.add({ start: 2, end: 3 }).getIntervalId();\n\t\t\tinterval3 = collection.add({ start: 5, end: 6 }).getIntervalId();\n\t\t});\n\n\t\tit(\"when each interval is within a single segment\", () => {\n\t\t\tresults = queryIntervalsByPositions(0, 1);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [{ start: 1, end: 1 }]);\n\n\t\t\tresults = queryIntervalsByPositions(1, 1);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [{ start: 1, end: 1 }]);\n\n\t\t\tresults = queryIntervalsByPositions(1, 3);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 2, end: 3 },\n\t\t\t]);\n\n\t\t\tresults = queryIntervalsByPositions(2, 4);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [{ start: 2, end: 3 }]);\n\n\t\t\tresults = queryIntervalsByPositions(5, 6);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [{ start: 5, end: 6 }]);\n\n\t\t\tresults = queryIntervalsByPositions(1, 6);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 2, end: 3 },\n\t\t\t\t{ start: 5, end: 6 },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"when existing interval across multiple segments\", () => {\n\t\t\t// Add intervals which are across more than one segments\n\t\t\tcollection.add({ start: 1, end: 3 });\n\t\t\tcollection.add({ start: 2, end: 5 });\n\t\t\tcollection.add({ start: 1, end: 6 });\n\n\t\t\tresults = queryIntervalsByPositions(0, 1);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 1, end: 3 },\n\t\t\t\t{ start: 1, end: 6 },\n\t\t\t]);\n\n\t\t\tresults = queryIntervalsByPositions(1, 3);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 1, end: 3 },\n\t\t\t\t{ start: 1, end: 6 },\n\t\t\t\t{ start: 2, end: 3 },\n\t\t\t\t{ start: 2, end: 5 },\n\t\t\t]);\n\n\t\t\tresults = queryIntervalsByPositions(5, 5);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 1, end: 6 },\n\t\t\t\t{ start: 2, end: 5 },\n\t\t\t\t{ start: 5, end: 6 },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"when adding duplicate intervals to the index\", () => {\n\t\t\tcollection.add({ start: 1, end: 1 });\n\t\t\tcollection.add({ start: 2, end: 3 });\n\t\t\tcollection.add({ start: 1, end: 1 });\n\n\t\t\tresults = queryIntervalsByPositions(1, 6);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 2, end: 3 },\n\t\t\t\t{ start: 2, end: 3 },\n\t\t\t\t{ start: 5, end: 6 },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"when removing intervals from the index\", () => {\n\t\t\tcollection.removeIntervalById(interval2);\n\t\t\tresults = queryIntervalsByPositions(1, 6);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 5, end: 6 },\n\t\t\t]);\n\n\t\t\t// Add and remove duplicate intervals\n\t\t\tconst interval4 = collection.add({ start: 1, end: 1 }).getIntervalId();\n\t\t\tcollection.removeIntervalById(interval1);\n\t\t\tresults = queryIntervalsByPositions(1, 6);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 5, end: 6 },\n\t\t\t]);\n\n\t\t\tcollection.removeIntervalById(interval4);\n\t\t\tresults = queryIntervalsByPositions(1, 6);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [{ start: 5, end: 6 }]);\n\t\t});\n\n\t\tit(\"when inserting or appending additional segments to the string\", () => {\n\t\t\t// Append a segment to the end of the string\n\t\t\ttestSharedString.insertText(7, \"hijk\");\n\t\t\tcollection.add({ start: 7, end: 9 }); // `interval4` in below graphs\n\n\t\t\t/**\n\t\t\t * Visualization of intervals within the string after the last insertion:\n\t\t\t *\n\t\t\t * 0 1 2 3 4 5 6 7 8 9 10\n\t\t\t * a b c d e f g h i j k\n\t\t\t * interval1 ^\n\t\t\t * interval2 [-]\n\t\t\t * interval3 [-]\n\t\t\t * interval4 [---]\n\t\t\t */\n\n\t\t\tresults = queryIntervalsByPositions(5, 7);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 5, end: 6 },\n\t\t\t\t{ start: 7, end: 9 },\n\t\t\t]);\n\n\t\t\t// Insert a segment in the middle of the string\n\t\t\ttestSharedString.insertText(3, \"xx\");\n\n\t\t\t/**\n\t\t\t * Visualization of intervals within the string after the last insertion:\n\t\t\t *\n\t\t\t * interval2's endpoint slides forwards\n\t\t\t * interval3 and interval4 shift forwards\n\t\t\t *\n\t\t\t * 0 1 2 3 4 5 6 7 8 9 10 11 12\n\t\t\t * a b c x x d e f g h i j k\n\t\t\t * interval1 ^\n\t\t\t * interval2 [-----]\n\t\t\t * interval3 [-]\n\t\t\t * interval4 [----]\n\t\t\t */\n\n\t\t\tresults = queryIntervalsByPositions(2, 4);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [{ start: 2, end: 5 }]);\n\t\t\tresults = queryIntervalsByPositions(5, 7);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 2, end: 5 },\n\t\t\t\t{ start: 7, end: 8 },\n\t\t\t]);\n\t\t\tresults = queryIntervalsByPositions(6, 9);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 7, end: 8 },\n\t\t\t\t{ start: 9, end: 11 },\n\t\t\t]);\n\n\t\t\t// Insert a segment at the head of the string\n\t\t\ttestSharedString.insertText(0, \"yy\");\n\n\t\t\t/**\n\t\t\t * Visualization of intervals within the string after the last insertion:\n\t\t\t * All intervals shift forwards\n\t\t\t *\n\t\t\t * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14\n\t\t\t * y y a b c x x d e f g h i j k\n\t\t\t * interval1 ^\n\t\t\t * interval2 [-----]\n\t\t\t * interval3 [-]\n\t\t\t * interval4 [-----]\n\t\t\t */\n\n\t\t\tresults = queryIntervalsByPositions(0, 14);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 3, end: 3 },\n\t\t\t\t{ start: 4, end: 7 },\n\t\t\t\t{ start: 9, end: 10 },\n\t\t\t\t{ start: 11, end: 13 },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"when removing segments from the string\", () => {\n\t\t\t// Remove the middle part of the string\n\t\t\ttestSharedString.removeText(2, 4);\n\n\t\t\t/**\n\t\t\t * Visualization of intervals within the string after the last deletion:\n\t\t\t *\n\t\t\t * interval2's startpoint slides forwards but the remains in the original segment\n\t\t\t * interval3 shifts forwards\n\t\t\t *\n\t\t\t * 0 1 2 3 4\n\t\t\t * a b e f g\n\t\t\t * interval1 ^\n\t\t\t * interval2 ^\n\t\t\t * interval3 [-]\n\t\t\t */\n\n\t\t\tresults = queryIntervalsByPositions(0, 4);\n\t\t\tassertSequenceIntervalsEqual(testSharedString, results, [\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 2, end: 2 },\n\t\t\t\t{ start: 3, end: 4 },\n\t\t\t]);\n\n\t\t\t// Remove the end part of the string\n\t\t\ttestSharedString.removeText(2, 5);\n\n\t\t\t/**\n\t\t\t * Visualization of intervals within the string after the last deletion:\n\t\t\t *\n\t\t\t * There does not exist a next valid segment for interval2 and interval3\n\t\t\t *\n\t\t\t * 0 1\n\t\t\t * a b\n\t\t\t * interval1 ^\n\t\t\t * interval2\n\t\t\t * interval3\n\t\t\t */\n\n\t\t\tresults = queryIntervalsByPositions(0, 1);\n\t\t\tassertSequenceIntervalsEqual(\n\t\t\t\ttestSharedString,\n\t\t\t\tresults,\n\t\t\t\t// TODO: At this point, this test should expect interval2 and interval3 to slide to an EndOfString segment\n\t\t\t\t// rather than back, and so should expect results:\n\t\t\t\t// [{ start: 1, end: 1 }]\n\t\t\t\t// However, currently intervals attempt to slide back when sliding forward fails.\n\t\t\t\t[\n\t\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t],\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"find consistent results with `naive` method\", () => {\n\t\t/**\n\t\t * Fills in random sequence intervals to the index and interval collection\n\t\t * @param options - The options object containing random, count, and min properties.\n\t\t */\n\t\tconst fillInRandomSequenceIntervals = ({\n\t\t\trandom,\n\t\t\tcount,\n\t\t\tmin,\n\t\t}: Pick<RandomIntervalOptions, \"random\" | \"count\" | \"min\">): void => {\n\t\t\t// Generate random text, and insert them into random positions of the string\n\t\t\tfor (let i = 0; i < count / 2; ++i) {\n\t\t\t\ttestSharedString.insertText(\n\t\t\t\t\trandom.integer(0, Math.max(testSharedString.getLength() - 1, 0)),\n\t\t\t\t\trandom.string(random.bool() ? 2 : 1),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst max = testSharedString.getLength() - 1;\n\t\t\t// Genereate random sequence intervals\n\t\t\tfor (let i = 0; i < count; ++i) {\n\t\t\t\tconst start = random.integer(min, max);\n\t\t\t\tconst end = random.integer(start, max);\n\t\t\t\tcollection.add({ start, end });\n\t\t\t}\n\t\t};\n\n\t\tit(\"when given massive random inputs\", () => {\n\t\t\tconst random = makeRandom(0);\n\t\t\tconst count = 100;\n\t\t\tconst min = 0;\n\n\t\t\t// Attach the default overlapping interval index for comparison purposes\n\t\t\tconst overlappingIntervalsIndex = createOverlappingIntervalsIndex(testSharedString);\n\t\t\tcollection.attachIndex(overlappingIntervalsIndex);\n\n\t\t\tfillInRandomSequenceIntervals({ random, count, min });\n\t\t\t// Test with running 100 random queries\n\t\t\tconst max = testSharedString.getLength() - 1;\n\t\t\tfor (let i = 0; i < 100; ++i) {\n\t\t\t\tconst start = random.integer(min, max);\n\t\t\t\tconst end = random.integer(start, max);\n\n\t\t\t\t// Query intervals using two distinct methods\n\t\t\t\tresults = queryIntervalsByPositions(start, end);\n\t\t\t\tconst expected = overlappingIntervalsIndex.findOverlappingIntervals(start, end);\n\n\t\t\t\tresults.sort(compareFn);\n\t\t\t\texpected.sort(compareFn);\n\n\t\t\t\tassertSequenceIntervalsEqual(testSharedString, results, expected);\n\t\t\t}\n\t\t});\n\t});\n});\n"]}