@fluidframework/sequence 2.0.0-rc.2.0.2 → 2.0.0-rc.3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/README.md +1 -1
- package/api-report/sequence.api.md +32 -32
- package/beta.d.ts +11 -0
- package/dist/{localValues.d.ts → IntervalCollectionValues.d.ts} +13 -12
- package/dist/IntervalCollectionValues.d.ts.map +1 -0
- package/dist/{localValues.js → IntervalCollectionValues.js} +6 -6
- package/dist/IntervalCollectionValues.js.map +1 -0
- package/dist/beta.d.ts +12 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/dist/intervalCollection.d.ts +10 -10
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +103 -99
- package/dist/intervalCollection.js.map +1 -1
- package/dist/{defaultMap.d.ts → intervalCollectionMap.d.ts} +11 -44
- package/dist/intervalCollectionMap.d.ts.map +1 -0
- package/dist/{defaultMap.js → intervalCollectionMap.js} +15 -70
- package/dist/intervalCollectionMap.js.map +1 -0
- package/dist/{defaultMapInterfaces.d.ts → intervalCollectionMapInterfaces.d.ts} +17 -16
- package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -0
- package/dist/{defaultMapInterfaces.js → intervalCollectionMapInterfaces.js} +1 -1
- package/dist/intervalCollectionMapInterfaces.js.map +1 -0
- package/dist/intervalIndex/endpointInRangeIndex.d.ts +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.js +3 -3
- package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/dist/intervalIndex/endpointIndex.d.ts +1 -1
- package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointIndex.js +3 -3
- package/dist/intervalIndex/endpointIndex.js.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.js +3 -3
- package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +3 -3
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.js +2 -3
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +6 -6
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.d.ts +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.js +3 -3
- package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/dist/intervalTree.d.ts +1 -1
- package/dist/intervalTree.d.ts.map +1 -1
- package/dist/intervalTree.js +2 -2
- package/dist/intervalTree.js.map +1 -1
- package/dist/intervals/interval.d.ts +1 -1
- package/dist/intervals/interval.d.ts.map +1 -1
- package/dist/intervals/interval.js +10 -10
- package/dist/intervals/interval.js.map +1 -1
- package/dist/intervals/intervalUtils.d.ts +1 -1
- package/dist/intervals/intervalUtils.d.ts.map +1 -1
- package/dist/intervals/intervalUtils.js +5 -5
- package/dist/intervals/intervalUtils.js.map +1 -1
- package/dist/intervals/sequenceInterval.d.ts +1 -1
- package/dist/intervals/sequenceInterval.d.ts.map +1 -1
- package/dist/intervals/sequenceInterval.js +34 -34
- package/dist/intervals/sequenceInterval.js.map +1 -1
- package/dist/legacy.d.ts +61 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/public.d.ts +12 -0
- package/dist/revertibles.d.ts +2 -2
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +34 -34
- package/dist/revertibles.js.map +1 -1
- package/dist/sequence.d.ts +7 -6
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +34 -34
- package/dist/sequence.js.map +1 -1
- package/dist/sequenceDeltaEvent.d.ts +1 -1
- package/dist/sequenceDeltaEvent.d.ts.map +1 -1
- package/dist/sequenceDeltaEvent.js +4 -4
- package/dist/sequenceDeltaEvent.js.map +1 -1
- package/dist/sequenceFactory.d.ts +1 -1
- package/dist/sequenceFactory.d.ts.map +1 -1
- package/dist/sequenceFactory.js +3 -3
- package/dist/sequenceFactory.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +4 -3
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/sharedIntervalCollection.js +5 -5
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/dist/sharedSequence.d.ts +3 -2
- package/dist/sharedSequence.d.ts.map +1 -1
- package/dist/sharedSequence.js +4 -4
- package/dist/sharedSequence.js.map +1 -1
- package/dist/sharedString.d.ts +2 -2
- package/dist/sharedString.d.ts.map +1 -1
- package/dist/sharedString.js +9 -9
- package/dist/sharedString.js.map +1 -1
- package/internal.d.ts +11 -0
- package/legacy.d.ts +11 -0
- package/lib/{localValues.d.ts → IntervalCollectionValues.d.ts} +13 -12
- package/lib/IntervalCollectionValues.d.ts.map +1 -0
- package/lib/{localValues.js → IntervalCollectionValues.js} +3 -3
- package/lib/IntervalCollectionValues.js.map +1 -0
- package/lib/beta.d.ts +12 -0
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/intervalCollection.d.ts +10 -10
- package/lib/intervalCollection.d.ts.map +1 -1
- package/lib/intervalCollection.js +8 -4
- package/lib/intervalCollection.js.map +1 -1
- package/lib/{defaultMap.d.ts → intervalCollectionMap.d.ts} +11 -44
- package/lib/intervalCollectionMap.d.ts.map +1 -0
- package/lib/{defaultMap.js → intervalCollectionMap.js} +8 -63
- package/lib/intervalCollectionMap.js.map +1 -0
- package/lib/{defaultMapInterfaces.d.ts → intervalCollectionMapInterfaces.d.ts} +17 -16
- package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -0
- package/lib/{defaultMapInterfaces.js → intervalCollectionMapInterfaces.js} +1 -1
- package/lib/intervalCollectionMapInterfaces.js.map +1 -0
- package/lib/intervalIndex/endpointInRangeIndex.d.ts +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.js +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/lib/intervalIndex/endpointIndex.d.ts +1 -1
- package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
- package/lib/intervalIndex/endpointIndex.js +1 -1
- package/lib/intervalIndex/endpointIndex.js.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.js +1 -1
- package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +3 -3
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.js +2 -3
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +2 -2
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.d.ts +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.js +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/lib/intervalTree.d.ts +1 -1
- package/lib/intervalTree.d.ts.map +1 -1
- package/lib/intervalTree.js +1 -1
- package/lib/intervalTree.js.map +1 -1
- package/lib/intervals/interval.d.ts +1 -1
- package/lib/intervals/interval.d.ts.map +1 -1
- package/lib/intervals/interval.js +3 -3
- package/lib/intervals/interval.js.map +1 -1
- package/lib/intervals/intervalUtils.d.ts +1 -1
- package/lib/intervals/intervalUtils.d.ts.map +1 -1
- package/lib/intervals/intervalUtils.js +1 -1
- package/lib/intervals/intervalUtils.js.map +1 -1
- package/lib/intervals/sequenceInterval.d.ts +1 -1
- package/lib/intervals/sequenceInterval.d.ts.map +1 -1
- package/lib/intervals/sequenceInterval.js +3 -3
- package/lib/intervals/sequenceInterval.js.map +1 -1
- package/lib/legacy.d.ts +61 -0
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/public.d.ts +12 -0
- package/lib/revertibles.d.ts +2 -2
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +3 -4
- package/lib/revertibles.js.map +1 -1
- package/lib/sequence.d.ts +7 -6
- package/lib/sequence.d.ts.map +1 -1
- package/lib/sequence.js +11 -12
- package/lib/sequence.js.map +1 -1
- package/lib/sequenceDeltaEvent.d.ts +1 -1
- package/lib/sequenceDeltaEvent.d.ts.map +1 -1
- package/lib/sequenceDeltaEvent.js +3 -4
- package/lib/sequenceDeltaEvent.js.map +1 -1
- package/lib/sequenceFactory.d.ts +1 -1
- package/lib/sequenceFactory.d.ts.map +1 -1
- package/lib/sequenceFactory.js +1 -1
- package/lib/sequenceFactory.js.map +1 -1
- package/lib/sharedIntervalCollection.d.ts +4 -3
- package/lib/sharedIntervalCollection.d.ts.map +1 -1
- package/lib/sharedIntervalCollection.js +4 -4
- package/lib/sharedIntervalCollection.js.map +1 -1
- package/lib/sharedSequence.d.ts +3 -2
- package/lib/sharedSequence.d.ts.map +1 -1
- package/lib/sharedSequence.js +2 -2
- package/lib/sharedSequence.js.map +1 -1
- package/lib/sharedString.d.ts +2 -2
- package/lib/sharedString.d.ts.map +1 -1
- package/lib/sharedString.js +1 -1
- package/lib/sharedString.js.map +1 -1
- package/package.json +41 -58
- package/src/{localValues.ts → IntervalCollectionValues.ts} +26 -18
- package/src/index.ts +2 -2
- package/src/intervalCollection.ts +46 -47
- package/src/{defaultMap.ts → intervalCollectionMap.ts} +42 -105
- package/src/{defaultMapInterfaces.ts → intervalCollectionMapInterfaces.ts} +26 -16
- package/src/intervalIndex/endpointInRangeIndex.ts +4 -1
- package/src/intervalIndex/endpointIndex.ts +4 -1
- package/src/intervalIndex/idIntervalIndex.ts +4 -2
- package/src/intervalIndex/overlappingIntervalsIndex.ts +8 -5
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +6 -3
- package/src/intervalIndex/sequenceIntervalIndexes.ts +3 -1
- package/src/intervalIndex/startpointInRangeIndex.ts +4 -1
- package/src/intervalTree.ts +4 -3
- package/src/intervals/interval.ts +6 -3
- package/src/intervals/intervalUtils.ts +4 -2
- package/src/intervals/sequenceInterval.ts +5 -3
- package/src/packageVersion.ts +1 -1
- package/src/revertibles.ts +10 -10
- package/src/sequence.ts +24 -31
- package/src/sequenceDeltaEvent.ts +3 -4
- package/src/sequenceFactory.ts +4 -3
- package/src/sharedIntervalCollection.ts +12 -18
- package/src/sharedSequence.ts +9 -6
- package/src/sharedString.ts +4 -3
- package/api-extractor-cjs.json +0 -8
- package/dist/defaultMap.d.ts.map +0 -1
- package/dist/defaultMap.js.map +0 -1
- package/dist/defaultMapInterfaces.d.ts.map +0 -1
- package/dist/defaultMapInterfaces.js.map +0 -1
- package/dist/localValues.d.ts.map +0 -1
- package/dist/localValues.js.map +0 -1
- package/dist/sequence-alpha.d.ts +0 -1432
- package/dist/sequence-beta.d.ts +0 -246
- package/dist/sequence-public.d.ts +0 -246
- package/dist/sequence-untrimmed.d.ts +0 -1820
- package/lib/defaultMap.d.ts.map +0 -1
- package/lib/defaultMap.js.map +0 -1
- package/lib/defaultMapInterfaces.d.ts.map +0 -1
- package/lib/defaultMapInterfaces.js.map +0 -1
- package/lib/localValues.d.ts.map +0 -1
- package/lib/localValues.js.map +0 -1
- package/lib/sequence-alpha.d.ts +0 -1432
- package/lib/sequence-beta.d.ts +0 -246
- package/lib/sequence-public.d.ts +0 -246
- package/lib/sequence-untrimmed.d.ts +0 -1820
- package/lib/test/collections.intervalTree.js +0 -73
- package/lib/test/collections.intervalTree.js.map +0 -1
- package/lib/test/createSnapshotFiles.js +0 -15
- package/lib/test/createSnapshotFiles.js.map +0 -1
- package/lib/test/dirname.cjs +0 -16
- package/lib/test/dirname.cjs.map +0 -1
- package/lib/test/endpointInRangeIndex.spec.js +0 -182
- package/lib/test/endpointInRangeIndex.spec.js.map +0 -1
- package/lib/test/fuzz/fuzzUtils.js +0 -250
- package/lib/test/fuzz/fuzzUtils.js.map +0 -1
- package/lib/test/fuzz/intervalCollection.fuzz.spec.js +0 -200
- package/lib/test/fuzz/intervalCollection.fuzz.spec.js.map +0 -1
- package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js +0 -129
- package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js.map +0 -1
- package/lib/test/fuzz/sharedString.fuzz.spec.js +0 -91
- package/lib/test/fuzz/sharedString.fuzz.spec.js.map +0 -1
- package/lib/test/generateSharedStrings.js +0 -138
- package/lib/test/generateSharedStrings.js.map +0 -1
- package/lib/test/intervalCollection.detached.spec.js +0 -126
- package/lib/test/intervalCollection.detached.spec.js.map +0 -1
- package/lib/test/intervalCollection.events.spec.js +0 -491
- package/lib/test/intervalCollection.events.spec.js.map +0 -1
- package/lib/test/intervalCollection.perf.spec.js +0 -88
- package/lib/test/intervalCollection.perf.spec.js.map +0 -1
- package/lib/test/intervalCollection.snapshot.spec.js +0 -171
- package/lib/test/intervalCollection.snapshot.spec.js.map +0 -1
- package/lib/test/intervalCollection.spec.js +0 -1660
- package/lib/test/intervalCollection.spec.js.map +0 -1
- package/lib/test/intervalIndexTestUtils.js +0 -49
- package/lib/test/intervalIndexTestUtils.js.map +0 -1
- package/lib/test/intervalRebasing.spec.js +0 -589
- package/lib/test/intervalRebasing.spec.js.map +0 -1
- package/lib/test/intervalStashedOps.spec.js +0 -142
- package/lib/test/intervalStashedOps.spec.js.map +0 -1
- package/lib/test/intervalTestUtils.js +0 -81
- package/lib/test/intervalTestUtils.js.map +0 -1
- package/lib/test/marshalling.spec.js +0 -55
- package/lib/test/marshalling.spec.js.map +0 -1
- package/lib/test/memory/sharedSequence.spec.js +0 -82
- package/lib/test/memory/sharedSequence.spec.js.map +0 -1
- package/lib/test/memory/sharedString.spec.js +0 -134
- package/lib/test/memory/sharedString.spec.js.map +0 -1
- package/lib/test/overlappingSequenceIntervalsIndex.spec.js +0 -348
- package/lib/test/overlappingSequenceIntervalsIndex.spec.js.map +0 -1
- package/lib/test/partialLoad.spec.js +0 -211
- package/lib/test/partialLoad.spec.js.map +0 -1
- package/lib/test/rebasing.spec.js +0 -81
- package/lib/test/rebasing.spec.js.map +0 -1
- package/lib/test/reentrancy.spec.js +0 -174
- package/lib/test/reentrancy.spec.js.map +0 -1
- package/lib/test/revertibles.spec.js +0 -971
- package/lib/test/revertibles.spec.js.map +0 -1
- package/lib/test/sequenceDeltaEvent.spec.js +0 -2144
- package/lib/test/sequenceDeltaEvent.spec.js.map +0 -1
- package/lib/test/sharedIntervalCollection.spec.js +0 -159
- package/lib/test/sharedIntervalCollection.spec.js.map +0 -1
- package/lib/test/sharedString.spec.js +0 -532
- package/lib/test/sharedString.spec.js.map +0 -1
- package/lib/test/snapshotEmptyProps.spec.js +0 -45
- package/lib/test/snapshotEmptyProps.spec.js.map +0 -1
- package/lib/test/snapshotVersion.spec.js +0 -149
- package/lib/test/snapshotVersion.spec.js.map +0 -1
- package/lib/test/startpointInRangeIndex.spec.js +0 -182
- package/lib/test/startpointInRangeIndex.spec.js.map +0 -1
- package/lib/test/subSequence.spec.js +0 -92
- package/lib/test/subSequence.spec.js.map +0 -1
- package/lib/test/types/validateSequencePrevious.generated.js +0 -162
- package/lib/test/types/validateSequencePrevious.generated.js.map +0 -1
- package/lib/test/v1IntervalCollectionHelpers.js +0 -93
- package/lib/test/v1IntervalCollectionHelpers.js.map +0 -1
- /package/{dist → lib}/tsdoc-metadata.json +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intervalRebasing.spec.js","sourceRoot":"","sources":["../../src/test/intervalRebasing.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { IChannelServices } from \"@fluidframework/datastore-definitions\";\nimport {\n\tMockContainerRuntimeFactoryForReconnection,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\n// eslint-disable-next-line import/no-internal-modules\nimport { useStrictPartialLengthChecks } from \"@fluidframework/merge-tree/test\";\nimport { SharedString } from \"../sharedString.js\";\nimport { IntervalStickiness } from \"../intervals/index.js\";\nimport { Side } from \"../intervalCollection.js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { assertConsistent, assertSequenceIntervals, Client } from \"./intervalTestUtils.js\";\n\nfunction constructClient(\n\tcontainerRuntimeFactory: MockContainerRuntimeFactoryForReconnection,\n\tid: string,\n) {\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\tdataStoreRuntime.options = {\n\t\tintervalStickinessEnabled: true,\n\t\tmergeTreeEnableObliterate: true,\n\t};\n\tconst sharedString = new SharedString(dataStoreRuntime, id, SharedStringFactory.Attributes);\n\tconst containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\tconst services: IChannelServices = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(),\n\t};\n\n\tsharedString.initializeLocal();\n\n\treturn {\n\t\tsharedString,\n\t\tcontainerRuntime,\n\t\tservices,\n\t};\n}\n\nasync function loadClient(\n\tcontainerRuntimeFactory: MockContainerRuntimeFactoryForReconnection,\n\tsource: Client,\n\tid: string,\n): Promise<Client> {\n\tconst { summary } = source.sharedString.getAttachSummary();\n\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\tdataStoreRuntime.options = {\n\t\tintervalStickinessEnabled: true,\n\t\tmergeTreeEnableObliterate: true,\n\t};\n\tconst factory = SharedString.getFactory();\n\tconst containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\tconst services: IChannelServices = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: MockStorage.createFromSummary(summary),\n\t};\n\tconst sharedString = await factory.load(dataStoreRuntime, id, services, factory.attributes);\n\n\treturn {\n\t\tsharedString,\n\t\tcontainerRuntime,\n\t};\n}\n\nfunction constructClients(\n\tcontainerRuntimeFactory: MockContainerRuntimeFactoryForReconnection,\n\tnumClients = 3,\n): [Client, Client, Client] {\n\treturn Array.from({ length: numClients }, (_, index) => {\n\t\tconst { sharedString, containerRuntime, services } = constructClient(\n\t\t\tcontainerRuntimeFactory,\n\t\t\tString.fromCharCode(index + 65),\n\t\t);\n\n\t\tsharedString.connect(services);\n\t\treturn { containerRuntime, sharedString };\n\t}) as [Client, Client, Client];\n}\n\ndescribe(\"interval rebasing\", () => {\n\tlet containerRuntimeFactory: MockContainerRuntimeFactoryForReconnection;\n\tlet clients: [Client, Client, Client];\n\n\tuseStrictPartialLengthChecks();\n\n\tbeforeEach(() => {\n\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactoryForReconnection();\n\t\tclients = constructClients(containerRuntimeFactory);\n\t});\n\n\tit(\"does not crash for an interval that lies on segment that has been removed locally\", () => {\n\t\tclients[0].sharedString.insertText(0, \"A\");\n\t\tclients[1].containerRuntime.connected = false;\n\t\tclients[1].sharedString.insertText(0, \"01234\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[1].containerRuntime.connected = true;\n\t\tclients[0].sharedString.insertText(0, \"012345678901234\");\n\t\tclients[0].containerRuntime.connected = false;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tconst collection_0 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_0.add({ start: 12, end: 15, props: { intervalId: \"id\" } });\n\t\tclients[2].sharedString.removeRange(5, 7);\n\t\tclients[0].sharedString.removeRange(3, 5);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].sharedString.insertText(13, \"0123\");\n\t\tclients[0].containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"does not crash when entire string on which interval lies is concurrently removed\", () => {\n\t\tclients[0].sharedString.insertText(0, \"a\");\n\t\tclients[1].sharedString.insertText(0, \"a\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].containerRuntime.connected = false;\n\t\tclients[1].sharedString.removeRange(0, 2);\n\t\tconst collection_0 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_0.add({ start: 0, end: 1, props: { intervalId: \"id\" } });\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].containerRuntime.connected = true;\n\t});\n\n\tit(\"does not crash when interval is removed before reconnect when string is concurrently removed\", () => {\n\t\tclients[0].sharedString.insertText(0, \"A\");\n\t\tclients[1].sharedString.insertText(0, \"B\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].containerRuntime.connected = false;\n\t\tclients[1].sharedString.removeRange(0, 2);\n\t\tconst collection_0 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_0.add({ start: 0, end: 1, props: { intervalId: \"id\" } });\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tcollection_0.removeIntervalById(\"id\");\n\t\tclients[0].containerRuntime.connected = true;\n\t});\n\n\tit(\"does not crash when interval slides off end of string\", () => {\n\t\tclients[0].sharedString.insertText(0, \"012Z45\");\n\t\tclients[2].sharedString.insertText(0, \"X\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[1].sharedString.insertText(0, \"01234567\");\n\t\tclients[0].containerRuntime.connected = false;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].sharedString.insertText(0, \"ABCDEFGHIJKLMN\");\n\t\tconst collection_0 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_0.add({\n\t\t\tstart: 20,\n\t\t\tend: 20,\n\t\t\tprops: { intervalId: \"0\" },\n\t\t});\n\t\tclients[2].sharedString.removeRange(13, 15);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"handles basic interval sliding for obliterate\", () => {\n\t\t// A-(BC)\n\n\t\tclients[0].sharedString.insertText(0, \"ABC\");\n\t\tconst collection_0 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_0.add({\n\t\t\tstart: 0,\n\t\t\tend: 2,\n\t\t\tprops: {\n\t\t\t\tintervalId: \"a\",\n\t\t\t},\n\t\t});\n\t\tclients[0].sharedString.obliterateRange(1, 3);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"reference is -1 for obliterated segment\", () => {\n\t\t// (L-PC-F)\n\n\t\tclients[1].sharedString.insertText(0, \"F\");\n\t\tclients[0].sharedString.insertText(0, \"PC\");\n\t\tconst collection_0 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_0.add({\n\t\t\tstart: 0,\n\t\t\tend: 1,\n\t\t\tprops: {\n\t\t\t\tintervalId: \"a\",\n\t\t\t},\n\t\t});\n\t\tclients[1].sharedString.insertText(0, \"L\");\n\t\tclients[1].sharedString.obliterateRange(0, 2);\n\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"slides to correct final destination\", () => {\n\t\tclients[0].sharedString.insertText(0, \"A\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[2].sharedString.insertText(0, \"B\");\n\t\tclients[2].sharedString.removeRange(0, 2);\n\t\tclients[0].sharedString.insertText(0, \"C\");\n\n\t\tconst collection_0 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_0.add({\n\t\t\tstart: 0,\n\t\t\tend: 1,\n\t\t\tprops: { intervalId: \"0\" },\n\t\t});\n\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"does not slide to invalid position when 0-length interval\", () => {\n\t\tclients[0].sharedString.insertText(0, \"A\");\n\t\tconst collection_0 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\t// A 0-length interval is required here to reproduce this error. If in\n\t\t// the future we wish to stop supporting 0-length intervals, this test\n\t\t// can be removed\n\t\tcollection_0.add({\n\t\t\tstart: 0,\n\t\t\tend: 0,\n\t\t\tprops: { intervalId: \"1\" },\n\t\t});\n\t\tclients[1].sharedString.insertText(0, \"BCD\");\n\t\tclients[1].sharedString.removeRange(0, 1);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[2].sharedString.removeRange(1, 3);\n\t\tclients[1].sharedString.insertText(1, \"E\");\n\t\tconst collection_1 = clients[1].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_1.add({\n\t\t\tstart: 0,\n\t\t\tend: 2,\n\t\t\tprops: {\n\t\t\t\tintervalId: \"2\",\n\t\t\t},\n\t\t});\n\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\n\t\tassert.equal(clients[0].sharedString.getText(), \"CE\");\n\t});\n\n\tit(\"is consistent for full stickiness\", () => {\n\t\tclients[0].sharedString.insertText(0, \"A\");\n\t\tclients[0].sharedString.insertText(0, \"BC\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tconst collection_1 = clients[1].sharedString.getIntervalCollection(\"comments\");\n\t\tconst interval1 = collection_1.add({\n\t\t\tstart: \"start\",\n\t\t\tend: \"end\",\n\t\t\tprops: {\n\t\t\t\tintervalId: \"2\",\n\t\t\t},\n\t\t});\n\t\tassert.equal(interval1.stickiness, IntervalStickiness.FULL);\n\t\tclients[0].sharedString.removeRange(0, 1);\n\t\tclients[1].sharedString.removeRange(0, 3);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"keeps obliterate segment group the same across multiple reconnects\", () => {\n\t\t// A-C\n\t\t// (A-B-C)\n\t\tclients[0].sharedString.insertText(0, \"C\");\n\t\tclients[0].sharedString.insertText(0, \"A\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].sharedString.insertText(1, \"B\");\n\t\tclients[1].sharedString.obliterateRange(0, 2);\n\t\tclients[1].containerRuntime.connected = false;\n\t\tclients[1].containerRuntime.connected = true;\n\t\tclients[1].containerRuntime.connected = false;\n\t\tclients[1].containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"doesn't crash for empty pending segment group\", () => {\n\t\t// A\n\t\t// ((A))-[D]\n\t\tclients[0].sharedString.insertText(0, \"A\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[1].sharedString.obliterateRange(0, 1);\n\t\tclients[0].sharedString.insertText(1, \"D\");\n\t\tclients[0].sharedString.obliterateRange(0, 1);\n\t\tclients[0].sharedString.removeRange(0, 1);\n\t\tclients[0].containerRuntime.connected = false;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].containerRuntime.connected = true;\n\n\t\tassert.equal(clients[0].sharedString.getText(), \"\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"zamboni avoids modifying segments with pending interval changes\", () => {\n\t\t// C-AB\n\t\t// D-C-AB\n\t\t// E-HIJ-FG-D-C-AB\n\t\t// ^----------^\n\t\tclients[2].sharedString.insertText(0, \"AB\");\n\t\tclients[0].sharedString.insertText(0, \"C\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[1].containerRuntime.connected = false;\n\t\tclients[2].sharedString.insertText(0, \"D\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[2].sharedString.insertText(0, \"E\");\n\t\tclients[1].sharedString.insertText(0, \"FG\");\n\t\tclients[1].sharedString.insertText(0, \"HIJ\");\n\t\tclients[0].containerRuntime.connected = false;\n\t\tconst collection_0 = clients[1].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_0.add({ start: 0, end: 7 });\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[1].containerRuntime.connected = true;\n\t});\n\n\tit(\"zamboni avoids modifying segments with pending interval changes through multiple reconnects\", async () => {\n\t\t// Note: the specifics of the attach flow shouldn't be necessary here to reproduce this issue.\n\t\t// All that's necessary is that the \"R\" segment is zamboni'd.\n\t\t// However, due to zamboni's fragility, some care needs to be taken for that to happen.\n\t\t// See AB#7048 for more details.\n\t\tconst A = constructClient(containerRuntimeFactory, \"A\");\n\t\tA.sharedString.insertText(0, \"Rr\");\n\t\tA.sharedString.connect(A.services);\n\t\tconst B = await loadClient(containerRuntimeFactory, A, \"B\");\n\t\tB.sharedString.removeRange(0, 1);\n\t\tconst collection = A.sharedString.getIntervalCollection(\"comments\");\n\t\tcollection.add({ start: { pos: 1, side: Side.After }, end: { pos: 0, side: Side.Before } });\n\t\tA.containerRuntime.connected = false;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tB.sharedString.insertText(0, \"8\");\n\t\tA.containerRuntime.connected = true;\n\t\tA.containerRuntime.connected = false;\n\t\tB.sharedString.insertText(0, \"J\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tA.containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent([A, B]);\n\t});\n\n\t// Reproduction of seed 70. Appears to be some problem with normalization of segments interacting\n\t// with sliding logic on reconnect. The ordering of the 22222 and 11 segments is not consistent\n\t// across clients even when in the collab window, and the local reference gets put on this segment.\n\t// So clients[0] disagrees with the others about where the reference slides.\n\tit.skip(\"AB#6552\", () => {\n\t\t// Note: all 3 clients submit edits. When debugging this test, it might be helpful to\n\t\t// add a 4th client that doesn't submit any edits. E.g.:\n\t\t// clients = constructClients(containerRuntimeFactory, 4);\n\t\tclients[0].sharedString.insertText(0, \"000\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tclients[0].containerRuntime.connected = false;\n\t\tclients[1].containerRuntime.connected = false;\n\t\tclients[1].sharedString.insertText(0, \"11\");\n\t\tclients[0].sharedString.insertText(1, \"22222\");\n\t\tclients[0].sharedString\n\t\t\t.getIntervalCollection(\"test collection\")\n\t\t\t.add({ start: { pos: 1, side: Side.After }, end: { pos: 1, side: Side.After } });\n\t\tclients[0].sharedString.removeRange(0, 6);\n\t\tclients[2].sharedString.removeRange(0, 2);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tclients[0].sharedString.insertText(1, \"3\");\n\t\tclients[1].containerRuntime.connected = true;\n\t\tclients[0].containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"doesn't create empty segment group when obliterated segment was obliterated by other client during reconnect\", () => {\n\t\t// A\n\t\t// ((A))-[D]\n\t\tclients[0].sharedString.insertText(0, \"A\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[1].sharedString.obliterateRange(0, 1);\n\t\tclients[0].sharedString.insertText(1, \"D\");\n\t\tclients[0].sharedString.obliterateRange(0, 1);\n\t\tclients[0].sharedString.removeRange(0, 1);\n\t\tclients[0].containerRuntime.connected = false;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].containerRuntime.connected = true;\n\t\tclients[0].containerRuntime.connected = false;\n\t\tclients[0].containerRuntime.connected = true;\n\n\t\tassert.equal(clients[0].sharedString.getText(), \"\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\t// todo: a failing obliterate reconnect test. when rebasing the op,\n\t// the character \"C\" has been concurrently obliterated, so the reconnect\n\t// position of \"B\" is computed to be 0, rather than 1\n\t//\n\t// at the time of writing, i'm not sure of a good solution. either we could\n\t// change calculation of reconnection position in some way or we could not\n\t// concurrently obliterate \"C\" in this context.\n\t//\n\t// in both cases, it's not clear to me how we detect when we're reconnecting\n\t//\n\t// ADO#3714\n\tit.skip(\"...\", () => {\n\t\t// AB\n\t\t// A-C-B\n\t\tclients[0].sharedString.insertText(0, \"AB\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].sharedString.insertText(1, \"C\");\n\t\tclients[1].containerRuntime.connected = false;\n\t\tclients[1].sharedString.obliterateRange(0, 2);\n\t\tclients[1].containerRuntime.connected = true;\n\t\tclients[1].containerRuntime.connected = false;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[1].containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\t// todo: ADO#3714 Failing obliterate reconnect test\n\tit.skip(\"...\", () => {\n\t\tclients[0].sharedString.insertText(0, \"AB\");\n\t\tclients[1].sharedString.insertText(0, \"CD\");\n\t\tclients[1].sharedString.insertText(1, \"E\");\n\t\tclients[0].sharedString.obliterateRange(0, 1);\n\t\tclients[0].sharedString.insertText(0, \"FGHIJK\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].sharedString.insertText(4, \"L\");\n\t\tclients[2].sharedString.obliterateRange(3, 5);\n\t\tclients[0].containerRuntime.connected = false;\n\t\tclients[0].sharedString.obliterateRange(1, 2);\n\t\tclients[0].sharedString.insertText(7, \"M\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"slides two refs on same segment to different segments\", () => {\n\t\tclients[0].sharedString.insertText(0, \"AB\");\n\t\tclients[0].sharedString.insertText(0, \"C\");\n\t\tconst collection_1 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tconst interval1 = collection_1.add({\n\t\t\tstart: { pos: 0, side: Side.After },\n\t\t\tend: \"end\",\n\t\t\tprops: {\n\t\t\t\tintervalId: \"1\",\n\t\t\t},\n\t\t});\n\t\tassert.equal(interval1.stickiness, IntervalStickiness.FULL);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[2].sharedString.removeRange(1, 2);\n\t\tconst collection_2 = clients[1].sharedString.getIntervalCollection(\"comments\");\n\t\tconst interval2 = collection_2.add({\n\t\t\tstart: \"start\",\n\t\t\tend: { pos: 2, side: Side.Before },\n\t\t\tprops: {\n\t\t\t\tintervalId: \"2\",\n\t\t\t},\n\t\t});\n\t\tassert.equal(interval2.stickiness, IntervalStickiness.FULL);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"maintains sliding preference on references after ack\", () => {\n\t\tclients[1].sharedString.insertText(0, \"ABC\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].sharedString.removeRange(0, 1);\n\t\tclients[0].sharedString.insertText(0, \"D\");\n\t\tconst collection_1 = clients[1].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_1.add({\n\t\t\tstart: { pos: 0, side: Side.After },\n\t\t\tend: 1,\n\t\t\tprops: {\n\t\t\t\tintervalId: \"1\",\n\t\t\t},\n\t\t});\n\t\tclients[2].sharedString.removeRange(1, 2);\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"maintains sliding preference on references after reconnect with special endpoint segment\", () => {\n\t\tclients[0].sharedString.insertText(0, \"D\");\n\t\tclients[0].containerRuntime.connected = false;\n\t\tconst collection_1 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tconst interval = collection_1.add({\n\t\t\tstart: \"start\",\n\t\t\tend: 0,\n\t\t\tprops: {\n\t\t\t\tintervalId: \"1\",\n\t\t\t},\n\t\t});\n\t\tassert.equal(interval.stickiness, IntervalStickiness.FULL);\n\t\tclients[0].containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\tit(\"maintains sliding preference on references after reconnect\", () => {\n\t\tclients[0].sharedString.insertText(0, \"D\");\n\t\tclients[0].containerRuntime.connected = false;\n\t\tconst collection_1 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tconst interval = collection_1.add({\n\t\t\tstart: { pos: 0, side: Side.After },\n\t\t\tend: 0,\n\t\t\tprops: {\n\t\t\t\tintervalId: \"1\",\n\t\t\t},\n\t\t});\n\t\tassert.equal(interval.stickiness, IntervalStickiness.FULL);\n\t\tclients[0].containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t});\n\n\t// todo: potentially related to AB#7050\n\t//\n\t// this is a reduced fuzz test from the suite\n\t// `SharedString with rebasing and reconnect`\n\tit.skip(\"...\", async () => {\n\t\tconst A = constructClient(containerRuntimeFactory, \"A\");\n\n\t\tA.sharedString.insertText(0, \"ABCDEF\");\n\t\tA.sharedString.insertText(0, \"GHIJ\");\n\t\tA.sharedString.insertText(0, \"KLMNO\");\n\t\tA.sharedString.insertText(0, \"PQRST\");\n\n\t\t// attach\n\t\tA.sharedString.connect(A.services);\n\t\tconst B = await loadClient(containerRuntimeFactory, A, \"B\");\n\n\t\tA.sharedString.insertText(0, \"UVWXYZ\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent([A, B]);\n\t\tB.sharedString.insertText(26, \"1\");\n\t\tA.sharedString.removeRange(0, 1);\n\t\tB.containerRuntime.connected = false;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent([A, B]);\n\t\tB.containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent([A, B]);\n\t});\n\n\tit(\"slides to correct segment when inserting segment while disconnected after changing interval\", () => {\n\t\t// B-A\n\t\t// ^\n\t\tclients[0].sharedString.insertText(0, \"A\");\n\t\tconst collection_0 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_0.add({ start: 0, end: 0, props: { intervalId: \"0\" } });\n\t\tcollection_0.change(\"0\", { start: 0, end: 0 });\n\t\tclients[0].containerRuntime.connected = false;\n\t\tclients[0].sharedString.insertText(0, \"B\");\n\t\tclients[0].containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\n\t\tassert.equal(clients[0].sharedString.getText(), \"BA\");\n\n\t\tassertSequenceIntervals(\n\t\t\tclients[0].sharedString,\n\t\t\tclients[0].sharedString.getIntervalCollection(\"comments\"),\n\t\t\t[{ start: 1, end: 1 }],\n\t\t);\n\t});\n\n\tit(\"changing interval to concurrently deleted segment detaches interval\", () => {\n\t\t// B-A\n\t\t// ^\n\t\t// (B)-A\n\t\t// ^\n\t\t// (B)-(A)-C\n\t\t// ^\n\t\tclients[0].sharedString.insertText(0, \"A\");\n\t\tclients[2].sharedString.insertText(0, \"B\");\n\t\tconst collection_0 = clients[2].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_0.add({ start: 0, end: 0, props: { intervalId: \"0\" } });\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[1].sharedString.removeRange(0, 1);\n\t\tclients[0].containerRuntime.connected = false;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[1].sharedString.removeRange(0, 1);\n\t\tconst collection_1 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_1.change(\"0\", { start: 0, end: 0 });\n\t\tclients[2].sharedString.insertText(0, \"C\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tclients[0].containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\n\t\tassert.equal(clients[0].sharedString.getText(), \"C\");\n\n\t\tassertSequenceIntervals(\n\t\t\tclients[0].sharedString,\n\t\t\tclients[0].sharedString.getIntervalCollection(\"comments\"),\n\t\t\t[{ start: 0, end: 0 }],\n\t\t);\n\t});\n\n\tit(\"changing interval endpoint while disconnected to segment also inserted while disconnected\", () => {\n\t\t// AC\n\t\t// A-B-C\n\t\tclients[0].sharedString.insertText(0, \"AC\");\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\t\tconst collection_0 = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tcollection_0.add({ start: 0, end: 0, props: { intervalId: \"0\" } });\n\t\tclients[0].containerRuntime.connected = false;\n\t\tclients[0].sharedString.insertText(1, \"B\");\n\t\tcollection_0.change(\"0\", { start: 1, end: 1 });\n\t\tclients[0].containerRuntime.connected = true;\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\n\t\tassert.equal(clients[0].sharedString.getText(), \"ABC\");\n\n\t\tassertSequenceIntervals(\n\t\t\tclients[0].sharedString,\n\t\t\tclients[0].sharedString.getIntervalCollection(\"comments\"),\n\t\t\t[{ start: 1, end: 1 }],\n\t\t);\n\t});\n\n\tit(\"delete and insert text into range containing interval while disconnected\", async () => {\n\t\t// 012\n\t\t// (0)-x-12\n\t\tclients[0].containerRuntime.connected = false;\n\t\tconst intervals = clients[0].sharedString.getIntervalCollection(\"comments\");\n\t\tclients[0].sharedString.insertText(0, \"012\");\n\t\tintervals.add({ start: 0, end: 2, props: { intervalId: \"0\" } });\n\t\tassertSequenceIntervals(clients[0].sharedString, intervals, [{ start: 0, end: 2 }]);\n\n\t\tclients[0].sharedString.insertText(1, \"x\");\n\t\tclients[0].sharedString.removeRange(0, 1);\n\t\tclients[0].containerRuntime.connected = true;\n\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tassertConsistent(clients);\n\n\t\tassert.equal(clients[0].sharedString.getText(), \"x12\");\n\n\t\tassertSequenceIntervals(clients[0].sharedString, intervals, [{ start: 0, end: 2 }]);\n\t});\n});\n"]}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
/* eslint-disable @typescript-eslint/dot-notation */
|
|
6
|
-
import { strict as assert } from "assert";
|
|
7
|
-
import { MockContainerRuntimeFactory, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
|
|
8
|
-
import { IntervalType } from "@fluidframework/sequence-previous";
|
|
9
|
-
import { AttachState } from "@fluidframework/container-definitions";
|
|
10
|
-
import { IntervalOpType } from "../intervals/index.js";
|
|
11
|
-
import { SharedString } from "../sharedString.js";
|
|
12
|
-
import { SharedStringFactory } from "../sequenceFactory.js";
|
|
13
|
-
const assertIntervals = (sharedString, intervalCollection, expected, validateOverlapping = true) => {
|
|
14
|
-
const actual = Array.from(intervalCollection);
|
|
15
|
-
if (validateOverlapping && sharedString.getLength() > 0) {
|
|
16
|
-
const overlapping = intervalCollection.findOverlappingIntervals(0, sharedString.getLength() - 1);
|
|
17
|
-
assert.deepEqual(actual, overlapping, "Interval search returned inconsistent results");
|
|
18
|
-
}
|
|
19
|
-
assert.strictEqual(actual.length, expected.length, `findOverlappingIntervals() must return the expected number of intervals`);
|
|
20
|
-
const actualPos = actual.map((interval) => {
|
|
21
|
-
assert(interval);
|
|
22
|
-
const start = sharedString.localReferencePositionToPosition(interval.start);
|
|
23
|
-
const end = sharedString.localReferencePositionToPosition(interval.end);
|
|
24
|
-
return { start, end };
|
|
25
|
-
});
|
|
26
|
-
assert.deepEqual(actualPos, expected, "intervals are not as expected");
|
|
27
|
-
};
|
|
28
|
-
describe("Interval Stashed Ops on client ", () => {
|
|
29
|
-
const localUserLongId = "localUser";
|
|
30
|
-
let sharedString;
|
|
31
|
-
let dataStoreRuntime1;
|
|
32
|
-
let containerRuntimeFactory;
|
|
33
|
-
beforeEach(() => {
|
|
34
|
-
dataStoreRuntime1 = new MockFluidDataStoreRuntime({ clientId: "1" });
|
|
35
|
-
sharedString = new SharedString(dataStoreRuntime1, "shared-string-1", SharedStringFactory.Attributes);
|
|
36
|
-
containerRuntimeFactory = new MockContainerRuntimeFactory();
|
|
37
|
-
// Connect the first SharedString.
|
|
38
|
-
dataStoreRuntime1.setAttachState(AttachState.Attached);
|
|
39
|
-
const containerRuntime1 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);
|
|
40
|
-
const services1 = {
|
|
41
|
-
deltaConnection: dataStoreRuntime1.createDeltaConnection(),
|
|
42
|
-
objectStorage: new MockStorage(),
|
|
43
|
-
};
|
|
44
|
-
sharedString.initializeLocal();
|
|
45
|
-
sharedString.connect(services1);
|
|
46
|
-
});
|
|
47
|
-
describe("applyStashedOp", () => {
|
|
48
|
-
let collection;
|
|
49
|
-
let intervalId;
|
|
50
|
-
const label = "test";
|
|
51
|
-
let startingInterval;
|
|
52
|
-
let startingIntervalWithProps;
|
|
53
|
-
beforeEach(() => {
|
|
54
|
-
sharedString.insertText(0, "hello world");
|
|
55
|
-
collection = sharedString.getIntervalCollection(label);
|
|
56
|
-
startingInterval = {
|
|
57
|
-
start: 0,
|
|
58
|
-
end: 5,
|
|
59
|
-
sequenceNumber: sharedString.getCurrentSeq(),
|
|
60
|
-
intervalType: IntervalType.SlideOnRemove,
|
|
61
|
-
};
|
|
62
|
-
startingIntervalWithProps = { ...startingInterval, props: { a: 1 } };
|
|
63
|
-
intervalId = collection.add(startingInterval).getIntervalId();
|
|
64
|
-
});
|
|
65
|
-
it("for add interval", () => {
|
|
66
|
-
const interval = {
|
|
67
|
-
start: 5,
|
|
68
|
-
end: 10,
|
|
69
|
-
sequenceNumber: sharedString.getCurrentSeq(),
|
|
70
|
-
intervalType: 2,
|
|
71
|
-
};
|
|
72
|
-
const opArgs = {
|
|
73
|
-
key: label,
|
|
74
|
-
type: "act",
|
|
75
|
-
value: {
|
|
76
|
-
opName: IntervalOpType.ADD,
|
|
77
|
-
value: interval,
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
sharedString["applyStashedOp"](opArgs);
|
|
81
|
-
assertIntervals(sharedString, collection, [
|
|
82
|
-
{ start: 0, end: 5 },
|
|
83
|
-
{ start: 5, end: 10 },
|
|
84
|
-
]);
|
|
85
|
-
});
|
|
86
|
-
it("for delete interval", () => {
|
|
87
|
-
const opArgs = {
|
|
88
|
-
key: label,
|
|
89
|
-
type: "act",
|
|
90
|
-
value: {
|
|
91
|
-
opName: IntervalOpType.DELETE,
|
|
92
|
-
value: {
|
|
93
|
-
properties: { intervalId },
|
|
94
|
-
sequenceNumber: sharedString.getCurrentSeq(),
|
|
95
|
-
intervalType: 2,
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
const metadata = sharedString["applyStashedOp"](opArgs);
|
|
100
|
-
assertIntervals(sharedString, collection, []);
|
|
101
|
-
assert.equal(collection.getIntervalById(intervalId), undefined);
|
|
102
|
-
});
|
|
103
|
-
it("for change interval", () => {
|
|
104
|
-
const opArgs = {
|
|
105
|
-
key: label,
|
|
106
|
-
type: "act",
|
|
107
|
-
value: {
|
|
108
|
-
opName: IntervalOpType.CHANGE,
|
|
109
|
-
value: {
|
|
110
|
-
start: 5,
|
|
111
|
-
end: 10,
|
|
112
|
-
properties: { intervalId },
|
|
113
|
-
sequenceNumber: sharedString.getCurrentSeq(),
|
|
114
|
-
intervalType: 2,
|
|
115
|
-
},
|
|
116
|
-
},
|
|
117
|
-
};
|
|
118
|
-
const metadata = sharedString["applyStashedOp"](opArgs);
|
|
119
|
-
assertIntervals(sharedString, collection, [{ start: 5, end: 10 }]);
|
|
120
|
-
});
|
|
121
|
-
it("for interval property change", () => {
|
|
122
|
-
const interval = collection.getIntervalById(intervalId);
|
|
123
|
-
assert(interval !== undefined);
|
|
124
|
-
const opArgs = {
|
|
125
|
-
key: label,
|
|
126
|
-
type: "act",
|
|
127
|
-
value: {
|
|
128
|
-
opName: IntervalOpType.CHANGE,
|
|
129
|
-
value: {
|
|
130
|
-
properties: { intervalId, a: 2 },
|
|
131
|
-
sequenceNumber: sharedString.getCurrentSeq(),
|
|
132
|
-
intervalType: 2,
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
const metadata = sharedString["applyStashedOp"](opArgs);
|
|
137
|
-
assertIntervals(sharedString, collection, [{ start: 0, end: 5 }]);
|
|
138
|
-
assert.equal(interval.properties.a, 2);
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
});
|
|
142
|
-
//# sourceMappingURL=intervalStashedOps.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intervalStashedOps.spec.js","sourceRoot":"","sources":["../../src/test/intervalStashedOps.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/* eslint-disable @typescript-eslint/dot-notation */\n\nimport { strict as assert } from \"assert\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { IntervalType } from \"@fluidframework/sequence-previous\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { IntervalOpType, SequenceInterval } from \"../intervals/index.js\";\nimport { IIntervalCollection } from \"../intervalCollection.js\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { IMapValueTypeOperation } from \"../defaultMap.js\";\n\nconst assertIntervals = (\n\tsharedString: SharedString,\n\tintervalCollection: IIntervalCollection<SequenceInterval>,\n\texpected: readonly { start: number; end: number }[],\n\tvalidateOverlapping: boolean = true,\n) => {\n\tconst actual = Array.from(intervalCollection);\n\tif (validateOverlapping && sharedString.getLength() > 0) {\n\t\tconst overlapping = intervalCollection.findOverlappingIntervals(\n\t\t\t0,\n\t\t\tsharedString.getLength() - 1,\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`findOverlappingIntervals() must return the expected number of intervals`,\n\t);\n\n\tconst actualPos = actual.map((interval) => {\n\t\tassert(interval);\n\t\tconst start = sharedString.localReferencePositionToPosition(interval.start);\n\t\tconst end = sharedString.localReferencePositionToPosition(interval.end);\n\t\treturn { start, end };\n\t});\n\tassert.deepEqual(actualPos, expected, \"intervals are not as expected\");\n};\n\ndescribe(\"Interval Stashed Ops on client \", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet sharedString: SharedString;\n\tlet dataStoreRuntime1: MockFluidDataStoreRuntime;\n\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\tbeforeEach(() => {\n\t\tdataStoreRuntime1 = new MockFluidDataStoreRuntime({ clientId: \"1\" });\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\tcontainerRuntimeFactory = new MockContainerRuntimeFactory();\n\n\t\t// Connect the first SharedString.\n\t\tdataStoreRuntime1.setAttachState(AttachState.Attached);\n\t\tconst containerRuntime1 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\t\tconst services1 = {\n\t\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\t\tobjectStorage: new MockStorage(),\n\t\t};\n\t\tsharedString.initializeLocal();\n\t\tsharedString.connect(services1);\n\t});\n\n\tdescribe(\"applyStashedOp\", () => {\n\t\tlet collection: IIntervalCollection<SequenceInterval>;\n\t\tlet intervalId: string;\n\t\tconst label = \"test\";\n\t\tlet startingInterval;\n\t\tlet startingIntervalWithProps;\n\t\tbeforeEach(() => {\n\t\t\tsharedString.insertText(0, \"hello world\");\n\t\t\tcollection = sharedString.getIntervalCollection(label);\n\t\t\tstartingInterval = {\n\t\t\t\tstart: 0,\n\t\t\t\tend: 5,\n\t\t\t\tsequenceNumber: sharedString.getCurrentSeq(),\n\t\t\t\tintervalType: IntervalType.SlideOnRemove,\n\t\t\t};\n\t\t\tstartingIntervalWithProps = { ...startingInterval, props: { a: 1 } };\n\t\t\tintervalId = collection.add(startingInterval).getIntervalId();\n\t\t});\n\t\tit(\"for add interval\", () => {\n\t\t\tconst interval = {\n\t\t\t\tstart: 5,\n\t\t\t\tend: 10,\n\t\t\t\tsequenceNumber: sharedString.getCurrentSeq(),\n\t\t\t\tintervalType: 2,\n\t\t\t};\n\t\t\tconst opArgs: IMapValueTypeOperation = {\n\t\t\t\tkey: label,\n\t\t\t\ttype: \"act\",\n\t\t\t\tvalue: {\n\t\t\t\t\topName: IntervalOpType.ADD,\n\t\t\t\t\tvalue: interval,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tsharedString[\"applyStashedOp\"](opArgs);\n\t\t\tassertIntervals(sharedString, collection, [\n\t\t\t\t{ start: 0, end: 5 },\n\t\t\t\t{ start: 5, end: 10 },\n\t\t\t]);\n\t\t});\n\t\tit(\"for delete interval\", () => {\n\t\t\tconst opArgs: IMapValueTypeOperation = {\n\t\t\t\tkey: label,\n\t\t\t\ttype: \"act\",\n\t\t\t\tvalue: {\n\t\t\t\t\topName: IntervalOpType.DELETE,\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tproperties: { intervalId },\n\t\t\t\t\t\tsequenceNumber: sharedString.getCurrentSeq(),\n\t\t\t\t\t\tintervalType: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst metadata = sharedString[\"applyStashedOp\"](opArgs);\n\t\t\tassertIntervals(sharedString, collection, []);\n\t\t\tassert.equal(collection.getIntervalById(intervalId), undefined);\n\t\t});\n\t\tit(\"for change interval\", () => {\n\t\t\tconst opArgs: IMapValueTypeOperation = {\n\t\t\t\tkey: label,\n\t\t\t\ttype: \"act\",\n\t\t\t\tvalue: {\n\t\t\t\t\topName: IntervalOpType.CHANGE,\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tstart: 5,\n\t\t\t\t\t\tend: 10,\n\t\t\t\t\t\tproperties: { intervalId },\n\t\t\t\t\t\tsequenceNumber: sharedString.getCurrentSeq(),\n\t\t\t\t\t\tintervalType: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst metadata = sharedString[\"applyStashedOp\"](opArgs);\n\t\t\tassertIntervals(sharedString, collection, [{ start: 5, end: 10 }]);\n\t\t});\n\t\tit(\"for interval property change\", () => {\n\t\t\tconst interval = collection.getIntervalById(intervalId);\n\t\t\tassert(interval !== undefined);\n\t\t\tconst opArgs: IMapValueTypeOperation = {\n\t\t\t\tkey: label,\n\t\t\t\ttype: \"act\",\n\t\t\t\tvalue: {\n\t\t\t\t\topName: IntervalOpType.CHANGE,\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tproperties: { intervalId, a: 2 },\n\t\t\t\t\t\tsequenceNumber: sharedString.getCurrentSeq(),\n\t\t\t\t\t\tintervalType: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst metadata = sharedString[\"applyStashedOp\"](opArgs);\n\t\t\tassertIntervals(sharedString, collection, [{ start: 0, end: 5 }]);\n\t\t\tassert.equal(interval.properties.a, 2);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { strict as assert } from "assert";
|
|
6
|
-
import { createOverlappingIntervalsIndex } from "../intervalIndex/index.js";
|
|
7
|
-
/**
|
|
8
|
-
* Validates that all shared strings in the provided array are consistent in the underlying text
|
|
9
|
-
* and location of all intervals in any interval collections they have.
|
|
10
|
-
* */
|
|
11
|
-
export function assertConsistent(clients) {
|
|
12
|
-
const connectedClients = clients.filter((client) => client.containerRuntime.connected);
|
|
13
|
-
if (connectedClients.length < 2) {
|
|
14
|
-
// No two strings are expected to be consistent.
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
const first = connectedClients[0].sharedString;
|
|
18
|
-
for (const { sharedString: other } of connectedClients.slice(1)) {
|
|
19
|
-
assertEquivalentSharedStrings(first, other);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
export function assertEquivalentSharedStrings(a, b) {
|
|
23
|
-
assert.equal(a.getText(), b.getText(), `Non-equal text between strings ${a.id} and ${b.id}.`);
|
|
24
|
-
assert.equal(a.getLength(), b.getLength());
|
|
25
|
-
const firstLabels = Array.from(a.getIntervalCollectionLabels()).sort();
|
|
26
|
-
const otherLabels = Array.from(b.getIntervalCollectionLabels()).sort();
|
|
27
|
-
assert.deepEqual(firstLabels, otherLabels, `Different interval collections found between ${a.id} and ${b.id}.`);
|
|
28
|
-
for (let i = 0; i < firstLabels.length; i++) {
|
|
29
|
-
const collection1 = a.getIntervalCollection(firstLabels[i]);
|
|
30
|
-
const collection2 = b.getIntervalCollection(otherLabels[i]);
|
|
31
|
-
const intervals1 = Array.from(collection1);
|
|
32
|
-
const intervals2 = Array.from(collection2);
|
|
33
|
-
assert.equal(intervals1.length, intervals2.length, `Different number of intervals found in ${a.id} and ${b.id}` +
|
|
34
|
-
` at collection ${firstLabels[i]}`);
|
|
35
|
-
for (const interval of intervals1) {
|
|
36
|
-
assert(interval);
|
|
37
|
-
const intervalId = interval.getIntervalId();
|
|
38
|
-
assert(intervalId);
|
|
39
|
-
const otherInterval = collection2.getIntervalById(intervalId);
|
|
40
|
-
assert(otherInterval);
|
|
41
|
-
assert.equal(interval.startSide, otherInterval.startSide, "interval start side not equal");
|
|
42
|
-
assert.equal(interval.endSide, otherInterval.endSide, "interval end side not equal");
|
|
43
|
-
assert.equal(interval.stickiness, otherInterval.stickiness, "interval stickiness not equal");
|
|
44
|
-
assert.equal(interval.start.slidingPreference, otherInterval.start.slidingPreference, "start sliding preference not equal");
|
|
45
|
-
assert.equal(interval.end.slidingPreference, otherInterval.end.slidingPreference, "end sliding preference not equal");
|
|
46
|
-
const firstStart = a.localReferencePositionToPosition(interval.start);
|
|
47
|
-
const otherStart = b.localReferencePositionToPosition(otherInterval.start);
|
|
48
|
-
assert.equal(firstStart, otherStart, `Startpoints of interval ${intervalId} different:\n` +
|
|
49
|
-
`\tfull text:${a.getText()}\n` +
|
|
50
|
-
`\tclient ${a.id} char:${a.getText(firstStart, firstStart + 1)}\n` +
|
|
51
|
-
`\tclient ${b.id} char:${b.getText(otherStart, otherStart + 1)}`);
|
|
52
|
-
const firstEnd = a.localReferencePositionToPosition(interval.end);
|
|
53
|
-
const otherEnd = b.localReferencePositionToPosition(otherInterval.end);
|
|
54
|
-
assert.equal(firstEnd, otherEnd, `Endpoints of interval ${intervalId} different:\n` +
|
|
55
|
-
`\tfull text:${a.getText()}\n` +
|
|
56
|
-
`\tclient ${a.id} char:${a.getText(firstEnd, firstEnd + 1)}\n` +
|
|
57
|
-
`\tclient ${b.id} char:${b.getText(otherEnd, otherEnd + 1)}`);
|
|
58
|
-
assert.equal(interval.intervalType, otherInterval.intervalType);
|
|
59
|
-
assert.deepEqual(interval.properties, otherInterval.properties);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
export const assertSequenceIntervals = (sharedString, intervalCollection, expected, validateOverlapping = true) => {
|
|
64
|
-
const actual = Array.from(intervalCollection);
|
|
65
|
-
if (validateOverlapping && sharedString.getLength() > 0) {
|
|
66
|
-
const overlappingIntervalsIndex = createOverlappingIntervalsIndex(sharedString);
|
|
67
|
-
intervalCollection.attachIndex(overlappingIntervalsIndex);
|
|
68
|
-
const overlapping = overlappingIntervalsIndex.findOverlappingIntervals("start", "end");
|
|
69
|
-
assert.deepEqual(actual, overlapping, "Interval search returned inconsistent results");
|
|
70
|
-
intervalCollection.detachIndex(overlappingIntervalsIndex);
|
|
71
|
-
}
|
|
72
|
-
assert.strictEqual(actual.length, expected.length, `findOverlappingIntervals() must return the expected number of intervals`);
|
|
73
|
-
const actualPos = actual.map((interval) => {
|
|
74
|
-
assert(interval);
|
|
75
|
-
const start = sharedString.localReferencePositionToPosition(interval.start);
|
|
76
|
-
const end = sharedString.localReferencePositionToPosition(interval.end);
|
|
77
|
-
return { start, end };
|
|
78
|
-
});
|
|
79
|
-
assert.deepEqual(actualPos, expected, "intervals are not as expected");
|
|
80
|
-
};
|
|
81
|
-
//# sourceMappingURL=intervalTestUtils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intervalTestUtils.js","sourceRoot":"","sources":["../../src/test/intervalTestUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAK1C,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAO5E;;;KAGK;AACL,MAAM,UAAU,gBAAgB,CAAC,OAAiB;IACjD,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACvF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;QAChC,gDAAgD;QAChD,OAAO;KACP;IACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAC/C,KAAK,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAChE,6BAA6B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;KAC5C;AACF,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,CAAe,EAAE,CAAe;IAC7E,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,kCAAkC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9F,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,MAAM,CAAC,SAAS,CACf,WAAW,EACX,WAAW,EACX,gDAAgD,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,CACnE,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC5C,MAAM,WAAW,GAAG,CAAC,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,CAAC,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CACX,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,MAAM,EACjB,0CAA0C,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE;YAC3D,kBAAkB,WAAW,CAAC,CAAC,CAAC,EAAE,CACnC,CAAC;QACF,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE;YAClC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjB,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC5C,MAAM,CAAC,UAAU,CAAC,CAAC;YACnB,MAAM,aAAa,GAAG,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YAC9D,MAAM,CAAC,aAAa,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CACX,QAAQ,CAAC,SAAS,EAClB,aAAa,CAAC,SAAS,EACvB,+BAA+B,CAC/B,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,6BAA6B,CAAC,CAAC;YACrF,MAAM,CAAC,KAAK,CACX,QAAQ,CAAC,UAAU,EACnB,aAAa,CAAC,UAAU,EACxB,+BAA+B,CAC/B,CAAC;YACF,MAAM,CAAC,KAAK,CACX,QAAQ,CAAC,KAAK,CAAC,iBAAiB,EAChC,aAAa,CAAC,KAAK,CAAC,iBAAiB,EACrC,oCAAoC,CACpC,CAAC;YACF,MAAM,CAAC,KAAK,CACX,QAAQ,CAAC,GAAG,CAAC,iBAAiB,EAC9B,aAAa,CAAC,GAAG,CAAC,iBAAiB,EACnC,kCAAkC,CAClC,CAAC;YACF,MAAM,UAAU,GAAG,CAAC,CAAC,gCAAgC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtE,MAAM,UAAU,GAAG,CAAC,CAAC,gCAAgC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC3E,MAAM,CAAC,KAAK,CACX,UAAU,EACV,UAAU,EACV,2BAA2B,UAAU,eAAe;gBACnD,eAAe,CAAC,CAAC,OAAO,EAAE,IAAI;gBAC9B,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,CAAC,CAAC,IAAI;gBAClE,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,CAAC,CAAC,EAAE,CACjE,CAAC;YACF,MAAM,QAAQ,GAAG,CAAC,CAAC,gCAAgC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,CAAC,CAAC,gCAAgC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CACX,QAAQ,EACR,QAAQ,EACR,yBAAyB,UAAU,eAAe;gBACjD,eAAe,CAAC,CAAC,OAAO,EAAE,IAAI;gBAC9B,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,CAAC,IAAI;gBAC9D,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,CAAC,EAAE,CAC7D,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;YAChE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;SAChE;KACD;AACF,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACtC,YAA0B,EAC1B,kBAAyD,EACzD,QAAmD,EACnD,sBAA+B,IAAI,EAClC,EAAE;IACH,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC9C,IAAI,mBAAmB,IAAI,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE;QACxD,MAAM,yBAAyB,GAAG,+BAA+B,CAAC,YAAY,CAAC,CAAC;QAChF,kBAAkB,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,yBAAyB,CAAC,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACvF,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,+CAA+C,CAAC,CAAC;QACvF,kBAAkB,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;KAC1D;IACD,MAAM,CAAC,WAAW,CACjB,MAAM,CAAC,MAAM,EACb,QAAQ,CAAC,MAAM,EACf,yEAAyE,CACzE,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACzC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjB,MAAM,KAAK,GAAG,YAAY,CAAC,gCAAgC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,YAAY,CAAC,gCAAgC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,+BAA+B,CAAC,CAAC;AACxE,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 { MockContainerRuntimeForReconnection } from \"@fluidframework/test-runtime-utils\";\nimport { SharedString } from \"../sharedString.js\";\nimport { IIntervalCollection } from \"../intervalCollection.js\";\nimport { SequenceInterval } from \"../intervals/index.js\";\nimport { createOverlappingIntervalsIndex } from \"../intervalIndex/index.js\";\n\nexport interface Client {\n\tsharedString: SharedString;\n\tcontainerRuntime: MockContainerRuntimeForReconnection;\n}\n\n/**\n * Validates that all shared strings in the provided array are consistent in the underlying text\n * and location of all intervals in any interval collections they have.\n * */\nexport function assertConsistent(clients: Client[]): void {\n\tconst connectedClients = clients.filter((client) => client.containerRuntime.connected);\n\tif (connectedClients.length < 2) {\n\t\t// No two strings are expected to be consistent.\n\t\treturn;\n\t}\n\tconst first = connectedClients[0].sharedString;\n\tfor (const { sharedString: other } of connectedClients.slice(1)) {\n\t\tassertEquivalentSharedStrings(first, other);\n\t}\n}\n\nexport function assertEquivalentSharedStrings(a: SharedString, b: SharedString) {\n\tassert.equal(a.getText(), b.getText(), `Non-equal text between strings ${a.id} and ${b.id}.`);\n\tassert.equal(a.getLength(), b.getLength());\n\tconst firstLabels = Array.from(a.getIntervalCollectionLabels()).sort();\n\tconst otherLabels = Array.from(b.getIntervalCollectionLabels()).sort();\n\tassert.deepEqual(\n\t\tfirstLabels,\n\t\totherLabels,\n\t\t`Different interval collections found between ${a.id} and ${b.id}.`,\n\t);\n\tfor (let i = 0; i < firstLabels.length; i++) {\n\t\tconst collection1 = a.getIntervalCollection(firstLabels[i]);\n\t\tconst collection2 = b.getIntervalCollection(otherLabels[i]);\n\t\tconst intervals1 = Array.from(collection1);\n\t\tconst intervals2 = Array.from(collection2);\n\t\tassert.equal(\n\t\t\tintervals1.length,\n\t\t\tintervals2.length,\n\t\t\t`Different number of intervals found in ${a.id} and ${b.id}` +\n\t\t\t\t` at collection ${firstLabels[i]}`,\n\t\t);\n\t\tfor (const interval of intervals1) {\n\t\t\tassert(interval);\n\t\t\tconst intervalId = interval.getIntervalId();\n\t\t\tassert(intervalId);\n\t\t\tconst otherInterval = collection2.getIntervalById(intervalId);\n\t\t\tassert(otherInterval);\n\t\t\tassert.equal(\n\t\t\t\tinterval.startSide,\n\t\t\t\totherInterval.startSide,\n\t\t\t\t\"interval start side not equal\",\n\t\t\t);\n\t\t\tassert.equal(interval.endSide, otherInterval.endSide, \"interval end side not equal\");\n\t\t\tassert.equal(\n\t\t\t\tinterval.stickiness,\n\t\t\t\totherInterval.stickiness,\n\t\t\t\t\"interval stickiness not equal\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tinterval.start.slidingPreference,\n\t\t\t\totherInterval.start.slidingPreference,\n\t\t\t\t\"start sliding preference not equal\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tinterval.end.slidingPreference,\n\t\t\t\totherInterval.end.slidingPreference,\n\t\t\t\t\"end sliding preference not equal\",\n\t\t\t);\n\t\t\tconst firstStart = a.localReferencePositionToPosition(interval.start);\n\t\t\tconst otherStart = b.localReferencePositionToPosition(otherInterval.start);\n\t\t\tassert.equal(\n\t\t\t\tfirstStart,\n\t\t\t\totherStart,\n\t\t\t\t`Startpoints of interval ${intervalId} different:\\n` +\n\t\t\t\t\t`\\tfull text:${a.getText()}\\n` +\n\t\t\t\t\t`\\tclient ${a.id} char:${a.getText(firstStart, firstStart + 1)}\\n` +\n\t\t\t\t\t`\\tclient ${b.id} char:${b.getText(otherStart, otherStart + 1)}`,\n\t\t\t);\n\t\t\tconst firstEnd = a.localReferencePositionToPosition(interval.end);\n\t\t\tconst otherEnd = b.localReferencePositionToPosition(otherInterval.end);\n\t\t\tassert.equal(\n\t\t\t\tfirstEnd,\n\t\t\t\totherEnd,\n\t\t\t\t`Endpoints of interval ${intervalId} different:\\n` +\n\t\t\t\t\t`\\tfull text:${a.getText()}\\n` +\n\t\t\t\t\t`\\tclient ${a.id} char:${a.getText(firstEnd, firstEnd + 1)}\\n` +\n\t\t\t\t\t`\\tclient ${b.id} char:${b.getText(otherEnd, otherEnd + 1)}`,\n\t\t\t);\n\t\t\tassert.equal(interval.intervalType, otherInterval.intervalType);\n\t\t\tassert.deepEqual(interval.properties, otherInterval.properties);\n\t\t}\n\t}\n}\n\nexport const assertSequenceIntervals = (\n\tsharedString: SharedString,\n\tintervalCollection: IIntervalCollection<SequenceInterval>,\n\texpected: readonly { start: number; end: number }[],\n\tvalidateOverlapping: boolean = true,\n) => {\n\tconst actual = Array.from(intervalCollection);\n\tif (validateOverlapping && sharedString.getLength() > 0) {\n\t\tconst overlappingIntervalsIndex = createOverlappingIntervalsIndex(sharedString);\n\t\tintervalCollection.attachIndex(overlappingIntervalsIndex);\n\t\tconst overlapping = overlappingIntervalsIndex.findOverlappingIntervals(\"start\", \"end\");\n\t\tassert.deepEqual(actual, overlapping, \"Interval search returned inconsistent results\");\n\t\tintervalCollection.detachIndex(overlappingIntervalsIndex);\n\t}\n\tassert.strictEqual(\n\t\tactual.length,\n\t\texpected.length,\n\t\t`findOverlappingIntervals() must return the expected number of intervals`,\n\t);\n\n\tconst actualPos = actual.map((interval) => {\n\t\tassert(interval);\n\t\tconst start = sharedString.localReferencePositionToPosition(interval.start);\n\t\tconst end = sharedString.localReferencePositionToPosition(interval.end);\n\t\treturn { start, end };\n\t});\n\tassert.deepEqual(actualPos, expected, \"intervals are not as expected\");\n};\n"]}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { strict as assert } from "assert";
|
|
6
|
-
import { Marker, ReferenceType, TextSegment } from "@fluidframework/merge-tree";
|
|
7
|
-
import { SubSequence } from "../sharedSequence.js";
|
|
8
|
-
const segmentTypes = [
|
|
9
|
-
{
|
|
10
|
-
ctor: () => new TextSegment("text"),
|
|
11
|
-
fromJSON: TextSegment.fromJSONObject,
|
|
12
|
-
name: "TextSegment",
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
ctor: () => new Marker(ReferenceType.Simple),
|
|
16
|
-
fromJSON: Marker.fromJSONObject,
|
|
17
|
-
name: "Marker",
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
ctor: () => new SubSequence([0]),
|
|
21
|
-
fromJSON: SubSequence.fromJSONObject,
|
|
22
|
-
name: "SubSequence",
|
|
23
|
-
},
|
|
24
|
-
];
|
|
25
|
-
describe("Segment Marshalling", () => {
|
|
26
|
-
for (const { name, ctor, fromJSON } of segmentTypes) {
|
|
27
|
-
describe(name, () => {
|
|
28
|
-
describe("to/from spec", () => {
|
|
29
|
-
// Ensure that a segment w/no 'props' correctly round-trips
|
|
30
|
-
it("unannotated", () => {
|
|
31
|
-
const expected = ctor();
|
|
32
|
-
const spec = expected.toJSONObject();
|
|
33
|
-
const actual = fromJSON(spec);
|
|
34
|
-
assert.deepStrictEqual(expected, actual);
|
|
35
|
-
});
|
|
36
|
-
// Ensure that a segment w/'props' correctly round-trips
|
|
37
|
-
it("annotated", () => {
|
|
38
|
-
const expected = ctor();
|
|
39
|
-
expected.addProperties({ hasProperties: true, numProperties: 2 });
|
|
40
|
-
const spec = expected.toJSONObject();
|
|
41
|
-
const actual = fromJSON(spec);
|
|
42
|
-
assert.deepStrictEqual(expected, actual);
|
|
43
|
-
});
|
|
44
|
-
// Ensure that 'fromJSON()' returns undefined for an unrecognized JSON spec.
|
|
45
|
-
it("returns 'undefined' for unrecognized JSON spec", () => {
|
|
46
|
-
// Test some potentially problematic values that are not used by any of the defined segment types.
|
|
47
|
-
for (const unrecognized of [{}, Symbol(), NaN, undefined, null, true, false]) {
|
|
48
|
-
assert.strictEqual(undefined, fromJSON(unrecognized));
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
//# sourceMappingURL=marshalling.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"marshalling.spec.js","sourceRoot":"","sources":["../../src/test/marshalling.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,YAAY,GAAG;IACpB;QACC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC;QACnC,QAAQ,EAAE,WAAW,CAAC,cAAc;QACpC,IAAI,EAAE,aAAa;KACnB;IACD;QACC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;QAC5C,QAAQ,EAAE,MAAM,CAAC,cAAc;QAC/B,IAAI,EAAE,QAAQ;KACd;IACD;QACC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,QAAQ,EAAE,WAAW,CAAC,cAAc;QACpC,IAAI,EAAE,aAAa;KACnB;CACD,CAAC;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACpC,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,YAAY,EAAE;QACpD,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;YACnB,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;gBAC7B,2DAA2D;gBAC3D,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;oBACtB,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC;oBACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;oBACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC9B,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC1C,CAAC,CAAC,CAAC;gBAEH,wDAAwD;gBACxD,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;oBACpB,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC;oBACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;oBAClE,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;oBACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC9B,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC1C,CAAC,CAAC,CAAC;gBAEH,4EAA4E;gBAC5E,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;oBACzD,kGAAkG;oBAClG,KAAK,MAAM,YAAY,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE;wBAC7E,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;qBACtD;gBACF,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;KACH;AACF,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 { Marker, ReferenceType, TextSegment } from \"@fluidframework/merge-tree\";\nimport { SubSequence } from \"../sharedSequence.js\";\n\nconst segmentTypes = [\n\t{\n\t\tctor: () => new TextSegment(\"text\"),\n\t\tfromJSON: TextSegment.fromJSONObject,\n\t\tname: \"TextSegment\",\n\t},\n\t{\n\t\tctor: () => new Marker(ReferenceType.Simple),\n\t\tfromJSON: Marker.fromJSONObject,\n\t\tname: \"Marker\",\n\t},\n\t{\n\t\tctor: () => new SubSequence([0]),\n\t\tfromJSON: SubSequence.fromJSONObject,\n\t\tname: \"SubSequence\",\n\t},\n];\n\ndescribe(\"Segment Marshalling\", () => {\n\tfor (const { name, ctor, fromJSON } of segmentTypes) {\n\t\tdescribe(name, () => {\n\t\t\tdescribe(\"to/from spec\", () => {\n\t\t\t\t// Ensure that a segment w/no 'props' correctly round-trips\n\t\t\t\tit(\"unannotated\", () => {\n\t\t\t\t\tconst expected = ctor();\n\t\t\t\t\tconst spec = expected.toJSONObject();\n\t\t\t\t\tconst actual = fromJSON(spec);\n\t\t\t\t\tassert.deepStrictEqual(expected, actual);\n\t\t\t\t});\n\n\t\t\t\t// Ensure that a segment w/'props' correctly round-trips\n\t\t\t\tit(\"annotated\", () => {\n\t\t\t\t\tconst expected = ctor();\n\t\t\t\t\texpected.addProperties({ hasProperties: true, numProperties: 2 });\n\t\t\t\t\tconst spec = expected.toJSONObject();\n\t\t\t\t\tconst actual = fromJSON(spec);\n\t\t\t\t\tassert.deepStrictEqual(expected, actual);\n\t\t\t\t});\n\n\t\t\t\t// Ensure that 'fromJSON()' returns undefined for an unrecognized JSON spec.\n\t\t\t\tit(\"returns 'undefined' for unrecognized JSON spec\", () => {\n\t\t\t\t\t// Test some potentially problematic values that are not used by any of the defined segment types.\n\t\t\t\t\tfor (const unrecognized of [{}, Symbol(), NaN, undefined, null, true, false]) {\n\t\t\t\t\t\tassert.strictEqual(undefined, fromJSON(unrecognized));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n});\n"]}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { benchmarkMemory } from "@fluid-tools/benchmark";
|
|
6
|
-
import { SubSequence } from "../../sharedSequence.js";
|
|
7
|
-
describe("SharedSequence memory usage", () => {
|
|
8
|
-
// IMPORTANT: variables scoped to the test suite are a big problem for memory-profiling tests
|
|
9
|
-
// because they won't be out of scope when we garbage-collect between runs of the same test,
|
|
10
|
-
// and that will skew measurements. Tests should allocate all the memory they need using local
|
|
11
|
-
// variables scoped to the test function itself, so several iterations of a given test can
|
|
12
|
-
// measure from the same baseline (as much as possible).
|
|
13
|
-
beforeEach(async () => {
|
|
14
|
-
// CAREFUL: usually beforeEach/afterEach hooks are used to initialize or interact with variables
|
|
15
|
-
// whose scope is the encompasing test suite, but that's a problem for memory-profiling tests.
|
|
16
|
-
// See the comment at the top of the test suite for more details.
|
|
17
|
-
});
|
|
18
|
-
afterEach(() => {
|
|
19
|
-
// CAREFUL: usually beforeEach/afterEach hooks are used to initialize or interact with variables
|
|
20
|
-
// whose scope is the encompasing test suite, but that's a problem for memory-profiling tests.
|
|
21
|
-
// See the comment at the top of the test suite for more details.
|
|
22
|
-
});
|
|
23
|
-
benchmarkMemory(new (class {
|
|
24
|
-
constructor() {
|
|
25
|
-
this.title = "Create empty SharedSequence";
|
|
26
|
-
this.minSampleCount = 500;
|
|
27
|
-
this.segment = new SubSequence([]);
|
|
28
|
-
}
|
|
29
|
-
async run() {
|
|
30
|
-
this.segment = new SubSequence([]);
|
|
31
|
-
}
|
|
32
|
-
})());
|
|
33
|
-
const numbersOfEntriesForTests = [100, 1000, 10000];
|
|
34
|
-
numbersOfEntriesForTests.forEach((x) => {
|
|
35
|
-
benchmarkMemory(new (class {
|
|
36
|
-
constructor() {
|
|
37
|
-
this.title = `Append and remove ${x} subsequences`;
|
|
38
|
-
this.segment = new SubSequence([]);
|
|
39
|
-
}
|
|
40
|
-
async run() {
|
|
41
|
-
for (let i = 0; i < x; i++) {
|
|
42
|
-
this.segment.append(new SubSequence([i]));
|
|
43
|
-
this.segment.removeRange(0, 1);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
beforeIteration() {
|
|
47
|
-
this.segment = new SubSequence([]);
|
|
48
|
-
}
|
|
49
|
-
})());
|
|
50
|
-
// NOTE: This test is commented out because SharedSequence does not exist
|
|
51
|
-
// as an implementable standalone datastructure. In order to implement the
|
|
52
|
-
// test for it, we need to define a SharedSequenceFactory and implement the
|
|
53
|
-
// various functions within it to instantiate and process the different
|
|
54
|
-
// datatypes within the Sequence. However, as we are depracating
|
|
55
|
-
// SharedObjectSequence and SharedNumberSequence, and SharedString has it's
|
|
56
|
-
// own performance tests, it makes little sense to make up and implement a
|
|
57
|
-
// ShareSequence standalone factory to benchmark performance as is. So we
|
|
58
|
-
// are leaving this test skipped over for now until there is a reason to
|
|
59
|
-
// invest more effort into benchmarking it's performance.
|
|
60
|
-
//
|
|
61
|
-
// function createLocalSharedSequence(id: string) {
|
|
62
|
-
// return new SharedSequence<number>(
|
|
63
|
-
// new MockFluidDataStoreRuntime(),
|
|
64
|
-
// id,
|
|
65
|
-
// SharedStringFactory.Attributes,
|
|
66
|
-
// SharedStringFactory.segmentFromSpec
|
|
67
|
-
// );
|
|
68
|
-
// }
|
|
69
|
-
// benchmarkMemory.skip({
|
|
70
|
-
// title: `Insert and remove ${x} subsequences`,
|
|
71
|
-
// benchmarkFn: async () => {
|
|
72
|
-
// const sharedSequence = createLocalSharedSequence("subsequence");
|
|
73
|
-
// sharedSequence.insert(0, [1]);
|
|
74
|
-
// for (let i = 0; i < x; i++) {
|
|
75
|
-
// sharedSequence.insert(0, [i]);
|
|
76
|
-
// sharedSequence.remove(0, 1);
|
|
77
|
-
// }
|
|
78
|
-
// },
|
|
79
|
-
// });
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
//# sourceMappingURL=sharedSequence.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sharedSequence.spec.js","sourceRoot":"","sources":["../../../src/test/memory/sharedSequence.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAqB,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC5C,6FAA6F;IAC7F,4FAA4F;IAC5F,8FAA8F;IAC9F,0FAA0F;IAC1F,wDAAwD;IAExD,UAAU,CAAC,KAAK,IAAI,EAAE;QACrB,gGAAgG;QAChG,8FAA8F;QAC9F,iEAAiE;IAClE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACd,gGAAgG;QAChG,8FAA8F;QAC9F,iEAAiE;IAClE,CAAC,CAAC,CAAC;IAEH,eAAe,CACd,IAAI,CAAC;QAAA;YACJ,UAAK,GAAG,6BAA6B,CAAC;YACtC,mBAAc,GAAG,GAAG,CAAC;YAEb,YAAO,GAAG,IAAI,WAAW,CAAS,EAAE,CAAC,CAAC;QAK/C,CAAC;QAHA,KAAK,CAAC,GAAG;YACR,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAS,EAAE,CAAC,CAAC;QAC5C,CAAC;KACD,CAAC,EAAE,CACJ,CAAC;IAEF,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAM,CAAC,CAAC;IAErD,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACtC,eAAe,CACd,IAAI,CAAC;YAAA;gBACJ,UAAK,GAAG,qBAAqB,CAAC,eAAe,CAAC;gBACtC,YAAO,GAAG,IAAI,WAAW,CAAS,EAAE,CAAC,CAAC;YAW/C,CAAC;YATA,KAAK,CAAC,GAAG;gBACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,WAAW,CAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;iBAC/B;YACF,CAAC;YACD,eAAe;gBACd,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAS,EAAE,CAAC,CAAC;YAC5C,CAAC;SACD,CAAC,EAAE,CACJ,CAAC;QAEF,yEAAyE;QACzE,0EAA0E;QAC1E,2EAA2E;QAC3E,uEAAuE;QACvE,gEAAgE;QAChE,2EAA2E;QAC3E,0EAA0E;QAC1E,yEAAyE;QACzE,wEAAwE;QACxE,yDAAyD;QACzD,EAAE;QACF,oDAAoD;QACpD,yCAAyC;QACzC,2CAA2C;QAC3C,cAAc;QACd,0CAA0C;QAC1C,8CAA8C;QAC9C,SAAS;QACT,IAAI;QACJ,yBAAyB;QACzB,oDAAoD;QACpD,iCAAiC;QACjC,2EAA2E;QAC3E,yCAAyC;QACzC,wCAAwC;QACxC,6CAA6C;QAC7C,2CAA2C;QAC3C,YAAY;QACZ,SAAS;QACT,MAAM;IACP,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 { benchmarkMemory, IMemoryTestObject } from \"@fluid-tools/benchmark\";\nimport { SubSequence } from \"../../sharedSequence.js\";\n\ndescribe(\"SharedSequence memory usage\", () => {\n\t// IMPORTANT: variables scoped to the test suite are a big problem for memory-profiling tests\n\t// because they won't be out of scope when we garbage-collect between runs of the same test,\n\t// and that will skew measurements. Tests should allocate all the memory they need using local\n\t// variables scoped to the test function itself, so several iterations of a given test can\n\t// measure from the same baseline (as much as possible).\n\n\tbeforeEach(async () => {\n\t\t// CAREFUL: usually beforeEach/afterEach hooks are used to initialize or interact with variables\n\t\t// whose scope is the encompasing test suite, but that's a problem for memory-profiling tests.\n\t\t// See the comment at the top of the test suite for more details.\n\t});\n\n\tafterEach(() => {\n\t\t// CAREFUL: usually beforeEach/afterEach hooks are used to initialize or interact with variables\n\t\t// whose scope is the encompasing test suite, but that's a problem for memory-profiling tests.\n\t\t// See the comment at the top of the test suite for more details.\n\t});\n\n\tbenchmarkMemory(\n\t\tnew (class implements IMemoryTestObject {\n\t\t\ttitle = \"Create empty SharedSequence\";\n\t\t\tminSampleCount = 500;\n\n\t\t\tprivate segment = new SubSequence<number>([]);\n\n\t\t\tasync run() {\n\t\t\t\tthis.segment = new SubSequence<number>([]);\n\t\t\t}\n\t\t})(),\n\t);\n\n\tconst numbersOfEntriesForTests = [100, 1000, 10_000];\n\n\tnumbersOfEntriesForTests.forEach((x) => {\n\t\tbenchmarkMemory(\n\t\t\tnew (class implements IMemoryTestObject {\n\t\t\t\ttitle = `Append and remove ${x} subsequences`;\n\t\t\t\tprivate segment = new SubSequence<number>([]);\n\n\t\t\t\tasync run() {\n\t\t\t\t\tfor (let i = 0; i < x; i++) {\n\t\t\t\t\t\tthis.segment.append(new SubSequence<number>([i]));\n\t\t\t\t\t\tthis.segment.removeRange(0, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbeforeIteration() {\n\t\t\t\t\tthis.segment = new SubSequence<number>([]);\n\t\t\t\t}\n\t\t\t})(),\n\t\t);\n\n\t\t// NOTE: This test is commented out because SharedSequence does not exist\n\t\t// as an implementable standalone datastructure. In order to implement the\n\t\t// test for it, we need to define a SharedSequenceFactory and implement the\n\t\t// various functions within it to instantiate and process the different\n\t\t// datatypes within the Sequence. However, as we are depracating\n\t\t// SharedObjectSequence and SharedNumberSequence, and SharedString has it's\n\t\t// own performance tests, it makes little sense to make up and implement a\n\t\t// ShareSequence standalone factory to benchmark performance as is. So we\n\t\t// are leaving this test skipped over for now until there is a reason to\n\t\t// invest more effort into benchmarking it's performance.\n\t\t//\n\t\t// function createLocalSharedSequence(id: string) {\n\t\t// return new SharedSequence<number>(\n\t\t// new MockFluidDataStoreRuntime(),\n\t\t// id,\n\t\t// SharedStringFactory.Attributes,\n\t\t// SharedStringFactory.segmentFromSpec\n\t\t// );\n\t\t// }\n\t\t// benchmarkMemory.skip({\n\t\t// title: `Insert and remove ${x} subsequences`,\n\t\t// benchmarkFn: async () => {\n\t\t// const sharedSequence = createLocalSharedSequence(\"subsequence\");\n\t\t// sharedSequence.insert(0, [1]);\n\t\t// for (let i = 0; i < x; i++) {\n\t\t// sharedSequence.insert(0, [i]);\n\t\t// sharedSequence.remove(0, 1);\n\t\t// }\n\t\t// },\n\t\t// });\n\t});\n});\n"]}
|