@fluidframework/sequence 2.0.0-dev-rc.2.0.0.245554 → 2.0.0-dev-rc.3.0.0.250606

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 (202) hide show
  1. package/README.md +1 -1
  2. package/dist/IntervalCollectionValues.d.ts +2 -2
  3. package/dist/IntervalCollectionValues.d.ts.map +1 -1
  4. package/dist/IntervalCollectionValues.js.map +1 -1
  5. package/dist/intervalCollection.d.ts +3 -3
  6. package/dist/intervalCollection.d.ts.map +1 -1
  7. package/dist/intervalCollection.js +34 -30
  8. package/dist/intervalCollection.js.map +1 -1
  9. package/dist/intervalCollectionMap.d.ts +3 -3
  10. package/dist/intervalCollectionMap.d.ts.map +1 -1
  11. package/dist/intervalCollectionMap.js +1 -1
  12. package/dist/intervalCollectionMap.js.map +1 -1
  13. package/dist/intervalCollectionMapInterfaces.d.ts +2 -2
  14. package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -1
  15. package/dist/intervalCollectionMapInterfaces.js.map +1 -1
  16. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  17. package/dist/intervalIndex/endpointInRangeIndex.js +1 -1
  18. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  19. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  20. package/dist/intervalIndex/endpointIndex.js +1 -1
  21. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  22. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  23. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  24. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +2 -2
  25. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  26. package/dist/intervalIndex/overlappingIntervalsIndex.js +2 -3
  27. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  28. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  29. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
  30. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  31. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  32. package/dist/intervalIndex/startpointInRangeIndex.js +1 -1
  33. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  34. package/dist/intervalTree.d.ts +1 -1
  35. package/dist/intervalTree.d.ts.map +1 -1
  36. package/dist/intervalTree.js.map +1 -1
  37. package/dist/intervals/interval.d.ts.map +1 -1
  38. package/dist/intervals/interval.js +2 -2
  39. package/dist/intervals/interval.js.map +1 -1
  40. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  41. package/dist/intervals/sequenceInterval.js +1 -1
  42. package/dist/intervals/sequenceInterval.js.map +1 -1
  43. package/dist/packageVersion.d.ts +1 -1
  44. package/dist/packageVersion.js +1 -1
  45. package/dist/packageVersion.js.map +1 -1
  46. package/dist/revertibles.d.ts +1 -1
  47. package/dist/revertibles.d.ts.map +1 -1
  48. package/dist/revertibles.js.map +1 -1
  49. package/dist/sequence.d.ts +5 -5
  50. package/dist/sequence.d.ts.map +1 -1
  51. package/dist/sequence.js +5 -5
  52. package/dist/sequence.js.map +1 -1
  53. package/dist/sequenceFactory.d.ts +1 -1
  54. package/dist/sequenceFactory.d.ts.map +1 -1
  55. package/dist/sequenceFactory.js.map +1 -1
  56. package/dist/sharedIntervalCollection.d.ts +2 -2
  57. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  58. package/dist/sharedIntervalCollection.js.map +1 -1
  59. package/dist/sharedSequence.d.ts +1 -1
  60. package/dist/sharedSequence.d.ts.map +1 -1
  61. package/dist/sharedSequence.js.map +1 -1
  62. package/dist/sharedString.d.ts +1 -1
  63. package/dist/sharedString.d.ts.map +1 -1
  64. package/dist/sharedString.js.map +1 -1
  65. package/lib/IntervalCollectionValues.d.ts +2 -2
  66. package/lib/IntervalCollectionValues.d.ts.map +1 -1
  67. package/lib/IntervalCollectionValues.js.map +1 -1
  68. package/lib/intervalCollection.d.ts +3 -3
  69. package/lib/intervalCollection.d.ts.map +1 -1
  70. package/lib/intervalCollection.js +6 -2
  71. package/lib/intervalCollection.js.map +1 -1
  72. package/lib/intervalCollectionMap.d.ts +3 -3
  73. package/lib/intervalCollectionMap.d.ts.map +1 -1
  74. package/lib/intervalCollectionMap.js +3 -3
  75. package/lib/intervalCollectionMap.js.map +1 -1
  76. package/lib/intervalCollectionMapInterfaces.d.ts +2 -2
  77. package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -1
  78. package/lib/intervalCollectionMapInterfaces.js.map +1 -1
  79. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  80. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  81. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
  82. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  83. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  84. package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
  85. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +2 -2
  86. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  87. package/lib/intervalIndex/overlappingIntervalsIndex.js +2 -3
  88. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  89. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  90. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
  91. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  92. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  93. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  94. package/lib/intervalTree.d.ts +1 -1
  95. package/lib/intervalTree.d.ts.map +1 -1
  96. package/lib/intervalTree.js.map +1 -1
  97. package/lib/intervals/interval.d.ts.map +1 -1
  98. package/lib/intervals/interval.js +1 -1
  99. package/lib/intervals/interval.js.map +1 -1
  100. package/lib/intervals/sequenceInterval.d.ts.map +1 -1
  101. package/lib/intervals/sequenceInterval.js +1 -1
  102. package/lib/intervals/sequenceInterval.js.map +1 -1
  103. package/lib/packageVersion.d.ts +1 -1
  104. package/lib/packageVersion.js +1 -1
  105. package/lib/packageVersion.js.map +1 -1
  106. package/lib/revertibles.d.ts +1 -1
  107. package/lib/revertibles.d.ts.map +1 -1
  108. package/lib/revertibles.js +2 -2
  109. package/lib/revertibles.js.map +1 -1
  110. package/lib/sequence.d.ts +5 -5
  111. package/lib/sequence.d.ts.map +1 -1
  112. package/lib/sequence.js +7 -7
  113. package/lib/sequence.js.map +1 -1
  114. package/lib/sequenceFactory.d.ts +1 -1
  115. package/lib/sequenceFactory.d.ts.map +1 -1
  116. package/lib/sequenceFactory.js.map +1 -1
  117. package/lib/sharedIntervalCollection.d.ts +2 -2
  118. package/lib/sharedIntervalCollection.d.ts.map +1 -1
  119. package/lib/sharedIntervalCollection.js +1 -1
  120. package/lib/sharedIntervalCollection.js.map +1 -1
  121. package/lib/sharedSequence.d.ts +1 -1
  122. package/lib/sharedSequence.d.ts.map +1 -1
  123. package/lib/sharedSequence.js.map +1 -1
  124. package/lib/sharedString.d.ts +1 -1
  125. package/lib/sharedString.d.ts.map +1 -1
  126. package/lib/sharedString.js +1 -1
  127. package/lib/sharedString.js.map +1 -1
  128. package/lib/test/createSnapshotFiles.js +1 -1
  129. package/lib/test/createSnapshotFiles.js.map +1 -1
  130. package/lib/test/fuzz/fuzzUtils.js +3 -3
  131. package/lib/test/fuzz/fuzzUtils.js.map +1 -1
  132. package/lib/test/fuzz/intervalCollection.fuzz.spec.js +1 -1
  133. package/lib/test/fuzz/intervalCollection.fuzz.spec.js.map +1 -1
  134. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js +2 -2
  135. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js.map +1 -1
  136. package/lib/test/fuzz/sharedString.fuzz.spec.js +1 -1
  137. package/lib/test/fuzz/sharedString.fuzz.spec.js.map +1 -1
  138. package/lib/test/generateSharedStrings.js +2 -2
  139. package/lib/test/generateSharedStrings.js.map +1 -1
  140. package/lib/test/intervalCollection.detached.spec.js +4 -2
  141. package/lib/test/intervalCollection.detached.spec.js.map +1 -1
  142. package/lib/test/intervalCollection.events.spec.js +4 -4
  143. package/lib/test/intervalCollection.events.spec.js.map +1 -1
  144. package/lib/test/intervalCollection.perf.spec.js +1 -1
  145. package/lib/test/intervalCollection.perf.spec.js.map +1 -1
  146. package/lib/test/intervalCollection.snapshot.spec.js +5 -5
  147. package/lib/test/intervalCollection.snapshot.spec.js.map +1 -1
  148. package/lib/test/intervalCollection.spec.js +4 -4
  149. package/lib/test/intervalCollection.spec.js.map +1 -1
  150. package/lib/test/intervalIndexTestUtils.js.map +1 -1
  151. package/lib/test/intervalRebasing.spec.js +3 -3
  152. package/lib/test/intervalRebasing.spec.js.map +1 -1
  153. package/lib/test/intervalStashedOps.spec.js +3 -3
  154. package/lib/test/intervalStashedOps.spec.js.map +1 -1
  155. package/lib/test/intervalTestUtils.js.map +1 -1
  156. package/lib/test/memory/sharedSequence.spec.js.map +1 -1
  157. package/lib/test/memory/sharedString.spec.js +2 -2
  158. package/lib/test/memory/sharedString.spec.js.map +1 -1
  159. package/lib/test/overlappingSequenceIntervalsIndex.spec.js +4 -4
  160. package/lib/test/overlappingSequenceIntervalsIndex.spec.js.map +1 -1
  161. package/lib/test/partialLoad.spec.js +2 -2
  162. package/lib/test/partialLoad.spec.js.map +1 -1
  163. package/lib/test/rebasing.spec.js +3 -3
  164. package/lib/test/rebasing.spec.js.map +1 -1
  165. package/lib/test/reentrancy.spec.js +3 -3
  166. package/lib/test/reentrancy.spec.js.map +1 -1
  167. package/lib/test/revertibles.spec.js +54 -6
  168. package/lib/test/revertibles.spec.js.map +1 -1
  169. package/lib/test/sequenceDeltaEvent.spec.js +1 -1
  170. package/lib/test/sequenceDeltaEvent.spec.js.map +1 -1
  171. package/lib/test/sharedIntervalCollection.spec.js +2 -2
  172. package/lib/test/sharedIntervalCollection.spec.js.map +1 -1
  173. package/lib/test/sharedString.spec.js +3 -3
  174. package/lib/test/sharedString.spec.js.map +1 -1
  175. package/lib/test/snapshotEmptyProps.spec.js +2 -2
  176. package/lib/test/snapshotEmptyProps.spec.js.map +1 -1
  177. package/lib/test/snapshotVersion.spec.js +2 -2
  178. package/lib/test/snapshotVersion.spec.js.map +1 -1
  179. package/lib/test/subSequence.spec.js.map +1 -1
  180. package/lib/test/v1IntervalCollectionHelpers.js +1 -1
  181. package/lib/test/v1IntervalCollectionHelpers.js.map +1 -1
  182. package/package.json +23 -20
  183. package/src/IntervalCollectionValues.ts +4 -4
  184. package/src/intervalCollection.ts +28 -24
  185. package/src/intervalCollectionMap.ts +15 -15
  186. package/src/intervalCollectionMapInterfaces.ts +4 -4
  187. package/src/intervalIndex/endpointInRangeIndex.ts +1 -0
  188. package/src/intervalIndex/endpointIndex.ts +1 -0
  189. package/src/intervalIndex/idIntervalIndex.ts +1 -1
  190. package/src/intervalIndex/overlappingIntervalsIndex.ts +5 -4
  191. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +3 -2
  192. package/src/intervalIndex/startpointInRangeIndex.ts +1 -0
  193. package/src/intervalTree.ts +2 -2
  194. package/src/intervals/interval.ts +2 -1
  195. package/src/intervals/sequenceInterval.ts +1 -1
  196. package/src/packageVersion.ts +1 -1
  197. package/src/revertibles.ts +7 -7
  198. package/src/sequence.ts +19 -19
  199. package/src/sequenceFactory.ts +2 -2
  200. package/src/sharedIntervalCollection.ts +7 -7
  201. package/src/sharedSequence.ts +1 -1
  202. package/src/sharedString.ts +2 -2
