@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
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.spyOnMethod = void 0;
|
|
8
|
-
|
|
8
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
9
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
10
|
+
const node_assert_1 = require("node:assert");
|
|
9
11
|
const test_pairwise_generator_1 = require("@fluid-private/test-pairwise-generator");
|
|
10
12
|
const mergeTreeTracking_js_1 = require("../mergeTreeTracking.js");
|
|
11
13
|
const ops_js_1 = require("../ops.js");
|
|
@@ -28,9 +30,10 @@ function spyOnMethod(
|
|
|
28
30
|
methodClass, methodName, spy) {
|
|
29
31
|
const { prototype } = methodClass;
|
|
30
32
|
const method = prototype[methodName];
|
|
31
|
-
(0,
|
|
33
|
+
(0, node_assert_1.strict)(typeof method === "function", `Method does not exist: ${methodName}`);
|
|
32
34
|
const methodSpy = function (...args) {
|
|
33
35
|
spy();
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
34
37
|
return method.call(this, ...args);
|
|
35
38
|
};
|
|
36
39
|
prototype[methodName] = methodSpy;
|
|
@@ -52,10 +55,14 @@ describe("MergeTree.Revertibles", () => {
|
|
|
52
55
|
(0, revertibles_js_1.appendToMergeTreeDeltaRevertibles)(delta, clientB_Revertibles);
|
|
53
56
|
});
|
|
54
57
|
ops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(0, "BB"), ++seq));
|
|
55
|
-
|
|
58
|
+
for (const op of ops.splice(0))
|
|
59
|
+
for (const c of clients.all)
|
|
60
|
+
c.applyMsg(op);
|
|
56
61
|
logger.validate({ baseText: "BB123" });
|
|
57
62
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientBDriver, clientB_Revertibles.splice(0));
|
|
58
|
-
|
|
63
|
+
for (const op of ops.splice(0))
|
|
64
|
+
for (const c of clients.all)
|
|
65
|
+
c.applyMsg(op);
|
|
59
66
|
logger.validate({ baseText: "123" });
|
|
60
67
|
});
|
|
61
68
|
it("has reasonable asymptotics in face of remove", () => {
|
|
@@ -93,8 +100,8 @@ describe("MergeTree.Revertibles", () => {
|
|
|
93
100
|
// tests are failing and the number of calls is still within a sane limit,
|
|
94
101
|
// it should be fine to update these checks to allow a larger number of
|
|
95
102
|
// calls
|
|
96
|
-
(0,
|
|
97
|
-
(0,
|
|
103
|
+
(0, node_assert_1.strict)(linkCount <= length * 3, `expected tracking group link to occur at most three times per segment. found ${linkCount} instead of ${length * 3}`);
|
|
104
|
+
(0, node_assert_1.strict)(unlinkCount <= length * 2, `expected tracking group unlink to occur at most twice per segment. found ${unlinkCount} instead of ${length * 2}`);
|
|
98
105
|
}
|
|
99
106
|
finally {
|
|
100
107
|
unspy1();
|
|
@@ -115,10 +122,14 @@ describe("MergeTree.Revertibles", () => {
|
|
|
115
122
|
(0, revertibles_js_1.appendToMergeTreeDeltaRevertibles)(delta, clientB_Revertibles);
|
|
116
123
|
});
|
|
117
124
|
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));
|
|
118
|
-
|
|
125
|
+
for (const op of ops.splice(0))
|
|
126
|
+
for (const c of clients.all)
|
|
127
|
+
c.applyMsg(op);
|
|
119
128
|
logger.validate({ baseText: "23" });
|
|
120
129
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientBDriver, clientB_Revertibles.splice(0));
|
|
121
|
-
|
|
130
|
+
for (const op of ops.splice(0))
|
|
131
|
+
for (const c of clients.all)
|
|
132
|
+
c.applyMsg(op);
|
|
122
133
|
logger.validate({ baseText: "123" });
|
|
123
134
|
});
|
|
124
135
|
for (const { name, removeStart, removeEnd, expectedPostRemove } of [
|
|
@@ -146,12 +157,15 @@ describe("MergeTree.Revertibles", () => {
|
|
|
146
157
|
clients.B.on("delta", (op, delta) => {
|
|
147
158
|
(0, revertibles_js_1.appendToMergeTreeDeltaRevertibles)(delta, clientB_Revertibles);
|
|
148
159
|
});
|
|
149
|
-
ops.push(clients.C.makeOpMessage(clients.C.removeRangeLocal(removeStart, removeEnd), ++seq));
|
|
150
|
-
ops.
|
|
151
|
-
|
|
160
|
+
ops.push(clients.C.makeOpMessage(clients.C.removeRangeLocal(removeStart, removeEnd), ++seq), clients.B.makeOpMessage(clients.B.removeRangeLocal(removeStart, removeEnd), ++seq));
|
|
161
|
+
for (const op of ops.splice(0))
|
|
162
|
+
for (const c of clients.all)
|
|
163
|
+
c.applyMsg(op);
|
|
152
164
|
logger.validate({ baseText: expectedPostRemove });
|
|
153
165
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientBDriver, clientB_Revertibles.splice(0));
|
|
154
|
-
|
|
166
|
+
for (const op of ops.splice(0))
|
|
167
|
+
for (const c of clients.all)
|
|
168
|
+
c.applyMsg(op);
|
|
155
169
|
logger.validate({ baseText: "123" });
|
|
156
170
|
});
|
|
157
171
|
}
|
|
@@ -172,15 +186,18 @@ describe("MergeTree.Revertibles", () => {
|
|
|
172
186
|
clients.C.on("delta", (op, delta) => {
|
|
173
187
|
(0, revertibles_js_1.appendToMergeTreeDeltaRevertibles)(delta, clientC_Revertibles);
|
|
174
188
|
});
|
|
175
|
-
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));
|
|
176
|
-
ops.
|
|
177
|
-
|
|
189
|
+
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq), clients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq));
|
|
190
|
+
for (const op of ops.splice(0))
|
|
191
|
+
for (const c of clients.all)
|
|
192
|
+
c.applyMsg(op);
|
|
178
193
|
logger.validate({ baseText: "23" });
|
|
179
194
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientBDriver, clientB_Revertibles.splice(0));
|
|
180
195
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientCDriver, clientC_Revertibles.splice(0));
|
|
181
196
|
// "123" would be the ideal final state, but due to current limitations,
|
|
182
197
|
// the eventual consistent state is "1123"
|
|
183
|
-
|
|
198
|
+
for (const op of ops.splice(0))
|
|
199
|
+
for (const c of clients.all)
|
|
200
|
+
c.applyMsg(op);
|
|
184
201
|
logger.validate({ baseText: "1123" });
|
|
185
202
|
});
|
|
186
203
|
it("revert annotate", () => {
|
|
@@ -195,10 +212,14 @@ describe("MergeTree.Revertibles", () => {
|
|
|
195
212
|
(0, revertibles_js_1.appendToMergeTreeDeltaRevertibles)(delta, clientB_Revertibles);
|
|
196
213
|
});
|
|
197
214
|
ops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq));
|
|
198
|
-
|
|
215
|
+
for (const op of ops.splice(0))
|
|
216
|
+
for (const c of clients.all)
|
|
217
|
+
c.applyMsg(op);
|
|
199
218
|
logger.validate({ baseText: "123" });
|
|
200
219
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientBDriver, clientB_Revertibles.splice(0));
|
|
201
|
-
|
|
220
|
+
for (const op of ops.splice(0))
|
|
221
|
+
for (const c of clients.all)
|
|
222
|
+
c.applyMsg(op);
|
|
202
223
|
logger.validate({ baseText: "123" });
|
|
203
224
|
});
|
|
204
225
|
it("Remove All Original Text and Insert then Revert", () => {
|
|
@@ -214,14 +235,16 @@ describe("MergeTree.Revertibles", () => {
|
|
|
214
235
|
};
|
|
215
236
|
clientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));
|
|
216
237
|
clients.B.on("delta", deltaCallback);
|
|
217
|
-
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));
|
|
218
|
-
ops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(0, "BB"), ++seq));
|
|
219
|
-
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq));
|
|
238
|
+
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq), clients.B.makeOpMessage(clients.B.insertTextLocal(0, "BB"), ++seq), clients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq));
|
|
220
239
|
// revert to the original callback
|
|
221
240
|
clients.B.off("delta", deltaCallback);
|
|
222
|
-
|
|
241
|
+
for (const op of ops.splice(0))
|
|
242
|
+
for (const c of clients.all)
|
|
243
|
+
c.applyMsg(op);
|
|
223
244
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientBDriver, clientB_Revertibles.splice(0));
|
|
224
|
-
|
|
245
|
+
for (const op of ops.splice(0))
|
|
246
|
+
for (const c of clients.all)
|
|
247
|
+
c.applyMsg(op);
|
|
225
248
|
logger.validate({ baseText: "12" });
|
|
226
249
|
});
|
|
227
250
|
it("Re-Insert at position 0 in empty string", () => {
|
|
@@ -236,14 +259,16 @@ describe("MergeTree.Revertibles", () => {
|
|
|
236
259
|
const clientBDriver = (0, testClient_js_1.createRevertDriver)(clients.B);
|
|
237
260
|
clientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));
|
|
238
261
|
clients.B.on("delta", deltaCallback);
|
|
239
|
-
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq));
|
|
240
|
-
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));
|
|
241
|
-
ops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, "BB"), ++seq));
|
|
262
|
+
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq), clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq), clients.B.makeOpMessage(clients.B.insertTextLocal(1, "BB"), ++seq));
|
|
242
263
|
// revert to the original callback
|
|
243
264
|
clients.B.off("delta", deltaCallback);
|
|
244
|
-
|
|
265
|
+
for (const op of ops.splice(0))
|
|
266
|
+
for (const c of clients.all)
|
|
267
|
+
c.applyMsg(op);
|
|
245
268
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientBDriver, clientB_Revertibles.splice(0));
|
|
246
|
-
|
|
269
|
+
for (const op of ops.splice(0))
|
|
270
|
+
for (const c of clients.all)
|
|
271
|
+
c.applyMsg(op);
|
|
247
272
|
logger.validate({ baseText: "BBC" });
|
|
248
273
|
});
|
|
249
274
|
it("Revert remove to empty with annotate", () => {
|
|
@@ -258,14 +283,16 @@ describe("MergeTree.Revertibles", () => {
|
|
|
258
283
|
const clientBDriver = (0, testClient_js_1.createRevertDriver)(clients.B);
|
|
259
284
|
clientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));
|
|
260
285
|
clients.B.on("delta", deltaCallback);
|
|
261
|
-
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 2), ++seq));
|
|
262
|
-
ops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq));
|
|
263
|
-
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));
|
|
286
|
+
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 2), ++seq), clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq), clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));
|
|
264
287
|
// revert to the original callback
|
|
265
288
|
clients.B.off("delta", deltaCallback);
|
|
266
|
-
|
|
289
|
+
for (const op of ops.splice(0))
|
|
290
|
+
for (const c of clients.all)
|
|
291
|
+
c.applyMsg(op);
|
|
267
292
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientBDriver, clientB_Revertibles.splice(0));
|
|
268
|
-
|
|
293
|
+
for (const op of ops.splice(0))
|
|
294
|
+
for (const c of clients.all)
|
|
295
|
+
c.applyMsg(op);
|
|
269
296
|
logger.validate({ baseText: "123" });
|
|
270
297
|
});
|
|
271
298
|
it("Revert Local annotate and remove with intersecting remote annotate", () => {
|
|
@@ -282,24 +309,27 @@ describe("MergeTree.Revertibles", () => {
|
|
|
282
309
|
const clientBDriver = (0, testClient_js_1.createRevertDriver)(clients.B);
|
|
283
310
|
clientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));
|
|
284
311
|
clients.B.on("delta", deltaCallback);
|
|
285
|
-
ops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 4, { test: "B" }), ++seq));
|
|
286
|
-
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq));
|
|
312
|
+
ops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 4, { test: "B" }), ++seq), clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq));
|
|
287
313
|
// revert to the original callback
|
|
288
314
|
clients.B.off("delta", deltaCallback);
|
|
289
315
|
ops.push(clients.C.makeOpMessage(clients.C.annotateRangeLocal(3, 4, { test: "C" }), ++seq));
|
|
290
|
-
|
|
316
|
+
for (const op of ops.splice(0))
|
|
317
|
+
for (const c of clients.all)
|
|
318
|
+
c.applyMsg(op);
|
|
291
319
|
logger.validate({ baseText: "134" });
|
|
292
320
|
try {
|
|
293
321
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientBDriver, clientB_Revertibles.splice(0));
|
|
294
|
-
|
|
322
|
+
for (const op of ops.splice(0))
|
|
323
|
+
for (const c of clients.all)
|
|
324
|
+
c.applyMsg(op);
|
|
295
325
|
}
|
|
296
|
-
catch (
|
|
297
|
-
throw logger.addLogsToError(
|
|
326
|
+
catch (error) {
|
|
327
|
+
throw logger.addLogsToError(error);
|
|
298
328
|
}
|
|
299
329
|
logger.validate({ baseText: "1234" });
|
|
300
330
|
});
|
|
301
331
|
describe("Revertibles work as expected when a pair of markers and text is involved", () => {
|
|
302
|
-
(0, test_pairwise_generator_1.generatePairwiseOptions)({
|
|
332
|
+
for (const options of (0, test_pairwise_generator_1.generatePairwiseOptions)({
|
|
303
333
|
revertMarkerInsert: [true, undefined],
|
|
304
334
|
ackMarkerInsert: [true, undefined],
|
|
305
335
|
splitInsertTextRevertible: [true, undefined],
|
|
@@ -307,7 +337,7 @@ describe("MergeTree.Revertibles", () => {
|
|
|
307
337
|
splitRemoveRevertible: [true, undefined],
|
|
308
338
|
ackTextRemove: [true, undefined],
|
|
309
339
|
ackUndo: [true, undefined],
|
|
310
|
-
})
|
|
340
|
+
})) {
|
|
311
341
|
it(JSON.stringify(options), () => {
|
|
312
342
|
const clients = (0, testClientLogger_js_1.createClientsAtInitialState)({ initialState: "", options: {} }, "A", "B");
|
|
313
343
|
const logger = new testClientLogger_js_1.TestClientLogger(clients.all);
|
|
@@ -328,10 +358,11 @@ describe("MergeTree.Revertibles", () => {
|
|
|
328
358
|
openNewUndoRedoTransaction();
|
|
329
359
|
afterUndoBaseText ?? (afterUndoBaseText = clients.B.getText());
|
|
330
360
|
}
|
|
331
|
-
ops.push(clients.B.makeOpMessage(clients.B.insertMarkerLocal(0, ops_js_1.ReferenceType.Simple), ++seq));
|
|
332
|
-
ops.push(clients.B.makeOpMessage(clients.B.insertMarkerLocal(1, ops_js_1.ReferenceType.Simple), ++seq));
|
|
361
|
+
ops.push(clients.B.makeOpMessage(clients.B.insertMarkerLocal(0, ops_js_1.ReferenceType.Simple), ++seq), clients.B.makeOpMessage(clients.B.insertMarkerLocal(1, ops_js_1.ReferenceType.Simple), ++seq));
|
|
333
362
|
if (options.ackMarkerInsert) {
|
|
334
|
-
|
|
363
|
+
for (const op of ops.splice(0))
|
|
364
|
+
for (const c of clients.all)
|
|
365
|
+
c.applyMsg(op);
|
|
335
366
|
logger.validate({ baseText: afterUndoBaseText });
|
|
336
367
|
}
|
|
337
368
|
if (options.splitInsertTextRevertible) {
|
|
@@ -340,7 +371,9 @@ describe("MergeTree.Revertibles", () => {
|
|
|
340
371
|
}
|
|
341
372
|
ops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, "B"), ++seq));
|
|
342
373
|
if (options.ackTextInsert) {
|
|
343
|
-
|
|
374
|
+
for (const op of ops.splice(0))
|
|
375
|
+
for (const c of clients.all)
|
|
376
|
+
c.applyMsg(op);
|
|
344
377
|
logger.validate({ baseText: "B" });
|
|
345
378
|
}
|
|
346
379
|
if (options.splitRemoveRevertible) {
|
|
@@ -349,37 +382,43 @@ describe("MergeTree.Revertibles", () => {
|
|
|
349
382
|
}
|
|
350
383
|
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq));
|
|
351
384
|
if (options.ackTextRemove) {
|
|
352
|
-
|
|
385
|
+
for (const op of ops.splice(0))
|
|
386
|
+
for (const c of clients.all)
|
|
387
|
+
c.applyMsg(op);
|
|
353
388
|
logger.validate({ baseText: "" });
|
|
354
389
|
}
|
|
355
390
|
const afterRevertBaseTest = clients.B.getText();
|
|
356
391
|
try {
|
|
357
392
|
const reverts = clientB_Revertibles.splice(0);
|
|
358
|
-
|
|
393
|
+
for (const revert of reverts) {
|
|
359
394
|
openNewUndoRedoTransaction();
|
|
360
395
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientBDriver, revert);
|
|
361
|
-
}
|
|
396
|
+
}
|
|
362
397
|
}
|
|
363
|
-
catch (
|
|
364
|
-
throw logger.addLogsToError(
|
|
398
|
+
catch (error) {
|
|
399
|
+
throw logger.addLogsToError(error);
|
|
365
400
|
}
|
|
366
401
|
if (options.ackUndo) {
|
|
367
|
-
|
|
402
|
+
for (const op of ops.splice(0))
|
|
403
|
+
for (const c of clients.all)
|
|
404
|
+
c.applyMsg(op);
|
|
368
405
|
logger.validate({ baseText: afterUndoBaseText });
|
|
369
406
|
}
|
|
370
407
|
try {
|
|
371
408
|
const reverts = clientB_Revertibles.splice(0);
|
|
372
|
-
|
|
409
|
+
for (const revert of reverts) {
|
|
373
410
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientBDriver, revert);
|
|
374
|
-
}
|
|
411
|
+
}
|
|
375
412
|
}
|
|
376
|
-
catch (
|
|
377
|
-
throw logger.addLogsToError(
|
|
413
|
+
catch (error) {
|
|
414
|
+
throw logger.addLogsToError(error);
|
|
378
415
|
}
|
|
379
|
-
|
|
416
|
+
for (const op of ops.splice(0))
|
|
417
|
+
for (const c of clients.all)
|
|
418
|
+
c.applyMsg(op);
|
|
380
419
|
logger.validate({ baseText: afterRevertBaseTest });
|
|
381
420
|
});
|
|
382
|
-
}
|
|
421
|
+
}
|
|
383
422
|
});
|
|
384
423
|
});
|
|
385
424
|
//# sourceMappingURL=revertibles.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revertibles.spec.js","sourceRoot":"","sources":["../../src/test/revertibles.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\";\n\nimport { generatePairwiseOptions } from \"@fluid-private/test-pairwise-generator\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { TrackingGroup, UnorderedTrackingGroup } from \"../mergeTreeTracking.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport {\n\tMergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n\trevertMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { createRevertDriver } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\n/**\n * Run a custom \"spy function\" every time the given method is invoked.\n * @param methodClass - the class that has the method\n * @param methodName - the name of the method\n * @param spy - the spy function to run alongside the method\n * @returns a function which will remove the spy function when invoked. Should be called exactly once\n * after the spy is no longer needed.\n *\n * This method is duplicated between shared-tree test code, and should eventually\n * be merged with the implementation that lives there\n */\nexport function spyOnMethod(\n\t// eslint-disable-next-line @typescript-eslint/ban-types\n\tmethodClass: Function,\n\tmethodName: string,\n\tspy: () => void,\n): () => void {\n\tconst { prototype } = methodClass;\n\tconst method = prototype[methodName];\n\tassert(typeof method === \"function\", `Method does not exist: ${methodName}`);\n\n\tconst methodSpy = function (this: unknown, ...args: unknown[]): unknown {\n\t\tspy();\n\t\treturn method.call(this, ...args);\n\t};\n\tprototype[methodName] = methodSpy;\n\n\treturn () => {\n\t\tprototype[methodName] = method;\n\t};\n}\n\ndescribe(\"MergeTree.Revertibles\", () => {\n\tit(\"revert insert\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BB\"), ++seq));\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\tlogger.validate({ baseText: \"BB123\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"has reasonable asymptotics in face of remove\", () => {\n\t\tconst length = 100;\n\n\t\t// track the amount of tracking group linking that occurs\n\t\tlet linkCount = 0;\n\t\tlet unlinkCount = 0;\n\n\t\tconst unspy1 = spyOnMethod(TrackingGroup, \"link\", () => (linkCount += 1));\n\t\tconst unspy2 = spyOnMethod(TrackingGroup, \"unlink\", () => (unlinkCount += 1));\n\t\tconst unspy3 = spyOnMethod(UnorderedTrackingGroup, \"link\", () => (linkCount += 1));\n\t\tconst unspy4 = spyOnMethod(UnorderedTrackingGroup, \"unlink\", () => (unlinkCount += 1));\n\n\t\ttry {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"\",\n\t\t\t\t\toptions: {},\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t);\n\n\t\t\tfor (let i = 1; i <= length; i++) {\n\t\t\t\tconst insertOp = clients.A.insertTextLocal(i - 1, \"a\");\n\t\t\t\tclients.A.applyMsg(\n\t\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\t\tinsertOp,\n\t\t\t\t\t\t/* seq */ i + 1,\n\t\t\t\t\t\t/* refSeq */ i,\n\t\t\t\t\t\tclients.A.longClientId,\n\t\t\t\t\t\t/* minSeq */ 1,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tclients.A.on(\"delta\", (_op, delta) => {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t});\n\n\t\t\tconst op = clients.A.removeRangeLocal(0, length - 1);\n\n\t\t\tclients.A.applyMsg(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\top,\n\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\tclients.A.longClientId,\n\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\t// the below checks act as a proxy for the asymptotics of undo-redo\n\t\t\t// linking. they are perhaps a bit more strict than necessary. if these\n\t\t\t// tests are failing and the number of calls is still within a sane limit,\n\t\t\t// it should be fine to update these checks to allow a larger number of\n\t\t\t// calls\n\t\t\tassert(\n\t\t\t\tlinkCount <= length * 3,\n\t\t\t\t`expected tracking group link to occur at most three times per segment. found ${linkCount} instead of ${\n\t\t\t\t\tlength * 3\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tunlinkCount <= length * 2,\n\t\t\t\t`expected tracking group unlink to occur at most twice per segment. found ${unlinkCount} instead of ${\n\t\t\t\t\tlength * 2\n\t\t\t\t}`,\n\t\t\t);\n\t\t} finally {\n\t\t\tunspy1();\n\t\t\tunspy2();\n\t\t\tunspy3();\n\t\t\tunspy4();\n\t\t}\n\t});\n\n\tit(\"revert remove\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\tlogger.validate({ baseText: \"23\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tfor (const { name, removeStart, removeEnd, expectedPostRemove } of [\n\t\t{\n\t\t\tname: \"revert overlapping remove\",\n\t\t\tremoveStart: 0,\n\t\t\tremoveEnd: 1,\n\t\t\texpectedPostRemove: \"23\",\n\t\t},\n\t\t{\n\t\t\tname: \"revert overlapping remove of multiple segments\",\n\t\t\tremoveStart: 0,\n\t\t\tremoveEnd: 2,\n\t\t\texpectedPreRemove: \"23\",\n\t\t},\n\t]) {\n\t\tit(name, () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{ initialState: \"1-23\", options: {} },\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t\t\"C\",\n\t\t\t);\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tlet seq = 0;\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\tclientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t});\n\n\t\t\tops.push(\n\t\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(removeStart, removeEnd), ++seq),\n\t\t\t);\n\t\t\tops.push(\n\t\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(removeStart, removeEnd), ++seq),\n\t\t\t);\n\n\t\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\t\tlogger.validate({ baseText: expectedPostRemove });\n\n\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\t\tlogger.validate({ baseText: \"123\" });\n\t\t});\n\t}\n\n\tit(\"revert two overlapping removes\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tconst clientC_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientCDriver = createRevertDriver(clients.C);\n\t\tclientCDriver.submitOpCallback = (op) => ops.push(clients.C.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tclients.C.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientC_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));\n\t\tops.push(clients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq));\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\tlogger.validate({ baseText: \"23\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\trevertMergeTreeDeltaRevertibles(clientCDriver, clientC_Revertibles.splice(0));\n\n\t\t// \"123\" would be the ideal final state, but due to current limitations,\n\t\t// the eventual consistent state is \"1123\"\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\tlogger.validate({ baseText: \"1123\" });\n\t});\n\n\tit(\"revert annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\t\tops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq));\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\tlogger.validate({ baseText: \"123\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"Remove All Original Text and Insert then Revert\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1-2--\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t// the test logger uses these callbacks, so preserve it\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tconst deltaCallback = (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tclientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BB\"), ++seq));\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq));\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\n\t\tlogger.validate({ baseText: \"12\" });\n\t});\n\n\tit(\"Re-Insert at position 0 in empty string\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"BBC-\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq));\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"BB\"), ++seq));\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\n\t\tlogger.validate({ baseText: \"BBC\" });\n\t});\n\n\tit(\"Revert remove to empty with annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1-23--\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 2), ++seq));\n\t\tops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq));\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"Revert Local annotate and remove with intersecting remote annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1234-----\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta) => {\n\t\t\tif (op.sequencedMessage === undefined) {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t}\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 4, { test: \"B\" }), ++seq),\n\t\t);\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq));\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tops.push(\n\t\t\tclients.C.makeOpMessage(clients.C.annotateRangeLocal(3, 4, { test: \"C\" }), ++seq),\n\t\t);\n\n\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\tlogger.validate({ baseText: \"134\" });\n\n\t\ttry {\n\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\t} catch (e) {\n\t\t\tthrow logger.addLogsToError(e);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1234\" });\n\t});\n\n\tdescribe(\"Revertibles work as expected when a pair of markers and text is involved\", () => {\n\t\tgeneratePairwiseOptions({\n\t\t\trevertMarkerInsert: [true, undefined],\n\t\t\tackMarkerInsert: [true, undefined],\n\t\t\tsplitInsertTextRevertible: [true, undefined],\n\t\t\tackTextInsert: [true, undefined],\n\t\t\tsplitRemoveRevertible: [true, undefined],\n\t\t\tackTextRemove: [true, undefined],\n\t\t\tackUndo: [true, undefined],\n\t\t}).forEach((options) => {\n\t\t\tit(JSON.stringify(options), () => {\n\t\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t\t{ initialState: \"\", options: {} },\n\t\t\t\t\t\"A\",\n\t\t\t\t\t\"B\",\n\t\t\t\t);\n\n\t\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[][] = [];\n\t\t\t\tconst openNewUndoRedoTransaction = () => clientB_Revertibles.unshift([]);\n\t\t\t\t// the test logger uses these callbacks, so preserve it\n\t\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\t\tclientBDriver.submitOpCallback = (op) => ops.push(clients.B.makeOpMessage(op, ++seq));\n\t\t\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\t\t\tif (op.sequencedMessage === undefined && clientB_Revertibles.length > 0) {\n\t\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles[0]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tlet afterUndoBaseText: string | undefined;\n\t\t\t\tif (options.revertMarkerInsert) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\t\t\t\tops.push(\n\t\t\t\t\tclients.B.makeOpMessage(clients.B.insertMarkerLocal(0, ReferenceType.Simple), ++seq),\n\t\t\t\t);\n\t\t\t\tops.push(\n\t\t\t\t\tclients.B.makeOpMessage(clients.B.insertMarkerLocal(1, ReferenceType.Simple), ++seq),\n\t\t\t\t);\n\n\t\t\t\tif (options.ackMarkerInsert) {\n\t\t\t\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\t\t\t\tlogger.validate({ baseText: afterUndoBaseText });\n\t\t\t\t}\n\n\t\t\t\tif (options.splitInsertTextRevertible) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\t\t\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"B\"), ++seq));\n\t\t\t\tif (options.ackTextInsert) {\n\t\t\t\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\t\t\t\tlogger.validate({ baseText: \"B\" });\n\t\t\t\t}\n\n\t\t\t\tif (options.splitRemoveRevertible) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\n\t\t\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq));\n\t\t\t\tif (options.ackTextRemove) {\n\t\t\t\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\t\t\t\tlogger.validate({ baseText: \"\" });\n\t\t\t\t}\n\n\t\t\t\tconst afterRevertBaseTest = clients.B.getText();\n\t\t\t\ttry {\n\t\t\t\t\tconst reverts = clientB_Revertibles.splice(0);\n\t\t\t\t\treverts.forEach((revert) => {\n\t\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, revert);\n\t\t\t\t\t});\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow logger.addLogsToError(e);\n\t\t\t\t}\n\n\t\t\t\tif (options.ackUndo) {\n\t\t\t\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\t\t\t\tlogger.validate({ baseText: afterUndoBaseText });\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst reverts = clientB_Revertibles.splice(0);\n\t\t\t\t\treverts.forEach((revert) => {\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, revert);\n\t\t\t\t\t});\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow logger.addLogsToError(e);\n\t\t\t\t}\n\n\t\t\t\tops.splice(0).forEach((op) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\t\t\tlogger.validate({ baseText: afterRevertBaseTest });\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"revertibles.spec.js","sourceRoot":"","sources":["../../src/test/revertibles.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\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { strict as assert } from \"node:assert\";\n\nimport { generatePairwiseOptions } from \"@fluid-private/test-pairwise-generator\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { TrackingGroup, UnorderedTrackingGroup } from \"../mergeTreeTracking.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport {\n\tMergeTreeDeltaRevertible,\n\tappendToMergeTreeDeltaRevertibles,\n\trevertMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport { createRevertDriver } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\n/**\n * Run a custom \"spy function\" every time the given method is invoked.\n * @param methodClass - the class that has the method\n * @param methodName - the name of the method\n * @param spy - the spy function to run alongside the method\n * @returns a function which will remove the spy function when invoked. Should be called exactly once\n * after the spy is no longer needed.\n *\n * This method is duplicated between shared-tree test code, and should eventually\n * be merged with the implementation that lives there\n */\nexport function spyOnMethod(\n\t// eslint-disable-next-line @typescript-eslint/ban-types\n\tmethodClass: Function,\n\tmethodName: string,\n\tspy: () => void,\n): () => void {\n\tconst { prototype } = methodClass;\n\tconst method = prototype[methodName];\n\tassert(typeof method === \"function\", `Method does not exist: ${methodName}`);\n\n\tconst methodSpy = function (this: unknown, ...args: unknown[]): unknown {\n\t\tspy();\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-call\n\t\treturn method.call(this, ...args);\n\t};\n\tprototype[methodName] = methodSpy;\n\n\treturn () => {\n\t\tprototype[methodName] = method;\n\t};\n}\n\ndescribe(\"MergeTree.Revertibles\", () => {\n\tit(\"revert insert\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BB\"), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"BB123\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"has reasonable asymptotics in face of remove\", () => {\n\t\tconst length = 100;\n\n\t\t// track the amount of tracking group linking that occurs\n\t\tlet linkCount = 0;\n\t\tlet unlinkCount = 0;\n\n\t\tconst unspy1 = spyOnMethod(TrackingGroup, \"link\", () => (linkCount += 1));\n\t\tconst unspy2 = spyOnMethod(TrackingGroup, \"unlink\", () => (unlinkCount += 1));\n\t\tconst unspy3 = spyOnMethod(UnorderedTrackingGroup, \"link\", () => (linkCount += 1));\n\t\tconst unspy4 = spyOnMethod(UnorderedTrackingGroup, \"unlink\", () => (unlinkCount += 1));\n\n\t\ttry {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"\",\n\t\t\t\t\toptions: {},\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t);\n\n\t\t\tfor (let i = 1; i <= length; i++) {\n\t\t\t\tconst insertOp = clients.A.insertTextLocal(i - 1, \"a\");\n\t\t\t\tclients.A.applyMsg(\n\t\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\t\tinsertOp,\n\t\t\t\t\t\t/* seq */ i + 1,\n\t\t\t\t\t\t/* refSeq */ i,\n\t\t\t\t\t\tclients.A.longClientId,\n\t\t\t\t\t\t/* minSeq */ 1,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tclients.A.on(\"delta\", (_op, delta) => {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, revertibles);\n\t\t\t});\n\n\t\t\tconst op = clients.A.removeRangeLocal(0, length - 1);\n\n\t\t\tclients.A.applyMsg(\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\top,\n\t\t\t\t\t/* seq */ length + 1,\n\t\t\t\t\t/* refSeq */ length,\n\t\t\t\t\tclients.A.longClientId,\n\t\t\t\t\t/* minSeq */ length,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\t// the below checks act as a proxy for the asymptotics of undo-redo\n\t\t\t// linking. they are perhaps a bit more strict than necessary. if these\n\t\t\t// tests are failing and the number of calls is still within a sane limit,\n\t\t\t// it should be fine to update these checks to allow a larger number of\n\t\t\t// calls\n\t\t\tassert(\n\t\t\t\tlinkCount <= length * 3,\n\t\t\t\t`expected tracking group link to occur at most three times per segment. found ${linkCount} instead of ${\n\t\t\t\t\tlength * 3\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tunlinkCount <= length * 2,\n\t\t\t\t`expected tracking group unlink to occur at most twice per segment. found ${unlinkCount} instead of ${\n\t\t\t\t\tlength * 2\n\t\t\t\t}`,\n\t\t\t);\n\t\t} finally {\n\t\t\tunspy1();\n\t\t\tunspy2();\n\t\t\tunspy3();\n\t\t\tunspy4();\n\t\t}\n\t});\n\n\tit(\"revert remove\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"23\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tfor (const { name, removeStart, removeEnd, expectedPostRemove } of [\n\t\t{\n\t\t\tname: \"revert overlapping remove\",\n\t\t\tremoveStart: 0,\n\t\t\tremoveEnd: 1,\n\t\t\texpectedPostRemove: \"23\",\n\t\t},\n\t\t{\n\t\t\tname: \"revert overlapping remove of multiple segments\",\n\t\t\tremoveStart: 0,\n\t\t\tremoveEnd: 2,\n\t\t\texpectedPreRemove: \"23\",\n\t\t},\n\t]) {\n\t\tit(name, () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{ initialState: \"1-23\", options: {} },\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t\t\"C\",\n\t\t\t);\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tlet seq = 0;\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t});\n\n\t\t\tops.push(\n\t\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(removeStart, removeEnd), ++seq),\n\t\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(removeStart, removeEnd), ++seq),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\tlogger.validate({ baseText: expectedPostRemove });\n\n\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\tlogger.validate({ baseText: \"123\" });\n\t\t});\n\t}\n\n\tit(\"revert two overlapping removes\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tconst clientC_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientCDriver = createRevertDriver(clients.C);\n\t\tclientCDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.C.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\n\t\tclients.C.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientC_Revertibles);\n\t\t});\n\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"23\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\trevertMergeTreeDeltaRevertibles(clientCDriver, clientC_Revertibles.splice(0));\n\n\t\t// \"123\" would be the ideal final state, but due to current limitations,\n\t\t// the eventual consistent state is \"1123\"\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"1123\" });\n\t});\n\n\tit(\"revert annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"123\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t);\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t});\n\t\tops.push(clients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"Remove All Original Text and Insert then Revert\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1-2--\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t// the test logger uses these callbacks, so preserve it\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BB\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"12\" });\n\t});\n\n\tit(\"Re-Insert at position 0 in empty string\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"BBC-\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(2, 3), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(1, \"BB\"), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"BBC\" });\n\t});\n\n\tit(\"Revert remove to empty with annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1-23--\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (op, delta: IMergeTreeDeltaCallbackArgs): void => {\n\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 2), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 1, { test: 1 }), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tlogger.validate({ baseText: \"123\" });\n\t});\n\n\tit(\"Revert Local annotate and remove with intersecting remote annotate\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"1234-----\", options: {} },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\tconst deltaCallback = (\n\t\t\top: IMergeTreeDeltaOpArgs,\n\t\t\tdelta: IMergeTreeDeltaCallbackArgs,\n\t\t): void => {\n\t\t\tif (op.sequencedMessage === undefined) {\n\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t}\n\t\t};\n\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\n\t\tclients.B.on(\"delta\", deltaCallback);\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.annotateRangeLocal(0, 4, { test: \"B\" }), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq),\n\t\t);\n\n\t\t// revert to the original callback\n\t\tclients.B.off(\"delta\", deltaCallback);\n\n\t\tops.push(\n\t\t\tclients.C.makeOpMessage(clients.C.annotateRangeLocal(3, 4, { test: \"C\" }), ++seq),\n\t\t);\n\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate({ baseText: \"134\" });\n\n\t\ttry {\n\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t} catch (error) {\n\t\t\tthrow logger.addLogsToError(error);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1234\" });\n\t});\n\n\tdescribe(\"Revertibles work as expected when a pair of markers and text is involved\", () => {\n\t\tfor (const options of generatePairwiseOptions({\n\t\t\trevertMarkerInsert: [true, undefined],\n\t\t\tackMarkerInsert: [true, undefined],\n\t\t\tsplitInsertTextRevertible: [true, undefined],\n\t\t\tackTextInsert: [true, undefined],\n\t\t\tsplitRemoveRevertible: [true, undefined],\n\t\t\tackTextRemove: [true, undefined],\n\t\t\tackUndo: [true, undefined],\n\t\t})) {\n\t\t\tit(JSON.stringify(options), () => {\n\t\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t\t{ initialState: \"\", options: {} },\n\t\t\t\t\t\"A\",\n\t\t\t\t\t\"B\",\n\t\t\t\t);\n\n\t\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[][] = [];\n\t\t\t\tconst openNewUndoRedoTransaction = (): number => clientB_Revertibles.unshift([]);\n\t\t\t\t// the test logger uses these callbacks, so preserve it\n\t\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\t\t\tops.push(clients.B.makeOpMessage(op, ++seq));\n\t\t\t\tclients.B.on(\"delta\", (op, delta) => {\n\t\t\t\t\tif (op.sequencedMessage === undefined && clientB_Revertibles.length > 0) {\n\t\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles[0]);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tlet afterUndoBaseText: string | undefined;\n\t\t\t\tif (options.revertMarkerInsert) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\t\t\t\tops.push(\n\t\t\t\t\tclients.B.makeOpMessage(clients.B.insertMarkerLocal(0, ReferenceType.Simple), ++seq),\n\t\t\t\t\tclients.B.makeOpMessage(clients.B.insertMarkerLocal(1, ReferenceType.Simple), ++seq),\n\t\t\t\t);\n\n\t\t\t\tif (options.ackMarkerInsert) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: afterUndoBaseText });\n\t\t\t\t}\n\n\t\t\t\tif (options.splitInsertTextRevertible) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\t\t\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"B\"), ++seq));\n\t\t\t\tif (options.ackTextInsert) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: \"B\" });\n\t\t\t\t}\n\n\t\t\t\tif (options.splitRemoveRevertible) {\n\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\tafterUndoBaseText ??= clients.B.getText();\n\t\t\t\t}\n\n\t\t\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq));\n\t\t\t\tif (options.ackTextRemove) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: \"\" });\n\t\t\t\t}\n\n\t\t\t\tconst afterRevertBaseTest = clients.B.getText();\n\t\t\t\ttry {\n\t\t\t\t\tconst reverts = clientB_Revertibles.splice(0);\n\t\t\t\t\tfor (const revert of reverts) {\n\t\t\t\t\t\topenNewUndoRedoTransaction();\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, revert);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow logger.addLogsToError(error);\n\t\t\t\t}\n\n\t\t\t\tif (options.ackUndo) {\n\t\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\t\tlogger.validate({ baseText: afterUndoBaseText });\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst reverts = clientB_Revertibles.splice(0);\n\t\t\t\t\tfor (const revert of reverts) {\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, revert);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow logger.addLogsToError(error);\n\t\t\t\t}\n\n\t\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\t\t\t\tlogger.validate({ baseText: afterRevertBaseTest });\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
|
|
@@ -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 textSegment_js_1 = require("../textSegment.js");
|
|
9
9
|
describe("segmentGroupCollection", () => {
|
|
10
10
|
let segment;
|
|
@@ -12,18 +12,18 @@ describe("segmentGroupCollection", () => {
|
|
|
12
12
|
segment = textSegment_js_1.TextSegment.make("abc");
|
|
13
13
|
});
|
|
14
14
|
it(".empty", () => {
|
|
15
|
-
(0,
|
|
15
|
+
(0, node_assert_1.strict)(segment.segmentGroups.empty);
|
|
16
16
|
});
|
|
17
17
|
it(".size", () => {
|
|
18
|
-
|
|
18
|
+
node_assert_1.strict.equal(segment.segmentGroups.size, 0);
|
|
19
19
|
});
|
|
20
20
|
it(".enqueue", () => {
|
|
21
21
|
const segmentGroup = { segments: [], localSeq: 1, refSeq: 0 };
|
|
22
22
|
segment.segmentGroups.enqueue(segmentGroup);
|
|
23
|
-
(0,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
(0, node_assert_1.strict)(!segment.segmentGroups.empty);
|
|
24
|
+
node_assert_1.strict.equal(segment.segmentGroups.size, 1);
|
|
25
|
+
node_assert_1.strict.equal(segmentGroup.segments.length, 1);
|
|
26
|
+
node_assert_1.strict.equal(segmentGroup.segments[0], segment);
|
|
27
27
|
});
|
|
28
28
|
it(".dequeue", () => {
|
|
29
29
|
const segmentGroup = { segments: [], localSeq: 1, refSeq: 0 };
|
|
@@ -33,10 +33,10 @@ describe("segmentGroupCollection", () => {
|
|
|
33
33
|
segment.segmentGroups.enqueue({ segments: [], localSeq: 1, refSeq: 0 });
|
|
34
34
|
}
|
|
35
35
|
const dequeuedSegmentGroup = segment.segmentGroups.dequeue();
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
node_assert_1.strict.equal(segment.segmentGroups.size, segmentGroupCount - 1);
|
|
37
|
+
node_assert_1.strict.equal(dequeuedSegmentGroup?.segments.length, 1);
|
|
38
|
+
node_assert_1.strict.equal(dequeuedSegmentGroup.segments[0], segment);
|
|
39
|
+
node_assert_1.strict.equal(dequeuedSegmentGroup, segmentGroup);
|
|
40
40
|
});
|
|
41
41
|
it(".copyTo", () => {
|
|
42
42
|
const segmentGroupCount = 6;
|
|
@@ -45,15 +45,15 @@ describe("segmentGroupCollection", () => {
|
|
|
45
45
|
}
|
|
46
46
|
const segmentCopy = textSegment_js_1.TextSegment.make("");
|
|
47
47
|
segment.segmentGroups.copyTo(segmentCopy);
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
node_assert_1.strict.equal(segment.segmentGroups.size, segmentGroupCount);
|
|
49
|
+
node_assert_1.strict.equal(segmentCopy.segmentGroups.size, segmentGroupCount);
|
|
50
50
|
while (!segment.segmentGroups.empty || !segmentCopy.segmentGroups.empty) {
|
|
51
51
|
const segmentGroup = segment.segmentGroups.dequeue();
|
|
52
52
|
const copySegmentGroup = segmentCopy.segmentGroups.dequeue();
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
node_assert_1.strict.equal(segmentGroup, copySegmentGroup);
|
|
54
|
+
node_assert_1.strict.equal(segmentGroup?.segments.length, 2);
|
|
55
|
+
node_assert_1.strict.equal(segmentGroup.segments[0], segment);
|
|
56
|
+
node_assert_1.strict.equal(segmentGroup.segments[1], segmentCopy);
|
|
57
57
|
}
|
|
58
58
|
});
|
|
59
59
|
});
|