@fluidframework/merge-tree 2.1.0-276985 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.cjs +2 -4
- package/CHANGELOG.md +15 -0
- package/README.md +109 -1
- package/api-extractor/api-extractor.current.json +5 -0
- package/api-extractor/api-extractor.legacy.json +1 -1
- package/api-extractor.json +1 -1
- package/api-report/merge-tree.legacy.alpha.api.md +10 -22
- package/api-report/merge-tree.legacy.public.api.md +9 -0
- package/dist/MergeTreeTextHelper.d.ts.map +1 -1
- package/dist/MergeTreeTextHelper.js +1 -1
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionCollection.d.ts.map +1 -1
- package/dist/attributionCollection.js +65 -17
- package/dist/attributionCollection.js.map +1 -1
- package/dist/attributionPolicy.d.ts +2 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +10 -3
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +3 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +65 -37
- package/dist/client.js.map +1 -1
- package/dist/collections/list.d.ts.map +1 -1
- package/dist/collections/list.js +5 -2
- package/dist/collections/list.js.map +1 -1
- package/dist/collections/rbTree.d.ts +2 -2
- package/dist/collections/rbTree.d.ts.map +1 -1
- package/dist/collections/rbTree.js +23 -35
- package/dist/collections/rbTree.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js +4 -1
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/legacy.d.ts +1 -1
- package/dist/localReference.d.ts +16 -6
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +31 -20
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +0 -1
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +127 -112
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js +1 -1
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +6 -5
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +29 -20
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.js +3 -3
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.d.ts +6 -1
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js +5 -0
- package/dist/opBuilder.js.map +1 -1
- package/dist/ops.d.ts.map +1 -1
- package/dist/ops.js.map +1 -1
- package/dist/ordinal.d.ts.map +1 -1
- package/dist/ordinal.js +7 -0
- package/dist/ordinal.js.map +1 -1
- package/dist/partialLengths.d.ts +4 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +101 -53
- package/dist/partialLengths.js.map +1 -1
- package/dist/perspective.d.ts +4 -1
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js +7 -6
- package/dist/perspective.js.map +1 -1
- package/dist/properties.d.ts +13 -10
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +22 -11
- package/dist/properties.js.map +1 -1
- package/dist/public.d.ts +1 -1
- package/dist/referencePositions.d.ts +7 -0
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +7 -0
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.d.ts +6 -0
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +50 -21
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +2 -0
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +7 -3
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +20 -15
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/snapshotChunks.d.ts.map +1 -1
- package/dist/snapshotChunks.js +10 -5
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +14 -10
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +20 -8
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +4 -2
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js +8 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/sortedSet.d.ts.map +1 -1
- package/dist/sortedSet.js +4 -0
- package/dist/sortedSet.js.map +1 -1
- package/dist/test/Insertion.perf.spec.js.map +1 -1
- package/dist/test/Removal.perf.spec.js.map +1 -1
- package/dist/test/Snapshot.perf.spec.js +1 -0
- package/dist/test/Snapshot.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.perf.spec.js +3 -1
- package/dist/test/attributionCollection.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.spec.js +69 -68
- package/dist/test/attributionCollection.spec.js.map +1 -1
- package/dist/test/attributionPolicy.spec.js +29 -27
- package/dist/test/attributionPolicy.spec.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts +1 -4
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +32 -30
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js +5 -5
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.apis.spec.d.ts.map +1 -1
- package/dist/test/client.apis.spec.js +5 -7
- package/dist/test/client.apis.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +125 -103
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.js +18 -10
- package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.js +13 -8
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.conflictFarm.spec.js +4 -2
- package/dist/test/client.conflictFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +10 -10
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +111 -104
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js +14 -10
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.rebasePosition.spec.js +12 -12
- package/dist/test/client.rebasePosition.spec.js.map +1 -1
- package/dist/test/client.reconnectFarm.spec.js +12 -9
- package/dist/test/client.reconnectFarm.spec.js.map +1 -1
- package/dist/test/client.replay.spec.js +11 -10
- package/dist/test/client.replay.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js +87 -84
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/client.rollbackFarm.spec.js +3 -1
- package/dist/test/client.rollbackFarm.spec.js.map +1 -1
- package/dist/test/client.searchForMarker.spec.js +122 -112
- package/dist/test/client.searchForMarker.spec.js.map +1 -1
- package/dist/test/client.walkSegments.spec.js +7 -7
- package/dist/test/client.walkSegments.spec.js.map +1 -1
- package/dist/test/collections.list.spec.js +14 -14
- package/dist/test/collections.list.spec.js.map +1 -1
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js +3 -3
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/dist/test/dirname.cjs +1 -0
- package/dist/test/dirname.cjs.map +1 -1
- package/dist/test/dirname.d.cts.map +1 -1
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js +7 -7
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +87 -87
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insert.deltaCallback.spec.js +6 -6
- package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +24 -24
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +6 -6
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +23 -23
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js +3 -3
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTree.zamboni.spec.js +10 -10
- package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +28 -16
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.spec.js +9 -5
- package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/dist/test/obliterate.concurrent.spec.js +165 -165
- package/dist/test/obliterate.concurrent.spec.js.map +1 -1
- package/dist/test/obliterate.deltaCallback.spec.js +20 -21
- package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/dist/test/obliterate.partialLength.spec.js +7 -7
- package/dist/test/obliterate.partialLength.spec.js.map +1 -1
- package/dist/test/obliterate.reconnect.spec.js +13 -13
- package/dist/test/obliterate.reconnect.spec.js.map +1 -1
- package/dist/test/obliterate.spec.js +9 -9
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/ordinal.spec.js +10 -4
- package/dist/test/ordinal.spec.js.map +1 -1
- package/dist/test/partialLength.spec.js.map +1 -1
- package/dist/test/properties.spec.js +15 -15
- package/dist/test/properties.spec.js.map +1 -1
- package/dist/test/reconnectHelper.d.ts +4 -4
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js +28 -20
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js +35 -29
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js +11 -10
- package/dist/test/revertibleFarm.spec.js.map +1 -1
- package/dist/test/revertibles.spec.d.ts.map +1 -1
- package/dist/test/revertibles.spec.js +96 -57
- package/dist/test/revertibles.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +17 -17
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.spec.js +5 -5
- package/dist/test/snapshot.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js +6 -6
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/snapshotlegacy.spec.js +18 -13
- package/dist/test/snapshotlegacy.spec.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +22 -18
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +6 -5
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +30 -32
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +39 -38
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testSerializer.d.ts +5 -5
- package/dist/test/testSerializer.d.ts.map +1 -1
- package/dist/test/testSerializer.js +0 -1
- package/dist/test/testSerializer.js.map +1 -1
- package/dist/test/testServer.d.ts.map +1 -1
- package/dist/test/testServer.js.map +1 -1
- package/dist/test/testUtils.d.ts +1 -1
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +15 -17
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js +1 -1
- package/dist/test/text.js.map +1 -1
- package/dist/test/tracking.spec.js +50 -46
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/wordUnitTests.spec.d.ts.map +1 -1
- package/dist/test/wordUnitTests.spec.js +10 -10
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/textSegment.d.ts +1 -1
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js +3 -3
- package/dist/textSegment.js.map +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js +7 -2
- package/dist/zamboni.js.map +1 -1
- package/internal.d.ts +1 -1
- package/legacy.d.ts +1 -1
- package/lib/MergeTreeTextHelper.d.ts.map +1 -1
- package/lib/MergeTreeTextHelper.js +1 -1
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/attributionCollection.d.ts.map +1 -1
- package/lib/attributionCollection.js +65 -17
- package/lib/attributionCollection.js.map +1 -1
- package/lib/attributionPolicy.d.ts +2 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js +10 -3
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +3 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +65 -37
- package/lib/client.js.map +1 -1
- package/lib/collections/list.d.ts.map +1 -1
- package/lib/collections/list.js +5 -2
- package/lib/collections/list.js.map +1 -1
- package/lib/collections/rbTree.d.ts +2 -2
- package/lib/collections/rbTree.d.ts.map +1 -1
- package/lib/collections/rbTree.js +23 -35
- package/lib/collections/rbTree.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js +4 -1
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/localReference.d.ts +16 -6
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +31 -20
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +0 -1
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +127 -112
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js +1 -1
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +6 -5
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +29 -20
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/mergeTreeTracking.js +3 -3
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/opBuilder.d.ts +6 -1
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js +5 -0
- package/lib/opBuilder.js.map +1 -1
- package/lib/ops.d.ts.map +1 -1
- package/lib/ops.js.map +1 -1
- package/lib/ordinal.d.ts.map +1 -1
- package/lib/ordinal.js +7 -0
- package/lib/ordinal.js.map +1 -1
- package/lib/partialLengths.d.ts +4 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +101 -53
- package/lib/partialLengths.js.map +1 -1
- package/lib/perspective.d.ts +4 -1
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js +7 -6
- package/lib/perspective.js.map +1 -1
- package/lib/properties.d.ts +13 -10
- package/lib/properties.d.ts.map +1 -1
- package/lib/properties.js +22 -11
- package/lib/properties.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/referencePositions.d.ts +7 -0
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +7 -0
- package/lib/referencePositions.js.map +1 -1
- package/lib/revertibles.d.ts +6 -0
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +50 -21
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +2 -0
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts +7 -3
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +20 -15
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/snapshotChunks.d.ts.map +1 -1
- package/lib/snapshotChunks.js +10 -5
- package/lib/snapshotChunks.js.map +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +14 -10
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +20 -8
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +4 -2
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js +8 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/sortedSet.d.ts.map +1 -1
- package/lib/sortedSet.js +4 -0
- package/lib/sortedSet.js.map +1 -1
- package/lib/test/Insertion.perf.spec.js.map +1 -1
- package/lib/test/Removal.perf.spec.js.map +1 -1
- package/lib/test/Snapshot.perf.spec.js +1 -0
- package/lib/test/Snapshot.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.perf.spec.js +3 -1
- package/lib/test/attributionCollection.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.spec.js +3 -2
- package/lib/test/attributionCollection.spec.js.map +1 -1
- package/lib/test/attributionPolicy.spec.js +3 -1
- package/lib/test/attributionPolicy.spec.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts +1 -4
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +26 -24
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js +1 -1
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.apis.spec.d.ts.map +1 -1
- package/lib/test/client.apis.spec.js +4 -6
- package/lib/test/client.apis.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +72 -50
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.js +18 -10
- package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.js +12 -7
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.conflictFarm.spec.js +4 -2
- package/lib/test/client.conflictFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js +1 -1
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +14 -7
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js +13 -9
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.rebasePosition.spec.js +1 -1
- package/lib/test/client.rebasePosition.spec.js.map +1 -1
- package/lib/test/client.reconnectFarm.spec.js +11 -8
- package/lib/test/client.reconnectFarm.spec.js.map +1 -1
- package/lib/test/client.replay.spec.js +8 -7
- package/lib/test/client.replay.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +14 -11
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/client.rollbackFarm.spec.js +3 -1
- package/lib/test/client.rollbackFarm.spec.js.map +1 -1
- package/lib/test/client.searchForMarker.spec.js +29 -19
- package/lib/test/client.searchForMarker.spec.js.map +1 -1
- package/lib/test/client.walkSegments.spec.js +1 -1
- package/lib/test/client.walkSegments.spec.js.map +1 -1
- package/lib/test/collections.list.spec.js +1 -1
- package/lib/test/collections.list.spec.js.map +1 -1
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js +1 -1
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/lib/test/dirname.cjs +1 -0
- package/lib/test/dirname.cjs.map +1 -1
- package/lib/test/dirname.d.cts.map +1 -1
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +1 -1
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.insert.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js +8 -8
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js +1 -1
- package/lib/test/mergeTree.walk.spec.js.map +1 -1
- package/lib/test/mergeTree.zamboni.spec.js +1 -1
- package/lib/test/mergeTree.zamboni.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +27 -15
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.spec.js +5 -1
- package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/lib/test/obliterate.concurrent.spec.js +4 -4
- package/lib/test/obliterate.concurrent.spec.js.map +1 -1
- package/lib/test/obliterate.deltaCallback.spec.js +2 -3
- package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/lib/test/obliterate.partialLength.spec.js +1 -1
- package/lib/test/obliterate.partialLength.spec.js.map +1 -1
- package/lib/test/obliterate.reconnect.spec.js +1 -1
- package/lib/test/obliterate.reconnect.spec.js.map +1 -1
- package/lib/test/obliterate.spec.js +1 -1
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/ordinal.spec.js +7 -1
- package/lib/test/ordinal.spec.js.map +1 -1
- package/lib/test/partialLength.spec.js.map +1 -1
- package/lib/test/properties.spec.js +1 -1
- package/lib/test/properties.spec.js.map +1 -1
- package/lib/test/reconnectHelper.d.ts +4 -4
- package/lib/test/reconnectHelper.d.ts.map +1 -1
- package/lib/test/reconnectHelper.js +22 -14
- package/lib/test/reconnectHelper.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js +8 -2
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/revertibleFarm.spec.js +8 -7
- package/lib/test/revertibleFarm.spec.js.map +1 -1
- package/lib/test/revertibles.spec.d.ts.map +1 -1
- package/lib/test/revertibles.spec.js +93 -54
- package/lib/test/revertibles.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js +1 -1
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.spec.js +1 -1
- package/lib/test/snapshot.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/snapshotlegacy.spec.js +10 -5
- package/lib/test/snapshotlegacy.spec.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js +6 -2
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +6 -5
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +25 -27
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +37 -36
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testSerializer.d.ts +5 -5
- package/lib/test/testSerializer.d.ts.map +1 -1
- package/lib/test/testSerializer.js +0 -1
- package/lib/test/testSerializer.js.map +1 -1
- package/lib/test/testServer.d.ts.map +1 -1
- package/lib/test/testServer.js.map +1 -1
- package/lib/test/testUtils.d.ts +1 -1
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +6 -8
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js +1 -1
- package/lib/test/text.js.map +1 -1
- package/lib/test/tracking.spec.js +9 -5
- package/lib/test/tracking.spec.js.map +1 -1
- package/lib/test/wordUnitTests.spec.d.ts.map +1 -1
- package/lib/test/wordUnitTests.spec.js +9 -9
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/textSegment.d.ts +1 -1
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js +3 -3
- package/lib/textSegment.js.map +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js +7 -2
- package/lib/zamboni.js.map +1 -1
- package/package.json +29 -27
- package/src/MergeTreeTextHelper.ts +2 -2
- package/src/attributionCollection.ts +71 -28
- package/src/attributionPolicy.ts +14 -9
- package/src/client.ts +120 -71
- package/src/collections/list.ts +9 -6
- package/src/collections/rbTree.ts +62 -71
- package/src/endOfTreeSegment.ts +21 -10
- package/src/localReference.ts +61 -43
- package/src/mergeTree.ts +229 -178
- package/src/mergeTreeNodeWalk.ts +2 -1
- package/src/mergeTreeNodes.ts +59 -46
- package/src/mergeTreeTracking.ts +3 -3
- package/src/opBuilder.ts +6 -1
- package/src/ops.ts +5 -0
- package/src/ordinal.ts +8 -1
- package/src/partialLengths.ts +143 -87
- package/src/perspective.ts +10 -7
- package/src/properties.ts +36 -18
- package/src/referencePositions.ts +7 -0
- package/src/revertibles.ts +71 -41
- package/src/segmentGroupCollection.ts +8 -6
- package/src/segmentPropertiesManager.ts +28 -24
- package/src/snapshotChunks.ts +12 -7
- package/src/snapshotLoader.ts +20 -17
- package/src/snapshotV1.ts +36 -18
- package/src/snapshotlegacy.ts +7 -5
- package/src/sortedSegmentSet.ts +9 -3
- package/src/sortedSet.ts +7 -3
- package/src/textSegment.ts +9 -9
- package/src/zamboni.ts +14 -10
- package/tsconfig.json +0 -1
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
const
|
|
7
|
+
const node_assert_1 = require("node:assert");
|
|
8
8
|
const internal_1 = require("@fluidframework/telemetry-utils/internal");
|
|
9
9
|
const mergeTree_js_1 = require("../mergeTree.js");
|
|
10
10
|
const reconnectHelper_js_1 = require("./reconnectHelper.js");
|
|
@@ -60,7 +60,7 @@ for (const incremental of [true, false]) {
|
|
|
60
60
|
helper.obliterateRange("A", 2, 11);
|
|
61
61
|
helper.removeRange("A", 1, 2);
|
|
62
62
|
helper.processAllOps();
|
|
63
|
-
|
|
63
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "I");
|
|
64
64
|
helper.logger.validate();
|
|
65
65
|
});
|
|
66
66
|
it("deletes concurrent insert that occurs after obliterate", () => {
|
|
@@ -70,8 +70,8 @@ for (const incremental of [true, false]) {
|
|
|
70
70
|
helper.obliterateRange("B", 0, 4);
|
|
71
71
|
helper.insertText("C", 2, "X");
|
|
72
72
|
helper.processAllOps();
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
74
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "");
|
|
75
75
|
helper.logger.validate();
|
|
76
76
|
});
|
|
77
77
|
it("deletes concurrent insert that occurs before obliterate", () => {
|
|
@@ -81,8 +81,8 @@ for (const incremental of [true, false]) {
|
|
|
81
81
|
helper.insertText("C", 2, "X");
|
|
82
82
|
helper.obliterateRange("B", 0, 4);
|
|
83
83
|
helper.processAllOps();
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
85
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "");
|
|
86
86
|
helper.logger.validate();
|
|
87
87
|
});
|
|
88
88
|
it("does not delete unacked segment at start of string", () => {
|
|
@@ -91,9 +91,9 @@ for (const incremental of [true, false]) {
|
|
|
91
91
|
helper.obliterateRange("C", 2, 3);
|
|
92
92
|
helper.insertText("B", 0, "X");
|
|
93
93
|
helper.processAllOps();
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "XAB");
|
|
95
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "XAB");
|
|
96
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "XAB");
|
|
97
97
|
helper.logger.validate();
|
|
98
98
|
});
|
|
99
99
|
it("throws when local obliterate has range end outside length of local string", () => {
|
|
@@ -102,11 +102,11 @@ for (const incremental of [true, false]) {
|
|
|
102
102
|
helper.insertText("C", 0, "B");
|
|
103
103
|
try {
|
|
104
104
|
helper.obliterateRange("C", 0, 2);
|
|
105
|
-
|
|
105
|
+
node_assert_1.strict.fail("should not be possible to obliterate outside local range");
|
|
106
106
|
}
|
|
107
|
-
catch (
|
|
108
|
-
(0,
|
|
109
|
-
|
|
107
|
+
catch (error) {
|
|
108
|
+
(0, node_assert_1.strict)(error instanceof internal_1.LoggingError);
|
|
109
|
+
node_assert_1.strict.equal(error.message, "RangeOutOfBounds");
|
|
110
110
|
}
|
|
111
111
|
});
|
|
112
112
|
it("does not delete when obliterate immediately after insert", () => {
|
|
@@ -117,9 +117,9 @@ for (const incremental of [true, false]) {
|
|
|
117
117
|
helper.insertText("C", 0, "D");
|
|
118
118
|
helper.obliterateRange("C", 0, 1);
|
|
119
119
|
helper.processAllOps();
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "W");
|
|
121
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "W");
|
|
122
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "W");
|
|
123
123
|
helper.logger.validate();
|
|
124
124
|
});
|
|
125
125
|
it("does not delete remote insert when between local insert+obliterate", () => {
|
|
@@ -130,9 +130,9 @@ for (const incremental of [true, false]) {
|
|
|
130
130
|
helper.insertText("C", 0, "B");
|
|
131
131
|
helper.obliterateRange("C", 0, 1);
|
|
132
132
|
helper.processAllOps();
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
133
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "X");
|
|
134
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "X");
|
|
135
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "X");
|
|
136
136
|
helper.logger.validate();
|
|
137
137
|
});
|
|
138
138
|
it("does not delete remote insert when between local insert+obliterate", () => {
|
|
@@ -143,9 +143,9 @@ for (const incremental of [true, false]) {
|
|
|
143
143
|
helper.insertText("C", 0, "X");
|
|
144
144
|
helper.obliterateRange("B", 0, 1);
|
|
145
145
|
helper.processAllOps();
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
146
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "X");
|
|
147
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "X");
|
|
148
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "X");
|
|
149
149
|
helper.logger.validate();
|
|
150
150
|
});
|
|
151
151
|
it("does not delete remote insert when in middle of segment", () => {
|
|
@@ -155,9 +155,9 @@ for (const incremental of [true, false]) {
|
|
|
155
155
|
helper.obliterateRange("C", 0, 1);
|
|
156
156
|
helper.insertText("B", 0, "X");
|
|
157
157
|
helper.processAllOps();
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "XB");
|
|
159
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "XB");
|
|
160
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "XB");
|
|
161
161
|
helper.logger.validate();
|
|
162
162
|
});
|
|
163
163
|
it("deletes segment inserted into locally obliterated segment", () => {
|
|
@@ -167,9 +167,9 @@ for (const incremental of [true, false]) {
|
|
|
167
167
|
helper.insertText("C", 0, "B");
|
|
168
168
|
helper.obliterateRange("C", 0, 2);
|
|
169
169
|
helper.processAllOps();
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
170
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
171
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "");
|
|
172
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "");
|
|
173
173
|
helper.logger.validate();
|
|
174
174
|
});
|
|
175
175
|
it("updates lengths after obliterated insertion", () => {
|
|
@@ -180,12 +180,12 @@ for (const incremental of [true, false]) {
|
|
|
180
180
|
helper.obliterateRange("C", 0, 2);
|
|
181
181
|
helper.insertText("B", 1, "B");
|
|
182
182
|
helper.processAllOps();
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
183
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
184
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "");
|
|
185
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "");
|
|
186
|
+
node_assert_1.strict.equal(helper.clients.A.getLength(), 0);
|
|
187
|
+
node_assert_1.strict.equal(helper.clients.B.getLength(), 0);
|
|
188
|
+
node_assert_1.strict.equal(helper.clients.C.getLength(), 0);
|
|
189
189
|
helper.logger.validate();
|
|
190
190
|
});
|
|
191
191
|
it("updates lengths when insertion causes tree to split", () => {
|
|
@@ -197,10 +197,10 @@ for (const incremental of [true, false]) {
|
|
|
197
197
|
helper.obliterateRange("C", 2, 5);
|
|
198
198
|
helper.insertText("B", 1, "A");
|
|
199
199
|
helper.processAllOps();
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
200
|
+
node_assert_1.strict.equal(helper.clients.A.getText().length, helper.clients.A.getLength());
|
|
201
|
+
node_assert_1.strict.equal(helper.clients.B.getText().length, helper.clients.B.getLength());
|
|
202
|
+
node_assert_1.strict.equal(helper.clients.C.getText().length, helper.clients.C.getLength());
|
|
203
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "GG30");
|
|
204
204
|
helper.logger.validate();
|
|
205
205
|
});
|
|
206
206
|
it("length of node split by insertion does not count remotely obliterated segments", () => {
|
|
@@ -213,8 +213,8 @@ for (const incremental of [true, false]) {
|
|
|
213
213
|
helper.obliterateRange("C", 2, 6);
|
|
214
214
|
helper.insertText("C", 1, "D");
|
|
215
215
|
helper.processAllOps();
|
|
216
|
-
|
|
217
|
-
|
|
216
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "GDGX21");
|
|
217
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "GDGX21");
|
|
218
218
|
helper.logger.validate();
|
|
219
219
|
});
|
|
220
220
|
it("length of node split by obliterate does not count remotely obliterated segments", () => {
|
|
@@ -228,8 +228,8 @@ for (const incremental of [true, false]) {
|
|
|
228
228
|
helper.insertText("C", 1, "C");
|
|
229
229
|
helper.insertText("B", 1, "D");
|
|
230
230
|
helper.processAllOps();
|
|
231
|
-
|
|
232
|
-
|
|
231
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "GCGX21");
|
|
232
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "GCGX21");
|
|
233
233
|
helper.logger.validate();
|
|
234
234
|
});
|
|
235
235
|
it("counts remotely but not concurrently inserted segments for length when tree is split", () => {
|
|
@@ -246,8 +246,8 @@ for (const incremental of [true, false]) {
|
|
|
246
246
|
helper.obliterateRange("B", 0, 2);
|
|
247
247
|
helper.removeRange("B", 4, 5);
|
|
248
248
|
helper.processAllOps();
|
|
249
|
-
|
|
250
|
-
|
|
249
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "cde13");
|
|
250
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "cde13");
|
|
251
251
|
helper.logger.validate();
|
|
252
252
|
});
|
|
253
253
|
it("does obliterate X for all clients", () => {
|
|
@@ -258,8 +258,8 @@ for (const incremental of [true, false]) {
|
|
|
258
258
|
helper.insertText("B", 0, "ABC");
|
|
259
259
|
helper.obliterateRange("B", 2, 4);
|
|
260
260
|
helper.processAllOps();
|
|
261
|
-
|
|
262
|
-
|
|
261
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "AB");
|
|
262
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "AB");
|
|
263
263
|
helper.logger.validate();
|
|
264
264
|
});
|
|
265
265
|
it("does not include remote but unacked segments in partial len calculation", () => {
|
|
@@ -275,8 +275,8 @@ for (const incremental of [true, false]) {
|
|
|
275
275
|
helper.insertText("A", 3, "w");
|
|
276
276
|
helper.insertText("C", 3, "Y");
|
|
277
277
|
helper.processAllOps();
|
|
278
|
-
|
|
279
|
-
|
|
278
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "823YX");
|
|
279
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "823YX");
|
|
280
280
|
helper.logger.validate();
|
|
281
281
|
});
|
|
282
282
|
it("correctly accounts for overlapping obliterate", () => {
|
|
@@ -286,9 +286,9 @@ for (const incremental of [true, false]) {
|
|
|
286
286
|
helper.obliterateRange("C", 0, 1);
|
|
287
287
|
helper.obliterateRange("B", 0, 1);
|
|
288
288
|
helper.processAllOps();
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
289
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "B");
|
|
290
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "B");
|
|
291
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "B");
|
|
292
292
|
helper.logger.validate();
|
|
293
293
|
});
|
|
294
294
|
it("correctly accounts for overlapping obliterate and remove", () => {
|
|
@@ -298,9 +298,9 @@ for (const incremental of [true, false]) {
|
|
|
298
298
|
helper.removeRange("C", 0, 1);
|
|
299
299
|
helper.obliterateRange("B", 0, 1);
|
|
300
300
|
helper.processAllOps();
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
301
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "B");
|
|
302
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "B");
|
|
303
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "B");
|
|
304
304
|
helper.logger.validate();
|
|
305
305
|
});
|
|
306
306
|
it("clones movedClientIds array during insert", () => {
|
|
@@ -317,9 +317,9 @@ for (const incremental of [true, false]) {
|
|
|
317
317
|
helper.obliterateRange("A", 1, 3);
|
|
318
318
|
helper.obliterateRange("B", 1, 4);
|
|
319
319
|
helper.processAllOps();
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
320
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "AD");
|
|
321
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "AD");
|
|
322
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "AD");
|
|
323
323
|
helper.logger.validate();
|
|
324
324
|
});
|
|
325
325
|
it("client partial lens consider overlapping obliterates", () => {
|
|
@@ -331,9 +331,9 @@ for (const incremental of [true, false]) {
|
|
|
331
331
|
helper.obliterateRange("C", 1, 4);
|
|
332
332
|
helper.obliterateRange("C", 4, 5);
|
|
333
333
|
helper.processAllOps();
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
334
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "AEF13");
|
|
335
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "AEF13");
|
|
336
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "AEF13");
|
|
337
337
|
helper.logger.validate();
|
|
338
338
|
});
|
|
339
339
|
it("client partial lens consider overlapping obliterates", () => {
|
|
@@ -345,8 +345,8 @@ for (const incremental of [true, false]) {
|
|
|
345
345
|
helper.obliterateRange("C", 1, 4);
|
|
346
346
|
helper.obliterateRange("C", 2, 3);
|
|
347
347
|
helper.processAllOps();
|
|
348
|
-
|
|
349
|
-
|
|
348
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "AEGX");
|
|
349
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "AEGX");
|
|
350
350
|
helper.logger.validate();
|
|
351
351
|
});
|
|
352
352
|
it("tracks obliterate refSeq when acking op for partial len calculation", () => {
|
|
@@ -363,8 +363,8 @@ for (const incremental of [true, false]) {
|
|
|
363
363
|
helper.insertText("A", 0, "6");
|
|
364
364
|
helper.obliterateRange("B", 3, 5);
|
|
365
365
|
helper.processAllOps();
|
|
366
|
-
|
|
367
|
-
|
|
366
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "62");
|
|
367
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "62");
|
|
368
368
|
helper.logger.validate();
|
|
369
369
|
});
|
|
370
370
|
it("does not have negative len when segment obliterated before insert", () => {
|
|
@@ -381,9 +381,9 @@ for (const incremental of [true, false]) {
|
|
|
381
381
|
helper.removeRange("A", 2, 5);
|
|
382
382
|
helper.insertText("C", 3, "X");
|
|
383
383
|
helper.processAllOps();
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
384
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "12B");
|
|
385
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "12B");
|
|
386
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "12B");
|
|
387
387
|
helper.logger.validate();
|
|
388
388
|
});
|
|
389
389
|
it("does not have negative len when segment obliterated before insert", () => {
|
|
@@ -399,9 +399,9 @@ for (const incremental of [true, false]) {
|
|
|
399
399
|
helper.obliterateRange("C", 0, 2);
|
|
400
400
|
helper.insertText("B", 1, "XX");
|
|
401
401
|
helper.processAllOps();
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
402
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "E13");
|
|
403
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "E13");
|
|
404
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "E13");
|
|
405
405
|
helper.logger.validate();
|
|
406
406
|
});
|
|
407
407
|
it("deletes segments between two obliterates with different seq", () => {
|
|
@@ -421,7 +421,7 @@ for (const incremental of [true, false]) {
|
|
|
421
421
|
helper.insertText("A", 1, "EFG");
|
|
422
422
|
helper.obliterateRange("A", 1, 11);
|
|
423
423
|
helper.processAllOps();
|
|
424
|
-
|
|
424
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "9DCBA");
|
|
425
425
|
helper.logger.validate();
|
|
426
426
|
});
|
|
427
427
|
it("deletes inserted segment when obliterate of different seq in-between", () => {
|
|
@@ -433,9 +433,9 @@ for (const incremental of [true, false]) {
|
|
|
433
433
|
helper.insertText("A", 0, "CD");
|
|
434
434
|
helper.obliterateRange("A", 1, 4);
|
|
435
435
|
helper.processAllOps();
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
436
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "C2");
|
|
437
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "C2");
|
|
438
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "C2");
|
|
439
439
|
helper.logger.validate();
|
|
440
440
|
});
|
|
441
441
|
it("deletes inserted segment when obliterate of different seq in-between", () => {
|
|
@@ -446,9 +446,9 @@ for (const incremental of [true, false]) {
|
|
|
446
446
|
helper.insertText("A", 1, "D");
|
|
447
447
|
helper.obliterateRange("C", 0, 2);
|
|
448
448
|
helper.processAllOps();
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
449
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
450
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "");
|
|
451
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "");
|
|
452
452
|
helper.logger.validate();
|
|
453
453
|
});
|
|
454
454
|
it("deletes inserted segment when obliterate of different seq in-between", () => {
|
|
@@ -459,9 +459,9 @@ for (const incremental of [true, false]) {
|
|
|
459
459
|
helper.insertText("A", 1, "D");
|
|
460
460
|
helper.obliterateRange("C", 0, 2);
|
|
461
461
|
helper.processAllOps();
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
462
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
463
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "");
|
|
464
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "");
|
|
465
465
|
helper.logger.validate();
|
|
466
466
|
});
|
|
467
467
|
it("considers obliterated local segments as remotely obliterate", () => {
|
|
@@ -477,8 +477,8 @@ for (const incremental of [true, false]) {
|
|
|
477
477
|
helper.insertText("B", 1, "I");
|
|
478
478
|
helper.insertText("C", 1, "J");
|
|
479
479
|
helper.processAllOps();
|
|
480
|
-
|
|
481
|
-
|
|
480
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "GJDEA");
|
|
481
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "GJDEA");
|
|
482
482
|
helper.logger.validate();
|
|
483
483
|
});
|
|
484
484
|
it("traverses hier block in obliterated when len at ref seq is >0 and len at len seq == 0", () => {
|
|
@@ -495,8 +495,8 @@ for (const incremental of [true, false]) {
|
|
|
495
495
|
helper.removeRange("A", 5, 7);
|
|
496
496
|
helper.obliterateRange("C", 7, 9);
|
|
497
497
|
helper.processAllOps();
|
|
498
|
-
|
|
499
|
-
|
|
498
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), helper.clients.D.getText());
|
|
499
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "EHIJKAD");
|
|
500
500
|
helper.logger.validate();
|
|
501
501
|
});
|
|
502
502
|
it("traverses hier block in obliterate when len at ref seq is >0 and len at len seq == 0", () => {
|
|
@@ -516,8 +516,8 @@ for (const incremental of [true, false]) {
|
|
|
516
516
|
helper.insertText("A", 0, "3");
|
|
517
517
|
helper.insertText("A", 0, "4");
|
|
518
518
|
helper.processAllOps();
|
|
519
|
-
|
|
520
|
-
|
|
519
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "43FBD");
|
|
520
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "43FBD");
|
|
521
521
|
helper.logger.validate();
|
|
522
522
|
});
|
|
523
523
|
it("ignores segments where movedSeq < seq for partial len calculations", () => {
|
|
@@ -532,9 +532,9 @@ for (const incremental of [true, false]) {
|
|
|
532
532
|
helper.logger.validate();
|
|
533
533
|
helper.insertText("B", 4, "X");
|
|
534
534
|
helper.processAllOps();
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
535
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "12BCX");
|
|
536
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "12BCX");
|
|
537
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "12BCX");
|
|
538
538
|
helper.logger.validate();
|
|
539
539
|
});
|
|
540
540
|
it("accounts for overlapping obliterates from same client", () => {
|
|
@@ -546,9 +546,9 @@ for (const incremental of [true, false]) {
|
|
|
546
546
|
helper.obliterateRange("B", 0, 1);
|
|
547
547
|
helper.removeRange("A", 0, 1);
|
|
548
548
|
helper.processAllOps();
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
549
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
550
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "");
|
|
551
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "");
|
|
552
552
|
helper.logger.validate();
|
|
553
553
|
});
|
|
554
554
|
it("accounts for concurrently obliterated segments from the perspective of the inserting client for partial lengths", () => {
|
|
@@ -562,8 +562,8 @@ for (const incremental of [true, false]) {
|
|
|
562
562
|
helper.insertText("A", 2, "D");
|
|
563
563
|
helper.insertText("A", 4, "E");
|
|
564
564
|
helper.processAllOps();
|
|
565
|
-
|
|
566
|
-
|
|
565
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "1E4CBA");
|
|
566
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "1E4CBA");
|
|
567
567
|
helper.logger.validate();
|
|
568
568
|
});
|
|
569
569
|
it("traverses segments when there is a local obliterate", () => {
|
|
@@ -576,7 +576,7 @@ for (const incremental of [true, false]) {
|
|
|
576
576
|
helper.insertText("C", 2, "C");
|
|
577
577
|
helper.obliterateRange("A", 0, 3);
|
|
578
578
|
helper.processAllOps();
|
|
579
|
-
|
|
579
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
580
580
|
helper.logger.validate();
|
|
581
581
|
});
|
|
582
582
|
it("keeps track of all obliterates on a segment", () => {
|
|
@@ -594,10 +594,10 @@ for (const incremental of [true, false]) {
|
|
|
594
594
|
helper.obliterateRange("A", 0, 2);
|
|
595
595
|
helper.insertText("B", 1, "C");
|
|
596
596
|
helper.processAllOps();
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
597
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
598
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "");
|
|
599
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "");
|
|
600
|
+
node_assert_1.strict.equal(helper.clients.D.getText(), "");
|
|
601
601
|
helper.logger.validate();
|
|
602
602
|
});
|
|
603
603
|
it("many overlapping obliterates", () => {
|
|
@@ -614,7 +614,7 @@ for (const incremental of [true, false]) {
|
|
|
614
614
|
helper.obliterateRange("A", 0, 1);
|
|
615
615
|
helper.obliterateRange("B", 1, 2);
|
|
616
616
|
helper.processAllOps();
|
|
617
|
-
|
|
617
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "2BD");
|
|
618
618
|
helper.logger.validate();
|
|
619
619
|
});
|
|
620
620
|
it("overlapping obliterates at start", () => {
|
|
@@ -646,10 +646,10 @@ for (const incremental of [true, false]) {
|
|
|
646
646
|
helper.insertText("B", 5, "H");
|
|
647
647
|
helper.insertText("C", 1, "I");
|
|
648
648
|
helper.processAllOps();
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
649
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "DIEHF");
|
|
650
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "DIEHF");
|
|
651
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "DIEHF");
|
|
652
|
+
node_assert_1.strict.equal(helper.clients.D.getText(), "DIEHF");
|
|
653
653
|
helper.logger.validate();
|
|
654
654
|
});
|
|
655
655
|
it("two local obliterates get different seq numbers after ack", () => {
|
|
@@ -666,8 +666,8 @@ for (const incremental of [true, false]) {
|
|
|
666
666
|
helper.insertText("B", 2, "D");
|
|
667
667
|
helper.obliterateRange("C", 0, 1);
|
|
668
668
|
helper.processAllOps();
|
|
669
|
-
|
|
670
|
-
|
|
669
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "D");
|
|
670
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "D");
|
|
671
671
|
helper.logger.validate();
|
|
672
672
|
});
|
|
673
673
|
it("acks remote segment obliterated by local op", () => {
|
|
@@ -684,8 +684,8 @@ for (const incremental of [true, false]) {
|
|
|
684
684
|
helper.logger.validate();
|
|
685
685
|
helper.insertText("C", 1, "E");
|
|
686
686
|
helper.processAllOps();
|
|
687
|
-
|
|
688
|
-
|
|
687
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "BE");
|
|
688
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "BE");
|
|
689
689
|
helper.logger.validate();
|
|
690
690
|
});
|
|
691
691
|
it("skips segments obliterated before refSeq when traversing for insertion", () => {
|
|
@@ -703,9 +703,9 @@ for (const incremental of [true, false]) {
|
|
|
703
703
|
// before the refSeq, which made it appear as an un-deleted segment
|
|
704
704
|
helper.insertText("B", 3, "F");
|
|
705
705
|
helper.processAllOps();
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
706
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "C");
|
|
707
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "C");
|
|
708
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "C");
|
|
709
709
|
helper.logger.validate();
|
|
710
710
|
});
|
|
711
711
|
it("applies correct movedSeq when right segment has multiple movedSeqs", () => {
|
|
@@ -724,9 +724,9 @@ for (const incremental of [true, false]) {
|
|
|
724
724
|
helper.insertText("A", 1, "C");
|
|
725
725
|
helper.insertText("A", 2, "D");
|
|
726
726
|
helper.processAllOps();
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
727
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
728
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "");
|
|
729
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "");
|
|
730
730
|
helper.logger.validate();
|
|
731
731
|
});
|
|
732
732
|
it("takes the correct moved client id when multiple clientIds for right segment", () => {
|
|
@@ -744,9 +744,9 @@ for (const incremental of [true, false]) {
|
|
|
744
744
|
helper.obliterateRange("C", 0, 2);
|
|
745
745
|
helper.insertText("A", 2, "D");
|
|
746
746
|
helper.processAllOps();
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
747
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
748
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "");
|
|
749
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "");
|
|
750
750
|
helper.logger.validate();
|
|
751
751
|
});
|
|
752
752
|
it("selects clientId if 0", () => {
|
|
@@ -764,9 +764,9 @@ for (const incremental of [true, false]) {
|
|
|
764
764
|
helper.insertText("A", 1, "D");
|
|
765
765
|
helper.insertText("A", 2, "E");
|
|
766
766
|
helper.processAllOps();
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
767
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
768
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "");
|
|
769
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "");
|
|
770
770
|
helper.logger.validate();
|
|
771
771
|
});
|
|
772
772
|
it("obliterates unacked segment inside non-leaf-segment", () => {
|
|
@@ -791,9 +791,9 @@ for (const incremental of [true, false]) {
|
|
|
791
791
|
helper.obliterateRange("A", 11, 13);
|
|
792
792
|
helper.insertText("B", 13, "L");
|
|
793
793
|
helper.processAllOps();
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
794
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "FGHIJE12345AKB");
|
|
795
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "FGHIJE12345AKB");
|
|
796
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "FGHIJE12345AKB");
|
|
797
797
|
helper.logger.validate();
|
|
798
798
|
});
|
|
799
799
|
it("tracks length at seq of lower move/remove seq when overlapping", () => {
|
|
@@ -814,9 +814,9 @@ for (const incremental of [true, false]) {
|
|
|
814
814
|
// occurred prior to the remove
|
|
815
815
|
helper.insertText("A", 1, "I");
|
|
816
816
|
helper.processAllOps();
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
817
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "IEB");
|
|
818
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "IEB");
|
|
819
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "IEB");
|
|
820
820
|
helper.logger.validate();
|
|
821
821
|
});
|
|
822
822
|
it("segment obliterated on insert overlaps with local obliterate", () => {
|
|
@@ -830,7 +830,7 @@ for (const incremental of [true, false]) {
|
|
|
830
830
|
helper.obliterateRange("B", 0, 2);
|
|
831
831
|
helper.obliterateRange("A", 0, 2);
|
|
832
832
|
helper.processAllOps();
|
|
833
|
-
|
|
833
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
834
834
|
helper.logger.validate();
|
|
835
835
|
});
|
|
836
836
|
it("obliterates entire string when concurrent inserts inside range", () => {
|
|
@@ -844,7 +844,7 @@ for (const incremental of [true, false]) {
|
|
|
844
844
|
helper.insertText("C", 1, "OY");
|
|
845
845
|
helper.insertText("C", 2, "S");
|
|
846
846
|
helper.processAllOps();
|
|
847
|
-
|
|
847
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
848
848
|
helper.logger.validate();
|
|
849
849
|
});
|
|
850
850
|
it("obliterate ack traverses over non-obliterated remove", () => {
|
|
@@ -865,8 +865,8 @@ for (const incremental of [true, false]) {
|
|
|
865
865
|
helper.logger.validate();
|
|
866
866
|
helper.insertText("A", 6, "3");
|
|
867
867
|
helper.processAllOps();
|
|
868
|
-
|
|
869
|
-
|
|
868
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "ABCDE13");
|
|
869
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "ABCDE13");
|
|
870
870
|
helper.logger.validate();
|
|
871
871
|
});
|
|
872
872
|
it("overlapping remove and obliterate when remove happens last", () => {
|
|
@@ -884,10 +884,10 @@ for (const incremental of [true, false]) {
|
|
|
884
884
|
helper.removeRange("A", 0, 1);
|
|
885
885
|
helper.insertText("A", 5, "I");
|
|
886
886
|
helper.processAllOps();
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
887
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "HEDBICA");
|
|
888
|
+
node_assert_1.strict.equal(helper.clients.B.getText(), "HEDBICA");
|
|
889
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "HEDBICA");
|
|
890
|
+
node_assert_1.strict.equal(helper.clients.D.getText(), "HEDBICA");
|
|
891
891
|
helper.logger.validate();
|
|
892
892
|
});
|
|
893
893
|
it("overlapping remove and obliterate when remove happens last _and_ partial length already exists", () => {
|
|
@@ -904,7 +904,7 @@ for (const incremental of [true, false]) {
|
|
|
904
904
|
helper.removeRange("A", 0, 4);
|
|
905
905
|
helper.insertText("A", 1, "Z");
|
|
906
906
|
helper.processAllOps();
|
|
907
|
-
|
|
907
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "DZEBA");
|
|
908
908
|
helper.logger.validate();
|
|
909
909
|
});
|
|
910
910
|
it("overlapping obliterate and remove when obliterate is larger than remove and happened last", () => {
|
|
@@ -921,7 +921,7 @@ for (const incremental of [true, false]) {
|
|
|
921
921
|
helper.obliterateRange("C", 0, 4);
|
|
922
922
|
helper.insertText("C", 1, "Z");
|
|
923
923
|
helper.processAllOps();
|
|
924
|
-
|
|
924
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "FZGBA");
|
|
925
925
|
helper.logger.validate();
|
|
926
926
|
});
|
|
927
927
|
it("wasMovedOnInsert remains after leaf node is split", () => {
|
|
@@ -939,7 +939,7 @@ for (const incremental of [true, false]) {
|
|
|
939
939
|
helper.obliterateRange("A", 1, 2);
|
|
940
940
|
helper.insertText("B", 0, "I");
|
|
941
941
|
helper.processAllOps();
|
|
942
|
-
|
|
942
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "IFDBA");
|
|
943
943
|
helper.logger.validate();
|
|
944
944
|
});
|
|
945
945
|
it("overlapping obliterates, segment is obliterated on insert and by local client", () => {
|
|
@@ -958,7 +958,7 @@ for (const incremental of [true, false]) {
|
|
|
958
958
|
helper.obliterateRange("A", 0, 5);
|
|
959
959
|
helper.insertText("A", 1, "I");
|
|
960
960
|
helper.processAllOps();
|
|
961
|
-
|
|
961
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "BICA");
|
|
962
962
|
helper.logger.validate();
|
|
963
963
|
});
|
|
964
964
|
it("overlapping obliterates and remove", () => {
|
|
@@ -975,7 +975,7 @@ for (const incremental of [true, false]) {
|
|
|
975
975
|
helper.obliterateRange("C", 0, 10);
|
|
976
976
|
helper.insertText("C", 1, "M");
|
|
977
977
|
helper.processAllOps();
|
|
978
|
-
|
|
978
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "EMA");
|
|
979
979
|
helper.logger.validate();
|
|
980
980
|
});
|
|
981
981
|
it("does not mark obliterated on insert for non-acked obliterates", () => {
|
|
@@ -993,7 +993,7 @@ for (const incremental of [true, false]) {
|
|
|
993
993
|
helper.obliterateRange("C", 0, 2);
|
|
994
994
|
helper.insertText("C", 0, "I");
|
|
995
995
|
helper.processAllOps();
|
|
996
|
-
|
|
996
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "IHEBA");
|
|
997
997
|
helper.logger.validate();
|
|
998
998
|
});
|
|
999
999
|
it("partial len isLocal when seq is -1 but moveSeq > -1", () => {
|
|
@@ -1009,7 +1009,7 @@ for (const incremental of [true, false]) {
|
|
|
1009
1009
|
helper.insertText("B", 4, "H");
|
|
1010
1010
|
helper.insertText("A", 2, "I");
|
|
1011
1011
|
helper.processAllOps();
|
|
1012
|
-
|
|
1012
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "CGAHB");
|
|
1013
1013
|
helper.logger.validate();
|
|
1014
1014
|
});
|
|
1015
1015
|
it("obliterated on insert by overlapping obliterates", () => {
|
|
@@ -1026,7 +1026,7 @@ for (const incremental of [true, false]) {
|
|
|
1026
1026
|
helper.insertText("C", 2, "H");
|
|
1027
1027
|
helper.insertText("A", 1, "I");
|
|
1028
1028
|
helper.processAllOps();
|
|
1029
|
-
|
|
1029
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "A");
|
|
1030
1030
|
helper.logger.validate();
|
|
1031
1031
|
});
|
|
1032
1032
|
it("overlapping obliterates", () => {
|
|
@@ -1045,7 +1045,7 @@ for (const incremental of [true, false]) {
|
|
|
1045
1045
|
helper.insertText("C", 0, "I");
|
|
1046
1046
|
helper.obliterateRange("A", 0, 4);
|
|
1047
1047
|
helper.processAllOps();
|
|
1048
|
-
|
|
1048
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "IF");
|
|
1049
1049
|
helper.logger.validate();
|
|
1050
1050
|
});
|
|
1051
1051
|
it("overlapping obliterates", () => {
|
|
@@ -1065,7 +1065,7 @@ for (const incremental of [true, false]) {
|
|
|
1065
1065
|
helper.insertText("C", 1, "I");
|
|
1066
1066
|
helper.obliterateRange("A", 1, 2);
|
|
1067
1067
|
helper.processAllOps();
|
|
1068
|
-
|
|
1068
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "B");
|
|
1069
1069
|
helper.logger.validate();
|
|
1070
1070
|
});
|
|
1071
1071
|
it("overlapping remove and obliterate, local obliterate does not have a remote obliterated len", () => {
|
|
@@ -1081,7 +1081,7 @@ for (const incremental of [true, false]) {
|
|
|
1081
1081
|
helper.insertText("A", 1, "I");
|
|
1082
1082
|
helper.obliterateRange("B", 1, 3);
|
|
1083
1083
|
helper.processAllOps();
|
|
1084
|
-
|
|
1084
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "GDBIC");
|
|
1085
1085
|
helper.logger.validate();
|
|
1086
1086
|
});
|
|
1087
1087
|
it("triple overlapping obliterate and overlapping remove", () => {
|
|
@@ -1105,8 +1105,8 @@ for (const incremental of [true, false]) {
|
|
|
1105
1105
|
helper.obliterateRange("C", 6, 7);
|
|
1106
1106
|
helper.removeRange("A", 0, 6);
|
|
1107
1107
|
helper.processAllOps();
|
|
1108
|
-
|
|
1109
|
-
|
|
1108
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
1109
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "");
|
|
1110
1110
|
helper.logger.validate();
|
|
1111
1111
|
});
|
|
1112
1112
|
it("triple overlapping obliterate with one being local", () => {
|
|
@@ -1128,7 +1128,7 @@ for (const incremental of [true, false]) {
|
|
|
1128
1128
|
helper.insertText("B", 0, "J");
|
|
1129
1129
|
helper.obliterateRange("B", 3, 5);
|
|
1130
1130
|
helper.processAllOps();
|
|
1131
|
-
|
|
1131
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "JIGBA");
|
|
1132
1132
|
helper.logger.validate();
|
|
1133
1133
|
});
|
|
1134
1134
|
it("obliterate ack traversal is not stopped by moved segment", () => {
|
|
@@ -1145,8 +1145,8 @@ for (const incremental of [true, false]) {
|
|
|
1145
1145
|
helper.logger.validate();
|
|
1146
1146
|
helper.insertText("C", 1, "F");
|
|
1147
1147
|
helper.processAllOps();
|
|
1148
|
-
|
|
1149
|
-
|
|
1148
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "DF");
|
|
1149
|
+
node_assert_1.strict.equal(helper.clients.C.getText(), "DF");
|
|
1150
1150
|
helper.logger.validate();
|
|
1151
1151
|
});
|
|
1152
1152
|
it("updates partial lengths for segments when doing obliterate ack traversal", () => {
|
|
@@ -1172,7 +1172,7 @@ for (const incremental of [true, false]) {
|
|
|
1172
1172
|
helper.logger.validate();
|
|
1173
1173
|
helper.insertText("B", 1, "R");
|
|
1174
1174
|
helper.processAllOps();
|
|
1175
|
-
|
|
1175
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "BR");
|
|
1176
1176
|
helper.logger.validate();
|
|
1177
1177
|
});
|
|
1178
1178
|
// fails only for incremental
|
|
@@ -1206,7 +1206,7 @@ for (const incremental of [true, false]) {
|
|
|
1206
1206
|
helper.obliterateRange("A", 38, 40);
|
|
1207
1207
|
helper.insertText("C", 17, "klmnop");
|
|
1208
1208
|
helper.processAllOps();
|
|
1209
|
-
|
|
1209
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "abcdefghijklmnop5890QBC");
|
|
1210
1210
|
helper.logger.validate();
|
|
1211
1211
|
helper.removeRange("B", 3, 6);
|
|
1212
1212
|
helper.insertText("C", 11, "Q");
|
|
@@ -1216,7 +1216,7 @@ for (const incremental of [true, false]) {
|
|
|
1216
1216
|
helper.obliterateRange("B", 14, 18);
|
|
1217
1217
|
helper.insertText("B", 1, "T");
|
|
1218
1218
|
helper.processAllOps();
|
|
1219
|
-
|
|
1219
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "aTbScghijkQlRmnoC");
|
|
1220
1220
|
helper.logger.validate();
|
|
1221
1221
|
});
|
|
1222
1222
|
it("three obliterates on same segment", () => {
|
|
@@ -1244,7 +1244,7 @@ for (const incremental of [true, false]) {
|
|
|
1244
1244
|
helper.insertText("A", 0, "C");
|
|
1245
1245
|
helper.obliterateRange("A", 0, 2);
|
|
1246
1246
|
helper.processAllOps();
|
|
1247
|
-
|
|
1247
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
1248
1248
|
helper.logger.validate();
|
|
1249
1249
|
});
|
|
1250
1250
|
it("obliterates 2 concurrently inserted segments", () => {
|
|
@@ -1256,7 +1256,7 @@ for (const incremental of [true, false]) {
|
|
|
1256
1256
|
helper.obliterateRange("B", 0, 2);
|
|
1257
1257
|
helper.insertText("A", 1, "D");
|
|
1258
1258
|
helper.processAllOps();
|
|
1259
|
-
|
|
1259
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
1260
1260
|
helper.logger.validate();
|
|
1261
1261
|
});
|
|
1262
1262
|
it("obliterates 4 concurrently inserted segments", () => {
|
|
@@ -1270,7 +1270,7 @@ for (const incremental of [true, false]) {
|
|
|
1270
1270
|
helper.insertText("A", 1, "H");
|
|
1271
1271
|
helper.insertText("B", 0, "I");
|
|
1272
1272
|
helper.processAllOps();
|
|
1273
|
-
|
|
1273
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "IFB");
|
|
1274
1274
|
helper.logger.validate();
|
|
1275
1275
|
});
|
|
1276
1276
|
it("obliterates 3 concurrently inserted segments", () => {
|
|
@@ -1284,7 +1284,7 @@ for (const incremental of [true, false]) {
|
|
|
1284
1284
|
helper.obliterateRange("B", 1, 3);
|
|
1285
1285
|
helper.insertText("B", 0, "I");
|
|
1286
1286
|
helper.processAllOps();
|
|
1287
|
-
|
|
1287
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "IGCA");
|
|
1288
1288
|
helper.logger.validate();
|
|
1289
1289
|
});
|
|
1290
1290
|
it("overlapping remove + obliterate, remove happened first", () => {
|
|
@@ -1301,7 +1301,7 @@ for (const incremental of [true, false]) {
|
|
|
1301
1301
|
helper.obliterateRange("A", 1, 3);
|
|
1302
1302
|
helper.insertText("A", 0, "I");
|
|
1303
1303
|
helper.processAllOps();
|
|
1304
|
-
|
|
1304
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "IDGBHCA");
|
|
1305
1305
|
helper.logger.validate();
|
|
1306
1306
|
});
|
|
1307
1307
|
it("overlapping remove + obliterate, remove happened last", () => {
|
|
@@ -1318,7 +1318,7 @@ for (const incremental of [true, false]) {
|
|
|
1318
1318
|
helper.removeRange("A", 1, 4);
|
|
1319
1319
|
helper.removeRange("A", 0, 1);
|
|
1320
1320
|
helper.processAllOps();
|
|
1321
|
-
|
|
1321
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "HCBA");
|
|
1322
1322
|
helper.logger.validate();
|
|
1323
1323
|
});
|
|
1324
1324
|
it("segment inside locally obliterated segment group is split", () => {
|
|
@@ -1338,7 +1338,7 @@ for (const incremental of [true, false]) {
|
|
|
1338
1338
|
helper.logger.validate();
|
|
1339
1339
|
helper.obliterateRange("B", 2, 3);
|
|
1340
1340
|
helper.processAllOps();
|
|
1341
|
-
|
|
1341
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "DE");
|
|
1342
1342
|
helper.logger.validate();
|
|
1343
1343
|
});
|
|
1344
1344
|
it("continues traversal past locally removed segment inserted before first obliterate", () => {
|
|
@@ -1354,7 +1354,7 @@ for (const incremental of [true, false]) {
|
|
|
1354
1354
|
helper.insertText("C", 0, "E");
|
|
1355
1355
|
helper.obliterateRange("C", 0, 2);
|
|
1356
1356
|
helper.processAllOps();
|
|
1357
|
-
|
|
1357
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "");
|
|
1358
1358
|
helper.logger.validate();
|
|
1359
1359
|
});
|
|
1360
1360
|
it("keeps track of remote obliterated length when hier node contains hier nodes", () => {
|
|
@@ -1381,7 +1381,7 @@ for (const incremental of [true, false]) {
|
|
|
1381
1381
|
helper.insertText("B", 5, "ghijk");
|
|
1382
1382
|
helper.insertText("C", 0, "lmnopq"); // seq: 13, len: 7
|
|
1383
1383
|
helper.processAllOps();
|
|
1384
|
-
|
|
1384
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "lmnopqLNOHghijkIbcefdB");
|
|
1385
1385
|
helper.logger.validate();
|
|
1386
1386
|
helper.insertText("A", 0, "r");
|
|
1387
1387
|
helper.insertText("B", 12, "stu");
|
|
@@ -1391,7 +1391,7 @@ for (const incremental of [true, false]) {
|
|
|
1391
1391
|
helper.removeRange("A", 14, 15); // seq: 19, len: 3
|
|
1392
1392
|
helper.insertText("B", 1, "x");
|
|
1393
1393
|
helper.processAllOps();
|
|
1394
|
-
|
|
1394
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "rlxmntfdB");
|
|
1395
1395
|
helper.logger.validate();
|
|
1396
1396
|
});
|
|
1397
1397
|
it("combines remote obliterated length for parent node of tree with depth >=3", () => {
|
|
@@ -1419,7 +1419,7 @@ for (const incremental of [true, false]) {
|
|
|
1419
1419
|
helper.removeRange("A", 1, 2);
|
|
1420
1420
|
helper.insertText("A", 0, "VWXYZ0"); // seq: 10, len: 2
|
|
1421
1421
|
helper.processAllOps();
|
|
1422
|
-
|
|
1422
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "VWXYZ0MOEFGHIJBPTUQRSCD");
|
|
1423
1423
|
helper.logger.validate();
|
|
1424
1424
|
helper.insertText("C", 12, "ab");
|
|
1425
1425
|
helper.removeRange("B", 11, 17);
|
|
@@ -1434,7 +1434,7 @@ for (const incremental of [true, false]) {
|
|
|
1434
1434
|
helper.insertText("C", 0, "i");
|
|
1435
1435
|
helper.insertText("A", 0, "j"); // seq: 22, len: 1
|
|
1436
1436
|
helper.processAllOps();
|
|
1437
|
-
|
|
1437
|
+
node_assert_1.strict.equal(helper.clients.A.getText(), "jihagSCdfeD");
|
|
1438
1438
|
helper.logger.validate();
|
|
1439
1439
|
});
|
|
1440
1440
|
});
|