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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +1 -1
  3. package/api-report/sequence.api.md +32 -32
  4. package/beta.d.ts +11 -0
  5. package/dist/{localValues.d.ts → IntervalCollectionValues.d.ts} +13 -12
  6. package/dist/IntervalCollectionValues.d.ts.map +1 -0
  7. package/dist/{localValues.js → IntervalCollectionValues.js} +6 -6
  8. package/dist/IntervalCollectionValues.js.map +1 -0
  9. package/dist/beta.d.ts +12 -0
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +10 -10
  13. package/dist/index.js.map +1 -1
  14. package/dist/intervalCollection.d.ts +10 -10
  15. package/dist/intervalCollection.d.ts.map +1 -1
  16. package/dist/intervalCollection.js +103 -99
  17. package/dist/intervalCollection.js.map +1 -1
  18. package/dist/{defaultMap.d.ts → intervalCollectionMap.d.ts} +11 -44
  19. package/dist/intervalCollectionMap.d.ts.map +1 -0
  20. package/dist/{defaultMap.js → intervalCollectionMap.js} +15 -70
  21. package/dist/intervalCollectionMap.js.map +1 -0
  22. package/dist/{defaultMapInterfaces.d.ts → intervalCollectionMapInterfaces.d.ts} +17 -16
  23. package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -0
  24. package/dist/{defaultMapInterfaces.js → intervalCollectionMapInterfaces.js} +1 -1
  25. package/dist/intervalCollectionMapInterfaces.js.map +1 -0
  26. package/dist/intervalIndex/endpointInRangeIndex.d.ts +1 -1
  27. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  28. package/dist/intervalIndex/endpointInRangeIndex.js +3 -3
  29. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  30. package/dist/intervalIndex/endpointIndex.d.ts +1 -1
  31. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  32. package/dist/intervalIndex/endpointIndex.js +3 -3
  33. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  34. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  35. package/dist/intervalIndex/idIntervalIndex.js +3 -3
  36. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  37. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +3 -3
  38. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  39. package/dist/intervalIndex/overlappingIntervalsIndex.js +2 -3
  40. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  41. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  42. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +6 -6
  43. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  44. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  45. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  46. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  47. package/dist/intervalIndex/startpointInRangeIndex.d.ts +1 -1
  48. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  49. package/dist/intervalIndex/startpointInRangeIndex.js +3 -3
  50. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  51. package/dist/intervalTree.d.ts +1 -1
  52. package/dist/intervalTree.d.ts.map +1 -1
  53. package/dist/intervalTree.js +2 -2
  54. package/dist/intervalTree.js.map +1 -1
  55. package/dist/intervals/interval.d.ts +1 -1
  56. package/dist/intervals/interval.d.ts.map +1 -1
  57. package/dist/intervals/interval.js +10 -10
  58. package/dist/intervals/interval.js.map +1 -1
  59. package/dist/intervals/intervalUtils.d.ts +1 -1
  60. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  61. package/dist/intervals/intervalUtils.js +5 -5
  62. package/dist/intervals/intervalUtils.js.map +1 -1
  63. package/dist/intervals/sequenceInterval.d.ts +1 -1
  64. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  65. package/dist/intervals/sequenceInterval.js +34 -34
  66. package/dist/intervals/sequenceInterval.js.map +1 -1
  67. package/dist/legacy.d.ts +61 -0
  68. package/dist/packageVersion.d.ts +1 -1
  69. package/dist/packageVersion.js +1 -1
  70. package/dist/packageVersion.js.map +1 -1
  71. package/dist/public.d.ts +12 -0
  72. package/dist/revertibles.d.ts +2 -2
  73. package/dist/revertibles.d.ts.map +1 -1
  74. package/dist/revertibles.js +34 -34
  75. package/dist/revertibles.js.map +1 -1
  76. package/dist/sequence.d.ts +7 -6
  77. package/dist/sequence.d.ts.map +1 -1
  78. package/dist/sequence.js +34 -34
  79. package/dist/sequence.js.map +1 -1
  80. package/dist/sequenceDeltaEvent.d.ts +1 -1
  81. package/dist/sequenceDeltaEvent.d.ts.map +1 -1
  82. package/dist/sequenceDeltaEvent.js +4 -4
  83. package/dist/sequenceDeltaEvent.js.map +1 -1
  84. package/dist/sequenceFactory.d.ts +1 -1
  85. package/dist/sequenceFactory.d.ts.map +1 -1
  86. package/dist/sequenceFactory.js +3 -3
  87. package/dist/sequenceFactory.js.map +1 -1
  88. package/dist/sharedIntervalCollection.d.ts +4 -3
  89. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  90. package/dist/sharedIntervalCollection.js +5 -5
  91. package/dist/sharedIntervalCollection.js.map +1 -1
  92. package/dist/sharedSequence.d.ts +3 -2
  93. package/dist/sharedSequence.d.ts.map +1 -1
  94. package/dist/sharedSequence.js +4 -4
  95. package/dist/sharedSequence.js.map +1 -1
  96. package/dist/sharedString.d.ts +2 -2
  97. package/dist/sharedString.d.ts.map +1 -1
  98. package/dist/sharedString.js +9 -9
  99. package/dist/sharedString.js.map +1 -1
  100. package/internal.d.ts +11 -0
  101. package/legacy.d.ts +11 -0
  102. package/lib/{localValues.d.ts → IntervalCollectionValues.d.ts} +13 -12
  103. package/lib/IntervalCollectionValues.d.ts.map +1 -0
  104. package/lib/{localValues.js → IntervalCollectionValues.js} +3 -3
  105. package/lib/IntervalCollectionValues.js.map +1 -0
  106. package/lib/beta.d.ts +12 -0
  107. package/lib/index.d.ts +2 -2
  108. package/lib/index.d.ts.map +1 -1
  109. package/lib/index.js +1 -1
  110. package/lib/index.js.map +1 -1
  111. package/lib/intervalCollection.d.ts +10 -10
  112. package/lib/intervalCollection.d.ts.map +1 -1
  113. package/lib/intervalCollection.js +8 -4
  114. package/lib/intervalCollection.js.map +1 -1
  115. package/lib/{defaultMap.d.ts → intervalCollectionMap.d.ts} +11 -44
  116. package/lib/intervalCollectionMap.d.ts.map +1 -0
  117. package/lib/{defaultMap.js → intervalCollectionMap.js} +8 -63
  118. package/lib/intervalCollectionMap.js.map +1 -0
  119. package/lib/{defaultMapInterfaces.d.ts → intervalCollectionMapInterfaces.d.ts} +17 -16
  120. package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -0
  121. package/lib/{defaultMapInterfaces.js → intervalCollectionMapInterfaces.js} +1 -1
  122. package/lib/intervalCollectionMapInterfaces.js.map +1 -0
  123. package/lib/intervalIndex/endpointInRangeIndex.d.ts +1 -1
  124. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  125. package/lib/intervalIndex/endpointInRangeIndex.js +1 -1
  126. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  127. package/lib/intervalIndex/endpointIndex.d.ts +1 -1
  128. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
  129. package/lib/intervalIndex/endpointIndex.js +1 -1
  130. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  131. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  132. package/lib/intervalIndex/idIntervalIndex.js +1 -1
  133. package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
  134. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +3 -3
  135. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  136. package/lib/intervalIndex/overlappingIntervalsIndex.js +2 -3
  137. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  138. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  139. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +2 -2
  140. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  141. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  142. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  143. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  144. package/lib/intervalIndex/startpointInRangeIndex.d.ts +1 -1
  145. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  146. package/lib/intervalIndex/startpointInRangeIndex.js +1 -1
  147. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  148. package/lib/intervalTree.d.ts +1 -1
  149. package/lib/intervalTree.d.ts.map +1 -1
  150. package/lib/intervalTree.js +1 -1
  151. package/lib/intervalTree.js.map +1 -1
  152. package/lib/intervals/interval.d.ts +1 -1
  153. package/lib/intervals/interval.d.ts.map +1 -1
  154. package/lib/intervals/interval.js +3 -3
  155. package/lib/intervals/interval.js.map +1 -1
  156. package/lib/intervals/intervalUtils.d.ts +1 -1
  157. package/lib/intervals/intervalUtils.d.ts.map +1 -1
  158. package/lib/intervals/intervalUtils.js +1 -1
  159. package/lib/intervals/intervalUtils.js.map +1 -1
  160. package/lib/intervals/sequenceInterval.d.ts +1 -1
  161. package/lib/intervals/sequenceInterval.d.ts.map +1 -1
  162. package/lib/intervals/sequenceInterval.js +3 -3
  163. package/lib/intervals/sequenceInterval.js.map +1 -1
  164. package/lib/legacy.d.ts +61 -0
  165. package/lib/packageVersion.d.ts +1 -1
  166. package/lib/packageVersion.js +1 -1
  167. package/lib/packageVersion.js.map +1 -1
  168. package/lib/public.d.ts +12 -0
  169. package/lib/revertibles.d.ts +2 -2
  170. package/lib/revertibles.d.ts.map +1 -1
  171. package/lib/revertibles.js +3 -4
  172. package/lib/revertibles.js.map +1 -1
  173. package/lib/sequence.d.ts +7 -6
  174. package/lib/sequence.d.ts.map +1 -1
  175. package/lib/sequence.js +11 -12
  176. package/lib/sequence.js.map +1 -1
  177. package/lib/sequenceDeltaEvent.d.ts +1 -1
  178. package/lib/sequenceDeltaEvent.d.ts.map +1 -1
  179. package/lib/sequenceDeltaEvent.js +3 -4
  180. package/lib/sequenceDeltaEvent.js.map +1 -1
  181. package/lib/sequenceFactory.d.ts +1 -1
  182. package/lib/sequenceFactory.d.ts.map +1 -1
  183. package/lib/sequenceFactory.js +1 -1
  184. package/lib/sequenceFactory.js.map +1 -1
  185. package/lib/sharedIntervalCollection.d.ts +4 -3
  186. package/lib/sharedIntervalCollection.d.ts.map +1 -1
  187. package/lib/sharedIntervalCollection.js +4 -4
  188. package/lib/sharedIntervalCollection.js.map +1 -1
  189. package/lib/sharedSequence.d.ts +3 -2
  190. package/lib/sharedSequence.d.ts.map +1 -1
  191. package/lib/sharedSequence.js +2 -2
  192. package/lib/sharedSequence.js.map +1 -1
  193. package/lib/sharedString.d.ts +2 -2
  194. package/lib/sharedString.d.ts.map +1 -1
  195. package/lib/sharedString.js +1 -1
  196. package/lib/sharedString.js.map +1 -1
  197. package/package.json +41 -58
  198. package/src/{localValues.ts → IntervalCollectionValues.ts} +26 -18
  199. package/src/index.ts +2 -2
  200. package/src/intervalCollection.ts +46 -47
  201. package/src/{defaultMap.ts → intervalCollectionMap.ts} +42 -105
  202. package/src/{defaultMapInterfaces.ts → intervalCollectionMapInterfaces.ts} +26 -16
  203. package/src/intervalIndex/endpointInRangeIndex.ts +4 -1
  204. package/src/intervalIndex/endpointIndex.ts +4 -1
  205. package/src/intervalIndex/idIntervalIndex.ts +4 -2
  206. package/src/intervalIndex/overlappingIntervalsIndex.ts +8 -5
  207. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +6 -3
  208. package/src/intervalIndex/sequenceIntervalIndexes.ts +3 -1
  209. package/src/intervalIndex/startpointInRangeIndex.ts +4 -1
  210. package/src/intervalTree.ts +4 -3
  211. package/src/intervals/interval.ts +6 -3
  212. package/src/intervals/intervalUtils.ts +4 -2
  213. package/src/intervals/sequenceInterval.ts +5 -3
  214. package/src/packageVersion.ts +1 -1
  215. package/src/revertibles.ts +10 -10
  216. package/src/sequence.ts +24 -31
  217. package/src/sequenceDeltaEvent.ts +3 -4
  218. package/src/sequenceFactory.ts +4 -3
  219. package/src/sharedIntervalCollection.ts +12 -18
  220. package/src/sharedSequence.ts +9 -6
  221. package/src/sharedString.ts +4 -3
  222. package/api-extractor-cjs.json +0 -8
  223. package/dist/defaultMap.d.ts.map +0 -1
  224. package/dist/defaultMap.js.map +0 -1
  225. package/dist/defaultMapInterfaces.d.ts.map +0 -1
  226. package/dist/defaultMapInterfaces.js.map +0 -1
  227. package/dist/localValues.d.ts.map +0 -1
  228. package/dist/localValues.js.map +0 -1
  229. package/dist/sequence-alpha.d.ts +0 -1432
  230. package/dist/sequence-beta.d.ts +0 -246
  231. package/dist/sequence-public.d.ts +0 -246
  232. package/dist/sequence-untrimmed.d.ts +0 -1820
  233. package/lib/defaultMap.d.ts.map +0 -1
  234. package/lib/defaultMap.js.map +0 -1
  235. package/lib/defaultMapInterfaces.d.ts.map +0 -1
  236. package/lib/defaultMapInterfaces.js.map +0 -1
  237. package/lib/localValues.d.ts.map +0 -1
  238. package/lib/localValues.js.map +0 -1
  239. package/lib/sequence-alpha.d.ts +0 -1432
  240. package/lib/sequence-beta.d.ts +0 -246
  241. package/lib/sequence-public.d.ts +0 -246
  242. package/lib/sequence-untrimmed.d.ts +0 -1820
  243. package/lib/test/collections.intervalTree.js +0 -73
  244. package/lib/test/collections.intervalTree.js.map +0 -1
  245. package/lib/test/createSnapshotFiles.js +0 -15
  246. package/lib/test/createSnapshotFiles.js.map +0 -1
  247. package/lib/test/dirname.cjs +0 -16
  248. package/lib/test/dirname.cjs.map +0 -1
  249. package/lib/test/endpointInRangeIndex.spec.js +0 -182
  250. package/lib/test/endpointInRangeIndex.spec.js.map +0 -1
  251. package/lib/test/fuzz/fuzzUtils.js +0 -250
  252. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  253. package/lib/test/fuzz/intervalCollection.fuzz.spec.js +0 -200
  254. package/lib/test/fuzz/intervalCollection.fuzz.spec.js.map +0 -1
  255. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js +0 -129
  256. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js.map +0 -1
  257. package/lib/test/fuzz/sharedString.fuzz.spec.js +0 -91
  258. package/lib/test/fuzz/sharedString.fuzz.spec.js.map +0 -1
  259. package/lib/test/generateSharedStrings.js +0 -138
  260. package/lib/test/generateSharedStrings.js.map +0 -1
  261. package/lib/test/intervalCollection.detached.spec.js +0 -126
  262. package/lib/test/intervalCollection.detached.spec.js.map +0 -1
  263. package/lib/test/intervalCollection.events.spec.js +0 -491
  264. package/lib/test/intervalCollection.events.spec.js.map +0 -1
  265. package/lib/test/intervalCollection.perf.spec.js +0 -88
  266. package/lib/test/intervalCollection.perf.spec.js.map +0 -1
  267. package/lib/test/intervalCollection.snapshot.spec.js +0 -171
  268. package/lib/test/intervalCollection.snapshot.spec.js.map +0 -1
  269. package/lib/test/intervalCollection.spec.js +0 -1660
  270. package/lib/test/intervalCollection.spec.js.map +0 -1
  271. package/lib/test/intervalIndexTestUtils.js +0 -49
  272. package/lib/test/intervalIndexTestUtils.js.map +0 -1
  273. package/lib/test/intervalRebasing.spec.js +0 -589
  274. package/lib/test/intervalRebasing.spec.js.map +0 -1
  275. package/lib/test/intervalStashedOps.spec.js +0 -142
  276. package/lib/test/intervalStashedOps.spec.js.map +0 -1
  277. package/lib/test/intervalTestUtils.js +0 -81
  278. package/lib/test/intervalTestUtils.js.map +0 -1
  279. package/lib/test/marshalling.spec.js +0 -55
  280. package/lib/test/marshalling.spec.js.map +0 -1
  281. package/lib/test/memory/sharedSequence.spec.js +0 -82
  282. package/lib/test/memory/sharedSequence.spec.js.map +0 -1
  283. package/lib/test/memory/sharedString.spec.js +0 -134
  284. package/lib/test/memory/sharedString.spec.js.map +0 -1
  285. package/lib/test/overlappingSequenceIntervalsIndex.spec.js +0 -348
  286. package/lib/test/overlappingSequenceIntervalsIndex.spec.js.map +0 -1
  287. package/lib/test/partialLoad.spec.js +0 -211
  288. package/lib/test/partialLoad.spec.js.map +0 -1
  289. package/lib/test/rebasing.spec.js +0 -81
  290. package/lib/test/rebasing.spec.js.map +0 -1
  291. package/lib/test/reentrancy.spec.js +0 -174
  292. package/lib/test/reentrancy.spec.js.map +0 -1
  293. package/lib/test/revertibles.spec.js +0 -971
  294. package/lib/test/revertibles.spec.js.map +0 -1
  295. package/lib/test/sequenceDeltaEvent.spec.js +0 -2144
  296. package/lib/test/sequenceDeltaEvent.spec.js.map +0 -1
  297. package/lib/test/sharedIntervalCollection.spec.js +0 -159
  298. package/lib/test/sharedIntervalCollection.spec.js.map +0 -1
  299. package/lib/test/sharedString.spec.js +0 -532
  300. package/lib/test/sharedString.spec.js.map +0 -1
  301. package/lib/test/snapshotEmptyProps.spec.js +0 -45
  302. package/lib/test/snapshotEmptyProps.spec.js.map +0 -1
  303. package/lib/test/snapshotVersion.spec.js +0 -149
  304. package/lib/test/snapshotVersion.spec.js.map +0 -1
  305. package/lib/test/startpointInRangeIndex.spec.js +0 -182
  306. package/lib/test/startpointInRangeIndex.spec.js.map +0 -1
  307. package/lib/test/subSequence.spec.js +0 -92
  308. package/lib/test/subSequence.spec.js.map +0 -1
  309. package/lib/test/types/validateSequencePrevious.generated.js +0 -162
  310. package/lib/test/types/validateSequencePrevious.generated.js.map +0 -1
  311. package/lib/test/v1IntervalCollectionHelpers.js +0 -93
  312. package/lib/test/v1IntervalCollectionHelpers.js.map +0 -1
  313. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -1,589 +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 { MockContainerRuntimeFactoryForReconnection, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
7
- // eslint-disable-next-line import/no-internal-modules
8
- import { useStrictPartialLengthChecks } from "@fluidframework/merge-tree/test";
9
- import { SharedString } from "../sharedString.js";
10
- import { IntervalStickiness } from "../intervals/index.js";
11
- import { Side } from "../intervalCollection.js";
12
- import { SharedStringFactory } from "../sequenceFactory.js";
13
- import { assertConsistent, assertSequenceIntervals } from "./intervalTestUtils.js";
14
- function constructClient(containerRuntimeFactory, id) {
15
- const dataStoreRuntime = new MockFluidDataStoreRuntime();
16
- dataStoreRuntime.options = {
17
- intervalStickinessEnabled: true,
18
- mergeTreeEnableObliterate: true,
19
- };
20
- const sharedString = new SharedString(dataStoreRuntime, id, SharedStringFactory.Attributes);
21
- const containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);
22
- const services = {
23
- deltaConnection: dataStoreRuntime.createDeltaConnection(),
24
- objectStorage: new MockStorage(),
25
- };
26
- sharedString.initializeLocal();
27
- return {
28
- sharedString,
29
- containerRuntime,
30
- services,
31
- };
32
- }
33
- async function loadClient(containerRuntimeFactory, source, id) {
34
- const { summary } = source.sharedString.getAttachSummary();
35
- const dataStoreRuntime = new MockFluidDataStoreRuntime();
36
- dataStoreRuntime.options = {
37
- intervalStickinessEnabled: true,
38
- mergeTreeEnableObliterate: true,
39
- };
40
- const factory = SharedString.getFactory();
41
- const containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);
42
- const services = {
43
- deltaConnection: dataStoreRuntime.createDeltaConnection(),
44
- objectStorage: MockStorage.createFromSummary(summary),
45
- };
46
- const sharedString = await factory.load(dataStoreRuntime, id, services, factory.attributes);
47
- return {
48
- sharedString,
49
- containerRuntime,
50
- };
51
- }
52
- function constructClients(containerRuntimeFactory, numClients = 3) {
53
- return Array.from({ length: numClients }, (_, index) => {
54
- const { sharedString, containerRuntime, services } = constructClient(containerRuntimeFactory, String.fromCharCode(index + 65));
55
- sharedString.connect(services);
56
- return { containerRuntime, sharedString };
57
- });
58
- }
59
- describe("interval rebasing", () => {
60
- let containerRuntimeFactory;
61
- let clients;
62
- useStrictPartialLengthChecks();
63
- beforeEach(() => {
64
- containerRuntimeFactory = new MockContainerRuntimeFactoryForReconnection();
65
- clients = constructClients(containerRuntimeFactory);
66
- });
67
- it("does not crash for an interval that lies on segment that has been removed locally", () => {
68
- clients[0].sharedString.insertText(0, "A");
69
- clients[1].containerRuntime.connected = false;
70
- clients[1].sharedString.insertText(0, "01234");
71
- containerRuntimeFactory.processAllMessages();
72
- assertConsistent(clients);
73
- clients[1].containerRuntime.connected = true;
74
- clients[0].sharedString.insertText(0, "012345678901234");
75
- clients[0].containerRuntime.connected = false;
76
- containerRuntimeFactory.processAllMessages();
77
- assertConsistent(clients);
78
- const collection_0 = clients[0].sharedString.getIntervalCollection("comments");
79
- collection_0.add({ start: 12, end: 15, props: { intervalId: "id" } });
80
- clients[2].sharedString.removeRange(5, 7);
81
- clients[0].sharedString.removeRange(3, 5);
82
- containerRuntimeFactory.processAllMessages();
83
- assertConsistent(clients);
84
- clients[0].sharedString.insertText(13, "0123");
85
- clients[0].containerRuntime.connected = true;
86
- containerRuntimeFactory.processAllMessages();
87
- assertConsistent(clients);
88
- });
89
- it("does not crash when entire string on which interval lies is concurrently removed", () => {
90
- clients[0].sharedString.insertText(0, "a");
91
- clients[1].sharedString.insertText(0, "a");
92
- containerRuntimeFactory.processAllMessages();
93
- assertConsistent(clients);
94
- clients[0].containerRuntime.connected = false;
95
- clients[1].sharedString.removeRange(0, 2);
96
- const collection_0 = clients[0].sharedString.getIntervalCollection("comments");
97
- collection_0.add({ start: 0, end: 1, props: { intervalId: "id" } });
98
- containerRuntimeFactory.processAllMessages();
99
- assertConsistent(clients);
100
- clients[0].containerRuntime.connected = true;
101
- });
102
- it("does not crash when interval is removed before reconnect when string is concurrently removed", () => {
103
- clients[0].sharedString.insertText(0, "A");
104
- clients[1].sharedString.insertText(0, "B");
105
- containerRuntimeFactory.processAllMessages();
106
- assertConsistent(clients);
107
- clients[0].containerRuntime.connected = false;
108
- clients[1].sharedString.removeRange(0, 2);
109
- const collection_0 = clients[0].sharedString.getIntervalCollection("comments");
110
- collection_0.add({ start: 0, end: 1, props: { intervalId: "id" } });
111
- containerRuntimeFactory.processAllMessages();
112
- assertConsistent(clients);
113
- collection_0.removeIntervalById("id");
114
- clients[0].containerRuntime.connected = true;
115
- });
116
- it("does not crash when interval slides off end of string", () => {
117
- clients[0].sharedString.insertText(0, "012Z45");
118
- clients[2].sharedString.insertText(0, "X");
119
- containerRuntimeFactory.processAllMessages();
120
- assertConsistent(clients);
121
- clients[1].sharedString.insertText(0, "01234567");
122
- clients[0].containerRuntime.connected = false;
123
- containerRuntimeFactory.processAllMessages();
124
- assertConsistent(clients);
125
- clients[0].sharedString.insertText(0, "ABCDEFGHIJKLMN");
126
- const collection_0 = clients[0].sharedString.getIntervalCollection("comments");
127
- collection_0.add({
128
- start: 20,
129
- end: 20,
130
- props: { intervalId: "0" },
131
- });
132
- clients[2].sharedString.removeRange(13, 15);
133
- containerRuntimeFactory.processAllMessages();
134
- assertConsistent(clients);
135
- clients[0].containerRuntime.connected = true;
136
- containerRuntimeFactory.processAllMessages();
137
- assertConsistent(clients);
138
- });
139
- it("handles basic interval sliding for obliterate", () => {
140
- // A-(BC)
141
- clients[0].sharedString.insertText(0, "ABC");
142
- const collection_0 = clients[0].sharedString.getIntervalCollection("comments");
143
- collection_0.add({
144
- start: 0,
145
- end: 2,
146
- props: {
147
- intervalId: "a",
148
- },
149
- });
150
- clients[0].sharedString.obliterateRange(1, 3);
151
- containerRuntimeFactory.processAllMessages();
152
- assertConsistent(clients);
153
- });
154
- it("reference is -1 for obliterated segment", () => {
155
- // (L-PC-F)
156
- clients[1].sharedString.insertText(0, "F");
157
- clients[0].sharedString.insertText(0, "PC");
158
- const collection_0 = clients[0].sharedString.getIntervalCollection("comments");
159
- collection_0.add({
160
- start: 0,
161
- end: 1,
162
- props: {
163
- intervalId: "a",
164
- },
165
- });
166
- clients[1].sharedString.insertText(0, "L");
167
- clients[1].sharedString.obliterateRange(0, 2);
168
- containerRuntimeFactory.processAllMessages();
169
- assertConsistent(clients);
170
- });
171
- it("slides to correct final destination", () => {
172
- clients[0].sharedString.insertText(0, "A");
173
- containerRuntimeFactory.processAllMessages();
174
- assertConsistent(clients);
175
- clients[2].sharedString.insertText(0, "B");
176
- clients[2].sharedString.removeRange(0, 2);
177
- clients[0].sharedString.insertText(0, "C");
178
- const collection_0 = clients[0].sharedString.getIntervalCollection("comments");
179
- collection_0.add({
180
- start: 0,
181
- end: 1,
182
- props: { intervalId: "0" },
183
- });
184
- containerRuntimeFactory.processAllMessages();
185
- assertConsistent(clients);
186
- });
187
- it("does not slide to invalid position when 0-length interval", () => {
188
- clients[0].sharedString.insertText(0, "A");
189
- const collection_0 = clients[0].sharedString.getIntervalCollection("comments");
190
- // A 0-length interval is required here to reproduce this error. If in
191
- // the future we wish to stop supporting 0-length intervals, this test
192
- // can be removed
193
- collection_0.add({
194
- start: 0,
195
- end: 0,
196
- props: { intervalId: "1" },
197
- });
198
- clients[1].sharedString.insertText(0, "BCD");
199
- clients[1].sharedString.removeRange(0, 1);
200
- containerRuntimeFactory.processAllMessages();
201
- assertConsistent(clients);
202
- clients[2].sharedString.removeRange(1, 3);
203
- clients[1].sharedString.insertText(1, "E");
204
- const collection_1 = clients[1].sharedString.getIntervalCollection("comments");
205
- collection_1.add({
206
- start: 0,
207
- end: 2,
208
- props: {
209
- intervalId: "2",
210
- },
211
- });
212
- containerRuntimeFactory.processAllMessages();
213
- assertConsistent(clients);
214
- assert.equal(clients[0].sharedString.getText(), "CE");
215
- });
216
- it("is consistent for full stickiness", () => {
217
- clients[0].sharedString.insertText(0, "A");
218
- clients[0].sharedString.insertText(0, "BC");
219
- containerRuntimeFactory.processAllMessages();
220
- assertConsistent(clients);
221
- const collection_1 = clients[1].sharedString.getIntervalCollection("comments");
222
- const interval1 = collection_1.add({
223
- start: "start",
224
- end: "end",
225
- props: {
226
- intervalId: "2",
227
- },
228
- });
229
- assert.equal(interval1.stickiness, IntervalStickiness.FULL);
230
- clients[0].sharedString.removeRange(0, 1);
231
- clients[1].sharedString.removeRange(0, 3);
232
- containerRuntimeFactory.processAllMessages();
233
- assertConsistent(clients);
234
- });
235
- it("keeps obliterate segment group the same across multiple reconnects", () => {
236
- // A-C
237
- // (A-B-C)
238
- clients[0].sharedString.insertText(0, "C");
239
- clients[0].sharedString.insertText(0, "A");
240
- containerRuntimeFactory.processAllMessages();
241
- assertConsistent(clients);
242
- clients[0].sharedString.insertText(1, "B");
243
- clients[1].sharedString.obliterateRange(0, 2);
244
- clients[1].containerRuntime.connected = false;
245
- clients[1].containerRuntime.connected = true;
246
- clients[1].containerRuntime.connected = false;
247
- clients[1].containerRuntime.connected = true;
248
- containerRuntimeFactory.processAllMessages();
249
- assertConsistent(clients);
250
- });
251
- it("doesn't crash for empty pending segment group", () => {
252
- // A
253
- // ((A))-[D]
254
- clients[0].sharedString.insertText(0, "A");
255
- containerRuntimeFactory.processAllMessages();
256
- assertConsistent(clients);
257
- clients[1].sharedString.obliterateRange(0, 1);
258
- clients[0].sharedString.insertText(1, "D");
259
- clients[0].sharedString.obliterateRange(0, 1);
260
- clients[0].sharedString.removeRange(0, 1);
261
- clients[0].containerRuntime.connected = false;
262
- containerRuntimeFactory.processAllMessages();
263
- assertConsistent(clients);
264
- clients[0].containerRuntime.connected = true;
265
- assert.equal(clients[0].sharedString.getText(), "");
266
- containerRuntimeFactory.processAllMessages();
267
- assertConsistent(clients);
268
- });
269
- it("zamboni avoids modifying segments with pending interval changes", () => {
270
- // C-AB
271
- // D-C-AB
272
- // E-HIJ-FG-D-C-AB
273
- // ^----------^
274
- clients[2].sharedString.insertText(0, "AB");
275
- clients[0].sharedString.insertText(0, "C");
276
- containerRuntimeFactory.processAllMessages();
277
- assertConsistent(clients);
278
- clients[1].containerRuntime.connected = false;
279
- clients[2].sharedString.insertText(0, "D");
280
- containerRuntimeFactory.processAllMessages();
281
- assertConsistent(clients);
282
- clients[2].sharedString.insertText(0, "E");
283
- clients[1].sharedString.insertText(0, "FG");
284
- clients[1].sharedString.insertText(0, "HIJ");
285
- clients[0].containerRuntime.connected = false;
286
- const collection_0 = clients[1].sharedString.getIntervalCollection("comments");
287
- collection_0.add({ start: 0, end: 7 });
288
- containerRuntimeFactory.processAllMessages();
289
- assertConsistent(clients);
290
- clients[1].containerRuntime.connected = true;
291
- });
292
- it("zamboni avoids modifying segments with pending interval changes through multiple reconnects", async () => {
293
- // Note: the specifics of the attach flow shouldn't be necessary here to reproduce this issue.
294
- // All that's necessary is that the "R" segment is zamboni'd.
295
- // However, due to zamboni's fragility, some care needs to be taken for that to happen.
296
- // See AB#7048 for more details.
297
- const A = constructClient(containerRuntimeFactory, "A");
298
- A.sharedString.insertText(0, "Rr");
299
- A.sharedString.connect(A.services);
300
- const B = await loadClient(containerRuntimeFactory, A, "B");
301
- B.sharedString.removeRange(0, 1);
302
- const collection = A.sharedString.getIntervalCollection("comments");
303
- collection.add({ start: { pos: 1, side: Side.After }, end: { pos: 0, side: Side.Before } });
304
- A.containerRuntime.connected = false;
305
- containerRuntimeFactory.processAllMessages();
306
- B.sharedString.insertText(0, "8");
307
- A.containerRuntime.connected = true;
308
- A.containerRuntime.connected = false;
309
- B.sharedString.insertText(0, "J");
310
- containerRuntimeFactory.processAllMessages();
311
- A.containerRuntime.connected = true;
312
- containerRuntimeFactory.processAllMessages();
313
- assertConsistent([A, B]);
314
- });
315
- // Reproduction of seed 70. Appears to be some problem with normalization of segments interacting
316
- // with sliding logic on reconnect. The ordering of the 22222 and 11 segments is not consistent
317
- // across clients even when in the collab window, and the local reference gets put on this segment.
318
- // So clients[0] disagrees with the others about where the reference slides.
319
- it.skip("AB#6552", () => {
320
- // Note: all 3 clients submit edits. When debugging this test, it might be helpful to
321
- // add a 4th client that doesn't submit any edits. E.g.:
322
- // clients = constructClients(containerRuntimeFactory, 4);
323
- clients[0].sharedString.insertText(0, "000");
324
- containerRuntimeFactory.processAllMessages();
325
- clients[0].containerRuntime.connected = false;
326
- clients[1].containerRuntime.connected = false;
327
- clients[1].sharedString.insertText(0, "11");
328
- clients[0].sharedString.insertText(1, "22222");
329
- clients[0].sharedString
330
- .getIntervalCollection("test collection")
331
- .add({ start: { pos: 1, side: Side.After }, end: { pos: 1, side: Side.After } });
332
- clients[0].sharedString.removeRange(0, 6);
333
- clients[2].sharedString.removeRange(0, 2);
334
- containerRuntimeFactory.processAllMessages();
335
- clients[0].sharedString.insertText(1, "3");
336
- clients[1].containerRuntime.connected = true;
337
- clients[0].containerRuntime.connected = true;
338
- containerRuntimeFactory.processAllMessages();
339
- assertConsistent(clients);
340
- });
341
- it("doesn't create empty segment group when obliterated segment was obliterated by other client during reconnect", () => {
342
- // A
343
- // ((A))-[D]
344
- clients[0].sharedString.insertText(0, "A");
345
- containerRuntimeFactory.processAllMessages();
346
- assertConsistent(clients);
347
- clients[1].sharedString.obliterateRange(0, 1);
348
- clients[0].sharedString.insertText(1, "D");
349
- clients[0].sharedString.obliterateRange(0, 1);
350
- clients[0].sharedString.removeRange(0, 1);
351
- clients[0].containerRuntime.connected = false;
352
- containerRuntimeFactory.processAllMessages();
353
- assertConsistent(clients);
354
- clients[0].containerRuntime.connected = true;
355
- clients[0].containerRuntime.connected = false;
356
- clients[0].containerRuntime.connected = true;
357
- assert.equal(clients[0].sharedString.getText(), "");
358
- containerRuntimeFactory.processAllMessages();
359
- assertConsistent(clients);
360
- });
361
- // todo: a failing obliterate reconnect test. when rebasing the op,
362
- // the character "C" has been concurrently obliterated, so the reconnect
363
- // position of "B" is computed to be 0, rather than 1
364
- //
365
- // at the time of writing, i'm not sure of a good solution. either we could
366
- // change calculation of reconnection position in some way or we could not
367
- // concurrently obliterate "C" in this context.
368
- //
369
- // in both cases, it's not clear to me how we detect when we're reconnecting
370
- //
371
- // ADO#3714
372
- it.skip("...", () => {
373
- // AB
374
- // A-C-B
375
- clients[0].sharedString.insertText(0, "AB");
376
- containerRuntimeFactory.processAllMessages();
377
- assertConsistent(clients);
378
- clients[0].sharedString.insertText(1, "C");
379
- clients[1].containerRuntime.connected = false;
380
- clients[1].sharedString.obliterateRange(0, 2);
381
- clients[1].containerRuntime.connected = true;
382
- clients[1].containerRuntime.connected = false;
383
- containerRuntimeFactory.processAllMessages();
384
- assertConsistent(clients);
385
- clients[1].containerRuntime.connected = true;
386
- containerRuntimeFactory.processAllMessages();
387
- assertConsistent(clients);
388
- });
389
- // todo: ADO#3714 Failing obliterate reconnect test
390
- it.skip("...", () => {
391
- clients[0].sharedString.insertText(0, "AB");
392
- clients[1].sharedString.insertText(0, "CD");
393
- clients[1].sharedString.insertText(1, "E");
394
- clients[0].sharedString.obliterateRange(0, 1);
395
- clients[0].sharedString.insertText(0, "FGHIJK");
396
- containerRuntimeFactory.processAllMessages();
397
- assertConsistent(clients);
398
- clients[0].sharedString.insertText(4, "L");
399
- clients[2].sharedString.obliterateRange(3, 5);
400
- clients[0].containerRuntime.connected = false;
401
- clients[0].sharedString.obliterateRange(1, 2);
402
- clients[0].sharedString.insertText(7, "M");
403
- containerRuntimeFactory.processAllMessages();
404
- assertConsistent(clients);
405
- clients[0].containerRuntime.connected = true;
406
- containerRuntimeFactory.processAllMessages();
407
- assertConsistent(clients);
408
- });
409
- it("slides two refs on same segment to different segments", () => {
410
- clients[0].sharedString.insertText(0, "AB");
411
- clients[0].sharedString.insertText(0, "C");
412
- const collection_1 = clients[0].sharedString.getIntervalCollection("comments");
413
- const interval1 = collection_1.add({
414
- start: { pos: 0, side: Side.After },
415
- end: "end",
416
- props: {
417
- intervalId: "1",
418
- },
419
- });
420
- assert.equal(interval1.stickiness, IntervalStickiness.FULL);
421
- containerRuntimeFactory.processAllMessages();
422
- assertConsistent(clients);
423
- clients[2].sharedString.removeRange(1, 2);
424
- const collection_2 = clients[1].sharedString.getIntervalCollection("comments");
425
- const interval2 = collection_2.add({
426
- start: "start",
427
- end: { pos: 2, side: Side.Before },
428
- props: {
429
- intervalId: "2",
430
- },
431
- });
432
- assert.equal(interval2.stickiness, IntervalStickiness.FULL);
433
- containerRuntimeFactory.processAllMessages();
434
- assertConsistent(clients);
435
- });
436
- it("maintains sliding preference on references after ack", () => {
437
- clients[1].sharedString.insertText(0, "ABC");
438
- containerRuntimeFactory.processAllMessages();
439
- assertConsistent(clients);
440
- clients[0].sharedString.removeRange(0, 1);
441
- clients[0].sharedString.insertText(0, "D");
442
- const collection_1 = clients[1].sharedString.getIntervalCollection("comments");
443
- collection_1.add({
444
- start: { pos: 0, side: Side.After },
445
- end: 1,
446
- props: {
447
- intervalId: "1",
448
- },
449
- });
450
- clients[2].sharedString.removeRange(1, 2);
451
- containerRuntimeFactory.processAllMessages();
452
- assertConsistent(clients);
453
- });
454
- it("maintains sliding preference on references after reconnect with special endpoint segment", () => {
455
- clients[0].sharedString.insertText(0, "D");
456
- clients[0].containerRuntime.connected = false;
457
- const collection_1 = clients[0].sharedString.getIntervalCollection("comments");
458
- const interval = collection_1.add({
459
- start: "start",
460
- end: 0,
461
- props: {
462
- intervalId: "1",
463
- },
464
- });
465
- assert.equal(interval.stickiness, IntervalStickiness.FULL);
466
- clients[0].containerRuntime.connected = true;
467
- containerRuntimeFactory.processAllMessages();
468
- assertConsistent(clients);
469
- });
470
- it("maintains sliding preference on references after reconnect", () => {
471
- clients[0].sharedString.insertText(0, "D");
472
- clients[0].containerRuntime.connected = false;
473
- const collection_1 = clients[0].sharedString.getIntervalCollection("comments");
474
- const interval = collection_1.add({
475
- start: { pos: 0, side: Side.After },
476
- end: 0,
477
- props: {
478
- intervalId: "1",
479
- },
480
- });
481
- assert.equal(interval.stickiness, IntervalStickiness.FULL);
482
- clients[0].containerRuntime.connected = true;
483
- containerRuntimeFactory.processAllMessages();
484
- assertConsistent(clients);
485
- });
486
- // todo: potentially related to AB#7050
487
- //
488
- // this is a reduced fuzz test from the suite
489
- // `SharedString with rebasing and reconnect`
490
- it.skip("...", async () => {
491
- const A = constructClient(containerRuntimeFactory, "A");
492
- A.sharedString.insertText(0, "ABCDEF");
493
- A.sharedString.insertText(0, "GHIJ");
494
- A.sharedString.insertText(0, "KLMNO");
495
- A.sharedString.insertText(0, "PQRST");
496
- // attach
497
- A.sharedString.connect(A.services);
498
- const B = await loadClient(containerRuntimeFactory, A, "B");
499
- A.sharedString.insertText(0, "UVWXYZ");
500
- containerRuntimeFactory.processAllMessages();
501
- assertConsistent([A, B]);
502
- B.sharedString.insertText(26, "1");
503
- A.sharedString.removeRange(0, 1);
504
- B.containerRuntime.connected = false;
505
- containerRuntimeFactory.processAllMessages();
506
- assertConsistent([A, B]);
507
- B.containerRuntime.connected = true;
508
- containerRuntimeFactory.processAllMessages();
509
- assertConsistent([A, B]);
510
- });
511
- it("slides to correct segment when inserting segment while disconnected after changing interval", () => {
512
- // B-A
513
- // ^
514
- clients[0].sharedString.insertText(0, "A");
515
- const collection_0 = clients[0].sharedString.getIntervalCollection("comments");
516
- collection_0.add({ start: 0, end: 0, props: { intervalId: "0" } });
517
- collection_0.change("0", { start: 0, end: 0 });
518
- clients[0].containerRuntime.connected = false;
519
- clients[0].sharedString.insertText(0, "B");
520
- clients[0].containerRuntime.connected = true;
521
- containerRuntimeFactory.processAllMessages();
522
- assertConsistent(clients);
523
- assert.equal(clients[0].sharedString.getText(), "BA");
524
- assertSequenceIntervals(clients[0].sharedString, clients[0].sharedString.getIntervalCollection("comments"), [{ start: 1, end: 1 }]);
525
- });
526
- it("changing interval to concurrently deleted segment detaches interval", () => {
527
- // B-A
528
- // ^
529
- // (B)-A
530
- // ^
531
- // (B)-(A)-C
532
- // ^
533
- clients[0].sharedString.insertText(0, "A");
534
- clients[2].sharedString.insertText(0, "B");
535
- const collection_0 = clients[2].sharedString.getIntervalCollection("comments");
536
- collection_0.add({ start: 0, end: 0, props: { intervalId: "0" } });
537
- containerRuntimeFactory.processAllMessages();
538
- assertConsistent(clients);
539
- clients[1].sharedString.removeRange(0, 1);
540
- clients[0].containerRuntime.connected = false;
541
- containerRuntimeFactory.processAllMessages();
542
- assertConsistent(clients);
543
- clients[1].sharedString.removeRange(0, 1);
544
- const collection_1 = clients[0].sharedString.getIntervalCollection("comments");
545
- collection_1.change("0", { start: 0, end: 0 });
546
- clients[2].sharedString.insertText(0, "C");
547
- containerRuntimeFactory.processAllMessages();
548
- assertConsistent(clients);
549
- clients[0].containerRuntime.connected = true;
550
- containerRuntimeFactory.processAllMessages();
551
- assertConsistent(clients);
552
- assert.equal(clients[0].sharedString.getText(), "C");
553
- assertSequenceIntervals(clients[0].sharedString, clients[0].sharedString.getIntervalCollection("comments"), [{ start: 0, end: 0 }]);
554
- });
555
- it("changing interval endpoint while disconnected to segment also inserted while disconnected", () => {
556
- // AC
557
- // A-B-C
558
- clients[0].sharedString.insertText(0, "AC");
559
- containerRuntimeFactory.processAllMessages();
560
- assertConsistent(clients);
561
- const collection_0 = clients[0].sharedString.getIntervalCollection("comments");
562
- collection_0.add({ start: 0, end: 0, props: { intervalId: "0" } });
563
- clients[0].containerRuntime.connected = false;
564
- clients[0].sharedString.insertText(1, "B");
565
- collection_0.change("0", { start: 1, end: 1 });
566
- clients[0].containerRuntime.connected = true;
567
- containerRuntimeFactory.processAllMessages();
568
- assertConsistent(clients);
569
- assert.equal(clients[0].sharedString.getText(), "ABC");
570
- assertSequenceIntervals(clients[0].sharedString, clients[0].sharedString.getIntervalCollection("comments"), [{ start: 1, end: 1 }]);
571
- });
572
- it("delete and insert text into range containing interval while disconnected", async () => {
573
- // 012
574
- // (0)-x-12
575
- clients[0].containerRuntime.connected = false;
576
- const intervals = clients[0].sharedString.getIntervalCollection("comments");
577
- clients[0].sharedString.insertText(0, "012");
578
- intervals.add({ start: 0, end: 2, props: { intervalId: "0" } });
579
- assertSequenceIntervals(clients[0].sharedString, intervals, [{ start: 0, end: 2 }]);
580
- clients[0].sharedString.insertText(1, "x");
581
- clients[0].sharedString.removeRange(0, 1);
582
- clients[0].containerRuntime.connected = true;
583
- containerRuntimeFactory.processAllMessages();
584
- assertConsistent(clients);
585
- assert.equal(clients[0].sharedString.getText(), "x12");
586
- assertSequenceIntervals(clients[0].sharedString, intervals, [{ start: 0, end: 2 }]);
587
- });
588
- });
589
- //# sourceMappingURL=intervalRebasing.spec.js.map