@@ -1 +1 @@
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"]}
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 { makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { LocalReferencePosition, compareReferencePositions } from \"@fluidframework/merge-tree\";\nimport { MockFluidDataStoreRuntime } from \"@fluidframework/test-runtime-utils\";\nimport {\n\tcreateOverlappingIntervalsIndex,\n\tcreateOverlappingSequenceIntervalsIndex,\n} from \"../intervalIndex/index.js\";\nimport { SequenceInterval } from \"../intervals/index.js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { SharedString } from \"../sharedString.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"]}
@@ -3,9 +3,9 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "assert";
6
- import { MockFluidDataStoreRuntime, MockContainerRuntimeFactory, MockStorage, } from "@fluidframework/test-runtime-utils";
7
6
  import { ReferenceType } from "@fluidframework/merge-tree";
8
- import { SharedStringFactory, SharedString } from "../index.js";
7
+ import { MockContainerRuntimeFactory, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
8
+ import { SharedString, SharedStringFactory } from "../index.js";
9
9
  function applyOperations(sharedString, content = sharedString.getLength().toString()) {
10
10
  const lenMod = sharedString.getLength() % 4;
11
11
  switch (lenMod) {
@@ -1 +1 @@
1
- {"version":3,"file":"partialLoad.spec.js","sourceRoot":"","sources":["../../src/test/partialLoad.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\nimport { strict as assert } from \"assert\";\nimport {\n\tMockFluidDataStoreRuntime,\n\tMockContainerRuntimeFactory,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { ReferenceType } from \"@fluidframework/merge-tree\";\nimport { IChannelServices } from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTree } from \"@fluidframework/protocol-definitions\";\nimport { SharedStringFactory, SharedString } from \"../index.js\";\n\nfunction applyOperations(\n\tsharedString: SharedString,\n\tcontent = sharedString.getLength().toString(),\n) {\n\tconst lenMod = sharedString.getLength() % 4;\n\tswitch (lenMod) {\n\t\tcase 0:\n\t\t\tsharedString.insertText(0, content);\n\t\t\tbreak;\n\n\t\tcase 1: {\n\t\t\tconst pos = Math.floor(sharedString.getLength() / lenMod);\n\t\t\tsharedString.insertMarker(pos, ReferenceType.Simple);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 2: {\n\t\t\tsharedString.insertText(sharedString.getLength(), content);\n\t\t\tconst pos = Math.floor(sharedString.getLength() / lenMod);\n\t\t\tsharedString.removeText(pos, pos + 1);\n\t\t\t// fall through to insert after remove\n\t\t}\n\t\tdefault:\n\t\t\tsharedString.insertText(sharedString.getLength(), content);\n\t}\n}\n\nconst mergeTreeSnapshotChunkSize = 5;\n\nfunction generateSummaryTree(\n\tcontainerRuntimeFactory: MockContainerRuntimeFactory,\n\toptions: any = {},\n): [SharedString, ISummaryTree] {\n\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime();\n\tdataStoreRuntime1.options = options;\n\t// Connect the first SharedString.\n\tconst containerRuntime1 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\tconst services1: IChannelServices = {\n\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(),\n\t};\n\tconst sharedString = new SharedString(\n\t\tdataStoreRuntime1,\n\t\t\"shared-string\",\n\t\tSharedStringFactory.Attributes,\n\t);\n\tsharedString.initializeLocal();\n\tsharedString.connect(services1);\n\n\t// Create and connect a second SharedString.\n\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\tdataStoreRuntime2.options = options;\n\tconst containerRuntime2 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\tconst sharedString2 = new SharedString(\n\t\tdataStoreRuntime2,\n\t\t\"shared-string\",\n\t\tSharedStringFactory.Attributes,\n\t);\n\tconst services2: IChannelServices = {\n\t\tdeltaConnection: dataStoreRuntime2.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(),\n\t};\n\tsharedString2.initializeLocal();\n\tsharedString2.connect(services2);\n\n\twhile (sharedString.getLength() < mergeTreeSnapshotChunkSize * 3) {\n\t\tapplyOperations(sharedString);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t}\n\tassert.equal(sharedString2.getText(), sharedString.getText());\n\tconst summaryTree = sharedString2.getAttachSummary().summary;\n\tassert(summaryTree);\n\treturn [sharedString2, summaryTree];\n}\n\ndescribe(\"SharedString Partial Load\", () => {\n\tit(\"Validate Full Load\", async () => {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst options = { mergeTreeSnapshotChunkSize };\n\t\tconst [remoteSharedString, summaryTree] = generateSummaryTree(\n\t\t\tcontainerRuntimeFactory,\n\t\t\toptions,\n\t\t);\n\n\t\tconst localDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tlocalDataStoreRuntime.options = options;\n\t\tcontainerRuntimeFactory.createContainerRuntime(localDataStoreRuntime);\n\t\tconst localServices = {\n\t\t\tdeltaConnection: localDataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t};\n\t\tconst localSharedString = new SharedString(\n\t\t\tlocalDataStoreRuntime,\n\t\t\t\"shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\n\t\tawait localSharedString.load(localServices);\n\n\t\tassert.equal(localSharedString.getText(), remoteSharedString.getText());\n\t});\n\n\tit(\"Validate New Format Load\", async () => {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst options = { newMergeTreeSnapshotFormat: true, mergeTreeSnapshotChunkSize };\n\t\tconst [remoteSharedString, summaryTree] = generateSummaryTree(\n\t\t\tcontainerRuntimeFactory,\n\t\t\toptions,\n\t\t);\n\n\t\tconst localDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tlocalDataStoreRuntime.options = options;\n\t\tcontainerRuntimeFactory.createContainerRuntime(localDataStoreRuntime);\n\t\tconst localServices = {\n\t\t\tdeltaConnection: localDataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t};\n\t\tconst localSharedString = new SharedString(\n\t\t\tlocalDataStoreRuntime,\n\t\t\t\"shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\n\t\tawait localSharedString.load(localServices);\n\n\t\tassert.equal(localSharedString.getText(), remoteSharedString.getText());\n\t});\n\n\tit(\"Validate Partial load\", async () => {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst options = {\n\t\t\tnewMergeTreeSnapshotFormat: true,\n\t\t\tsequenceInitializeFromHeaderOnly: true,\n\t\t\tmergeTreeSnapshotChunkSize,\n\t\t};\n\t\tconst [remoteSharedString, summaryTree] = generateSummaryTree(\n\t\t\tcontainerRuntimeFactory,\n\t\t\toptions,\n\t\t);\n\n\t\tconst localDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tlocalDataStoreRuntime.options = options;\n\t\tcontainerRuntimeFactory.createContainerRuntime(localDataStoreRuntime);\n\t\tconst localServices = {\n\t\t\tdeltaConnection: localDataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t};\n\t\tconst localSharedString = new SharedString(\n\t\t\tlocalDataStoreRuntime,\n\t\t\t\"shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\n\t\tawait localSharedString.load(localServices);\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tawait localSharedString.loaded;\n\t\tlocalDataStoreRuntime.deltaManager.lastSequenceNumber = localSharedString.getCurrentSeq();\n\n\t\tassert.equal(localSharedString.getText(), remoteSharedString.getText());\n\t});\n\n\tit(\"Validate Partial load with local ops\", async () => {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst options = {\n\t\t\tsequenceInitializeFromHeaderOnly: true,\n\t\t\tmergeTreeSnapshotChunkSize,\n\t\t};\n\t\tconst [remoteSharedString, summaryTree] = generateSummaryTree(\n\t\t\tcontainerRuntimeFactory,\n\t\t\toptions,\n\t\t);\n\n\t\tconst localDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tlocalDataStoreRuntime.options = options;\n\t\tcontainerRuntimeFactory.createContainerRuntime(localDataStoreRuntime);\n\t\tconst localServices = {\n\t\t\tdeltaConnection: localDataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t};\n\t\tconst localSharedString = new SharedString(\n\t\t\tlocalDataStoreRuntime,\n\t\t\t\"shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\n\t\tawait localSharedString.load(localServices);\n\n\t\tlocalDataStoreRuntime.deltaManager.lastSequenceNumber =\n\t\t\tcontainerRuntimeFactory.sequenceNumber;\n\n\t\tlocalDataStoreRuntime.deltaManager.minimumSequenceNumber =\n\t\t\tcontainerRuntimeFactory.getMinSeq();\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tapplyOperations(localSharedString, \"L\");\n\t\t}\n\n\t\tassert.equal(containerRuntimeFactory.outstandingMessageCount, 0);\n\n\t\tawait localSharedString.loaded;\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\t\tassert.notEqual(containerRuntimeFactory.outstandingMessageCount, 0);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\tassert.equal(localSharedString.getText(), remoteSharedString.getText());\n\t});\n\n\tit(\"Validate Partial load with remote ops\", async () => {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst options = {\n\t\t\tsequenceInitializeFromHeaderOnly: true,\n\t\t\tmergeTreeSnapshotChunkSize,\n\t\t};\n\t\tconst [remoteSharedString, summaryTree] = generateSummaryTree(\n\t\t\tcontainerRuntimeFactory,\n\t\t\toptions,\n\t\t);\n\n\t\tconst localDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tlocalDataStoreRuntime.options = options;\n\t\tcontainerRuntimeFactory.createContainerRuntime(localDataStoreRuntime);\n\t\tconst localServices = {\n\t\t\tdeltaConnection: localDataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t};\n\t\tconst localSharedString = new SharedString(\n\t\t\tlocalDataStoreRuntime,\n\t\t\t\"shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\n\t\tawait localSharedString.load(localServices);\n\n\t\tlocalDataStoreRuntime.deltaManager.lastSequenceNumber =\n\t\t\tcontainerRuntimeFactory.sequenceNumber;\n\n\t\tlocalDataStoreRuntime.deltaManager.minimumSequenceNumber =\n\t\t\tcontainerRuntimeFactory.getMinSeq();\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tapplyOperations(remoteSharedString, \"R\");\n\t\t}\n\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tawait localSharedString.loaded;\n\n\t\tassert.equal(localSharedString.getText(), remoteSharedString.getText());\n\t});\n\n\tit(\"Validate Partial load with local and remote ops\", async () => {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst options = {\n\t\t\tsequenceInitializeFromHeaderOnly: true,\n\t\t\tmergeTreeSnapshotChunkSize,\n\t\t};\n\t\tconst [remoteSharedString, summaryTree] = generateSummaryTree(\n\t\t\tcontainerRuntimeFactory,\n\t\t\toptions,\n\t\t);\n\n\t\tconst localDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tlocalDataStoreRuntime.options = options;\n\t\tcontainerRuntimeFactory.createContainerRuntime(localDataStoreRuntime);\n\t\tconst localServices = {\n\t\t\tdeltaConnection: localDataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t};\n\t\tconst localSharedString = new SharedString(\n\t\t\tlocalDataStoreRuntime,\n\t\t\t\"shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\n\t\tawait localSharedString.load(localServices);\n\n\t\tlocalDataStoreRuntime.deltaManager.lastSequenceNumber =\n\t\t\tcontainerRuntimeFactory.sequenceNumber;\n\n\t\tlocalDataStoreRuntime.deltaManager.minimumSequenceNumber =\n\t\t\tcontainerRuntimeFactory.getMinSeq();\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tapplyOperations(remoteSharedString, \"R\");\n\t\t}\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tapplyOperations(localSharedString, \"L\");\n\t\t}\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tawait localSharedString.loaded;\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\tassert.equal(localSharedString.getText(), remoteSharedString.getText());\n\t});\n});\n"]}
1
+ {"version":3,"file":"partialLoad.spec.js","sourceRoot":"","sources":["../../src/test/partialLoad.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\nimport { strict as assert } from \"assert\";\nimport { IChannelServices } from \"@fluidframework/datastore-definitions\";\nimport { ReferenceType } from \"@fluidframework/merge-tree\";\nimport { ISummaryTree } from \"@fluidframework/protocol-definitions\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { SharedString, SharedStringFactory } from \"../index.js\";\n\nfunction applyOperations(\n\tsharedString: SharedString,\n\tcontent = sharedString.getLength().toString(),\n) {\n\tconst lenMod = sharedString.getLength() % 4;\n\tswitch (lenMod) {\n\t\tcase 0:\n\t\t\tsharedString.insertText(0, content);\n\t\t\tbreak;\n\n\t\tcase 1: {\n\t\t\tconst pos = Math.floor(sharedString.getLength() / lenMod);\n\t\t\tsharedString.insertMarker(pos, ReferenceType.Simple);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 2: {\n\t\t\tsharedString.insertText(sharedString.getLength(), content);\n\t\t\tconst pos = Math.floor(sharedString.getLength() / lenMod);\n\t\t\tsharedString.removeText(pos, pos + 1);\n\t\t\t// fall through to insert after remove\n\t\t}\n\t\tdefault:\n\t\t\tsharedString.insertText(sharedString.getLength(), content);\n\t}\n}\n\nconst mergeTreeSnapshotChunkSize = 5;\n\nfunction generateSummaryTree(\n\tcontainerRuntimeFactory: MockContainerRuntimeFactory,\n\toptions: any = {},\n): [SharedString, ISummaryTree] {\n\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime();\n\tdataStoreRuntime1.options = options;\n\t// Connect the first SharedString.\n\tconst containerRuntime1 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\tconst services1: IChannelServices = {\n\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(),\n\t};\n\tconst sharedString = new SharedString(\n\t\tdataStoreRuntime1,\n\t\t\"shared-string\",\n\t\tSharedStringFactory.Attributes,\n\t);\n\tsharedString.initializeLocal();\n\tsharedString.connect(services1);\n\n\t// Create and connect a second SharedString.\n\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\tdataStoreRuntime2.options = options;\n\tconst containerRuntime2 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\tconst sharedString2 = new SharedString(\n\t\tdataStoreRuntime2,\n\t\t\"shared-string\",\n\t\tSharedStringFactory.Attributes,\n\t);\n\tconst services2: IChannelServices = {\n\t\tdeltaConnection: dataStoreRuntime2.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(),\n\t};\n\tsharedString2.initializeLocal();\n\tsharedString2.connect(services2);\n\n\twhile (sharedString.getLength() < mergeTreeSnapshotChunkSize * 3) {\n\t\tapplyOperations(sharedString);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t}\n\tassert.equal(sharedString2.getText(), sharedString.getText());\n\tconst summaryTree = sharedString2.getAttachSummary().summary;\n\tassert(summaryTree);\n\treturn [sharedString2, summaryTree];\n}\n\ndescribe(\"SharedString Partial Load\", () => {\n\tit(\"Validate Full Load\", async () => {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst options = { mergeTreeSnapshotChunkSize };\n\t\tconst [remoteSharedString, summaryTree] = generateSummaryTree(\n\t\t\tcontainerRuntimeFactory,\n\t\t\toptions,\n\t\t);\n\n\t\tconst localDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tlocalDataStoreRuntime.options = options;\n\t\tcontainerRuntimeFactory.createContainerRuntime(localDataStoreRuntime);\n\t\tconst localServices = {\n\t\t\tdeltaConnection: localDataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t};\n\t\tconst localSharedString = new SharedString(\n\t\t\tlocalDataStoreRuntime,\n\t\t\t\"shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\n\t\tawait localSharedString.load(localServices);\n\n\t\tassert.equal(localSharedString.getText(), remoteSharedString.getText());\n\t});\n\n\tit(\"Validate New Format Load\", async () => {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst options = { newMergeTreeSnapshotFormat: true, mergeTreeSnapshotChunkSize };\n\t\tconst [remoteSharedString, summaryTree] = generateSummaryTree(\n\t\t\tcontainerRuntimeFactory,\n\t\t\toptions,\n\t\t);\n\n\t\tconst localDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tlocalDataStoreRuntime.options = options;\n\t\tcontainerRuntimeFactory.createContainerRuntime(localDataStoreRuntime);\n\t\tconst localServices = {\n\t\t\tdeltaConnection: localDataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t};\n\t\tconst localSharedString = new SharedString(\n\t\t\tlocalDataStoreRuntime,\n\t\t\t\"shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\n\t\tawait localSharedString.load(localServices);\n\n\t\tassert.equal(localSharedString.getText(), remoteSharedString.getText());\n\t});\n\n\tit(\"Validate Partial load\", async () => {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst options = {\n\t\t\tnewMergeTreeSnapshotFormat: true,\n\t\t\tsequenceInitializeFromHeaderOnly: true,\n\t\t\tmergeTreeSnapshotChunkSize,\n\t\t};\n\t\tconst [remoteSharedString, summaryTree] = generateSummaryTree(\n\t\t\tcontainerRuntimeFactory,\n\t\t\toptions,\n\t\t);\n\n\t\tconst localDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tlocalDataStoreRuntime.options = options;\n\t\tcontainerRuntimeFactory.createContainerRuntime(localDataStoreRuntime);\n\t\tconst localServices = {\n\t\t\tdeltaConnection: localDataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t};\n\t\tconst localSharedString = new SharedString(\n\t\t\tlocalDataStoreRuntime,\n\t\t\t\"shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\n\t\tawait localSharedString.load(localServices);\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tawait localSharedString.loaded;\n\t\tlocalDataStoreRuntime.deltaManager.lastSequenceNumber = localSharedString.getCurrentSeq();\n\n\t\tassert.equal(localSharedString.getText(), remoteSharedString.getText());\n\t});\n\n\tit(\"Validate Partial load with local ops\", async () => {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst options = {\n\t\t\tsequenceInitializeFromHeaderOnly: true,\n\t\t\tmergeTreeSnapshotChunkSize,\n\t\t};\n\t\tconst [remoteSharedString, summaryTree] = generateSummaryTree(\n\t\t\tcontainerRuntimeFactory,\n\t\t\toptions,\n\t\t);\n\n\t\tconst localDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tlocalDataStoreRuntime.options = options;\n\t\tcontainerRuntimeFactory.createContainerRuntime(localDataStoreRuntime);\n\t\tconst localServices = {\n\t\t\tdeltaConnection: localDataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t};\n\t\tconst localSharedString = new SharedString(\n\t\t\tlocalDataStoreRuntime,\n\t\t\t\"shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\n\t\tawait localSharedString.load(localServices);\n\n\t\tlocalDataStoreRuntime.deltaManager.lastSequenceNumber =\n\t\t\tcontainerRuntimeFactory.sequenceNumber;\n\n\t\tlocalDataStoreRuntime.deltaManager.minimumSequenceNumber =\n\t\t\tcontainerRuntimeFactory.getMinSeq();\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tapplyOperations(localSharedString, \"L\");\n\t\t}\n\n\t\tassert.equal(containerRuntimeFactory.outstandingMessageCount, 0);\n\n\t\tawait localSharedString.loaded;\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\t\tassert.notEqual(containerRuntimeFactory.outstandingMessageCount, 0);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\tassert.equal(localSharedString.getText(), remoteSharedString.getText());\n\t});\n\n\tit(\"Validate Partial load with remote ops\", async () => {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst options = {\n\t\t\tsequenceInitializeFromHeaderOnly: true,\n\t\t\tmergeTreeSnapshotChunkSize,\n\t\t};\n\t\tconst [remoteSharedString, summaryTree] = generateSummaryTree(\n\t\t\tcontainerRuntimeFactory,\n\t\t\toptions,\n\t\t);\n\n\t\tconst localDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tlocalDataStoreRuntime.options = options;\n\t\tcontainerRuntimeFactory.createContainerRuntime(localDataStoreRuntime);\n\t\tconst localServices = {\n\t\t\tdeltaConnection: localDataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t};\n\t\tconst localSharedString = new SharedString(\n\t\t\tlocalDataStoreRuntime,\n\t\t\t\"shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\n\t\tawait localSharedString.load(localServices);\n\n\t\tlocalDataStoreRuntime.deltaManager.lastSequenceNumber =\n\t\t\tcontainerRuntimeFactory.sequenceNumber;\n\n\t\tlocalDataStoreRuntime.deltaManager.minimumSequenceNumber =\n\t\t\tcontainerRuntimeFactory.getMinSeq();\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tapplyOperations(remoteSharedString, \"R\");\n\t\t}\n\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tawait localSharedString.loaded;\n\n\t\tassert.equal(localSharedString.getText(), remoteSharedString.getText());\n\t});\n\n\tit(\"Validate Partial load with local and remote ops\", async () => {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst options = {\n\t\t\tsequenceInitializeFromHeaderOnly: true,\n\t\t\tmergeTreeSnapshotChunkSize,\n\t\t};\n\t\tconst [remoteSharedString, summaryTree] = generateSummaryTree(\n\t\t\tcontainerRuntimeFactory,\n\t\t\toptions,\n\t\t);\n\n\t\tconst localDataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tlocalDataStoreRuntime.options = options;\n\t\tcontainerRuntimeFactory.createContainerRuntime(localDataStoreRuntime);\n\t\tconst localServices = {\n\t\t\tdeltaConnection: localDataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t};\n\t\tconst localSharedString = new SharedString(\n\t\t\tlocalDataStoreRuntime,\n\t\t\t\"shared-string\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\n\t\tawait localSharedString.load(localServices);\n\n\t\tlocalDataStoreRuntime.deltaManager.lastSequenceNumber =\n\t\t\tcontainerRuntimeFactory.sequenceNumber;\n\n\t\tlocalDataStoreRuntime.deltaManager.minimumSequenceNumber =\n\t\t\tcontainerRuntimeFactory.getMinSeq();\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tapplyOperations(remoteSharedString, \"R\");\n\t\t}\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tapplyOperations(localSharedString, \"L\");\n\t\t}\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tawait localSharedString.loaded;\n\n\t\tassert.notEqual(localSharedString.getText(), remoteSharedString.getText());\n\n\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\tassert.equal(localSharedString.getText(), remoteSharedString.getText());\n\t});\n});\n"]}
@@ -3,11 +3,11 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "assert";
6
- import { MockFluidDataStoreRuntime, MockContainerRuntimeFactory, MockStorage, } from "@fluidframework/test-runtime-utils";
7
- import { FlushMode } from "@fluidframework/runtime-definitions";
8
6
  import { AttachState } from "@fluidframework/container-definitions";
9
- import { SharedString } from "../sharedString.js";
7
+ import { FlushMode } from "@fluidframework/runtime-definitions";
8
+ import { MockContainerRuntimeFactory, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
10
9
  import { SharedStringFactory } from "../sequenceFactory.js";
10
+ import { SharedString } from "../sharedString.js";
11
11
  [
12
12
  {
13
13
  options: {
@@ -1 +1 @@
1
- {"version":3,"file":"rebasing.spec.js","sourceRoot":"","sources":["../../src/test/rebasing.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\nimport { strict as assert } from \"assert\";\nimport {\n\tMockFluidDataStoreRuntime,\n\tMockContainerRuntimeFactory,\n\tMockContainerRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { IMergeTreeInsertMsg } from \"@fluidframework/merge-tree\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\n\n[\n\t{\n\t\toptions: {\n\t\t\tflushMode: FlushMode.Immediate,\n\t\t},\n\t\tname: \"FlushMode immediate\",\n\t},\n\t{\n\t\toptions: {\n\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\tenableGroupedBatching: true,\n\t\t},\n\t\tname: \"FlushMode TurnBased with grouped batching\",\n\t},\n].forEach((testConfig) => {\n\tdescribe(`Rebasing - ${testConfig.name}`, () => {\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\t\tlet containerRuntime1: MockContainerRuntime;\n\t\tlet containerRuntime2: MockContainerRuntime;\n\t\tlet sharedString1: SharedString;\n\t\tlet sharedString2: SharedString;\n\n\t\tconst createSharedString = async (\n\t\t\tid: string,\n\t\t\tfactory: MockContainerRuntimeFactory,\n\t\t): Promise<[SharedString, MockContainerRuntime]> => {\n\t\t\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\t\tdataStoreRuntime.setAttachState(AttachState.Attached);\n\t\t\tconst containerRuntime = factory.createContainerRuntime(dataStoreRuntime);\n\t\t\tconst services = {\n\t\t\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t};\n\t\t\tconst sharedString = new SharedString(\n\t\t\t\tdataStoreRuntime,\n\t\t\t\tid,\n\t\t\t\tSharedStringFactory.Attributes,\n\t\t\t);\n\t\t\tsharedString.initializeLocal();\n\t\t\tsharedString.connect(services);\n\t\t\treturn [sharedString, containerRuntime];\n\t\t};\n\n\t\tbeforeEach(async () => {\n\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactory(testConfig.options);\n\t\t\t[sharedString1, containerRuntime1] = await createSharedString(\n\t\t\t\t\"shared-string-1\",\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t);\n\t\t\t[sharedString2, containerRuntime2] = await createSharedString(\n\t\t\t\t\"shared-string-2\",\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t);\n\t\t});\n\n\t\tit(\"Rebasing ops maintains eventual consistency\", async () => {\n\t\t\tsharedString1.insertText(0, \"ad\");\n\t\t\tsharedString1.insertText(1, \"c\");\n\t\t\tcontainerRuntime1.flush();\n\t\t\tcontainerRuntime2.flush();\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString2.on(\"sequenceDelta\", (sequenceDeltaEvent) => {\n\t\t\t\tif ((sequenceDeltaEvent.opArgs.op as IMergeTreeInsertMsg).seg === \"b\") {\n\t\t\t\t\tsharedString2.insertText(3, \"u\");\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsharedString1.insertText(1, \"b\");\n\t\t\tsharedString2.insertText(0, \"y\");\n\t\t\tsharedString2.insertText(1, \"w\");\n\t\t\tcontainerRuntime1.rebase();\n\t\t\tcontainerRuntime1.flush();\n\t\t\tcontainerRuntimeFactory.processOneMessage();\n\t\t\tsharedString2.insertText(2, \"v\");\n\n\t\t\tcontainerRuntime2.rebase();\n\t\t\tcontainerRuntime1.flush();\n\t\t\tcontainerRuntime2.flush();\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString2.insertText(0, \"z\");\n\t\t\tcontainerRuntime1.flush();\n\t\t\tcontainerRuntime2.flush();\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tassert.strictEqual(sharedString1.getText(), \"zywvaubcd\");\n\t\t\tassert.strictEqual(\n\t\t\t\tsharedString1.getText(),\n\t\t\t\tsharedString2.getText(),\n\t\t\t\t\"SharedString eventual consistency broken\",\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"rebasing.spec.js","sourceRoot":"","sources":["../../src/test/rebasing.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\nimport { strict as assert } from \"assert\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { IMergeTreeInsertMsg } from \"@fluidframework/merge-tree\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport {\n\tMockContainerRuntime,\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { SharedString } from \"../sharedString.js\";\n\n[\n\t{\n\t\toptions: {\n\t\t\tflushMode: FlushMode.Immediate,\n\t\t},\n\t\tname: \"FlushMode immediate\",\n\t},\n\t{\n\t\toptions: {\n\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\tenableGroupedBatching: true,\n\t\t},\n\t\tname: \"FlushMode TurnBased with grouped batching\",\n\t},\n].forEach((testConfig) => {\n\tdescribe(`Rebasing - ${testConfig.name}`, () => {\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\t\tlet containerRuntime1: MockContainerRuntime;\n\t\tlet containerRuntime2: MockContainerRuntime;\n\t\tlet sharedString1: SharedString;\n\t\tlet sharedString2: SharedString;\n\n\t\tconst createSharedString = async (\n\t\t\tid: string,\n\t\t\tfactory: MockContainerRuntimeFactory,\n\t\t): Promise<[SharedString, MockContainerRuntime]> => {\n\t\t\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\t\tdataStoreRuntime.setAttachState(AttachState.Attached);\n\t\t\tconst containerRuntime = factory.createContainerRuntime(dataStoreRuntime);\n\t\t\tconst services = {\n\t\t\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t};\n\t\t\tconst sharedString = new SharedString(\n\t\t\t\tdataStoreRuntime,\n\t\t\t\tid,\n\t\t\t\tSharedStringFactory.Attributes,\n\t\t\t);\n\t\t\tsharedString.initializeLocal();\n\t\t\tsharedString.connect(services);\n\t\t\treturn [sharedString, containerRuntime];\n\t\t};\n\n\t\tbeforeEach(async () => {\n\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactory(testConfig.options);\n\t\t\t[sharedString1, containerRuntime1] = await createSharedString(\n\t\t\t\t\"shared-string-1\",\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t);\n\t\t\t[sharedString2, containerRuntime2] = await createSharedString(\n\t\t\t\t\"shared-string-2\",\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t);\n\t\t});\n\n\t\tit(\"Rebasing ops maintains eventual consistency\", async () => {\n\t\t\tsharedString1.insertText(0, \"ad\");\n\t\t\tsharedString1.insertText(1, \"c\");\n\t\t\tcontainerRuntime1.flush();\n\t\t\tcontainerRuntime2.flush();\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString2.on(\"sequenceDelta\", (sequenceDeltaEvent) => {\n\t\t\t\tif ((sequenceDeltaEvent.opArgs.op as IMergeTreeInsertMsg).seg === \"b\") {\n\t\t\t\t\tsharedString2.insertText(3, \"u\");\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsharedString1.insertText(1, \"b\");\n\t\t\tsharedString2.insertText(0, \"y\");\n\t\t\tsharedString2.insertText(1, \"w\");\n\t\t\tcontainerRuntime1.rebase();\n\t\t\tcontainerRuntime1.flush();\n\t\t\tcontainerRuntimeFactory.processOneMessage();\n\t\t\tsharedString2.insertText(2, \"v\");\n\n\t\t\tcontainerRuntime2.rebase();\n\t\t\tcontainerRuntime1.flush();\n\t\t\tcontainerRuntime2.flush();\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString2.insertText(0, \"z\");\n\t\t\tcontainerRuntime1.flush();\n\t\t\tcontainerRuntime2.flush();\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tassert.strictEqual(sharedString1.getText(), \"zywvaubcd\");\n\t\t\tassert.strictEqual(\n\t\t\t\tsharedString1.getText(),\n\t\t\t\tsharedString2.getText(),\n\t\t\t\t\"SharedString eventual consistency broken\",\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
@@ -3,12 +3,12 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "assert";
6
+ import { AttachState } from "@fluidframework/container-definitions";
6
7
  import { LocalReferenceCollection, MergeTreeDeltaType, ReferenceType, } from "@fluidframework/merge-tree";
7
- import { MockFluidDataStoreRuntime, MockContainerRuntimeFactory, MockStorage, } from "@fluidframework/test-runtime-utils";
8
8
  import { MockLogger } from "@fluidframework/telemetry-utils";
9
- import { AttachState } from "@fluidframework/container-definitions";
10
- import { SharedString } from "../sharedString.js";
9
+ import { MockContainerRuntimeFactory, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
11
10
  import { resetReentrancyLogCounter } from "../sequence.js";
11
+ import { SharedString } from "../sharedString.js";
12
12
  describe("SharedString op-reentrancy", () => {
13
13
  /**
14
14
  * This is an example scenario where reentrancy of submission of local ops was problematic which we saw in production.
@@ -1 +1 @@
1
- {"version":3,"file":"reentrancy.spec.js","sourceRoot":"","sources":["../../src/test/reentrancy.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\nimport { strict as assert } from \"assert\";\nimport {\n\tLocalReferenceCollection,\n\tMergeTreeDeltaType,\n\tReferenceType,\n} from \"@fluidframework/merge-tree\";\nimport {\n\tMockFluidDataStoreRuntime,\n\tMockContainerRuntimeFactory,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { SharedString } from \"../sharedString.js\";\nimport { resetReentrancyLogCounter } from \"../sequence.js\";\n\ndescribe(\"SharedString op-reentrancy\", () => {\n\t/**\n\t * This is an example scenario where reentrancy of submission of local ops was problematic which we saw in production.\n\t *\n\t * Reentrant local ops were a problem before #16815 as most SharedString local application methods were set up along\n\t * the following lines:\n\t * ```ts\n\t * const op = this.client.insert(start, content);\n\t * this.submitLocalMessage(op);\n\t * ```\n\t *\n\t * However, `this.client.insert` triggers SharedString's delta event. Thus, if the application uses that event to submit\n\t * further ops, from merge-tree's perspective they would have occurred *after* the first op, but the call to submit the op\n\t * to the container runtime would happen *before* the call to submit the outermost op.\n\t *\n\t * Symptoms included various merge-tree asserts that the pending segments queue was inconsistent on the client which\n\t * triggered a reentrant op (ex: 0x046) and doc corruption from the perspective of other clients.\n\t *\n\t * #16815 fixed this by moving op submission to before raising the `sequenceDelta` event.\n\t */\n\tfor (const sharedStringPreventReentrancy of [undefined, true]) {\n\t\tdescribe(`with preventSharedStringReentrancy: ${sharedStringPreventReentrancy}`, () => {\n\t\t\tit(\"throws on local re-entrancy\", () => {\n\t\t\t\tconst factory = SharedString.getFactory();\n\t\t\t\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime({\n\t\t\t\t\tattachState: AttachState.Detached,\n\t\t\t\t});\n\t\t\t\tdataStoreRuntime1.options = { sharedStringPreventReentrancy };\n\n\t\t\t\tconst sharedString = factory.create(dataStoreRuntime1, \"A\");\n\t\t\t\tsharedString.insertText(0, \"abcX\");\n\n\t\t\t\tsharedString.on(\"sequenceDelta\", ({ deltaOperation, isLocal }, target) => {\n\t\t\t\t\tif (deltaOperation === MergeTreeDeltaType.INSERT && isLocal) {\n\t\t\t\t\t\ttarget.removeRange(3, 4);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tassert.throws(() => sharedString.insertText(4, \"e\"), \"Reentrancy detected\");\n\t\t\t});\n\t\t});\n\t}\n\n\tdescribe(\"with sharedStringPreventReentrancy: false\", () => {\n\t\tlet sharedString: SharedString;\n\t\tlet sharedString2: SharedString;\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\t\tlet logger: MockLogger;\n\t\tbeforeEach(() => {\n\t\t\tresetReentrancyLogCounter();\n\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactory();\n\n\t\t\tconst factory = SharedString.getFactory();\n\t\t\tlogger = new MockLogger();\n\t\t\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime({\n\t\t\t\tlogger: logger.toTelemetryLogger(),\n\t\t\t});\n\t\t\tdataStoreRuntime1.setAttachState(AttachState.Attached);\n\t\t\tdataStoreRuntime1.options = { sharedStringPreventReentrancy: false };\n\t\t\tsharedString = factory.create(dataStoreRuntime1, \"A\");\n\n\t\t\tconst containerRuntime1 =\n\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\t\t\tconst services1 = {\n\t\t\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t};\n\t\t\tsharedString.connect(services1);\n\n\t\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\t\tdataStoreRuntime2.options = { sharedStringPreventReentrancy: false };\n\t\t\tdataStoreRuntime2.setAttachState(AttachState.Attached);\n\t\t\tconst containerRuntime2 =\n\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\t\tconst services2 = {\n\t\t\t\tdeltaConnection: dataStoreRuntime2.createDeltaConnection(),\n\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t};\n\n\t\t\tsharedString2 = factory.create(dataStoreRuntime2, \"B\");\n\t\t\tsharedString2.connect(services2);\n\t\t});\n\n\t\tit(\"remains consistent on reentrancy\", () => {\n\t\t\tsharedString.insertText(0, \"abcX\");\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString.on(\"sequenceDelta\", ({ deltaOperation, isLocal }, target) => {\n\t\t\t\tif (deltaOperation === MergeTreeDeltaType.INSERT && isLocal) {\n\t\t\t\t\ttarget.removeRange(3, 4);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsharedString.insertText(4, \"e\");\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tfor (const str of [sharedString, sharedString2]) {\n\t\t\t\tassert.equal(str.getText(), \"abce\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"is empty after deleting reference pos in reentrant callback\", () => {\n\t\t\tsharedString.insertText(0, \"abcX\");\n\t\t\tconst { segment } = sharedString.getContainingSegment(0);\n\t\t\tassert(segment);\n\t\t\tconst localRefs = LocalReferenceCollection.setOrGet(segment);\n\t\t\tconst localRef = localRefs.createLocalRef(0, ReferenceType.SlideOnRemove, undefined);\n\n\t\t\tassert.notEqual(localRef.getSegment(), undefined);\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString.on(\"sequenceDelta\", ({ deltaOperation, isLocal }, target) => {\n\t\t\t\tif (deltaOperation === MergeTreeDeltaType.INSERT && isLocal) {\n\t\t\t\t\tconst { segment: segment2 } = target.getContainingSegment(0);\n\t\t\t\t\tassert(segment2);\n\t\t\t\t\tassert.equal(segment, segment2);\n\t\t\t\t\tassert(segment2.localRefs);\n\t\t\t\t\tsegment2.localRefs.removeLocalRef(localRef);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsharedString.insertText(4, \"e\");\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString.walkSegments((seg) => {\n\t\t\t\tif (!seg.localRefs) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tassert.equal(seg.localRefs.empty, true);\n\t\t\t\tassert.equal(seg.localRefs.has(localRef), false);\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tassert.equal(localRef.getSegment(), undefined);\n\t\t\tassert.equal(localRef.getOffset(), 0);\n\t\t});\n\n\t\tit(\"is empty after deleting segment containing simple reference pos in reentrant callback\", () => {\n\t\t\tsharedString.insertText(0, \"abcX\");\n\t\t\tconst { segment } = sharedString.getContainingSegment(0);\n\t\t\tassert(segment);\n\t\t\tconst localRefs = LocalReferenceCollection.setOrGet(segment);\n\t\t\tconst localRef = localRefs.createLocalRef(0, ReferenceType.Simple, undefined);\n\n\t\t\tassert.notEqual(localRef.getSegment(), undefined);\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString.on(\"sequenceDelta\", ({ deltaOperation, isLocal }, target) => {\n\t\t\t\tif (deltaOperation === MergeTreeDeltaType.INSERT && isLocal) {\n\t\t\t\t\ttarget.removeRange(0, 4);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsharedString.insertText(4, \"e\");\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString.walkSegments((seg) => {\n\t\t\t\tif (!seg.localRefs) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tassert.equal(seg.localRefs.empty, true);\n\t\t\t\tassert.equal(seg.localRefs.has(localRef), false);\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tassert.equal(localRef.getSegment(), undefined);\n\t\t\tassert.equal(localRef.getOffset(), 0);\n\t\t});\n\n\t\tit(\"logs reentrant events a fixed number of times\", () => {\n\t\t\tlet numberRemainingReentrantInserts = 10;\n\t\t\tsharedString.on(\"sequenceDelta\", ({ isLocal }, target) => {\n\t\t\t\tif (isLocal && numberRemainingReentrantInserts > 0) {\n\t\t\t\t\tnumberRemainingReentrantInserts--;\n\t\t\t\t\ttarget.insertText(target.getLength(), \"1\");\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsharedString.insertText(0, \"A\");\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst eventName = \"fluid:MockFluidDataStoreRuntime:LocalOpReentry\";\n\t\t\tlogger.assertMatchStrict([\n\t\t\t\t{ eventName, depth: 1 },\n\t\t\t\t{ eventName, depth: 2 },\n\t\t\t\t{ eventName, depth: 3 },\n\t\t\t]);\n\t\t\tlogger.assertMatchNone([{ eventName, depth: 4 }]);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"reentrancy.spec.js","sourceRoot":"","sources":["../../src/test/reentrancy.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\nimport { strict as assert } from \"assert\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport {\n\tLocalReferenceCollection,\n\tMergeTreeDeltaType,\n\tReferenceType,\n} from \"@fluidframework/merge-tree\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { resetReentrancyLogCounter } from \"../sequence.js\";\nimport { SharedString } from \"../sharedString.js\";\n\ndescribe(\"SharedString op-reentrancy\", () => {\n\t/**\n\t * This is an example scenario where reentrancy of submission of local ops was problematic which we saw in production.\n\t *\n\t * Reentrant local ops were a problem before #16815 as most SharedString local application methods were set up along\n\t * the following lines:\n\t * ```ts\n\t * const op = this.client.insert(start, content);\n\t * this.submitLocalMessage(op);\n\t * ```\n\t *\n\t * However, `this.client.insert` triggers SharedString's delta event. Thus, if the application uses that event to submit\n\t * further ops, from merge-tree's perspective they would have occurred *after* the first op, but the call to submit the op\n\t * to the container runtime would happen *before* the call to submit the outermost op.\n\t *\n\t * Symptoms included various merge-tree asserts that the pending segments queue was inconsistent on the client which\n\t * triggered a reentrant op (ex: 0x046) and doc corruption from the perspective of other clients.\n\t *\n\t * #16815 fixed this by moving op submission to before raising the `sequenceDelta` event.\n\t */\n\tfor (const sharedStringPreventReentrancy of [undefined, true]) {\n\t\tdescribe(`with preventSharedStringReentrancy: ${sharedStringPreventReentrancy}`, () => {\n\t\t\tit(\"throws on local re-entrancy\", () => {\n\t\t\t\tconst factory = SharedString.getFactory();\n\t\t\t\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime({\n\t\t\t\t\tattachState: AttachState.Detached,\n\t\t\t\t});\n\t\t\t\tdataStoreRuntime1.options = { sharedStringPreventReentrancy };\n\n\t\t\t\tconst sharedString = factory.create(dataStoreRuntime1, \"A\");\n\t\t\t\tsharedString.insertText(0, \"abcX\");\n\n\t\t\t\tsharedString.on(\"sequenceDelta\", ({ deltaOperation, isLocal }, target) => {\n\t\t\t\t\tif (deltaOperation === MergeTreeDeltaType.INSERT && isLocal) {\n\t\t\t\t\t\ttarget.removeRange(3, 4);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tassert.throws(() => sharedString.insertText(4, \"e\"), \"Reentrancy detected\");\n\t\t\t});\n\t\t});\n\t}\n\n\tdescribe(\"with sharedStringPreventReentrancy: false\", () => {\n\t\tlet sharedString: SharedString;\n\t\tlet sharedString2: SharedString;\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\t\tlet logger: MockLogger;\n\t\tbeforeEach(() => {\n\t\t\tresetReentrancyLogCounter();\n\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactory();\n\n\t\t\tconst factory = SharedString.getFactory();\n\t\t\tlogger = new MockLogger();\n\t\t\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime({\n\t\t\t\tlogger: logger.toTelemetryLogger(),\n\t\t\t});\n\t\t\tdataStoreRuntime1.setAttachState(AttachState.Attached);\n\t\t\tdataStoreRuntime1.options = { sharedStringPreventReentrancy: false };\n\t\t\tsharedString = factory.create(dataStoreRuntime1, \"A\");\n\n\t\t\tconst containerRuntime1 =\n\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\t\t\tconst services1 = {\n\t\t\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t};\n\t\t\tsharedString.connect(services1);\n\n\t\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\t\tdataStoreRuntime2.options = { sharedStringPreventReentrancy: false };\n\t\t\tdataStoreRuntime2.setAttachState(AttachState.Attached);\n\t\t\tconst containerRuntime2 =\n\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\t\tconst services2 = {\n\t\t\t\tdeltaConnection: dataStoreRuntime2.createDeltaConnection(),\n\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t};\n\n\t\t\tsharedString2 = factory.create(dataStoreRuntime2, \"B\");\n\t\t\tsharedString2.connect(services2);\n\t\t});\n\n\t\tit(\"remains consistent on reentrancy\", () => {\n\t\t\tsharedString.insertText(0, \"abcX\");\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString.on(\"sequenceDelta\", ({ deltaOperation, isLocal }, target) => {\n\t\t\t\tif (deltaOperation === MergeTreeDeltaType.INSERT && isLocal) {\n\t\t\t\t\ttarget.removeRange(3, 4);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsharedString.insertText(4, \"e\");\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tfor (const str of [sharedString, sharedString2]) {\n\t\t\t\tassert.equal(str.getText(), \"abce\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"is empty after deleting reference pos in reentrant callback\", () => {\n\t\t\tsharedString.insertText(0, \"abcX\");\n\t\t\tconst { segment } = sharedString.getContainingSegment(0);\n\t\t\tassert(segment);\n\t\t\tconst localRefs = LocalReferenceCollection.setOrGet(segment);\n\t\t\tconst localRef = localRefs.createLocalRef(0, ReferenceType.SlideOnRemove, undefined);\n\n\t\t\tassert.notEqual(localRef.getSegment(), undefined);\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString.on(\"sequenceDelta\", ({ deltaOperation, isLocal }, target) => {\n\t\t\t\tif (deltaOperation === MergeTreeDeltaType.INSERT && isLocal) {\n\t\t\t\t\tconst { segment: segment2 } = target.getContainingSegment(0);\n\t\t\t\t\tassert(segment2);\n\t\t\t\t\tassert.equal(segment, segment2);\n\t\t\t\t\tassert(segment2.localRefs);\n\t\t\t\t\tsegment2.localRefs.removeLocalRef(localRef);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsharedString.insertText(4, \"e\");\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString.walkSegments((seg) => {\n\t\t\t\tif (!seg.localRefs) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tassert.equal(seg.localRefs.empty, true);\n\t\t\t\tassert.equal(seg.localRefs.has(localRef), false);\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tassert.equal(localRef.getSegment(), undefined);\n\t\t\tassert.equal(localRef.getOffset(), 0);\n\t\t});\n\n\t\tit(\"is empty after deleting segment containing simple reference pos in reentrant callback\", () => {\n\t\t\tsharedString.insertText(0, \"abcX\");\n\t\t\tconst { segment } = sharedString.getContainingSegment(0);\n\t\t\tassert(segment);\n\t\t\tconst localRefs = LocalReferenceCollection.setOrGet(segment);\n\t\t\tconst localRef = localRefs.createLocalRef(0, ReferenceType.Simple, undefined);\n\n\t\t\tassert.notEqual(localRef.getSegment(), undefined);\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString.on(\"sequenceDelta\", ({ deltaOperation, isLocal }, target) => {\n\t\t\t\tif (deltaOperation === MergeTreeDeltaType.INSERT && isLocal) {\n\t\t\t\t\ttarget.removeRange(0, 4);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsharedString.insertText(4, \"e\");\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tsharedString.walkSegments((seg) => {\n\t\t\t\tif (!seg.localRefs) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tassert.equal(seg.localRefs.empty, true);\n\t\t\t\tassert.equal(seg.localRefs.has(localRef), false);\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tassert.equal(localRef.getSegment(), undefined);\n\t\t\tassert.equal(localRef.getOffset(), 0);\n\t\t});\n\n\t\tit(\"logs reentrant events a fixed number of times\", () => {\n\t\t\tlet numberRemainingReentrantInserts = 10;\n\t\t\tsharedString.on(\"sequenceDelta\", ({ isLocal }, target) => {\n\t\t\t\tif (isLocal && numberRemainingReentrantInserts > 0) {\n\t\t\t\t\tnumberRemainingReentrantInserts--;\n\t\t\t\t\ttarget.insertText(target.getLength(), \"1\");\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsharedString.insertText(0, \"A\");\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst eventName = \"fluid:MockFluidDataStoreRuntime:LocalOpReentry\";\n\t\t\tlogger.assertMatchStrict([\n\t\t\t\t{ eventName, depth: 1 },\n\t\t\t\t{ eventName, depth: 2 },\n\t\t\t\t{ eventName, depth: 3 },\n\t\t\t]);\n\t\t\tlogger.assertMatchNone([{ eventName, depth: 4 }]);\n\t\t});\n\t});\n});\n"]}
@@ -3,13 +3,13 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "assert";
6
- import { MockContainerRuntimeFactory, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
7
6
  import { AttachState } from "@fluidframework/container-definitions";
8
- import { appendAddIntervalToRevertibles, appendChangeIntervalToRevertibles, appendDeleteIntervalToRevertibles, appendIntervalPropertyChangedToRevertibles, appendSharedStringDeltaToRevertibles, revertSharedStringRevertibles, } from "../revertibles.js";
9
- import { SharedString } from "../sharedString.js";
7
+ import { MockContainerRuntimeFactory, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
10
8
  import { Side } from "../intervalCollection.js";
11
- import { SharedStringFactory } from "../sequenceFactory.js";
12
9
  import { IntervalStickiness } from "../intervals/index.js";
10
+ import { appendAddIntervalToRevertibles, appendChangeIntervalToRevertibles, appendDeleteIntervalToRevertibles, appendIntervalPropertyChangedToRevertibles, appendSharedStringDeltaToRevertibles, revertSharedStringRevertibles, } from "../revertibles.js";
11
+ import { SharedStringFactory } from "../sequenceFactory.js";
12
+ import { SharedString } from "../sharedString.js";
13
13
  import { assertSequenceIntervals } from "./intervalTestUtils.js";
14
14
  describe("Sequence.Revertibles with Local Edits", () => {
15
15
  let sharedString;
@@ -197,6 +197,51 @@ describe("Sequence.Revertibles with Local Edits", () => {
197
197
  revertSharedStringRevertibles(sharedString, revertibles.splice(0));
198
198
  assertSequenceIntervals(sharedString, collection, [{ start: 1, end: 3 }]);
199
199
  });
200
+ it("performs two acked interval removes and reverts to ensure interval returns to correct position", () => {
201
+ const undoRevertibles = [];
202
+ const redoRevertibles = [];
203
+ let currentRevertStack = undoRevertibles;
204
+ sharedString.insertText(0, "123456789");
205
+ collection.add({ start: 2, end: 2 });
206
+ sharedString.on("sequenceDelta", (op) => {
207
+ if (op.isLocal) {
208
+ appendSharedStringDeltaToRevertibles(sharedString, op, currentRevertStack);
209
+ }
210
+ });
211
+ collection.on("changeInterval", (interval, previousInterval, local, op, slide) => {
212
+ if (slide === false &&
213
+ (interval.end !== previousInterval.end || interval.start !== previousInterval.start)) {
214
+ appendChangeIntervalToRevertibles(sharedString, interval, previousInterval, currentRevertStack);
215
+ }
216
+ });
217
+ // remove "34"
218
+ sharedString.removeRange(2, 4);
219
+ containerRuntimeFactory.processAllMessages();
220
+ assert.equal(sharedString.getText(), "1256789");
221
+ assertSequenceIntervals(sharedString, collection, [{ start: 2, end: 2 }]);
222
+ // undo to reinsert "34"
223
+ currentRevertStack = redoRevertibles;
224
+ revertSharedStringRevertibles(sharedString, undoRevertibles.splice(0));
225
+ currentRevertStack = undoRevertibles;
226
+ containerRuntimeFactory.processAllMessages();
227
+ assert.equal(undoRevertibles.length, 0);
228
+ assert.equal(redoRevertibles.length, 2);
229
+ assert.equal(sharedString.getText(), "123456789");
230
+ assertSequenceIntervals(sharedString, collection, [{ start: 2, end: 2 }]);
231
+ // remove "5"
232
+ sharedString.removeRange(4, 5);
233
+ containerRuntimeFactory.processAllMessages();
234
+ assert.equal(sharedString.getText(), "12346789");
235
+ assert.equal(undoRevertibles.length, 1);
236
+ assertSequenceIntervals(sharedString, collection, [{ start: 2, end: 2 }]);
237
+ // undo to reinsert "5"
238
+ currentRevertStack = redoRevertibles;
239
+ revertSharedStringRevertibles(sharedString, undoRevertibles.splice(0));
240
+ currentRevertStack = undoRevertibles;
241
+ containerRuntimeFactory.processAllMessages();
242
+ assert.equal(sharedString.getText(), "123456789");
243
+ assertSequenceIntervals(sharedString, collection, [{ start: 2, end: 2 }]);
244
+ });
200
245
  });
201
246
  describe("Sequence.Revertibles with Remote Edits", () => {
202
247
  let sharedString;
@@ -628,6 +673,7 @@ describe("Undo/redo for string remove containing intervals", () => {
628
673
  appendSharedStringDeltaToRevertibles(sharedString, op, revertibles);
629
674
  });
630
675
  const interval = collection.add({ start: 2, end: 4 });
676
+ const id = interval.getIntervalId();
631
677
  sharedString.removeRange(0, 6);
632
678
  const actualStart = sharedString.localReferencePositionToPosition(interval.start);
633
679
  const actualEnd = sharedString.localReferencePositionToPosition(interval.end);
@@ -635,10 +681,12 @@ describe("Undo/redo for string remove containing intervals", () => {
635
681
  assert.equal(actualEnd, 0, `actualEnd is ${actualEnd}`);
636
682
  assert.equal(revertibles.length, 1, "revertibles.length is not 1");
637
683
  revertSharedStringRevertibles(sharedString, revertibles.splice(0));
684
+ const updatedInterval = collection.getIntervalById(id);
685
+ assert(updatedInterval !== undefined, "updatedInterval is undefined");
638
686
  assert.equal(sharedString.getText(), "hello world");
639
687
  assertSequenceIntervals(sharedString, collection, [{ start: 2, end: 4 }]);
640
- assert.equal(interval.start.getOffset(), 2, `after remove start.getOffset() is ${interval.start.getOffset()}`);
641
- assert.equal(interval.end.getOffset(), 4, `after remove start.getOffset() is ${interval.end.getOffset()}`);
688
+ assert.equal(updatedInterval.start.getOffset(), 2, `after remove start.getOffset() is ${interval.start.getOffset()}`);
689
+ assert.equal(updatedInterval.end.getOffset(), 4, `after remove start.getOffset() is ${interval.end.getOffset()}`);
642
690
  });
643
691
  it("has an interval with endpoints at the deleted range", () => {
644
692
  sharedString.insertText(0, "hello world");