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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +1 -1
  3. package/api-report/sequence.api.md +32 -32
  4. package/beta.d.ts +11 -0
  5. package/dist/{localValues.d.ts → IntervalCollectionValues.d.ts} +13 -12
  6. package/dist/IntervalCollectionValues.d.ts.map +1 -0
  7. package/dist/{localValues.js → IntervalCollectionValues.js} +6 -6
  8. package/dist/IntervalCollectionValues.js.map +1 -0
  9. package/dist/beta.d.ts +12 -0
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +10 -10
  13. package/dist/index.js.map +1 -1
  14. package/dist/intervalCollection.d.ts +10 -10
  15. package/dist/intervalCollection.d.ts.map +1 -1
  16. package/dist/intervalCollection.js +103 -99
  17. package/dist/intervalCollection.js.map +1 -1
  18. package/dist/{defaultMap.d.ts → intervalCollectionMap.d.ts} +11 -44
  19. package/dist/intervalCollectionMap.d.ts.map +1 -0
  20. package/dist/{defaultMap.js → intervalCollectionMap.js} +15 -70
  21. package/dist/intervalCollectionMap.js.map +1 -0
  22. package/dist/{defaultMapInterfaces.d.ts → intervalCollectionMapInterfaces.d.ts} +17 -16
  23. package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -0
  24. package/dist/{defaultMapInterfaces.js → intervalCollectionMapInterfaces.js} +1 -1
  25. package/dist/intervalCollectionMapInterfaces.js.map +1 -0
  26. package/dist/intervalIndex/endpointInRangeIndex.d.ts +1 -1
  27. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  28. package/dist/intervalIndex/endpointInRangeIndex.js +3 -3
  29. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  30. package/dist/intervalIndex/endpointIndex.d.ts +1 -1
  31. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  32. package/dist/intervalIndex/endpointIndex.js +3 -3
  33. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  34. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  35. package/dist/intervalIndex/idIntervalIndex.js +3 -3
  36. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  37. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +3 -3
  38. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  39. package/dist/intervalIndex/overlappingIntervalsIndex.js +2 -3
  40. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  41. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  42. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +6 -6
  43. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  44. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  45. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  46. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  47. package/dist/intervalIndex/startpointInRangeIndex.d.ts +1 -1
  48. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  49. package/dist/intervalIndex/startpointInRangeIndex.js +3 -3
  50. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  51. package/dist/intervalTree.d.ts +1 -1
  52. package/dist/intervalTree.d.ts.map +1 -1
  53. package/dist/intervalTree.js +2 -2
  54. package/dist/intervalTree.js.map +1 -1
  55. package/dist/intervals/interval.d.ts +1 -1
  56. package/dist/intervals/interval.d.ts.map +1 -1
  57. package/dist/intervals/interval.js +10 -10
  58. package/dist/intervals/interval.js.map +1 -1
  59. package/dist/intervals/intervalUtils.d.ts +1 -1
  60. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  61. package/dist/intervals/intervalUtils.js +5 -5
  62. package/dist/intervals/intervalUtils.js.map +1 -1
  63. package/dist/intervals/sequenceInterval.d.ts +1 -1
  64. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  65. package/dist/intervals/sequenceInterval.js +34 -34
  66. package/dist/intervals/sequenceInterval.js.map +1 -1
  67. package/dist/legacy.d.ts +61 -0
  68. package/dist/packageVersion.d.ts +1 -1
  69. package/dist/packageVersion.js +1 -1
  70. package/dist/packageVersion.js.map +1 -1
  71. package/dist/public.d.ts +12 -0
  72. package/dist/revertibles.d.ts +2 -2
  73. package/dist/revertibles.d.ts.map +1 -1
  74. package/dist/revertibles.js +34 -34
  75. package/dist/revertibles.js.map +1 -1
  76. package/dist/sequence.d.ts +7 -6
  77. package/dist/sequence.d.ts.map +1 -1
  78. package/dist/sequence.js +34 -34
  79. package/dist/sequence.js.map +1 -1
  80. package/dist/sequenceDeltaEvent.d.ts +1 -1
  81. package/dist/sequenceDeltaEvent.d.ts.map +1 -1
  82. package/dist/sequenceDeltaEvent.js +4 -4
  83. package/dist/sequenceDeltaEvent.js.map +1 -1
  84. package/dist/sequenceFactory.d.ts +1 -1
  85. package/dist/sequenceFactory.d.ts.map +1 -1
  86. package/dist/sequenceFactory.js +3 -3
  87. package/dist/sequenceFactory.js.map +1 -1
  88. package/dist/sharedIntervalCollection.d.ts +4 -3
  89. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  90. package/dist/sharedIntervalCollection.js +5 -5
  91. package/dist/sharedIntervalCollection.js.map +1 -1
  92. package/dist/sharedSequence.d.ts +3 -2
  93. package/dist/sharedSequence.d.ts.map +1 -1
  94. package/dist/sharedSequence.js +4 -4
  95. package/dist/sharedSequence.js.map +1 -1
  96. package/dist/sharedString.d.ts +2 -2
  97. package/dist/sharedString.d.ts.map +1 -1
  98. package/dist/sharedString.js +9 -9
  99. package/dist/sharedString.js.map +1 -1
  100. package/internal.d.ts +11 -0
  101. package/legacy.d.ts +11 -0
  102. package/lib/{localValues.d.ts → IntervalCollectionValues.d.ts} +13 -12
  103. package/lib/IntervalCollectionValues.d.ts.map +1 -0
  104. package/lib/{localValues.js → IntervalCollectionValues.js} +3 -3
  105. package/lib/IntervalCollectionValues.js.map +1 -0
  106. package/lib/beta.d.ts +12 -0
  107. package/lib/index.d.ts +2 -2
  108. package/lib/index.d.ts.map +1 -1
  109. package/lib/index.js +1 -1
  110. package/lib/index.js.map +1 -1
  111. package/lib/intervalCollection.d.ts +10 -10
  112. package/lib/intervalCollection.d.ts.map +1 -1
  113. package/lib/intervalCollection.js +8 -4
  114. package/lib/intervalCollection.js.map +1 -1
  115. package/lib/{defaultMap.d.ts → intervalCollectionMap.d.ts} +11 -44
  116. package/lib/intervalCollectionMap.d.ts.map +1 -0
  117. package/lib/{defaultMap.js → intervalCollectionMap.js} +8 -63
  118. package/lib/intervalCollectionMap.js.map +1 -0
  119. package/lib/{defaultMapInterfaces.d.ts → intervalCollectionMapInterfaces.d.ts} +17 -16
  120. package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -0
  121. package/lib/{defaultMapInterfaces.js → intervalCollectionMapInterfaces.js} +1 -1
  122. package/lib/intervalCollectionMapInterfaces.js.map +1 -0
  123. package/lib/intervalIndex/endpointInRangeIndex.d.ts +1 -1
  124. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  125. package/lib/intervalIndex/endpointInRangeIndex.js +1 -1
  126. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  127. package/lib/intervalIndex/endpointIndex.d.ts +1 -1
  128. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
  129. package/lib/intervalIndex/endpointIndex.js +1 -1
  130. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  131. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  132. package/lib/intervalIndex/idIntervalIndex.js +1 -1
  133. package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
  134. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +3 -3
  135. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  136. package/lib/intervalIndex/overlappingIntervalsIndex.js +2 -3
  137. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  138. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  139. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +2 -2
  140. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  141. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  142. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  143. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  144. package/lib/intervalIndex/startpointInRangeIndex.d.ts +1 -1
  145. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  146. package/lib/intervalIndex/startpointInRangeIndex.js +1 -1
  147. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  148. package/lib/intervalTree.d.ts +1 -1
  149. package/lib/intervalTree.d.ts.map +1 -1
  150. package/lib/intervalTree.js +1 -1
  151. package/lib/intervalTree.js.map +1 -1
  152. package/lib/intervals/interval.d.ts +1 -1
  153. package/lib/intervals/interval.d.ts.map +1 -1
  154. package/lib/intervals/interval.js +3 -3
  155. package/lib/intervals/interval.js.map +1 -1
  156. package/lib/intervals/intervalUtils.d.ts +1 -1
  157. package/lib/intervals/intervalUtils.d.ts.map +1 -1
  158. package/lib/intervals/intervalUtils.js +1 -1
  159. package/lib/intervals/intervalUtils.js.map +1 -1
  160. package/lib/intervals/sequenceInterval.d.ts +1 -1
  161. package/lib/intervals/sequenceInterval.d.ts.map +1 -1
  162. package/lib/intervals/sequenceInterval.js +3 -3
  163. package/lib/intervals/sequenceInterval.js.map +1 -1
  164. package/lib/legacy.d.ts +61 -0
  165. package/lib/packageVersion.d.ts +1 -1
  166. package/lib/packageVersion.js +1 -1
  167. package/lib/packageVersion.js.map +1 -1
  168. package/lib/public.d.ts +12 -0
  169. package/lib/revertibles.d.ts +2 -2
  170. package/lib/revertibles.d.ts.map +1 -1
  171. package/lib/revertibles.js +3 -4
  172. package/lib/revertibles.js.map +1 -1
  173. package/lib/sequence.d.ts +7 -6
  174. package/lib/sequence.d.ts.map +1 -1
  175. package/lib/sequence.js +11 -12
  176. package/lib/sequence.js.map +1 -1
  177. package/lib/sequenceDeltaEvent.d.ts +1 -1
  178. package/lib/sequenceDeltaEvent.d.ts.map +1 -1
  179. package/lib/sequenceDeltaEvent.js +3 -4
  180. package/lib/sequenceDeltaEvent.js.map +1 -1
  181. package/lib/sequenceFactory.d.ts +1 -1
  182. package/lib/sequenceFactory.d.ts.map +1 -1
  183. package/lib/sequenceFactory.js +1 -1
  184. package/lib/sequenceFactory.js.map +1 -1
  185. package/lib/sharedIntervalCollection.d.ts +4 -3
  186. package/lib/sharedIntervalCollection.d.ts.map +1 -1
  187. package/lib/sharedIntervalCollection.js +4 -4
  188. package/lib/sharedIntervalCollection.js.map +1 -1
  189. package/lib/sharedSequence.d.ts +3 -2
  190. package/lib/sharedSequence.d.ts.map +1 -1
  191. package/lib/sharedSequence.js +2 -2
  192. package/lib/sharedSequence.js.map +1 -1
  193. package/lib/sharedString.d.ts +2 -2
  194. package/lib/sharedString.d.ts.map +1 -1
  195. package/lib/sharedString.js +1 -1
  196. package/lib/sharedString.js.map +1 -1
  197. package/package.json +41 -58
  198. package/src/{localValues.ts → IntervalCollectionValues.ts} +26 -18
  199. package/src/index.ts +2 -2
  200. package/src/intervalCollection.ts +46 -47
  201. package/src/{defaultMap.ts → intervalCollectionMap.ts} +42 -105
  202. package/src/{defaultMapInterfaces.ts → intervalCollectionMapInterfaces.ts} +26 -16
  203. package/src/intervalIndex/endpointInRangeIndex.ts +4 -1
  204. package/src/intervalIndex/endpointIndex.ts +4 -1
  205. package/src/intervalIndex/idIntervalIndex.ts +4 -2
  206. package/src/intervalIndex/overlappingIntervalsIndex.ts +8 -5
  207. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +6 -3
  208. package/src/intervalIndex/sequenceIntervalIndexes.ts +3 -1
  209. package/src/intervalIndex/startpointInRangeIndex.ts +4 -1
  210. package/src/intervalTree.ts +4 -3
  211. package/src/intervals/interval.ts +6 -3
  212. package/src/intervals/intervalUtils.ts +4 -2
  213. package/src/intervals/sequenceInterval.ts +5 -3
  214. package/src/packageVersion.ts +1 -1
  215. package/src/revertibles.ts +10 -10
  216. package/src/sequence.ts +24 -31
  217. package/src/sequenceDeltaEvent.ts +3 -4
  218. package/src/sequenceFactory.ts +4 -3
  219. package/src/sharedIntervalCollection.ts +12 -18
  220. package/src/sharedSequence.ts +9 -6
  221. package/src/sharedString.ts +4 -3
  222. package/api-extractor-cjs.json +0 -8
  223. package/dist/defaultMap.d.ts.map +0 -1
  224. package/dist/defaultMap.js.map +0 -1
  225. package/dist/defaultMapInterfaces.d.ts.map +0 -1
  226. package/dist/defaultMapInterfaces.js.map +0 -1
  227. package/dist/localValues.d.ts.map +0 -1
  228. package/dist/localValues.js.map +0 -1
  229. package/dist/sequence-alpha.d.ts +0 -1432
  230. package/dist/sequence-beta.d.ts +0 -246
  231. package/dist/sequence-public.d.ts +0 -246
  232. package/dist/sequence-untrimmed.d.ts +0 -1820
  233. package/lib/defaultMap.d.ts.map +0 -1
  234. package/lib/defaultMap.js.map +0 -1
  235. package/lib/defaultMapInterfaces.d.ts.map +0 -1
  236. package/lib/defaultMapInterfaces.js.map +0 -1
  237. package/lib/localValues.d.ts.map +0 -1
  238. package/lib/localValues.js.map +0 -1
  239. package/lib/sequence-alpha.d.ts +0 -1432
  240. package/lib/sequence-beta.d.ts +0 -246
  241. package/lib/sequence-public.d.ts +0 -246
  242. package/lib/sequence-untrimmed.d.ts +0 -1820
  243. package/lib/test/collections.intervalTree.js +0 -73
  244. package/lib/test/collections.intervalTree.js.map +0 -1
  245. package/lib/test/createSnapshotFiles.js +0 -15
  246. package/lib/test/createSnapshotFiles.js.map +0 -1
  247. package/lib/test/dirname.cjs +0 -16
  248. package/lib/test/dirname.cjs.map +0 -1
  249. package/lib/test/endpointInRangeIndex.spec.js +0 -182
  250. package/lib/test/endpointInRangeIndex.spec.js.map +0 -1
  251. package/lib/test/fuzz/fuzzUtils.js +0 -250
  252. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  253. package/lib/test/fuzz/intervalCollection.fuzz.spec.js +0 -200
  254. package/lib/test/fuzz/intervalCollection.fuzz.spec.js.map +0 -1
  255. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js +0 -129
  256. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js.map +0 -1
  257. package/lib/test/fuzz/sharedString.fuzz.spec.js +0 -91
  258. package/lib/test/fuzz/sharedString.fuzz.spec.js.map +0 -1
  259. package/lib/test/generateSharedStrings.js +0 -138
  260. package/lib/test/generateSharedStrings.js.map +0 -1
  261. package/lib/test/intervalCollection.detached.spec.js +0 -126
  262. package/lib/test/intervalCollection.detached.spec.js.map +0 -1
  263. package/lib/test/intervalCollection.events.spec.js +0 -491
  264. package/lib/test/intervalCollection.events.spec.js.map +0 -1
  265. package/lib/test/intervalCollection.perf.spec.js +0 -88
  266. package/lib/test/intervalCollection.perf.spec.js.map +0 -1
  267. package/lib/test/intervalCollection.snapshot.spec.js +0 -171
  268. package/lib/test/intervalCollection.snapshot.spec.js.map +0 -1
  269. package/lib/test/intervalCollection.spec.js +0 -1660
  270. package/lib/test/intervalCollection.spec.js.map +0 -1
  271. package/lib/test/intervalIndexTestUtils.js +0 -49
  272. package/lib/test/intervalIndexTestUtils.js.map +0 -1
  273. package/lib/test/intervalRebasing.spec.js +0 -589
  274. package/lib/test/intervalRebasing.spec.js.map +0 -1
  275. package/lib/test/intervalStashedOps.spec.js +0 -142
  276. package/lib/test/intervalStashedOps.spec.js.map +0 -1
  277. package/lib/test/intervalTestUtils.js +0 -81
  278. package/lib/test/intervalTestUtils.js.map +0 -1
  279. package/lib/test/marshalling.spec.js +0 -55
  280. package/lib/test/marshalling.spec.js.map +0 -1
  281. package/lib/test/memory/sharedSequence.spec.js +0 -82
  282. package/lib/test/memory/sharedSequence.spec.js.map +0 -1
  283. package/lib/test/memory/sharedString.spec.js +0 -134
  284. package/lib/test/memory/sharedString.spec.js.map +0 -1
  285. package/lib/test/overlappingSequenceIntervalsIndex.spec.js +0 -348
  286. package/lib/test/overlappingSequenceIntervalsIndex.spec.js.map +0 -1
  287. package/lib/test/partialLoad.spec.js +0 -211
  288. package/lib/test/partialLoad.spec.js.map +0 -1
  289. package/lib/test/rebasing.spec.js +0 -81
  290. package/lib/test/rebasing.spec.js.map +0 -1
  291. package/lib/test/reentrancy.spec.js +0 -174
  292. package/lib/test/reentrancy.spec.js.map +0 -1
  293. package/lib/test/revertibles.spec.js +0 -971
  294. package/lib/test/revertibles.spec.js.map +0 -1
  295. package/lib/test/sequenceDeltaEvent.spec.js +0 -2144
  296. package/lib/test/sequenceDeltaEvent.spec.js.map +0 -1
  297. package/lib/test/sharedIntervalCollection.spec.js +0 -159
  298. package/lib/test/sharedIntervalCollection.spec.js.map +0 -1
  299. package/lib/test/sharedString.spec.js +0 -532
  300. package/lib/test/sharedString.spec.js.map +0 -1
  301. package/lib/test/snapshotEmptyProps.spec.js +0 -45
  302. package/lib/test/snapshotEmptyProps.spec.js.map +0 -1
  303. package/lib/test/snapshotVersion.spec.js +0 -149
  304. package/lib/test/snapshotVersion.spec.js.map +0 -1
  305. package/lib/test/startpointInRangeIndex.spec.js +0 -182
  306. package/lib/test/startpointInRangeIndex.spec.js.map +0 -1
  307. package/lib/test/subSequence.spec.js +0 -92
  308. package/lib/test/subSequence.spec.js.map +0 -1
  309. package/lib/test/types/validateSequencePrevious.generated.js +0 -162
  310. package/lib/test/types/validateSequencePrevious.generated.js.map +0 -1
  311. package/lib/test/v1IntervalCollectionHelpers.js +0 -93
  312. package/lib/test/v1IntervalCollectionHelpers.js.map +0 -1
  313. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"sharedString.spec.js","sourceRoot":"","sources":["../../src/test/sharedString.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 { ISummaryTree } from \"@fluidframework/protocol-definitions\";\nimport { IChannelServices } from \"@fluidframework/datastore-definitions\";\nimport {\n\tappendToMergeTreeDeltaRevertibles,\n\tMarker,\n\tmatchProperties,\n\tMergeTreeDeltaRevertible,\n\tReferenceType,\n\treservedMarkerIdKey,\n\treservedMarkerSimpleTypeKey,\n\treservedTileLabelsKey,\n\trevertMergeTreeDeltaRevertibles,\n} from \"@fluidframework/merge-tree\";\nimport {\n\tMockFluidDataStoreRuntime,\n\tMockContainerRuntimeFactory,\n\tMockContainerRuntimeFactoryForReconnection,\n\tMockContainerRuntimeForReconnection,\n\tMockEmptyDeltaConnection,\n\tMockStorage,\n\tvalidateAssertionError,\n} from \"@fluidframework/test-runtime-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { getTextAndMarkers, SharedString } from \"../sharedString.js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\n\ndescribe(\"SharedString\", () => {\n\tlet sharedString: SharedString;\n\tlet dataStoreRuntime1: MockFluidDataStoreRuntime;\n\n\tbeforeEach(() => {\n\t\tdataStoreRuntime1 = new MockFluidDataStoreRuntime();\n\t\tsharedString = new SharedString(\n\t\t\tdataStoreRuntime1,\n\t\t\t\"shared-string-1\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\t});\n\n\tdescribe(\"SharedString in local state\", () => {\n\t\tbeforeEach(() => {\n\t\t\tdataStoreRuntime1.local = true;\n\t\t});\n\n\t\t// Creates a new SharedString and loads it from the passed snapshot tree.\n\t\tasync function CreateStringAndCompare(summaryTree: ISummaryTree): Promise<void> {\n\t\t\tconst services: IChannelServices = {\n\t\t\t\tdeltaConnection: new MockEmptyDeltaConnection(),\n\t\t\t\tobjectStorage: MockStorage.createFromSummary(summaryTree),\n\t\t\t};\n\t\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\t\tconst sharedString2 = new SharedString(\n\t\t\t\tdataStoreRuntime2,\n\t\t\t\t\"shared-string-2\",\n\t\t\t\tSharedStringFactory.Attributes,\n\t\t\t);\n\t\t\tawait sharedString2.load(services);\n\t\t\tawait sharedString2.loaded;\n\n\t\t\tassert.equal(\n\t\t\t\tsharedString.getText(),\n\t\t\t\tsharedString2.getText(),\n\t\t\t\t\"Could not correctly load from snapshot\",\n\t\t\t);\n\t\t}\n\n\t\tfunction verifyAndReturnSummaryTree(): ISummaryTree {\n\t\t\tconst summarizeResult = sharedString.getAttachSummary();\n\t\t\tconst summaryObjectKeys = Object.keys(summarizeResult.summary.tree);\n\t\t\tassert.strictEqual(summaryObjectKeys.length, 1, \"summary should have one entries\");\n\t\t\tassert.strictEqual(summaryObjectKeys[0], \"content\", \"content not present in summary\");\n\n\t\t\tconst subTree = summarizeResult.summary.tree.content as ISummaryTree;\n\t\t\tconst subTreeObjectKeys = Object.keys(subTree.tree);\n\t\t\tassert.strictEqual(subTreeObjectKeys.length, 1, \"sub tree should have one entries\");\n\t\t\tassert.strictEqual(subTreeObjectKeys[0], \"header\", \"header not present in sub tree\");\n\n\t\t\treturn summarizeResult.summary;\n\t\t}\n\n\t\tit(\"can insert text\", async () => {\n\t\t\tsharedString.insertText(0, \"hello\");\n\t\t\tassert.equal(sharedString.getText(), \"hello\", \"Could not insert text at beginning\");\n\n\t\t\tsharedString.insertText(5, \"world\");\n\t\t\tassert.equal(sharedString.getText(), \"helloworld\", \"Could not insert text at end\");\n\n\t\t\tsharedString.insertText(5, \" \");\n\t\t\tassert.equal(\n\t\t\t\tsharedString.getText(),\n\t\t\t\t\"hello world\",\n\t\t\t\t\"Could not insert text in the middle\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can replace text\", async () => {\n\t\t\tsharedString.insertText(0, \"hello world\");\n\n\t\t\tsharedString.replaceText(6, 11, \"there!\");\n\t\t\tassert.equal(sharedString.getText(), \"hello there!\", \"Could not replace text\");\n\n\t\t\tsharedString.replaceText(0, 5, \"hi\");\n\t\t\tassert.equal(\n\t\t\t\tsharedString.getText(),\n\t\t\t\t\"hi there!\",\n\t\t\t\t\"Could not replace text at beginning\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can remove text\", async () => {\n\t\t\tsharedString.insertText(0, \"hello world\");\n\n\t\t\tsharedString.removeText(5, 11);\n\t\t\tassert.equal(sharedString.getText(), \"hello\", \"Could not remove text\");\n\n\t\t\tsharedString.removeText(0, 3);\n\t\t\tassert.equal(sharedString.getText(), \"lo\", \"Could not remove text from beginning\");\n\t\t});\n\n\t\tit(\"can annotate the text\", async () => {\n\t\t\tconst text = \"hello world\";\n\t\t\tconst styleProps = { style: \"bold\" };\n\t\t\tsharedString.insertText(0, text, styleProps);\n\n\t\t\tfor (let i = 0; i < text.length; i++) {\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\t{ ...sharedString.getPropertiesAtPosition(i) },\n\t\t\t\t\t{ ...styleProps },\n\t\t\t\t\t\"Could not add props\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst colorProps = { color: \"green\" };\n\t\t\tsharedString.annotateRange(6, text.length, colorProps);\n\n\t\t\tfor (let i = 6; i < text.length; i++) {\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\t{ ...sharedString.getPropertiesAtPosition(i) },\n\t\t\t\t\t{ ...styleProps, ...colorProps },\n\t\t\t\t\t\"Could not annotate props\",\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tit(\"can handle null annotations in text\", async () => {\n\t\t\tconst text = \"hello world\";\n\t\t\tconst startingProps = { style: \"bold\", color: null };\n\t\t\tsharedString.insertText(0, text, startingProps);\n\n\t\t\tfor (let i = 0; i < text.length; i++) {\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsharedString.getPropertiesAtPosition(i)?.color,\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"Null values allowed in properties\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst updatedProps = { style: null };\n\t\t\tsharedString.annotateRange(6, text.length, updatedProps);\n\n\t\t\tfor (let i = 6; i < text.length; i++) {\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tsharedString.getPropertiesAtPosition(i)?.style,\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"Null values allowed in properties\",\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tit(\"can handle empty annotations in text\", async () => {\n\t\t\tconst text = \"hello world\";\n\t\t\tconst startingProps = Object.entries({});\n\t\t\tsharedString.insertText(0, text, startingProps);\n\t\t\tfor (let i = 0; i < text.length; i++) {\n\t\t\t\tconst actualProps = sharedString.getPropertiesAtPosition(i);\n\t\t\t\tassert(\n\t\t\t\t\tactualProps !== undefined,\n\t\t\t\t\t\"Properties are undefined when they should be empty\",\n\t\t\t\t);\n\t\t\t\tassert(\n\t\t\t\t\tstartingProps.toString() === Object.entries(actualProps).toString(),\n\t\t\t\t\t`Properties are not empty at position ${i}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tit(\"can insert marker\", () => {\n\t\t\tsharedString.insertText(0, \"hello world\");\n\t\t\t// Insert a simple marker.\n\t\t\tsharedString.insertMarker(6, ReferenceType.Simple, {\n\t\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\t\t[reservedMarkerSimpleTypeKey]: \"markerKeyValue\",\n\t\t\t});\n\n\t\t\t// Verify that the simple marker can be retrieved via id.\n\t\t\tconst simpleMarker = sharedString.getMarkerFromId(\"markerId\");\n\t\t\tassert.equal(simpleMarker?.type, \"Marker\", \"Could not get simple marker\");\n\t\t\tassert.equal(simpleMarker?.properties?.markerId, \"markerId\", \"markerId is incorrect\");\n\t\t\tassert.equal(\n\t\t\t\tsimpleMarker?.properties?.markerSimpleType,\n\t\t\t\t\"markerKeyValue\",\n\t\t\t\t\"markerSimpleType is incorrect\",\n\t\t\t);\n\n\t\t\t// Insert a tile marker.\n\t\t\tsharedString.insertMarker(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [\"tileLabel\"],\n\t\t\t\t[reservedMarkerIdKey]: \"tileMarkerId\",\n\t\t\t});\n\n\t\t\t// Verify that the tile marker can be retrieved via label.\n\t\t\tconst { parallelMarkers } = getTextAndMarkers(sharedString, \"tileLabel\");\n\t\t\tconst parallelMarker = parallelMarkers[0];\n\t\t\tassert.equal(parallelMarker.type, \"Marker\", \"Could not get tile marker\");\n\t\t\tassert.equal(\n\t\t\t\tparallelMarker.properties?.markerId,\n\t\t\t\t\"tileMarkerId\",\n\t\t\t\t\"tile markerId is incorrect\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can annotate marker\", () => {\n\t\t\tsharedString.insertText(0, \"hello world\");\n\t\t\t// Insert a simple marker.\n\t\t\tsharedString.insertMarker(6, ReferenceType.Simple, {\n\t\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\t});\n\n\t\t\t// Annotate the marker.\n\t\t\tconst props = { color: \"blue\" };\n\t\t\tconst simpleMarker = sharedString.getMarkerFromId(\"markerId\") as Marker;\n\t\t\tsharedString.annotateMarker(simpleMarker, props);\n\t\t\tassert.equal(simpleMarker.properties?.color, \"blue\", \"Could not annotate marker\");\n\t\t});\n\n\t\tit(\"fails when the marker id is updated with a new string\", () => {\n\t\t\tsharedString.insertText(0, \"hello world\");\n\t\t\t// Insert a simple marker.\n\t\t\tsharedString.insertMarker(6, ReferenceType.Simple, {\n\t\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\t});\n\t\t\t// Annotate the marker.\n\t\t\tconst props = { color: \"blue\" };\n\t\t\tconst simpleMarker = sharedString.getMarkerFromId(\"markerId\") as Marker;\n\t\t\tsharedString.annotateMarker(simpleMarker, props);\n\t\t\tassert.equal(simpleMarker.properties?.color, \"blue\", \"Could not annotate marker\");\n\t\t\t// Annotate the marker's ID.\n\t\t\tconst newIdProps = { [reservedMarkerIdKey]: \"newIdValue\" };\n\t\t\tassert.throws(\n\t\t\t\t() => {\n\t\t\t\t\tsharedString.annotateMarker(simpleMarker, newIdProps);\n\t\t\t\t},\n\t\t\t\t(e: Error) =>\n\t\t\t\t\tvalidateAssertionError(e, \"Cannot change the markerId of an existing marker\"),\n\t\t\t\t\"Error from attempting to update marker was not thrown or was not the expected error\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"fails when the marker id is updated with null\", () => {\n\t\t\tsharedString.insertText(0, \"hello world\");\n\t\t\t// Insert a simple marker.\n\t\t\tsharedString.insertMarker(6, ReferenceType.Simple, {\n\t\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\t});\n\t\t\t// Annotate the marker's ID.\n\t\t\tconst simpleMarker = sharedString.getMarkerFromId(\"markerId\") as Marker;\n\t\t\tconst newIdProps = { [reservedMarkerIdKey]: null };\n\n\t\t\tassert.throws(\n\t\t\t\t() => {\n\t\t\t\t\tsharedString.annotateMarker(simpleMarker, newIdProps);\n\t\t\t\t},\n\t\t\t\t(e: Error) =>\n\t\t\t\t\tvalidateAssertionError(e, \"Cannot change the markerId of an existing marker\"),\n\t\t\t\t\"Error from attempting to update marker was not thrown or was not the expected error\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"fails when the marker id is updated with undefined\", () => {\n\t\t\tsharedString.insertText(0, \"hello world\");\n\t\t\t// Insert a simple marker.\n\t\t\tsharedString.insertMarker(6, ReferenceType.Simple, {\n\t\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\t});\n\t\t\t// Annotate the marker's ID.\n\t\t\tconst simpleMarker = sharedString.getMarkerFromId(\"markerId\") as Marker;\n\t\t\tconst newIdProps = { [reservedMarkerIdKey]: undefined };\n\n\t\t\tassert.throws(\n\t\t\t\t() => {\n\t\t\t\t\tsharedString.annotateMarker(simpleMarker, newIdProps);\n\t\t\t\t},\n\t\t\t\t(e: Error) =>\n\t\t\t\t\tvalidateAssertionError(e, \"Cannot change the markerId of an existing marker\"),\n\t\t\t\t\"Error from attempting to update marker was not thrown or was not the expected error\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"allows the markerId to be updated with the existing value\", () => {\n\t\t\tsharedString.insertText(0, \"hello world\");\n\t\t\t// Insert a simple marker.\n\t\t\tsharedString.insertMarker(6, ReferenceType.Simple, {\n\t\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\t});\n\t\t\t// Annotate the marker's ID.\n\t\t\tconst simpleMarker = sharedString.getMarkerFromId(\"markerId\") as Marker;\n\t\t\tconst newIdProps = { [reservedMarkerIdKey]: \"markerId\" };\n\t\t\tsharedString.annotateMarker(simpleMarker, newIdProps);\n\t\t\tassert.equal(\n\t\t\t\tsharedString.getMarkerFromId(\"markerId\"),\n\t\t\t\tsimpleMarker,\n\t\t\t\t\"Could not update marker with the existing id value\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\t\"markerId\",\n\t\t\t\tsimpleMarker.properties?.[reservedMarkerIdKey],\n\t\t\t\t`Actual value of marker id property - ${simpleMarker.properties?.[reservedMarkerIdKey]} - does not match the expected value`,\n\t\t\t);\n\t\t});\n\n\t\tit(\"replace zero range\", async () => {\n\t\t\tsharedString.insertText(0, \"123\");\n\t\t\tsharedString.replaceText(1, 1, \"\\u00e4\\u00c4\");\n\t\t\tassert.equal(sharedString.getText(), \"1\\u00e4\\u00c423\", \"Could not replace zero range\");\n\t\t});\n\n\t\tit(\"replace negative range\", async () => {\n\t\t\tsharedString.insertText(0, \"123\");\n\t\t\tsharedString.replaceText(2, 1, \"aaa\");\n\t\t\t// This assert relies on the behavior that replacement for a reversed range\n\t\t\t// will insert at the max end of the range but not delete the range\n\t\t\tassert.equal(sharedString.getText(), \"12aaa3\", \"Could not replace negative range\");\n\t\t});\n\n\t\tit(\"can load a SharedString from summary\", async () => {\n\t\t\tconst insertText = \"text\";\n\t\t\tconst segmentCount = 1000;\n\n\t\t\tsharedString.initializeLocal();\n\n\t\t\tfor (let i = 0; i < segmentCount; i = i + 1) {\n\t\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t\t}\n\n\t\t\t// Verify that summary data is correct.\n\t\t\tlet summaryTree = verifyAndReturnSummaryTree();\n\n\t\t\t// Load a new SharedString from the snapshot and verify it is loaded correctly.\n\t\t\tawait CreateStringAndCompare(summaryTree);\n\n\t\t\tfor (let i = 0; i < segmentCount; i = i + 1) {\n\t\t\t\tsharedString.insertText(0, `${insertText}-${i}`);\n\t\t\t}\n\n\t\t\t// TODO: Due to segment packing, we have only \"header\" and no body\n\t\t\t// Need to change test to include other types of segments (like marker) to exercise \"body\".\n\n\t\t\t// Verify summary after changes.\n\t\t\tsummaryTree = verifyAndReturnSummaryTree();\n\n\t\t\t// Load a new SharedString from the snapshot and verify it is loaded correctly.\n\t\t\tawait CreateStringAndCompare(summaryTree);\n\t\t});\n\t});\n\n\tdescribe(\"SharedString op processing in local state\", () => {\n\t\tit(\"should correctly process operations sent in local state\", async () => {\n\t\t\t// Set the data store runtime to local.\n\t\t\tdataStoreRuntime1.local = true;\n\n\t\t\t// Initialize the shared string so that it is completely loaded before we take a snapshot.\n\t\t\tsharedString.initializeLocal();\n\n\t\t\t// Insert and replace text in first shared string.\n\t\t\tsharedString.insertText(0, \"hello world\");\n\t\t\tsharedString.replaceText(6, 11, \"there\");\n\n\t\t\t// Load a new Ink in connected state from the snapshot of the first one.\n\t\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\t\tconst containerRuntime2 =\n\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\t\tconst services2: IChannelServices = {\n\t\t\t\tdeltaConnection: dataStoreRuntime2.createDeltaConnection(),\n\t\t\t\tobjectStorage: MockStorage.createFromSummary(\n\t\t\t\t\tsharedString.getAttachSummary().summary,\n\t\t\t\t),\n\t\t\t};\n\n\t\t\tconst sharedString2 = new SharedString(\n\t\t\t\tdataStoreRuntime2,\n\t\t\t\t\"shared-string-2\",\n\t\t\t\tSharedStringFactory.Attributes,\n\t\t\t);\n\t\t\tawait sharedString2.load(services2);\n\n\t\t\t// Now connect the first Ink\n\t\t\tdataStoreRuntime1.setAttachState(AttachState.Attached);\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(undefined),\n\t\t\t};\n\t\t\tsharedString.connect(services1);\n\n\t\t\t// Verify that both the shared strings have the text.\n\t\t\tassert.equal(\n\t\t\t\tsharedString.getText(),\n\t\t\t\t\"hello there\",\n\t\t\t\t\"The first string does not have the text\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tsharedString2.getText(),\n\t\t\t\t\"hello there\",\n\t\t\t\t\"The second string does not have the text\",\n\t\t\t);\n\n\t\t\t// Insert and replace text in second shared string.\n\t\t\tsharedString2.insertText(0, \"well \");\n\n\t\t\t// Process the message.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that both the shared strings have the new text.\n\t\t\tassert.equal(\n\t\t\t\tsharedString.getText(),\n\t\t\t\t\"well hello there\",\n\t\t\t\t\"The first string does not have the text\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tsharedString2.getText(),\n\t\t\t\t\"well hello there\",\n\t\t\t\t\"The second string does not have the text\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"SharedString in connected state with a remote SharedString\", () => {\n\t\tlet sharedString2: SharedString;\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\n\t\tbeforeEach(() => {\n\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactory();\n\n\t\t\t// Connect the first SharedString.\n\t\t\tdataStoreRuntime1.setAttachState(AttachState.Attached);\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.initializeLocal();\n\t\t\tsharedString.connect(services1);\n\n\t\t\t// Create and connect a second SharedString.\n\t\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\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 = new SharedString(\n\t\t\t\tdataStoreRuntime2,\n\t\t\t\t\"shared-string-2\",\n\t\t\t\tSharedStringFactory.Attributes,\n\t\t\t);\n\t\t\tsharedString2.initializeLocal();\n\t\t\tsharedString2.connect(services2);\n\t\t});\n\n\t\tit(\"can insert text\", async () => {\n\t\t\t// Insert text in first shared string.\n\t\t\tsharedString.insertText(0, \"hello\");\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that both the shared strings inserted the text.\n\t\t\tassert.equal(sharedString.getText(), \"hello\", \"Could not insert text at beginning\");\n\t\t\tassert.equal(\n\t\t\t\tsharedString2.getText(),\n\t\t\t\t\"hello\",\n\t\t\t\t\"Could not insert text at beginning in remote string\",\n\t\t\t);\n\n\t\t\t// Insert text at the end of second shared string.\n\t\t\tsharedString2.insertText(5, \" world\");\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that both the shared strings inserted the text.\n\t\t\tassert.equal(sharedString.getText(), \"hello world\", \"Could not insert text at end\");\n\t\t\tassert.equal(\n\t\t\t\tsharedString2.getText(),\n\t\t\t\t\"hello world\",\n\t\t\t\t\"Could not insert text at end in remote string\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can replace text\", async () => {\n\t\t\t// Insert and replace text in first shared string.\n\t\t\tsharedString.insertText(0, \"hello world\");\n\t\t\tsharedString.replaceText(6, 11, \"there!\");\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that both the shared strings replaced the text.\n\t\t\tassert.equal(sharedString.getText(), \"hello there!\", \"Could not replace text\");\n\t\t\tassert.equal(\n\t\t\t\tsharedString2.getText(),\n\t\t\t\t\"hello there!\",\n\t\t\t\t\"Could not replace text in remote string\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can remove text\", async () => {\n\t\t\t// Insert and remove text in first shared string.\n\t\t\tsharedString.insertText(0, \"hello world\");\n\t\t\tsharedString.removeText(5, 11);\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that both the shared strings removed the text.\n\t\t\tassert.equal(sharedString.getText(), \"hello\", \"Could not remove text\");\n\t\t\tassert.equal(\n\t\t\t\tsharedString2.getText(),\n\t\t\t\t\"hello\",\n\t\t\t\t\"Could not remove text from remote string\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can annotate the text\", async () => {\n\t\t\t// Insert text with properties in the first shared string.\n\t\t\tconst text = \"hello world\";\n\t\t\tconst styleProps = { style: \"bold\" };\n\t\t\tsharedString.insertText(0, text, styleProps);\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that both the shared strings have the properties.\n\t\t\tfor (let i = 0; i < text.length; i++) {\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\t{ ...sharedString.getPropertiesAtPosition(i) },\n\t\t\t\t\t{ ...styleProps },\n\t\t\t\t\t\"Could not add props\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\t{ ...sharedString2.getPropertiesAtPosition(i) },\n\t\t\t\t\t{ ...styleProps },\n\t\t\t\t\t\"Could not add props to remote string\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Annotate the properties.\n\t\t\tconst colorProps = { color: \"green\" };\n\t\t\tsharedString.annotateRange(6, text.length, colorProps);\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that both the shared strings have the annotated properties.\n\t\t\tfor (let i = 6; i < text.length; i++) {\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\t{ ...sharedString.getPropertiesAtPosition(i) },\n\t\t\t\t\t{ ...styleProps, ...colorProps },\n\t\t\t\t\t\"Could not annotate props\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\t{ ...sharedString2.getPropertiesAtPosition(i) },\n\t\t\t\t\t{ ...styleProps, ...colorProps },\n\t\t\t\t\t\"Could not annotate props in remote string\",\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\tit(\"can insert marker\", () => {\n\t\t\tconst label = \"tileLabel\";\n\t\t\tconst id = \"tileMarkerId\";\n\t\t\tconst simpleKey = \"tileMarkerKey\";\n\n\t\t\tconst verifyMarker = (marker) => {\n\t\t\t\tassert.equal(marker.type, \"Marker\", \"Could not get simple marker\");\n\t\t\t\tassert.equal(marker.properties.markerId, id, \"markerId is incorrect\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tmarker.properties.markerSimpleType,\n\t\t\t\t\tsimpleKey,\n\t\t\t\t\t\"markerSimpleType is incorrect\",\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\tmarker.properties.referenceTileLabels[0],\n\t\t\t\t\tlabel,\n\t\t\t\t\t\"markerSimpleType is incorrect\",\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tsharedString.insertText(0, \"hello world\");\n\n\t\t\t// Insert a tile marker.\n\t\t\tsharedString.insertMarker(6, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [label],\n\t\t\t\t[reservedMarkerIdKey]: id,\n\t\t\t\t[reservedMarkerSimpleTypeKey]: simpleKey,\n\t\t\t});\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that the marker can be retrieved via id from both the shared strings.\n\t\t\tconst simpleMarker1 = sharedString.getMarkerFromId(id);\n\t\t\tverifyMarker(simpleMarker1);\n\t\t\tconst simpleMarker2 = sharedString2.getMarkerFromId(id);\n\t\t\tverifyMarker(simpleMarker2);\n\n\t\t\t// Verify that the marker can be retrieved via label from both the shared strings.\n\t\t\tconst textAndMarker1 = getTextAndMarkers(sharedString, label);\n\t\t\tverifyMarker(textAndMarker1.parallelMarkers[0]);\n\t\t\tconst textAndMarker2 = getTextAndMarkers(sharedString2, label);\n\t\t\tverifyMarker(textAndMarker2.parallelMarkers[0]);\n\t\t});\n\n\t\tit(\"can annotate marker\", () => {\n\t\t\tsharedString.insertText(0, \"hello world\");\n\t\t\t// Insert a simple marker.\n\t\t\tsharedString.insertMarker(6, ReferenceType.Simple, {\n\t\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\t});\n\n\t\t\t// Annotate the marker.\n\t\t\tconst props = { color: \"blue\" };\n\t\t\tconst simpleMarker = sharedString.getMarkerFromId(\"markerId\") as Marker;\n\t\t\tsharedString.annotateMarker(simpleMarker, props);\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that the marker was annotated in both the shared strings.\n\t\t\tconst simpleMarker1 = sharedString.getMarkerFromId(\"markerId\") as Marker;\n\t\t\tassert.equal(simpleMarker1.properties?.color, \"blue\", \"Could not annotate marker\");\n\n\t\t\tconst simpleMarker2 = sharedString.getMarkerFromId(\"markerId\") as Marker;\n\t\t\tassert.equal(\n\t\t\t\tsimpleMarker2.properties?.color,\n\t\t\t\t\"blue\",\n\t\t\t\t\"Could not annotate marker in remote string\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"reconnect\", () => {\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactoryForReconnection;\n\t\tlet containerRuntime1: MockContainerRuntimeForReconnection;\n\t\tlet containerRuntime2: MockContainerRuntimeForReconnection;\n\t\tlet sharedString2: SharedString;\n\n\t\tbeforeEach(async () => {\n\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactoryForReconnection();\n\n\t\t\t// Connect the first SharedString.\n\t\t\tcontainerRuntime1 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\t\t\tconst services1: IChannelServices = {\n\t\t\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t};\n\t\t\tsharedString.initializeLocal();\n\t\t\tsharedString.connect(services1);\n\n\t\t\t// Create and connect a second SharedString.\n\t\t\tconst runtime2 = new MockFluidDataStoreRuntime();\n\t\t\tcontainerRuntime2 = containerRuntimeFactory.createContainerRuntime(runtime2);\n\t\t\tsharedString2 = new SharedString(\n\t\t\t\truntime2,\n\t\t\t\t\"shared-string-2\",\n\t\t\t\tSharedStringFactory.Attributes,\n\t\t\t);\n\t\t\tconst services2: IChannelServices = {\n\t\t\t\tdeltaConnection: runtime2.createDeltaConnection(),\n\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t};\n\t\t\tsharedString2.initializeLocal();\n\t\t\tsharedString2.connect(services2);\n\t\t});\n\n\t\tit(\"can resend unacked ops on reconnection\", async () => {\n\t\t\t// Make couple of changes to the first SharedString.\n\t\t\tsharedString.insertText(0, \"helloworld\");\n\t\t\tsharedString.replaceText(5, 10, \" friend\");\n\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\t// Disconnect and reconnect the first collection.\n\t\t\t\tcontainerRuntime1.connected = false;\n\t\t\t\tcontainerRuntime1.connected = true;\n\t\t\t}\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that the changes were correctly received by the second SharedString\n\t\t\tassert.equal(sharedString2.getText(), \"hello friend\");\n\t\t});\n\n\t\tit(\"insert in middle of multibyte character\", async () => {\n\t\t\tlet base = \"🎉\";\n\n\t\t\tsharedString.insertText(0, \"🎉\");\n\n\t\t\tassert.equal(sharedString.getText(), base);\n\t\t\tassert.equal(sharedString.getLength(), base.length);\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tbase = `${base.slice(0, 1)}a${base.slice(1)}`;\n\t\t\tsharedString.insertText(1, \"a\");\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tassert.equal(sharedString.getText(), base); // not 🎉a\n\t\t\tassert.equal(sharedString.getLength(), base.length);\n\t\t});\n\n\t\tit(\"insert in middle of surrogate pair\", async () => {\n\t\t\tlet base = \"👨🏻‍🦱\";\n\t\t\tsharedString.insertText(0, \"👨🏻‍🦱\");\n\n\t\t\tassert.equal(sharedString.getText(), base);\n\t\t\tassert.equal(sharedString.getLength(), base.length);\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tbase = `${base.slice(0, 2)}a${base.slice(2)}`;\n\t\t\tsharedString.insertText(2, \"a\");\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tassert.equal(sharedString.getText(), base); // not 👨🏻‍🦱a\n\t\t\tassert.equal(sharedString.getLength(), base.length);\n\t\t});\n\n\t\tit(\"can store ops in disconnected state and resend them on reconnection\", async () => {\n\t\t\t// Disconnect the first SharedString.\n\t\t\tcontainerRuntime1.connected = false;\n\n\t\t\t// Make couple of changes to it.\n\t\t\tsharedString.insertText(0, \"helloworld\");\n\t\t\tsharedString.replaceText(5, 10, \" friend\");\n\n\t\t\t// Reconnect the first SharedString.\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify that the changes were correctly received by the second SharedString\n\t\t\tassert.equal(sharedString2.getText(), \"hello friend\");\n\t\t});\n\t});\n\n\t// revertibles are deeply test in the merge tree package\n\t// these test just validate high level integration\n\tdescribe(\"revertible smoke tests\", () => {\n\t\tit(\"insert\", () => {\n\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tsharedString.on(\"sequenceDelta\", (event) =>\n\t\t\t\tappendToMergeTreeDeltaRevertibles(event.deltaArgs, revertibles),\n\t\t\t);\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tsharedString.insertText(sharedString.getLength(), i.toString());\n\t\t\t}\n\t\t\tassert.equal(sharedString.getText(), \"0123456789\");\n\n\t\t\t// undo all inserts\n\t\t\trevertMergeTreeDeltaRevertibles(sharedString, revertibles.splice(0));\n\t\t\tassert.equal(sharedString.getText(), \"\");\n\n\t\t\t// redo all inserts\n\t\t\trevertMergeTreeDeltaRevertibles(sharedString, revertibles.splice(0));\n\t\t\tassert.equal(sharedString.getText(), \"0123456789\");\n\t\t});\n\n\t\tit(\"remove\", () => {\n\t\t\tsharedString.insertText(sharedString.getLength(), \"hello world\");\n\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tsharedString.on(\"sequenceDelta\", (event) =>\n\t\t\t\tappendToMergeTreeDeltaRevertibles(event.deltaArgs, revertibles),\n\t\t\t);\n\t\t\twhile (sharedString.getLength() > 0) {\n\t\t\t\tconst middle = Math.floor(sharedString.getLength() / 2);\n\t\t\t\tsharedString.removeRange(middle, middle + 1);\n\t\t\t}\n\t\t\tassert.equal(sharedString.getText(), \"\");\n\n\t\t\t// undo all removes\n\t\t\trevertMergeTreeDeltaRevertibles(sharedString, revertibles.splice(0));\n\t\t\tassert.equal(sharedString.getText(), \"hello world\");\n\n\t\t\t// redo all removes\n\t\t\trevertMergeTreeDeltaRevertibles(sharedString, revertibles.splice(0));\n\t\t\tassert.equal(sharedString.getText(), \"\");\n\t\t});\n\n\t\tit(\"annotate\", () => {\n\t\t\tsharedString.insertText(0, \"hello world\");\n\t\t\tArray.from({ length: sharedString.getLength() }).forEach((_, i) =>\n\t\t\t\tassert(matchProperties(sharedString.getPropertiesAtPosition(i), undefined)),\n\t\t\t);\n\n\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tsharedString.on(\"sequenceDelta\", (event) =>\n\t\t\t\tappendToMergeTreeDeltaRevertibles(event.deltaArgs, revertibles),\n\t\t\t);\n\n\t\t\tfor (let i = 0; i < sharedString.getLength(); i++) {\n\t\t\t\tsharedString.annotateRange(i, i + 1, { test: i });\n\t\t\t}\n\t\t\tassert.equal(sharedString.getText(), \"hello world\");\n\t\t\tArray.from({ length: sharedString.getLength() }).forEach((_, i) =>\n\t\t\t\tassert(matchProperties(sharedString.getPropertiesAtPosition(i), { test: i })),\n\t\t\t);\n\n\t\t\t// undo all annotates\n\t\t\trevertMergeTreeDeltaRevertibles(sharedString, revertibles.splice(0));\n\t\t\tassert.equal(sharedString.getText(), \"hello world\");\n\t\t\tArray.from({ length: sharedString.getLength() }).forEach((_, i) =>\n\t\t\t\tassert(matchProperties(sharedString.getPropertiesAtPosition(i), {})),\n\t\t\t);\n\n\t\t\t// redo all annotates\n\t\t\trevertMergeTreeDeltaRevertibles(sharedString, revertibles.splice(0));\n\t\t\tassert.equal(sharedString.getText(), \"hello world\");\n\t\t\tArray.from({ length: sharedString.getLength() }).forEach((_, i) =>\n\t\t\t\tassert(matchProperties(sharedString.getPropertiesAtPosition(i), { test: i })),\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
@@ -1,45 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "assert";
6
- import fs from "fs";
7
- import path from "path";
8
- import { MockContainerRuntimeFactory, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
9
- import { SharedString } from "../sharedString.js";
10
- import { SharedStringFactory } from "../sequenceFactory.js";
11
- import { LocationBase } from "./generateSharedStrings.js";
12
- import { _dirname } from "./dirname.cjs";
13
- describe("SharedString Snapshot Version - Empty Props", () => {
14
- let filebase;
15
- before(() => {
16
- filebase = path.join(_dirname, `../../${LocationBase}`);
17
- });
18
- async function loadSharedString(id, serializedSnapshot) {
19
- const containerRuntimeFactory = new MockContainerRuntimeFactory();
20
- const dataStoreRuntime = new MockFluidDataStoreRuntime();
21
- const containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);
22
- const services = {
23
- deltaConnection: dataStoreRuntime.createDeltaConnection(),
24
- objectStorage: new MockStorage(JSON.parse(serializedSnapshot)),
25
- };
26
- const sharedString = new SharedString(dataStoreRuntime, id, SharedStringFactory.Attributes);
27
- await sharedString.load(services);
28
- await sharedString.loaded;
29
- return sharedString;
30
- }
31
- it("loads a snapshot that contains an empty PropertySet", async () => {
32
- const filename = `${filebase}emptyPropsAtEnd.json`;
33
- assert(fs.existsSync(filename), `test snapshot file does not exist: ${filename}`);
34
- const data = fs.readFileSync(filename, "utf8");
35
- const sharedString = await loadSharedString("fakeId", data);
36
- const expectedProps = Object.entries({});
37
- assert(sharedString !== undefined, "SharedString is undefined");
38
- for (let i = 0; i < sharedString.getLength(); i++) {
39
- const actualProps = sharedString.getPropertiesAtPosition(i);
40
- assert(actualProps !== undefined, "Properties are undefined when they should be empty");
41
- assert(Object.entries(actualProps).toString() === expectedProps.toString(), `Properties are not empty at position ${i}`);
42
- }
43
- });
44
- });
45
- //# sourceMappingURL=snapshotEmptyProps.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshotEmptyProps.spec.js","sourceRoot":"","sources":["../../src/test/snapshotEmptyProps.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EACN,2BAA2B,EAC3B,yBAAyB,EACzB,WAAW,GACX,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IAC5D,IAAI,QAAgB,CAAC;IAErB,MAAM,CAAC,GAAG,EAAE;QACX,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,gBAAgB,CAAC,EAAU,EAAE,kBAA0B;QACrE,MAAM,uBAAuB,GAAG,IAAI,2BAA2B,EAAE,CAAC;QAClE,MAAM,gBAAgB,GAAG,IAAI,yBAAyB,EAAE,CAAC;QACzD,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;QAC1F,MAAM,QAAQ,GAAG;YAChB,eAAe,EAAE,gBAAgB,CAAC,qBAAqB,EAAE;YACzD,aAAa,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;SAC9D,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,gBAAgB,EAAE,EAAE,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC5F,MAAM,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,YAAY,CAAC,MAAM,CAAC;QAC1B,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,QAAQ,GAAG,GAAG,QAAQ,sBAAsB,CAAC;QACnD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,sCAAsC,QAAQ,EAAE,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,2BAA2B,CAAC,CAAC;QAEhE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;YAClD,MAAM,WAAW,GAAG,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,oDAAoD,CAAC,CAAC;YACxF,MAAM,CACL,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,KAAK,aAAa,CAAC,QAAQ,EAAE,EACnE,wCAAwC,CAAC,EAAE,CAC3C,CAAC;SACF;IACF,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { LocationBase } from \"./generateSharedStrings.js\";\nimport { _dirname } from \"./dirname.cjs\";\n\ndescribe(\"SharedString Snapshot Version - Empty Props\", () => {\n\tlet filebase: string;\n\n\tbefore(() => {\n\t\tfilebase = path.join(_dirname, `../../${LocationBase}`);\n\t});\n\n\tasync function loadSharedString(id: string, serializedSnapshot: string): Promise<SharedString> {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tconst containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\t\tconst services = {\n\t\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: new MockStorage(JSON.parse(serializedSnapshot)),\n\t\t};\n\t\tconst sharedString = new SharedString(dataStoreRuntime, id, SharedStringFactory.Attributes);\n\t\tawait sharedString.load(services);\n\t\tawait sharedString.loaded;\n\t\treturn sharedString;\n\t}\n\n\tit(\"loads a snapshot that contains an empty PropertySet\", async () => {\n\t\tconst filename = `${filebase}emptyPropsAtEnd.json`;\n\t\tassert(fs.existsSync(filename), `test snapshot file does not exist: ${filename}`);\n\t\tconst data = fs.readFileSync(filename, \"utf8\");\n\t\tconst sharedString = await loadSharedString(\"fakeId\", data);\n\t\tconst expectedProps = Object.entries({});\n\t\tassert(sharedString !== undefined, \"SharedString is undefined\");\n\n\t\tfor (let i = 0; i < sharedString.getLength(); i++) {\n\t\t\tconst actualProps = sharedString.getPropertiesAtPosition(i);\n\t\t\tassert(actualProps !== undefined, \"Properties are undefined when they should be empty\");\n\t\t\tassert(\n\t\t\t\tObject.entries(actualProps).toString() === expectedProps.toString(),\n\t\t\t\t`Properties are not empty at position ${i}`,\n\t\t\t);\n\t\t}\n\t});\n});\n"]}
@@ -1,149 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "assert";
6
- import fs from "fs";
7
- import path from "path";
8
- import { convertSummaryTreeToITree } from "@fluidframework/runtime-utils";
9
- import { MockContainerRuntimeFactory, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
10
- import { SharedString } from "../sharedString.js";
11
- import { SharedStringFactory } from "../sequenceFactory.js";
12
- import { generateStrings, LocationBase } from "./generateSharedStrings.js";
13
- import { _dirname } from "./dirname.cjs";
14
- function assertIntervalCollectionsAreEquivalent(actual, expected, message) {
15
- assert.deepEqual(Array.from(actual.getIntervalCollectionLabels()), Array.from(expected.getIntervalCollectionLabels()), message);
16
- for (const label of actual.getIntervalCollectionLabels()) {
17
- const expectedCollection = expected.getIntervalCollection(label);
18
- for (const interval of actual.getIntervalCollection(label)) {
19
- assert(interval);
20
- const intervalId = interval.getIntervalId();
21
- assert(intervalId);
22
- const expectedInterval = expectedCollection.getIntervalById(intervalId);
23
- assert(expectedInterval);
24
- const start = actual.localReferencePositionToPosition(interval.start);
25
- const expectedStart = expected.localReferencePositionToPosition(expectedInterval.start);
26
- assert.equal(start, expectedStart, message);
27
- const end = actual.localReferencePositionToPosition(interval.end);
28
- const expectedEnd = expected.localReferencePositionToPosition(expectedInterval.end);
29
- assert.equal(end, expectedEnd, message);
30
- }
31
- }
32
- }
33
- function assertSharedStringsAreEquivalent(actual, expected, message) {
34
- assert.equal(actual.getLength(), expected.getLength(), message);
35
- assert.equal(actual.getText(), expected.getText(), message);
36
- for (let j = 0; j < actual.getLength(); j += 10) {
37
- assert(JSON.stringify(actual.getPropertiesAtPosition(j)) ===
38
- JSON.stringify(expected.getPropertiesAtPosition(j)), message);
39
- }
40
- }
41
- describe("SharedString Snapshot Version", () => {
42
- let fileBase;
43
- const message = "SharedString snapshot format has changed. " +
44
- "Please update the snapshotFormatVersion if appropriate " +
45
- "and then run npm test:newsnapfiles to create new snapshot test files.";
46
- before(() => {
47
- fileBase = path.join(_dirname, `../../${LocationBase}`);
48
- });
49
- async function loadSharedString(id, serializedSnapshot) {
50
- const containerRuntimeFactory = new MockContainerRuntimeFactory();
51
- const dataStoreRuntime = new MockFluidDataStoreRuntime();
52
- const containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);
53
- const services = {
54
- deltaConnection: dataStoreRuntime.createDeltaConnection(),
55
- objectStorage: new MockStorage(JSON.parse(serializedSnapshot)),
56
- };
57
- const sharedString = new SharedString(dataStoreRuntime, id, SharedStringFactory.Attributes);
58
- await sharedString.load(services);
59
- await sharedString.loaded;
60
- return sharedString;
61
- }
62
- function generateSnapshotRebuildTest(name, testString, normalized) {
63
- it(name, async () => {
64
- const filename = `${fileBase}${name}.json`;
65
- assert(fs.existsSync(filename), `test snapshot file does not exist: ${filename}`);
66
- const data = fs.readFileSync(filename, "utf8");
67
- const sharedString = await loadSharedString("fakeId", data);
68
- // test rebuilt sharedString against the original
69
- assertSharedStringsAreEquivalent(sharedString, testString, message);
70
- // Only verify interval collection equivalence before editing both strings; the sliding
71
- // behavior of intervals requires acking and `testString` is only set up locally.
72
- assertIntervalCollectionsAreEquivalent(sharedString, testString, message);
73
- for (let j = 0; j < sharedString.getLength(); j += 50) {
74
- sharedString.insertText(j, "NEWTEXT");
75
- testString.insertText(j, "NEWTEXT");
76
- }
77
- assertSharedStringsAreEquivalent(sharedString, testString, message);
78
- sharedString.replaceText(0, sharedString.getLength(), "hello world");
79
- testString.replaceText(0, testString.getLength(), "hello world");
80
- assertSharedStringsAreEquivalent(sharedString, testString, message);
81
- sharedString.removeText(0, sharedString.getLength());
82
- testString.removeText(0, testString.getLength());
83
- assertSharedStringsAreEquivalent(sharedString, testString, message);
84
- });
85
- }
86
- function generateSnapshotRebuildTests() {
87
- describe("Snapshot rebuild", () => {
88
- for (const { snapshotPath, expected, snapshotIsNormalized } of generateStrings()) {
89
- if (snapshotIsNormalized || snapshotPath === "v1Intervals/withV1Intervals") {
90
- generateSnapshotRebuildTest(snapshotPath, expected, snapshotIsNormalized);
91
- }
92
- }
93
- });
94
- }
95
- generateSnapshotRebuildTests();
96
- function generateSnapshotDiffTest(name, testString) {
97
- it(name, async () => {
98
- const filename = `${fileBase}${name}.json`;
99
- assert(fs.existsSync(filename), `test snapshot file does not exist: ${filename}`);
100
- const data = fs.readFileSync(filename, "utf8").trim();
101
- const dataObject = JSON.parse(data);
102
- const summaryTree = testString.getAttachSummary().summary;
103
- const snapshotTree = convertSummaryTreeToITree(summaryTree);
104
- const testData = JSON.stringify(snapshotTree, undefined, 1).trim();
105
- const testDataObject = JSON.parse(testData);
106
- assert.deepStrictEqual(dataObject, testDataObject, message);
107
- });
108
- }
109
- function generateSnapshotDiffTests() {
110
- describe("Snapshot diff", () => {
111
- for (const str of generateStrings()) {
112
- if (str.snapshotIsNormalized) {
113
- generateSnapshotDiffTest(str.snapshotPath, str.expected);
114
- }
115
- }
116
- });
117
- }
118
- generateSnapshotDiffTests();
119
- it("normalizes prefixed interval collection keys", async () => {
120
- // This test verifies some back-compat for the fix related to
121
- // https://github.com/microsoft/FluidFramework/issues/10557.
122
- const originalString = new SharedString(new MockFluidDataStoreRuntime(), "original", SharedStringFactory.Attributes);
123
- originalString.initializeLocal();
124
- originalString.insertText(0, "ABCD");
125
- const collectionId = "015e0f46-efa3-42d7-a9ab-970ecc376df9";
126
- originalString.getIntervalCollection(collectionId).add({ start: 1, end: 2 });
127
- const summaryTree = originalString.getAttachSummary().summary;
128
- const snapshotTree = convertSummaryTreeToITree(summaryTree);
129
- const serializedSnapshot = JSON.stringify(snapshotTree);
130
- const denormalizedSnapshot = serializedSnapshot.replace(collectionId, `intervalCollections/${collectionId}`);
131
- assert(denormalizedSnapshot.includes(`intervalCollections/${collectionId}`));
132
- const rehydratedString = await loadSharedString("rehydrated", serializedSnapshot);
133
- const rehydratedFromDenormalizedString = await loadSharedString("denormalized", denormalizedSnapshot);
134
- const assertEquivalent = (actual, expected) => {
135
- assertSharedStringsAreEquivalent(actual, expected, `Difference found between ${actual.id} and ${expected.id}'s text.`);
136
- assertIntervalCollectionsAreEquivalent(actual, expected, `Difference found between ${actual.id} and ${expected.id}'s intervals.`);
137
- };
138
- assertEquivalent(originalString, rehydratedString);
139
- assertEquivalent(originalString, rehydratedFromDenormalizedString);
140
- for (const sharedString of [
141
- originalString,
142
- rehydratedString,
143
- rehydratedFromDenormalizedString,
144
- ]) {
145
- assert.deepEqual(Array.from(sharedString.getIntervalCollectionLabels()), [collectionId], `Unexpected labels for string "${sharedString.id}".`);
146
- }
147
- });
148
- });
149
- //# sourceMappingURL=snapshotVersion.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshotVersion.spec.js","sourceRoot":"","sources":["../../src/test/snapshotVersion.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 fs from \"fs\";\nimport path from \"path\";\nimport { convertSummaryTreeToITree } from \"@fluidframework/runtime-utils\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { generateStrings, LocationBase } from \"./generateSharedStrings.js\";\nimport { _dirname } from \"./dirname.cjs\";\n\nfunction assertIntervalCollectionsAreEquivalent(\n\tactual: SharedString,\n\texpected: SharedString,\n\tmessage: string,\n): void {\n\tassert.deepEqual(\n\t\tArray.from(actual.getIntervalCollectionLabels()),\n\t\tArray.from(expected.getIntervalCollectionLabels()),\n\t\tmessage,\n\t);\n\n\tfor (const label of actual.getIntervalCollectionLabels()) {\n\t\tconst expectedCollection = expected.getIntervalCollection(label);\n\t\tfor (const interval of actual.getIntervalCollection(label)) {\n\t\t\tassert(interval);\n\t\t\tconst intervalId = interval.getIntervalId();\n\t\t\tassert(intervalId);\n\t\t\tconst expectedInterval = expectedCollection.getIntervalById(intervalId);\n\t\t\tassert(expectedInterval);\n\t\t\tconst start = actual.localReferencePositionToPosition(interval.start);\n\t\t\tconst expectedStart = expected.localReferencePositionToPosition(expectedInterval.start);\n\t\t\tassert.equal(start, expectedStart, message);\n\t\t\tconst end = actual.localReferencePositionToPosition(interval.end);\n\t\t\tconst expectedEnd = expected.localReferencePositionToPosition(expectedInterval.end);\n\t\t\tassert.equal(end, expectedEnd, message);\n\t\t}\n\t}\n}\n\nfunction assertSharedStringsAreEquivalent(\n\tactual: SharedString,\n\texpected: SharedString,\n\tmessage: string,\n): void {\n\tassert.equal(actual.getLength(), expected.getLength(), message);\n\tassert.equal(actual.getText(), expected.getText(), message);\n\n\tfor (let j = 0; j < actual.getLength(); j += 10) {\n\t\tassert(\n\t\t\tJSON.stringify(actual.getPropertiesAtPosition(j)) ===\n\t\t\t\tJSON.stringify(expected.getPropertiesAtPosition(j)),\n\t\t\tmessage,\n\t\t);\n\t}\n}\n\ndescribe(\"SharedString Snapshot Version\", () => {\n\tlet fileBase: string;\n\tconst message =\n\t\t\"SharedString snapshot format has changed. \" +\n\t\t\"Please update the snapshotFormatVersion if appropriate \" +\n\t\t\"and then run npm test:newsnapfiles to create new snapshot test files.\";\n\n\tbefore(() => {\n\t\tfileBase = path.join(_dirname, `../../${LocationBase}`);\n\t});\n\n\tasync function loadSharedString(id: string, serializedSnapshot: string): Promise<SharedString> {\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tconst containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\t\tconst services = {\n\t\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: new MockStorage(JSON.parse(serializedSnapshot)),\n\t\t};\n\t\tconst sharedString = new SharedString(dataStoreRuntime, id, SharedStringFactory.Attributes);\n\t\tawait sharedString.load(services);\n\t\tawait sharedString.loaded;\n\t\treturn sharedString;\n\t}\n\n\tfunction generateSnapshotRebuildTest(\n\t\tname: string,\n\t\ttestString: SharedString,\n\t\tnormalized: boolean,\n\t) {\n\t\tit(name, async () => {\n\t\t\tconst filename = `${fileBase}${name}.json`;\n\t\t\tassert(fs.existsSync(filename), `test snapshot file does not exist: ${filename}`);\n\t\t\tconst data = fs.readFileSync(filename, \"utf8\");\n\t\t\tconst sharedString = await loadSharedString(\"fakeId\", data);\n\t\t\t// test rebuilt sharedString against the original\n\t\t\tassertSharedStringsAreEquivalent(sharedString, testString, message);\n\t\t\t// Only verify interval collection equivalence before editing both strings; the sliding\n\t\t\t// behavior of intervals requires acking and `testString` is only set up locally.\n\t\t\tassertIntervalCollectionsAreEquivalent(sharedString, testString, message);\n\n\t\t\tfor (let j = 0; j < sharedString.getLength(); j += 50) {\n\t\t\t\tsharedString.insertText(j, \"NEWTEXT\");\n\t\t\t\ttestString.insertText(j, \"NEWTEXT\");\n\t\t\t}\n\n\t\t\tassertSharedStringsAreEquivalent(sharedString, testString, message);\n\n\t\t\tsharedString.replaceText(0, sharedString.getLength(), \"hello world\");\n\t\t\ttestString.replaceText(0, testString.getLength(), \"hello world\");\n\n\t\t\tassertSharedStringsAreEquivalent(sharedString, testString, message);\n\n\t\t\tsharedString.removeText(0, sharedString.getLength());\n\t\t\ttestString.removeText(0, testString.getLength());\n\n\t\t\tassertSharedStringsAreEquivalent(sharedString, testString, message);\n\t\t});\n\t}\n\n\tfunction generateSnapshotRebuildTests() {\n\t\tdescribe(\"Snapshot rebuild\", () => {\n\t\t\tfor (const { snapshotPath, expected, snapshotIsNormalized } of generateStrings()) {\n\t\t\t\tif (snapshotIsNormalized || snapshotPath === \"v1Intervals/withV1Intervals\") {\n\t\t\t\t\tgenerateSnapshotRebuildTest(snapshotPath, expected, snapshotIsNormalized);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tgenerateSnapshotRebuildTests();\n\n\tfunction generateSnapshotDiffTest(name: string, testString: SharedString) {\n\t\tit(name, async () => {\n\t\t\tconst filename = `${fileBase}${name}.json`;\n\t\t\tassert(fs.existsSync(filename), `test snapshot file does not exist: ${filename}`);\n\t\t\tconst data = fs.readFileSync(filename, \"utf8\").trim();\n\t\t\tconst dataObject = JSON.parse(data);\n\n\t\t\tconst summaryTree = testString.getAttachSummary().summary;\n\t\t\tconst snapshotTree = convertSummaryTreeToITree(summaryTree);\n\t\t\tconst testData = JSON.stringify(snapshotTree, undefined, 1).trim();\n\t\t\tconst testDataObject = JSON.parse(testData);\n\n\t\t\tassert.deepStrictEqual(dataObject, testDataObject, message);\n\t\t});\n\t}\n\n\tfunction generateSnapshotDiffTests() {\n\t\tdescribe(\"Snapshot diff\", () => {\n\t\t\tfor (const str of generateStrings()) {\n\t\t\t\tif (str.snapshotIsNormalized) {\n\t\t\t\t\tgenerateSnapshotDiffTest(str.snapshotPath, str.expected);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tgenerateSnapshotDiffTests();\n\n\tit(\"normalizes prefixed interval collection keys\", async () => {\n\t\t// This test verifies some back-compat for the fix related to\n\t\t// https://github.com/microsoft/FluidFramework/issues/10557.\n\t\tconst originalString = new SharedString(\n\t\t\tnew MockFluidDataStoreRuntime(),\n\t\t\t\"original\",\n\t\t\tSharedStringFactory.Attributes,\n\t\t);\n\t\toriginalString.initializeLocal();\n\t\toriginalString.insertText(0, \"ABCD\");\n\t\tconst collectionId = \"015e0f46-efa3-42d7-a9ab-970ecc376df9\";\n\t\toriginalString.getIntervalCollection(collectionId).add({ start: 1, end: 2 });\n\t\tconst summaryTree = originalString.getAttachSummary().summary;\n\t\tconst snapshotTree = convertSummaryTreeToITree(summaryTree);\n\t\tconst serializedSnapshot = JSON.stringify(snapshotTree);\n\t\tconst denormalizedSnapshot = serializedSnapshot.replace(\n\t\t\tcollectionId,\n\t\t\t`intervalCollections/${collectionId}`,\n\t\t);\n\n\t\tassert(denormalizedSnapshot.includes(`intervalCollections/${collectionId}`));\n\t\tconst rehydratedString = await loadSharedString(\"rehydrated\", serializedSnapshot);\n\t\tconst rehydratedFromDenormalizedString = await loadSharedString(\n\t\t\t\"denormalized\",\n\t\t\tdenormalizedSnapshot,\n\t\t);\n\n\t\tconst assertEquivalent = (actual: SharedString, expected: SharedString) => {\n\t\t\tassertSharedStringsAreEquivalent(\n\t\t\t\tactual,\n\t\t\t\texpected,\n\t\t\t\t`Difference found between ${actual.id} and ${expected.id}'s text.`,\n\t\t\t);\n\t\t\tassertIntervalCollectionsAreEquivalent(\n\t\t\t\tactual,\n\t\t\t\texpected,\n\t\t\t\t`Difference found between ${actual.id} and ${expected.id}'s intervals.`,\n\t\t\t);\n\t\t};\n\n\t\tassertEquivalent(originalString, rehydratedString);\n\t\tassertEquivalent(originalString, rehydratedFromDenormalizedString);\n\n\t\tfor (const sharedString of [\n\t\t\toriginalString,\n\t\t\trehydratedString,\n\t\t\trehydratedFromDenormalizedString,\n\t\t]) {\n\t\t\tassert.deepEqual(\n\t\t\t\tArray.from(sharedString.getIntervalCollectionLabels()),\n\t\t\t\t[collectionId],\n\t\t\t\t`Unexpected labels for string \"${sharedString.id}\".`,\n\t\t\t);\n\t\t}\n\t});\n});\n"]}
@@ -1,182 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "assert";
6
- import { makeRandom } from "@fluid-private/stochastic-test-utils";
7
- import { StartpointInRangeIndex } from "../intervalIndex/index.js";
8
- import { intervalHelpers } from "../intervals/index.js";
9
- import { assertPlainNumberIntervals, createTestInterval, generateRandomIntervals, } from "./intervalIndexTestUtils.js";
10
- class TestStartpointInRangeIndex {
11
- constructor() {
12
- this.intervals = [];
13
- }
14
- add(interval) {
15
- this.intervals.push(interval);
16
- }
17
- remove(interval) {
18
- const index = this.intervals.findIndex((i) => i === interval);
19
- if (index !== -1) {
20
- this.intervals.splice(index, 1);
21
- }
22
- }
23
- findIntervalsWithStartpointInRange(start, end) {
24
- return this.intervals.filter((interval) => interval.start >= start && interval.start <= end);
25
- }
26
- }
27
- describe("findIntervalsWithStartpointInRange", () => {
28
- const helpers = intervalHelpers;
29
- // sort the query result by the interval startpoint value
30
- const compareFn = (a, b) => {
31
- if (a.start === b.start) {
32
- return a.end - b.end;
33
- }
34
- return a.start - b.start;
35
- };
36
- let startpointInRangeIndex;
37
- let results;
38
- beforeEach(() => {
39
- startpointInRangeIndex = new StartpointInRangeIndex(undefined, helpers);
40
- });
41
- describe("finds no intervals", () => {
42
- it("when the index is empty", () => {
43
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 1);
44
- assert.equal(results.length, 0);
45
- });
46
- describe("with intervals in the index", () => {
47
- beforeEach(() => {
48
- startpointInRangeIndex.add(createTestInterval(2, 2));
49
- startpointInRangeIndex.add(createTestInterval(3, 4));
50
- });
51
- it("when start > end for the query range", () => {
52
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(2, 1);
53
- assert.equal(results.length, 0);
54
- });
55
- it("when start is 0 for the query range", () => {
56
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(0, 2);
57
- assert.equal(results.length, 0);
58
- });
59
- it("when endpoints of the query range are negative", () => {
60
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(-2, -1);
61
- assert.equal(results.length, 0);
62
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(-1, 1);
63
- assert.equal(results.length, 0);
64
- });
65
- it("when all intervals are above the query range", () => {
66
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 1);
67
- assert.equal(results.length, 0);
68
- });
69
- it("when all intervals are below the query range", () => {
70
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(5, 6);
71
- assert.equal(results.length, 0);
72
- });
73
- });
74
- });
75
- describe("finds intervals while performing multiple adding operations on the index", () => {
76
- beforeEach(() => {
77
- startpointInRangeIndex.add(createTestInterval(1, 3));
78
- startpointInRangeIndex.add(createTestInterval(2, 3));
79
- });
80
- it("when quering the intervals which the startpoints exactly fall on the range boundary", () => {
81
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 1);
82
- assertPlainNumberIntervals(results, [{ start: 1, end: 3 }]);
83
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 2);
84
- assertPlainNumberIntervals(results, [
85
- { start: 1, end: 3 },
86
- { start: 2, end: 3 },
87
- ]);
88
- });
89
- it("when querying various kinds of intervals within the range", () => {
90
- startpointInRangeIndex.add(createTestInterval(2, 4));
91
- startpointInRangeIndex.add(createTestInterval(3, 4));
92
- startpointInRangeIndex.add(createTestInterval(4, 5));
93
- startpointInRangeIndex.add(createTestInterval(3, 4)); // duplicate interval
94
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(2, 4);
95
- results.sort(compareFn);
96
- assertPlainNumberIntervals(results, [
97
- { start: 2, end: 3 },
98
- { start: 2, end: 4 },
99
- { start: 3, end: 4 },
100
- { start: 3, end: 4 },
101
- { start: 4, end: 5 },
102
- ]);
103
- });
104
- });
105
- describe("find intervals while performing removing operations on the index", () => {
106
- let interval1;
107
- let interval2;
108
- beforeEach(() => {
109
- interval1 = createTestInterval(1, 3);
110
- interval2 = createTestInterval(2, 3);
111
- startpointInRangeIndex.add(interval1);
112
- startpointInRangeIndex.add(interval2);
113
- });
114
- it("when removing the interval with duplicate startpoints/endpoints", () => {
115
- const interval3 = createTestInterval(1, 3);
116
- startpointInRangeIndex.add(interval3);
117
- startpointInRangeIndex.remove(interval1);
118
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 2);
119
- results.sort(compareFn);
120
- assertPlainNumberIntervals(results, [
121
- { start: 1, end: 3 },
122
- { start: 2, end: 3 },
123
- ]);
124
- startpointInRangeIndex.remove(interval3);
125
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 2);
126
- assertPlainNumberIntervals(results, [{ start: 2, end: 3 }]);
127
- });
128
- it("when removing the interval does not exist in the index", () => {
129
- const interval3 = createTestInterval(1, 3);
130
- startpointInRangeIndex.remove(interval3);
131
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 2);
132
- results.sort(compareFn);
133
- assertPlainNumberIntervals(results, [
134
- { start: 1, end: 3 },
135
- { start: 2, end: 3 },
136
- ]);
137
- });
138
- it("when removing the interval within the target range", () => {
139
- startpointInRangeIndex.remove(interval2);
140
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 2);
141
- assertPlainNumberIntervals(results, [{ start: 1, end: 3 }]);
142
- const interval3 = createTestInterval(2, 4);
143
- startpointInRangeIndex.add(interval3);
144
- const interval4 = createTestInterval(3, 4);
145
- startpointInRangeIndex.add(interval4);
146
- startpointInRangeIndex.remove(interval3);
147
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 4);
148
- results.sort(compareFn);
149
- assertPlainNumberIntervals(results, [
150
- { start: 1, end: 3 },
151
- { start: 3, end: 4 },
152
- ]);
153
- });
154
- });
155
- describe("find exactly the same intervals as those obtained by `brute-force` method", () => {
156
- it("when given massive random inputs", () => {
157
- const testIndex = new TestStartpointInRangeIndex();
158
- const random = makeRandom(0);
159
- const count = 800;
160
- const min = 1;
161
- const max = 1500;
162
- // Generate intervals randomly and add them to both index
163
- const intervals = generateRandomIntervals({ random, count, min, max });
164
- for (const interval of intervals) {
165
- testIndex.add(interval);
166
- startpointInRangeIndex.add(interval);
167
- }
168
- // Test with running 1000 random queries
169
- for (let i = 0; i < 1000; ++i) {
170
- const start = random.integer(min, max);
171
- const end = random.integer(start, max);
172
- // Query intervals using both index
173
- results = startpointInRangeIndex.findIntervalsWithStartpointInRange(start, end);
174
- const expected = testIndex.findIntervalsWithStartpointInRange(start, end);
175
- results.sort(compareFn);
176
- expected.sort(compareFn);
177
- assertPlainNumberIntervals(results, expected);
178
- }
179
- });
180
- });
181
- });
182
- //# sourceMappingURL=startpointInRangeIndex.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"startpointInRangeIndex.spec.js","sourceRoot":"","sources":["../../src/test/startpointInRangeIndex.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 { makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { Client } from \"@fluidframework/merge-tree\";\nimport { IStartpointInRangeIndex, StartpointInRangeIndex } from \"../intervalIndex/index.js\";\nimport { Interval, intervalHelpers } from \"../intervals/index.js\";\nimport {\n\tassertPlainNumberIntervals,\n\tcreateTestInterval,\n\tgenerateRandomIntervals,\n} from \"./intervalIndexTestUtils.js\";\n\nclass TestStartpointInRangeIndex implements IStartpointInRangeIndex<Interval> {\n\tprivate readonly intervals: Interval[];\n\n\tconstructor() {\n\t\tthis.intervals = [];\n\t}\n\n\tadd(interval: Interval) {\n\t\tthis.intervals.push(interval);\n\t}\n\n\tremove(interval: Interval) {\n\t\tconst index = this.intervals.findIndex((i) => i === interval);\n\t\tif (index !== -1) {\n\t\t\tthis.intervals.splice(index, 1);\n\t\t}\n\t}\n\n\tfindIntervalsWithStartpointInRange(start: number, end: number): Interval[] {\n\t\treturn this.intervals.filter(\n\t\t\t(interval) => interval.start >= start && interval.start <= end,\n\t\t);\n\t}\n}\n\ndescribe(\"findIntervalsWithStartpointInRange\", () => {\n\tconst helpers = intervalHelpers;\n\t// sort the query result by the interval startpoint value\n\tconst compareFn = (a: Interval, b: Interval) => {\n\t\tif (a.start === b.start) {\n\t\t\treturn a.end - b.end;\n\t\t}\n\t\treturn a.start - b.start;\n\t};\n\tlet startpointInRangeIndex;\n\tlet results;\n\n\tbeforeEach(() => {\n\t\tstartpointInRangeIndex = new StartpointInRangeIndex(undefined as any as Client, helpers);\n\t});\n\n\tdescribe(\"finds no intervals\", () => {\n\t\tit(\"when the index is empty\", () => {\n\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 1);\n\t\t\tassert.equal(results.length, 0);\n\t\t});\n\n\t\tdescribe(\"with intervals in the index\", () => {\n\t\t\tbeforeEach(() => {\n\t\t\t\tstartpointInRangeIndex.add(createTestInterval(2, 2));\n\t\t\t\tstartpointInRangeIndex.add(createTestInterval(3, 4));\n\t\t\t});\n\n\t\t\tit(\"when start > end for the query range\", () => {\n\t\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(2, 1);\n\t\t\t\tassert.equal(results.length, 0);\n\t\t\t});\n\n\t\t\tit(\"when start is 0 for the query range\", () => {\n\t\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(0, 2);\n\t\t\t\tassert.equal(results.length, 0);\n\t\t\t});\n\n\t\t\tit(\"when endpoints of the query range are negative\", () => {\n\t\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(-2, -1);\n\t\t\t\tassert.equal(results.length, 0);\n\t\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(-1, 1);\n\t\t\t\tassert.equal(results.length, 0);\n\t\t\t});\n\n\t\t\tit(\"when all intervals are above the query range\", () => {\n\t\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 1);\n\t\t\t\tassert.equal(results.length, 0);\n\t\t\t});\n\n\t\t\tit(\"when all intervals are below the query range\", () => {\n\t\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(5, 6);\n\t\t\t\tassert.equal(results.length, 0);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"finds intervals while performing multiple adding operations on the index\", () => {\n\t\tbeforeEach(() => {\n\t\t\tstartpointInRangeIndex.add(createTestInterval(1, 3));\n\t\t\tstartpointInRangeIndex.add(createTestInterval(2, 3));\n\t\t});\n\n\t\tit(\"when quering the intervals which the startpoints exactly fall on the range boundary\", () => {\n\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 1);\n\t\t\tassertPlainNumberIntervals(results, [{ start: 1, end: 3 }]);\n\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 2);\n\t\t\tassertPlainNumberIntervals(results, [\n\t\t\t\t{ start: 1, end: 3 },\n\t\t\t\t{ start: 2, end: 3 },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"when querying various kinds of intervals within the range\", () => {\n\t\t\tstartpointInRangeIndex.add(createTestInterval(2, 4));\n\t\t\tstartpointInRangeIndex.add(createTestInterval(3, 4));\n\t\t\tstartpointInRangeIndex.add(createTestInterval(4, 5));\n\t\t\tstartpointInRangeIndex.add(createTestInterval(3, 4)); // duplicate interval\n\n\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(2, 4);\n\t\t\tresults.sort(compareFn);\n\t\t\tassertPlainNumberIntervals(results, [\n\t\t\t\t{ start: 2, end: 3 },\n\t\t\t\t{ start: 2, end: 4 },\n\t\t\t\t{ start: 3, end: 4 },\n\t\t\t\t{ start: 3, end: 4 },\n\t\t\t\t{ start: 4, end: 5 },\n\t\t\t]);\n\t\t});\n\t});\n\n\tdescribe(\"find intervals while performing removing operations on the index\", () => {\n\t\tlet interval1;\n\t\tlet interval2;\n\n\t\tbeforeEach(() => {\n\t\t\tinterval1 = createTestInterval(1, 3);\n\t\t\tinterval2 = createTestInterval(2, 3);\n\t\t\tstartpointInRangeIndex.add(interval1);\n\t\t\tstartpointInRangeIndex.add(interval2);\n\t\t});\n\n\t\tit(\"when removing the interval with duplicate startpoints/endpoints\", () => {\n\t\t\tconst interval3 = createTestInterval(1, 3);\n\t\t\tstartpointInRangeIndex.add(interval3);\n\t\t\tstartpointInRangeIndex.remove(interval1);\n\n\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 2);\n\t\t\tresults.sort(compareFn);\n\t\t\tassertPlainNumberIntervals(results, [\n\t\t\t\t{ start: 1, end: 3 },\n\t\t\t\t{ start: 2, end: 3 },\n\t\t\t]);\n\n\t\t\tstartpointInRangeIndex.remove(interval3);\n\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 2);\n\t\t\tassertPlainNumberIntervals(results, [{ start: 2, end: 3 }]);\n\t\t});\n\n\t\tit(\"when removing the interval does not exist in the index\", () => {\n\t\t\tconst interval3 = createTestInterval(1, 3);\n\t\t\tstartpointInRangeIndex.remove(interval3);\n\n\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 2);\n\t\t\tresults.sort(compareFn);\n\t\t\tassertPlainNumberIntervals(results, [\n\t\t\t\t{ start: 1, end: 3 },\n\t\t\t\t{ start: 2, end: 3 },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"when removing the interval within the target range\", () => {\n\t\t\tstartpointInRangeIndex.remove(interval2);\n\n\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 2);\n\t\t\tassertPlainNumberIntervals(results, [{ start: 1, end: 3 }]);\n\n\t\t\tconst interval3 = createTestInterval(2, 4);\n\t\t\tstartpointInRangeIndex.add(interval3);\n\n\t\t\tconst interval4 = createTestInterval(3, 4);\n\t\t\tstartpointInRangeIndex.add(interval4);\n\n\t\t\tstartpointInRangeIndex.remove(interval3);\n\n\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(1, 4);\n\t\t\tresults.sort(compareFn);\n\t\t\tassertPlainNumberIntervals(results, [\n\t\t\t\t{ start: 1, end: 3 },\n\t\t\t\t{ start: 3, end: 4 },\n\t\t\t]);\n\t\t});\n\t});\n\n\tdescribe(\"find exactly the same intervals as those obtained by `brute-force` method\", () => {\n\t\tit(\"when given massive random inputs\", () => {\n\t\t\tconst testIndex = new TestStartpointInRangeIndex();\n\t\t\tconst random = makeRandom(0);\n\t\t\tconst count = 800;\n\t\t\tconst min = 1;\n\t\t\tconst max = 1500;\n\n\t\t\t// Generate intervals randomly and add them to both index\n\t\t\tconst intervals = generateRandomIntervals({ random, count, min, max });\n\t\t\tfor (const interval of intervals) {\n\t\t\t\ttestIndex.add(interval);\n\t\t\t\tstartpointInRangeIndex.add(interval);\n\t\t\t}\n\n\t\t\t// Test with running 1000 random queries\n\t\t\tfor (let i = 0; i < 1000; ++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\t// Query intervals using both index\n\t\t\t\tresults = startpointInRangeIndex.findIntervalsWithStartpointInRange(start, end);\n\t\t\t\tconst expected = testIndex.findIntervalsWithStartpointInRange(start, end);\n\t\t\t\tresults.sort(compareFn);\n\t\t\t\texpected.sort(compareFn);\n\n\t\t\t\tassertPlainNumberIntervals(results, expected);\n\t\t\t}\n\t\t});\n\t});\n});\n"]}