@fluidframework/sequence 2.0.0-dev-rc.2.0.0.246488 → 2.0.0-dev-rc.3.0.0.250606
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/IntervalCollectionValues.d.ts +2 -2
- package/dist/IntervalCollectionValues.d.ts.map +1 -1
- package/dist/IntervalCollectionValues.js.map +1 -1
- package/dist/intervalCollection.d.ts +3 -3
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +31 -31
- package/dist/intervalCollection.js.map +1 -1
- package/dist/intervalCollectionMap.d.ts +3 -3
- package/dist/intervalCollectionMap.d.ts.map +1 -1
- package/dist/intervalCollectionMap.js +1 -1
- package/dist/intervalCollectionMap.js.map +1 -1
- package/dist/intervalCollectionMapInterfaces.d.ts +2 -2
- package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -1
- package/dist/intervalCollectionMapInterfaces.js.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +2 -2
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.js +2 -2
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/dist/intervalTree.d.ts +1 -1
- package/dist/intervalTree.d.ts.map +1 -1
- package/dist/intervalTree.js.map +1 -1
- package/dist/intervals/interval.d.ts.map +1 -1
- package/dist/intervals/interval.js +1 -1
- package/dist/intervals/interval.js.map +1 -1
- package/dist/intervals/sequenceInterval.d.ts.map +1 -1
- package/dist/intervals/sequenceInterval.js +1 -1
- package/dist/intervals/sequenceInterval.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/revertibles.d.ts +1 -1
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js.map +1 -1
- package/dist/sequence.d.ts +5 -5
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +5 -5
- package/dist/sequence.js.map +1 -1
- package/dist/sequenceFactory.d.ts +1 -1
- package/dist/sequenceFactory.d.ts.map +1 -1
- package/dist/sequenceFactory.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +2 -2
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/dist/sharedSequence.d.ts +1 -1
- package/dist/sharedSequence.d.ts.map +1 -1
- package/dist/sharedSequence.js.map +1 -1
- package/dist/sharedString.d.ts +1 -1
- package/dist/sharedString.d.ts.map +1 -1
- package/dist/sharedString.js.map +1 -1
- package/lib/IntervalCollectionValues.d.ts +2 -2
- package/lib/IntervalCollectionValues.d.ts.map +1 -1
- package/lib/IntervalCollectionValues.js.map +1 -1
- package/lib/intervalCollection.d.ts +3 -3
- package/lib/intervalCollection.d.ts.map +1 -1
- package/lib/intervalCollection.js +2 -2
- package/lib/intervalCollection.js.map +1 -1
- package/lib/intervalCollectionMap.d.ts +3 -3
- package/lib/intervalCollectionMap.d.ts.map +1 -1
- package/lib/intervalCollectionMap.js +3 -3
- package/lib/intervalCollectionMap.js.map +1 -1
- package/lib/intervalCollectionMapInterfaces.d.ts +2 -2
- package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -1
- package/lib/intervalCollectionMapInterfaces.js.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +2 -2
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.js +2 -2
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/lib/intervalTree.d.ts +1 -1
- package/lib/intervalTree.d.ts.map +1 -1
- package/lib/intervalTree.js.map +1 -1
- package/lib/intervals/interval.d.ts.map +1 -1
- package/lib/intervals/interval.js +1 -1
- package/lib/intervals/interval.js.map +1 -1
- package/lib/intervals/sequenceInterval.d.ts.map +1 -1
- package/lib/intervals/sequenceInterval.js +1 -1
- package/lib/intervals/sequenceInterval.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/revertibles.d.ts +1 -1
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +2 -2
- package/lib/revertibles.js.map +1 -1
- package/lib/sequence.d.ts +5 -5
- package/lib/sequence.d.ts.map +1 -1
- package/lib/sequence.js +7 -7
- package/lib/sequence.js.map +1 -1
- package/lib/sequenceFactory.d.ts +1 -1
- package/lib/sequenceFactory.d.ts.map +1 -1
- package/lib/sequenceFactory.js.map +1 -1
- package/lib/sharedIntervalCollection.d.ts +2 -2
- package/lib/sharedIntervalCollection.d.ts.map +1 -1
- package/lib/sharedIntervalCollection.js +1 -1
- package/lib/sharedIntervalCollection.js.map +1 -1
- package/lib/sharedSequence.d.ts +1 -1
- package/lib/sharedSequence.d.ts.map +1 -1
- package/lib/sharedSequence.js.map +1 -1
- package/lib/sharedString.d.ts +1 -1
- package/lib/sharedString.d.ts.map +1 -1
- package/lib/sharedString.js +1 -1
- package/lib/sharedString.js.map +1 -1
- package/lib/test/createSnapshotFiles.js +1 -1
- package/lib/test/createSnapshotFiles.js.map +1 -1
- package/lib/test/fuzz/fuzzUtils.js +3 -3
- package/lib/test/fuzz/fuzzUtils.js.map +1 -1
- package/lib/test/fuzz/intervalCollection.fuzz.spec.js +1 -1
- package/lib/test/fuzz/intervalCollection.fuzz.spec.js.map +1 -1
- package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js +2 -2
- package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js.map +1 -1
- package/lib/test/fuzz/sharedString.fuzz.spec.js +1 -1
- package/lib/test/fuzz/sharedString.fuzz.spec.js.map +1 -1
- package/lib/test/generateSharedStrings.js +2 -2
- package/lib/test/generateSharedStrings.js.map +1 -1
- package/lib/test/intervalCollection.detached.spec.js.map +1 -1
- package/lib/test/intervalCollection.events.spec.js +4 -4
- package/lib/test/intervalCollection.events.spec.js.map +1 -1
- package/lib/test/intervalCollection.perf.spec.js +1 -1
- package/lib/test/intervalCollection.perf.spec.js.map +1 -1
- package/lib/test/intervalCollection.snapshot.spec.js +5 -5
- package/lib/test/intervalCollection.snapshot.spec.js.map +1 -1
- package/lib/test/intervalCollection.spec.js +4 -4
- package/lib/test/intervalCollection.spec.js.map +1 -1
- package/lib/test/intervalIndexTestUtils.js.map +1 -1
- package/lib/test/intervalRebasing.spec.js +3 -3
- package/lib/test/intervalRebasing.spec.js.map +1 -1
- package/lib/test/intervalStashedOps.spec.js +3 -3
- package/lib/test/intervalStashedOps.spec.js.map +1 -1
- package/lib/test/intervalTestUtils.js.map +1 -1
- package/lib/test/memory/sharedSequence.spec.js.map +1 -1
- package/lib/test/memory/sharedString.spec.js +2 -2
- package/lib/test/memory/sharedString.spec.js.map +1 -1
- package/lib/test/overlappingSequenceIntervalsIndex.spec.js +4 -4
- package/lib/test/overlappingSequenceIntervalsIndex.spec.js.map +1 -1
- package/lib/test/partialLoad.spec.js +2 -2
- package/lib/test/partialLoad.spec.js.map +1 -1
- package/lib/test/rebasing.spec.js +3 -3
- package/lib/test/rebasing.spec.js.map +1 -1
- package/lib/test/reentrancy.spec.js +3 -3
- package/lib/test/reentrancy.spec.js.map +1 -1
- package/lib/test/revertibles.spec.js +4 -4
- package/lib/test/revertibles.spec.js.map +1 -1
- package/lib/test/sequenceDeltaEvent.spec.js +1 -1
- package/lib/test/sequenceDeltaEvent.spec.js.map +1 -1
- package/lib/test/sharedIntervalCollection.spec.js +2 -2
- package/lib/test/sharedIntervalCollection.spec.js.map +1 -1
- package/lib/test/sharedString.spec.js +3 -3
- package/lib/test/sharedString.spec.js.map +1 -1
- package/lib/test/snapshotEmptyProps.spec.js +2 -2
- package/lib/test/snapshotEmptyProps.spec.js.map +1 -1
- package/lib/test/snapshotVersion.spec.js +2 -2
- package/lib/test/snapshotVersion.spec.js.map +1 -1
- package/lib/test/subSequence.spec.js.map +1 -1
- package/lib/test/v1IntervalCollectionHelpers.js +1 -1
- package/lib/test/v1IntervalCollectionHelpers.js.map +1 -1
- package/package.json +23 -20
- package/src/IntervalCollectionValues.ts +4 -4
- package/src/intervalCollection.ts +24 -24
- package/src/intervalCollectionMap.ts +15 -15
- package/src/intervalCollectionMapInterfaces.ts +4 -4
- package/src/intervalIndex/idIntervalIndex.ts +1 -1
- package/src/intervalIndex/overlappingIntervalsIndex.ts +4 -4
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +2 -2
- package/src/intervalTree.ts +2 -2
- package/src/intervals/interval.ts +1 -1
- package/src/intervals/sequenceInterval.ts +1 -1
- package/src/packageVersion.ts +1 -1
- package/src/revertibles.ts +7 -7
- package/src/sequence.ts +19 -19
- package/src/sequenceFactory.ts +2 -2
- package/src/sharedIntervalCollection.ts +7 -7
- package/src/sharedSequence.ts +1 -1
- package/src/sharedString.ts +2 -2
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { strict as assert } from "assert";
|
|
6
6
|
import { MockContainerRuntimeFactory, MockContainerRuntimeFactoryForReconnection, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
|
|
7
|
-
import { SharedIntervalCollection, SharedIntervalCollectionFactory, } from "../sharedIntervalCollection.js";
|
|
8
|
-
import { intervalHelpers } from "../intervals/index.js";
|
|
9
7
|
import { OverlappingIntervalsIndex } from "../intervalIndex/index.js";
|
|
8
|
+
import { intervalHelpers } from "../intervals/index.js";
|
|
9
|
+
import { SharedIntervalCollection, SharedIntervalCollectionFactory, } from "../sharedIntervalCollection.js";
|
|
10
10
|
const assertIntervals = (intervalCollection, expected, overlappingIntervalsIndex) => {
|
|
11
11
|
const actual = Array.from(intervalCollection);
|
|
12
12
|
if (overlappingIntervalsIndex) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharedIntervalCollection.spec.js","sourceRoot":"","sources":["../../src/test/sharedIntervalCollection.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport {\n\tMockContainerRuntime,\n\tMockContainerRuntimeFactory,\n\tMockContainerRuntimeFactoryForReconnection,\n\tMockContainerRuntimeForReconnection,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { Client } from \"@fluidframework/merge-tree\";\nimport {\n\tSharedIntervalCollection,\n\tSharedIntervalCollectionFactory,\n} from \"../sharedIntervalCollection.js\";\nimport { IIntervalCollection } from \"../intervalCollection.js\";\nimport { Interval, intervalHelpers } from \"../intervals/index.js\";\nimport { IOverlappingIntervalsIndex, OverlappingIntervalsIndex } from \"../intervalIndex/index.js\";\n\nconst assertIntervals = (\n\tintervalCollection: IIntervalCollection<Interval>,\n\texpected: readonly { start: number; end: number }[],\n\toverlappingIntervalsIndex?: IOverlappingIntervalsIndex<Interval>,\n) => {\n\tconst actual = Array.from(intervalCollection);\n\tif (overlappingIntervalsIndex) {\n\t\tconst overlapping = overlappingIntervalsIndex.findOverlappingIntervals(\n\t\t\tNumber.NEGATIVE_INFINITY,\n\t\t\tNumber.POSITIVE_INFINITY,\n\t\t);\n\t\tassert.deepEqual(actual, overlapping, \"Interval search returned inconsistent results\");\n\t}\n\tassert.strictEqual(\n\t\tactual.length,\n\t\texpected.length,\n\t\t`the number of intervals must be consistent`,\n\t);\n\n\tconst actualPos = actual.map((interval) => {\n\t\tassert(interval);\n\t\treturn { start: interval.start, end: interval.end };\n\t});\n\tassert.deepEqual(actualPos, expected, \"intervals are not as expected\");\n};\n\nfunction createConnectedIntervalCollection(\n\tid: string,\n\truntimeFactory: MockContainerRuntimeFactoryForReconnection,\n): {\n\tintervals: SharedIntervalCollection;\n\tcontainerRuntime: MockContainerRuntimeForReconnection;\n};\nfunction createConnectedIntervalCollection(\n\tid: string,\n\truntimeFactory: MockContainerRuntimeFactory,\n): {\n\tintervals: SharedIntervalCollection;\n\tcontainerRuntime: MockContainerRuntime;\n};\nfunction createConnectedIntervalCollection(\n\tid: string,\n\truntimeFactory: MockContainerRuntimeFactory | MockContainerRuntimeFactoryForReconnection,\n) {\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\tconst intervals = new SharedIntervalCollection(\n\t\tid,\n\t\tdataStoreRuntime,\n\t\tSharedIntervalCollectionFactory.Attributes,\n\t);\n\tconst containerRuntime = runtimeFactory.createContainerRuntime(dataStoreRuntime);\n\tconst services = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(undefined),\n\t};\n\tintervals.connect(services);\n\tintervals.initializeLocal();\n\treturn { intervals, containerRuntime };\n}\n\ndescribe(\"SharedIntervalCollection\", () => {\n\tdescribe(\"In a connected state\", () => {\n\t\tlet runtimeFactory: MockContainerRuntimeFactory;\n\t\tlet intervals1: SharedIntervalCollection;\n\t\tlet intervals2: SharedIntervalCollection;\n\t\tlet collection1: IIntervalCollection<Interval>;\n\t\tlet collection2: IIntervalCollection<Interval>;\n\t\tlet overlappingIntervalsIndex1: IOverlappingIntervalsIndex<Interval>;\n\t\tlet overlappingIntervalsIndex2: IOverlappingIntervalsIndex<Interval>;\n\n\t\tbeforeEach(() => {\n\t\t\truntimeFactory = new MockContainerRuntimeFactory();\n\t\t\tintervals1 = createConnectedIntervalCollection(\n\t\t\t\t\"collection 1\",\n\t\t\t\truntimeFactory,\n\t\t\t).intervals;\n\t\t\tintervals2 = createConnectedIntervalCollection(\n\t\t\t\t\"collection 2\",\n\t\t\t\truntimeFactory,\n\t\t\t).intervals;\n\t\t\tcollection1 = intervals1.getIntervalCollection(\"test\");\n\t\t\tcollection2 = intervals2.getIntervalCollection(\"test\");\n\t\t\toverlappingIntervalsIndex1 = new OverlappingIntervalsIndex(\n\t\t\t\tundefined as unknown as Client,\n\t\t\t\tintervalHelpers,\n\t\t\t);\n\t\t\toverlappingIntervalsIndex2 = new OverlappingIntervalsIndex(\n\t\t\t\tundefined as unknown as Client,\n\t\t\t\tintervalHelpers,\n\t\t\t);\n\t\t\tcollection1.attachIndex(overlappingIntervalsIndex1);\n\t\t\tcollection2.attachIndex(overlappingIntervalsIndex2);\n\t\t});\n\n\t\tafterEach(() => {\n\t\t\tcollection1.detachIndex(overlappingIntervalsIndex1);\n\t\t\tcollection2.detachIndex(overlappingIntervalsIndex2);\n\t\t});\n\n\t\tit(\"Can add intervals from multiple clients\", () => {\n\t\t\tcollection1.add({ start: 0, end: 20 });\n\t\t\tcollection2.add({ start: 10, end: 30 });\n\t\t\tassertIntervals(collection1, [{ start: 0, end: 20 }], overlappingIntervalsIndex1);\n\t\t\tassertIntervals(collection2, [{ start: 10, end: 30 }], overlappingIntervalsIndex2);\n\n\t\t\tassert.equal(overlappingIntervalsIndex1.findOverlappingIntervals(1, 3).length, 1);\n\t\t\tassert.equal(overlappingIntervalsIndex2.findOverlappingIntervals(1, 3).length, 0);\n\t\t\tassert.equal(overlappingIntervalsIndex1.findOverlappingIntervals(1, 19).length, 1);\n\t\t\tassert.equal(overlappingIntervalsIndex2.findOverlappingIntervals(1, 19).length, 1);\n\n\t\t\truntimeFactory.processAllMessages();\n\t\t\tconst expected = [\n\t\t\t\t{ start: 0, end: 20 },\n\t\t\t\t{ start: 10, end: 30 },\n\t\t\t];\n\t\t\tassertIntervals(collection1, expected, overlappingIntervalsIndex1);\n\t\t\tassertIntervals(collection2, expected, overlappingIntervalsIndex2);\n\n\t\t\tassert.equal(overlappingIntervalsIndex1.findOverlappingIntervals(1, 3).length, 1);\n\t\t\tassert.equal(overlappingIntervalsIndex2.findOverlappingIntervals(1, 3).length, 1);\n\t\t\tassert.equal(overlappingIntervalsIndex1.findOverlappingIntervals(1, 19).length, 2);\n\t\t\tassert.equal(overlappingIntervalsIndex2.findOverlappingIntervals(1, 19).length, 2);\n\t\t});\n\n\t\tit(\"Can remove intervals that were added\", () => {\n\t\t\tconst interval = collection1.add({ start: 0, end: 20 });\n\t\t\tcollection2.add({ start: 10, end: 30 });\n\t\t\truntimeFactory.processAllMessages();\n\n\t\t\tconst id = interval.getIntervalId() ?? assert.fail(\"expected interval to have id\");\n\t\t\tcollection1.removeIntervalById(id);\n\t\t\tassertIntervals(collection1, [{ start: 10, end: 30 }], overlappingIntervalsIndex1);\n\t\t\tassertIntervals(\n\t\t\t\tcollection2,\n\t\t\t\t[\n\t\t\t\t\t{ start: 0, end: 20 },\n\t\t\t\t\t{ start: 10, end: 30 },\n\t\t\t\t],\n\t\t\t\toverlappingIntervalsIndex2,\n\t\t\t);\n\n\t\t\truntimeFactory.processAllMessages();\n\t\t\tassertIntervals(collection1, [{ start: 10, end: 30 }], overlappingIntervalsIndex1);\n\t\t\tassertIntervals(collection2, [{ start: 10, end: 30 }], overlappingIntervalsIndex2);\n\t\t});\n\n\t\tit(\"Can change intervals\", () => {\n\t\t\tconst interval = collection1.add({ start: 0, end: 20 });\n\t\t\tcollection2.add({ start: 10, end: 30 });\n\t\t\truntimeFactory.processAllMessages();\n\n\t\t\tconst id = interval.getIntervalId() ?? assert.fail(\"expected interval to have id\");\n\t\t\tcollection1.change(id, { start: 10, end: 20 });\n\t\t\tassertIntervals(\n\t\t\t\tcollection1,\n\t\t\t\t[\n\t\t\t\t\t{ start: 10, end: 20 },\n\t\t\t\t\t{ start: 10, end: 30 },\n\t\t\t\t],\n\t\t\t\toverlappingIntervalsIndex1,\n\t\t\t);\n\t\t\tassertIntervals(\n\t\t\t\tcollection2,\n\t\t\t\t[\n\t\t\t\t\t{ start: 0, end: 20 },\n\t\t\t\t\t{ start: 10, end: 30 },\n\t\t\t\t],\n\t\t\t\toverlappingIntervalsIndex2,\n\t\t\t);\n\n\t\t\truntimeFactory.processAllMessages();\n\t\t\tassertIntervals(\n\t\t\t\tcollection1,\n\t\t\t\t[\n\t\t\t\t\t{ start: 10, end: 20 },\n\t\t\t\t\t{ start: 10, end: 30 },\n\t\t\t\t],\n\t\t\t\toverlappingIntervalsIndex1,\n\t\t\t);\n\t\t\tassertIntervals(\n\t\t\t\tcollection2,\n\t\t\t\t[\n\t\t\t\t\t{ start: 10, end: 20 },\n\t\t\t\t\t{ start: 10, end: 30 },\n\t\t\t\t],\n\t\t\t\toverlappingIntervalsIndex2,\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"on reconnect\", () => {\n\t\tlet runtimeFactory: MockContainerRuntimeFactoryForReconnection;\n\t\tlet intervals1: SharedIntervalCollection;\n\t\tlet intervals2: SharedIntervalCollection;\n\t\tlet runtime1: MockContainerRuntimeForReconnection;\n\t\tlet collection1: IIntervalCollection<Interval>;\n\t\tlet collection2: IIntervalCollection<Interval>;\n\t\tlet overlappingIntervalsIndex1: IOverlappingIntervalsIndex<Interval>;\n\t\tlet overlappingIntervalsIndex2: IOverlappingIntervalsIndex<Interval>;\n\n\t\tbeforeEach(() => {\n\t\t\truntimeFactory = new MockContainerRuntimeFactoryForReconnection();\n\t\t\tconst client1 = createConnectedIntervalCollection(\"collection 1\", runtimeFactory);\n\t\t\truntime1 = client1.containerRuntime;\n\t\t\tintervals1 = client1.intervals;\n\t\t\tintervals2 = createConnectedIntervalCollection(\n\t\t\t\t\"collection 2\",\n\t\t\t\truntimeFactory,\n\t\t\t).intervals;\n\t\t\tcollection1 = intervals1.getIntervalCollection(\"test\");\n\t\t\tcollection2 = intervals2.getIntervalCollection(\"test\");\n\n\t\t\toverlappingIntervalsIndex1 = new OverlappingIntervalsIndex(\n\t\t\t\tundefined as unknown as Client,\n\t\t\t\tintervalHelpers,\n\t\t\t);\n\t\t\toverlappingIntervalsIndex2 = new OverlappingIntervalsIndex(\n\t\t\t\tundefined as unknown as Client,\n\t\t\t\tintervalHelpers,\n\t\t\t);\n\t\t\tcollection1.attachIndex(overlappingIntervalsIndex1);\n\t\t\tcollection2.attachIndex(overlappingIntervalsIndex2);\n\t\t});\n\n\t\tafterEach(() => {\n\t\t\tcollection1.detachIndex(overlappingIntervalsIndex1);\n\t\t\tcollection2.detachIndex(overlappingIntervalsIndex2);\n\t\t});\n\n\t\tit(\"can rebase add ops\", () => {\n\t\t\truntime1.connected = false;\n\t\t\tcollection1.add({ start: 15, end: 17 });\n\t\t\truntimeFactory.processAllMessages();\n\n\t\t\tassertIntervals(collection1, [{ start: 15, end: 17 }], overlappingIntervalsIndex1);\n\t\t\tassertIntervals(collection2, [], overlappingIntervalsIndex2);\n\n\t\t\truntime1.connected = true;\n\t\t\truntimeFactory.processAllMessages();\n\n\t\t\tassertIntervals(collection1, [{ start: 15, end: 17 }], overlappingIntervalsIndex1);\n\t\t\tassertIntervals(collection2, [{ start: 15, end: 17 }], overlappingIntervalsIndex2);\n\t\t});\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"sharedIntervalCollection.spec.js","sourceRoot":"","sources":["../../src/test/sharedIntervalCollection.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 { Client } from \"@fluidframework/merge-tree\";\nimport {\n\tMockContainerRuntime,\n\tMockContainerRuntimeFactory,\n\tMockContainerRuntimeFactoryForReconnection,\n\tMockContainerRuntimeForReconnection,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { IIntervalCollection } from \"../intervalCollection.js\";\nimport { IOverlappingIntervalsIndex, OverlappingIntervalsIndex } from \"../intervalIndex/index.js\";\nimport { Interval, intervalHelpers } from \"../intervals/index.js\";\nimport {\n\tSharedIntervalCollection,\n\tSharedIntervalCollectionFactory,\n} from \"../sharedIntervalCollection.js\";\n\nconst assertIntervals = (\n\tintervalCollection: IIntervalCollection<Interval>,\n\texpected: readonly { start: number; end: number }[],\n\toverlappingIntervalsIndex?: IOverlappingIntervalsIndex<Interval>,\n) => {\n\tconst actual = Array.from(intervalCollection);\n\tif (overlappingIntervalsIndex) {\n\t\tconst overlapping = overlappingIntervalsIndex.findOverlappingIntervals(\n\t\t\tNumber.NEGATIVE_INFINITY,\n\t\t\tNumber.POSITIVE_INFINITY,\n\t\t);\n\t\tassert.deepEqual(actual, overlapping, \"Interval search returned inconsistent results\");\n\t}\n\tassert.strictEqual(\n\t\tactual.length,\n\t\texpected.length,\n\t\t`the number of intervals must be consistent`,\n\t);\n\n\tconst actualPos = actual.map((interval) => {\n\t\tassert(interval);\n\t\treturn { start: interval.start, end: interval.end };\n\t});\n\tassert.deepEqual(actualPos, expected, \"intervals are not as expected\");\n};\n\nfunction createConnectedIntervalCollection(\n\tid: string,\n\truntimeFactory: MockContainerRuntimeFactoryForReconnection,\n): {\n\tintervals: SharedIntervalCollection;\n\tcontainerRuntime: MockContainerRuntimeForReconnection;\n};\nfunction createConnectedIntervalCollection(\n\tid: string,\n\truntimeFactory: MockContainerRuntimeFactory,\n): {\n\tintervals: SharedIntervalCollection;\n\tcontainerRuntime: MockContainerRuntime;\n};\nfunction createConnectedIntervalCollection(\n\tid: string,\n\truntimeFactory: MockContainerRuntimeFactory | MockContainerRuntimeFactoryForReconnection,\n) {\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\tconst intervals = new SharedIntervalCollection(\n\t\tid,\n\t\tdataStoreRuntime,\n\t\tSharedIntervalCollectionFactory.Attributes,\n\t);\n\tconst containerRuntime = runtimeFactory.createContainerRuntime(dataStoreRuntime);\n\tconst services = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(undefined),\n\t};\n\tintervals.connect(services);\n\tintervals.initializeLocal();\n\treturn { intervals, containerRuntime };\n}\n\ndescribe(\"SharedIntervalCollection\", () => {\n\tdescribe(\"In a connected state\", () => {\n\t\tlet runtimeFactory: MockContainerRuntimeFactory;\n\t\tlet intervals1: SharedIntervalCollection;\n\t\tlet intervals2: SharedIntervalCollection;\n\t\tlet collection1: IIntervalCollection<Interval>;\n\t\tlet collection2: IIntervalCollection<Interval>;\n\t\tlet overlappingIntervalsIndex1: IOverlappingIntervalsIndex<Interval>;\n\t\tlet overlappingIntervalsIndex2: IOverlappingIntervalsIndex<Interval>;\n\n\t\tbeforeEach(() => {\n\t\t\truntimeFactory = new MockContainerRuntimeFactory();\n\t\t\tintervals1 = createConnectedIntervalCollection(\n\t\t\t\t\"collection 1\",\n\t\t\t\truntimeFactory,\n\t\t\t).intervals;\n\t\t\tintervals2 = createConnectedIntervalCollection(\n\t\t\t\t\"collection 2\",\n\t\t\t\truntimeFactory,\n\t\t\t).intervals;\n\t\t\tcollection1 = intervals1.getIntervalCollection(\"test\");\n\t\t\tcollection2 = intervals2.getIntervalCollection(\"test\");\n\t\t\toverlappingIntervalsIndex1 = new OverlappingIntervalsIndex(\n\t\t\t\tundefined as unknown as Client,\n\t\t\t\tintervalHelpers,\n\t\t\t);\n\t\t\toverlappingIntervalsIndex2 = new OverlappingIntervalsIndex(\n\t\t\t\tundefined as unknown as Client,\n\t\t\t\tintervalHelpers,\n\t\t\t);\n\t\t\tcollection1.attachIndex(overlappingIntervalsIndex1);\n\t\t\tcollection2.attachIndex(overlappingIntervalsIndex2);\n\t\t});\n\n\t\tafterEach(() => {\n\t\t\tcollection1.detachIndex(overlappingIntervalsIndex1);\n\t\t\tcollection2.detachIndex(overlappingIntervalsIndex2);\n\t\t});\n\n\t\tit(\"Can add intervals from multiple clients\", () => {\n\t\t\tcollection1.add({ start: 0, end: 20 });\n\t\t\tcollection2.add({ start: 10, end: 30 });\n\t\t\tassertIntervals(collection1, [{ start: 0, end: 20 }], overlappingIntervalsIndex1);\n\t\t\tassertIntervals(collection2, [{ start: 10, end: 30 }], overlappingIntervalsIndex2);\n\n\t\t\tassert.equal(overlappingIntervalsIndex1.findOverlappingIntervals(1, 3).length, 1);\n\t\t\tassert.equal(overlappingIntervalsIndex2.findOverlappingIntervals(1, 3).length, 0);\n\t\t\tassert.equal(overlappingIntervalsIndex1.findOverlappingIntervals(1, 19).length, 1);\n\t\t\tassert.equal(overlappingIntervalsIndex2.findOverlappingIntervals(1, 19).length, 1);\n\n\t\t\truntimeFactory.processAllMessages();\n\t\t\tconst expected = [\n\t\t\t\t{ start: 0, end: 20 },\n\t\t\t\t{ start: 10, end: 30 },\n\t\t\t];\n\t\t\tassertIntervals(collection1, expected, overlappingIntervalsIndex1);\n\t\t\tassertIntervals(collection2, expected, overlappingIntervalsIndex2);\n\n\t\t\tassert.equal(overlappingIntervalsIndex1.findOverlappingIntervals(1, 3).length, 1);\n\t\t\tassert.equal(overlappingIntervalsIndex2.findOverlappingIntervals(1, 3).length, 1);\n\t\t\tassert.equal(overlappingIntervalsIndex1.findOverlappingIntervals(1, 19).length, 2);\n\t\t\tassert.equal(overlappingIntervalsIndex2.findOverlappingIntervals(1, 19).length, 2);\n\t\t});\n\n\t\tit(\"Can remove intervals that were added\", () => {\n\t\t\tconst interval = collection1.add({ start: 0, end: 20 });\n\t\t\tcollection2.add({ start: 10, end: 30 });\n\t\t\truntimeFactory.processAllMessages();\n\n\t\t\tconst id = interval.getIntervalId() ?? assert.fail(\"expected interval to have id\");\n\t\t\tcollection1.removeIntervalById(id);\n\t\t\tassertIntervals(collection1, [{ start: 10, end: 30 }], overlappingIntervalsIndex1);\n\t\t\tassertIntervals(\n\t\t\t\tcollection2,\n\t\t\t\t[\n\t\t\t\t\t{ start: 0, end: 20 },\n\t\t\t\t\t{ start: 10, end: 30 },\n\t\t\t\t],\n\t\t\t\toverlappingIntervalsIndex2,\n\t\t\t);\n\n\t\t\truntimeFactory.processAllMessages();\n\t\t\tassertIntervals(collection1, [{ start: 10, end: 30 }], overlappingIntervalsIndex1);\n\t\t\tassertIntervals(collection2, [{ start: 10, end: 30 }], overlappingIntervalsIndex2);\n\t\t});\n\n\t\tit(\"Can change intervals\", () => {\n\t\t\tconst interval = collection1.add({ start: 0, end: 20 });\n\t\t\tcollection2.add({ start: 10, end: 30 });\n\t\t\truntimeFactory.processAllMessages();\n\n\t\t\tconst id = interval.getIntervalId() ?? assert.fail(\"expected interval to have id\");\n\t\t\tcollection1.change(id, { start: 10, end: 20 });\n\t\t\tassertIntervals(\n\t\t\t\tcollection1,\n\t\t\t\t[\n\t\t\t\t\t{ start: 10, end: 20 },\n\t\t\t\t\t{ start: 10, end: 30 },\n\t\t\t\t],\n\t\t\t\toverlappingIntervalsIndex1,\n\t\t\t);\n\t\t\tassertIntervals(\n\t\t\t\tcollection2,\n\t\t\t\t[\n\t\t\t\t\t{ start: 0, end: 20 },\n\t\t\t\t\t{ start: 10, end: 30 },\n\t\t\t\t],\n\t\t\t\toverlappingIntervalsIndex2,\n\t\t\t);\n\n\t\t\truntimeFactory.processAllMessages();\n\t\t\tassertIntervals(\n\t\t\t\tcollection1,\n\t\t\t\t[\n\t\t\t\t\t{ start: 10, end: 20 },\n\t\t\t\t\t{ start: 10, end: 30 },\n\t\t\t\t],\n\t\t\t\toverlappingIntervalsIndex1,\n\t\t\t);\n\t\t\tassertIntervals(\n\t\t\t\tcollection2,\n\t\t\t\t[\n\t\t\t\t\t{ start: 10, end: 20 },\n\t\t\t\t\t{ start: 10, end: 30 },\n\t\t\t\t],\n\t\t\t\toverlappingIntervalsIndex2,\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"on reconnect\", () => {\n\t\tlet runtimeFactory: MockContainerRuntimeFactoryForReconnection;\n\t\tlet intervals1: SharedIntervalCollection;\n\t\tlet intervals2: SharedIntervalCollection;\n\t\tlet runtime1: MockContainerRuntimeForReconnection;\n\t\tlet collection1: IIntervalCollection<Interval>;\n\t\tlet collection2: IIntervalCollection<Interval>;\n\t\tlet overlappingIntervalsIndex1: IOverlappingIntervalsIndex<Interval>;\n\t\tlet overlappingIntervalsIndex2: IOverlappingIntervalsIndex<Interval>;\n\n\t\tbeforeEach(() => {\n\t\t\truntimeFactory = new MockContainerRuntimeFactoryForReconnection();\n\t\t\tconst client1 = createConnectedIntervalCollection(\"collection 1\", runtimeFactory);\n\t\t\truntime1 = client1.containerRuntime;\n\t\t\tintervals1 = client1.intervals;\n\t\t\tintervals2 = createConnectedIntervalCollection(\n\t\t\t\t\"collection 2\",\n\t\t\t\truntimeFactory,\n\t\t\t).intervals;\n\t\t\tcollection1 = intervals1.getIntervalCollection(\"test\");\n\t\t\tcollection2 = intervals2.getIntervalCollection(\"test\");\n\n\t\t\toverlappingIntervalsIndex1 = new OverlappingIntervalsIndex(\n\t\t\t\tundefined as unknown as Client,\n\t\t\t\tintervalHelpers,\n\t\t\t);\n\t\t\toverlappingIntervalsIndex2 = new OverlappingIntervalsIndex(\n\t\t\t\tundefined as unknown as Client,\n\t\t\t\tintervalHelpers,\n\t\t\t);\n\t\t\tcollection1.attachIndex(overlappingIntervalsIndex1);\n\t\t\tcollection2.attachIndex(overlappingIntervalsIndex2);\n\t\t});\n\n\t\tafterEach(() => {\n\t\t\tcollection1.detachIndex(overlappingIntervalsIndex1);\n\t\t\tcollection2.detachIndex(overlappingIntervalsIndex2);\n\t\t});\n\n\t\tit(\"can rebase add ops\", () => {\n\t\t\truntime1.connected = false;\n\t\t\tcollection1.add({ start: 15, end: 17 });\n\t\t\truntimeFactory.processAllMessages();\n\n\t\t\tassertIntervals(collection1, [{ start: 15, end: 17 }], overlappingIntervalsIndex1);\n\t\t\tassertIntervals(collection2, [], overlappingIntervalsIndex2);\n\n\t\t\truntime1.connected = true;\n\t\t\truntimeFactory.processAllMessages();\n\n\t\t\tassertIntervals(collection1, [{ start: 15, end: 17 }], overlappingIntervalsIndex1);\n\t\t\tassertIntervals(collection2, [{ start: 15, end: 17 }], overlappingIntervalsIndex2);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { strict as assert } from "assert";
|
|
6
|
-
import { appendToMergeTreeDeltaRevertibles, matchProperties, ReferenceType, reservedMarkerIdKey, reservedMarkerSimpleTypeKey, reservedTileLabelsKey, revertMergeTreeDeltaRevertibles, } from "@fluidframework/merge-tree";
|
|
7
|
-
import { MockFluidDataStoreRuntime, MockContainerRuntimeFactory, MockContainerRuntimeFactoryForReconnection, MockEmptyDeltaConnection, MockStorage, validateAssertionError, } from "@fluidframework/test-runtime-utils";
|
|
8
6
|
import { AttachState } from "@fluidframework/container-definitions";
|
|
9
|
-
import {
|
|
7
|
+
import { ReferenceType, appendToMergeTreeDeltaRevertibles, matchProperties, reservedMarkerIdKey, reservedMarkerSimpleTypeKey, reservedTileLabelsKey, revertMergeTreeDeltaRevertibles, } from "@fluidframework/merge-tree";
|
|
8
|
+
import { MockContainerRuntimeFactory, MockContainerRuntimeFactoryForReconnection, MockEmptyDeltaConnection, MockFluidDataStoreRuntime, MockStorage, validateAssertionError, } from "@fluidframework/test-runtime-utils";
|
|
10
9
|
import { SharedStringFactory } from "../sequenceFactory.js";
|
|
10
|
+
import { SharedString, getTextAndMarkers } from "../sharedString.js";
|
|
11
11
|
describe("SharedString", () => {
|
|
12
12
|
let sharedString;
|
|
13
13
|
let dataStoreRuntime1;
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"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 { AttachState } from \"@fluidframework/container-definitions\";\nimport { IChannelServices } from \"@fluidframework/datastore-definitions\";\nimport {\n\tMarker,\n\tMergeTreeDeltaRevertible,\n\tReferenceType,\n\tappendToMergeTreeDeltaRevertibles,\n\tmatchProperties,\n\treservedMarkerIdKey,\n\treservedMarkerSimpleTypeKey,\n\treservedTileLabelsKey,\n\trevertMergeTreeDeltaRevertibles,\n} from \"@fluidframework/merge-tree\";\nimport { ISummaryTree } from \"@fluidframework/protocol-definitions\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockContainerRuntimeFactoryForReconnection,\n\tMockContainerRuntimeForReconnection,\n\tMockEmptyDeltaConnection,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n\tvalidateAssertionError,\n} from \"@fluidframework/test-runtime-utils\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { SharedString, getTextAndMarkers } from \"../sharedString.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"]}
|
|
@@ -6,10 +6,10 @@ import { strict as assert } from "assert";
|
|
|
6
6
|
import fs from "fs";
|
|
7
7
|
import path from "path";
|
|
8
8
|
import { MockContainerRuntimeFactory, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
|
|
9
|
-
import { SharedString } from "../sharedString.js";
|
|
10
9
|
import { SharedStringFactory } from "../sequenceFactory.js";
|
|
11
|
-
import {
|
|
10
|
+
import { SharedString } from "../sharedString.js";
|
|
12
11
|
import { _dirname } from "./dirname.cjs";
|
|
12
|
+
import { LocationBase } from "./generateSharedStrings.js";
|
|
13
13
|
describe("SharedString Snapshot Version - Empty Props", () => {
|
|
14
14
|
let filebase;
|
|
15
15
|
before(() => {
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,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 { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { SharedString } from \"../sharedString.js\";\nimport { _dirname } from \"./dirname.cjs\";\nimport { LocationBase } from \"./generateSharedStrings.js\";\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"]}
|
|
@@ -7,10 +7,10 @@ import fs from "fs";
|
|
|
7
7
|
import path from "path";
|
|
8
8
|
import { convertSummaryTreeToITree } from "@fluidframework/runtime-utils";
|
|
9
9
|
import { MockContainerRuntimeFactory, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
|
|
10
|
-
import { SharedString } from "../sharedString.js";
|
|
11
10
|
import { SharedStringFactory } from "../sequenceFactory.js";
|
|
12
|
-
import {
|
|
11
|
+
import { SharedString } from "../sharedString.js";
|
|
13
12
|
import { _dirname } from "./dirname.cjs";
|
|
13
|
+
import { LocationBase, generateStrings } from "./generateSharedStrings.js";
|
|
14
14
|
function assertIntervalCollectionsAreEquivalent(actual, expected, message) {
|
|
15
15
|
assert.deepEqual(Array.from(actual.getIntervalCollectionLabels()), Array.from(expected.getIntervalCollectionLabels()), message);
|
|
16
16
|
for (const label of actual.getIntervalCollectionLabels()) {
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"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 { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { SharedString } from \"../sharedString.js\";\nimport { _dirname } from \"./dirname.cjs\";\nimport { LocationBase, generateStrings } from \"./generateSharedStrings.js\";\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subSequence.spec.js","sourceRoot":"","sources":["../../src/test/subSequence.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD,OAAO,
|
|
1
|
+
{"version":3,"file":"subSequence.spec.js","sourceRoot":"","sources":["../../src/test/subSequence.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 { assert } from \"@fluidframework/core-utils\";\nimport { Serializable } from \"@fluidframework/datastore-definitions\";\nimport {\n\tPropertySet,\n\tcreateInsertSegmentOp,\n\tcreateRemoveRangeOp,\n} from \"@fluidframework/merge-tree\";\n// eslint-disable-next-line import/no-internal-modules\nimport { TestClient } from \"@fluidframework/merge-tree/test\";\nimport { SubSequence } from \"../sharedSequence.js\";\n\nconst clientNames = [\"Ed\", \"Ted\", \"Ned\", \"Harv\", \"Marv\", \"Glenda\", \"Susan\"];\nconst verbose = true;\n\nclass SubSequenceTestClient extends TestClient {\n\tconstructor() {\n\t\tsuper(undefined, (spec) => {\n\t\t\tconst subSequence = SubSequence.fromJSONObject(spec);\n\t\t\tassert(subSequence !== undefined, \"expected `spec` to be a valid `SubSequence`\");\n\t\t\treturn subSequence;\n\t\t});\n\t}\n\n\tpublic insertItemsRemote<T>(\n\t\tpos: number,\n\t\titems: Serializable<T>[],\n\t\tprops: PropertySet | undefined,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t) {\n\t\tconst segment = new SubSequence(items);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createInsertSegmentOp(pos, segment), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic relItems(clientId: number, refSeq: number) {\n\t\tlet items: string = \"\";\n\n\t\tthis.walkSegments(\n\t\t\t(s) => {\n\t\t\t\tif (SubSequence.is(s)) {\n\t\t\t\t\titems += s.items.toString();\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\t0,\n\t\t\tthis.getLength(),\n\t\t);\n\n\t\treturn `cli: ${this.getLongClientId(clientId)} refSeq: ${refSeq}: ${items}`;\n\t}\n}\n\ndescribe(\"SubSequence\", () => {\n\tit(\"firstItemTest\", () => {\n\t\tconst cli = new SubSequenceTestClient();\n\t\tcli.startOrUpdateCollaboration(\"Fred1\");\n\t\tfor (const cname of clientNames) {\n\t\t\tcli.addLongClientId(cname);\n\t\t}\n\t\tcli.insertItemsRemote(0, [2, 11], undefined, 1, 0, \"1\");\n\n\t\tif (verbose) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\t\tconsole.log(cli.mergeTree.toString());\n\t\t}\n\t\tcli.insertItemsRemote(0, [4, 5, 6], undefined, 2, 0, \"2\");\n\t\tif (verbose) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\t\tconsole.log(cli.mergeTree.toString());\n\t\t}\n\t\tconst segment = new SubSequence<number>([3, 4, 1, 1]);\n\t\tconst insert = cli.insertSegmentLocal(4, segment);\n\t\tif (verbose) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\t\tconsole.log(cli.mergeTree.toString());\n\t\t}\n\t\tif (verbose) {\n\t\t\tfor (let i = 0; i < 4; i++) {\n\t\t\t\tfor (let j = 0; j < 3; j++) {\n\t\t\t\t\tconsole.log(cli.relItems(i, j));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcli.applyMsg(cli.makeOpMessage(insert, 3));\n\t\tcli.insertItemsRemote(5, [1, 5, 6, 2, 3], undefined, 4, 2, \"2\");\n\t\tcli.insertItemsRemote(0, [9], undefined, 5, 0, \"2\");\n\t\tif (verbose) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\t\tconsole.log(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 6; refSeq++) {\n\t\t\t\t\tconsole.log(cli.relItems(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(3, 6), 6, 5, \"3\"));\n\t\tif (verbose) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\t\tconsole.log(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 7; refSeq++) {\n\t\t\t\t\tconsole.log(cli.relItems(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n});\n"]}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { IntervalCollectionMap } from "../intervalCollectionMap.js";
|
|
6
5
|
import { IntervalCollection, makeOpsMap, } from "../intervalCollection.js";
|
|
6
|
+
import { IntervalCollectionMap } from "../intervalCollectionMap.js";
|
|
7
7
|
import { createSequenceInterval, } from "../intervals/index.js";
|
|
8
8
|
import { pkgVersion } from "../packageVersion.js";
|
|
9
9
|
import { SharedString } from "../sharedString.js";
|