@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,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
8
|
-
const
|
|
8
|
+
const node_assert_1 = require("node:assert");
|
|
9
9
|
const mergeTreeNodes_js_1 = require("../mergeTreeNodes.js");
|
|
10
10
|
const ops_js_1 = require("../ops.js");
|
|
11
11
|
const properties_js_1 = require("../properties.js");
|
|
@@ -17,7 +17,7 @@ describe("resetPendingSegmentsToOp", () => {
|
|
|
17
17
|
beforeEach(() => {
|
|
18
18
|
client = new testClient_js_1.TestClient();
|
|
19
19
|
client.startOrUpdateCollaboration("local user");
|
|
20
|
-
(0,
|
|
20
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
21
21
|
});
|
|
22
22
|
describe("with a number of nested inserts", () => {
|
|
23
23
|
const insertCount = 5;
|
|
@@ -39,12 +39,12 @@ describe("resetPendingSegmentsToOp", () => {
|
|
|
39
39
|
for (let i = 0; i < insertCount; i++) {
|
|
40
40
|
const op = client.insertTextLocal(i, "hello");
|
|
41
41
|
opList.push({ op, refSeq: client.getCurrentSeq() });
|
|
42
|
-
|
|
42
|
+
node_assert_1.strict.equal(client.mergeTree.pendingSegments?.length, i + 1);
|
|
43
43
|
}
|
|
44
44
|
});
|
|
45
45
|
it("acked insertSegment", async () => {
|
|
46
46
|
applyOpList(client);
|
|
47
|
-
(0,
|
|
47
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
48
48
|
});
|
|
49
49
|
it("only computes localPartialLengths once", () => {
|
|
50
50
|
// This test helps verify the asymptotic correctness of rebase.
|
|
@@ -58,12 +58,14 @@ describe("resetPendingSegmentsToOp", () => {
|
|
|
58
58
|
spiedMergeTree._localPartialsComputed = spiedMergeTree.localPartialsComputed;
|
|
59
59
|
Object.defineProperty(client.mergeTree, "localPartialsComputed", {
|
|
60
60
|
get() {
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
61
62
|
return this._localPartialsComputed;
|
|
62
63
|
},
|
|
63
64
|
set(newValue) {
|
|
64
65
|
if (newValue) {
|
|
65
66
|
localPartialsComputeCount++;
|
|
66
67
|
}
|
|
68
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
|
|
67
69
|
this._localPartialsComputed = newValue;
|
|
68
70
|
},
|
|
69
71
|
});
|
|
@@ -74,7 +76,7 @@ describe("resetPendingSegmentsToOp", () => {
|
|
|
74
76
|
refSeq: client.getCurrentSeq(),
|
|
75
77
|
}));
|
|
76
78
|
applyOpList(client);
|
|
77
|
-
|
|
79
|
+
node_assert_1.strict.equal(localPartialsComputeCount, 1);
|
|
78
80
|
});
|
|
79
81
|
it("nacked insertSegment", async () => {
|
|
80
82
|
const oldops = opList;
|
|
@@ -86,27 +88,28 @@ describe("resetPendingSegmentsToOp", () => {
|
|
|
86
88
|
// we expect a nack op per segment since our original ops split segments
|
|
87
89
|
// we should expect mores nack ops then original ops.
|
|
88
90
|
// only the first op didn't split a segment, all the others did
|
|
89
|
-
|
|
91
|
+
node_assert_1.strict.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);
|
|
90
92
|
applyOpList(client);
|
|
91
|
-
(0,
|
|
93
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
92
94
|
});
|
|
93
95
|
it("acked removeRange", async () => {
|
|
94
96
|
applyOpList(client);
|
|
95
|
-
(0,
|
|
97
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
96
98
|
opList.push({
|
|
97
99
|
op: client.removeRangeLocal(0, client.getLength()),
|
|
98
100
|
refSeq: client.getCurrentSeq(),
|
|
99
101
|
});
|
|
100
102
|
applyOpList(client);
|
|
101
|
-
(0,
|
|
103
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
102
104
|
});
|
|
103
105
|
it("nacked removeRange", async () => {
|
|
104
106
|
applyOpList(client);
|
|
105
|
-
(0,
|
|
107
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
106
108
|
opList.push({
|
|
107
109
|
op: client.removeRangeLocal(0, client.getLength()),
|
|
108
110
|
refSeq: client.getCurrentSeq(),
|
|
109
111
|
});
|
|
112
|
+
// eslint-disable-next-line unicorn/no-array-push-push
|
|
110
113
|
opList.push({
|
|
111
114
|
op: client.regeneratePendingOp(opList.shift().op, client.mergeTree.pendingSegments.first.data),
|
|
112
115
|
refSeq: client.getCurrentSeq(),
|
|
@@ -114,9 +117,9 @@ describe("resetPendingSegmentsToOp", () => {
|
|
|
114
117
|
// we expect a nack op per segment since our original ops split segments
|
|
115
118
|
// we should expect mores nack ops then original ops.
|
|
116
119
|
// only the first op didn't split a segment, all the others did
|
|
117
|
-
|
|
120
|
+
node_assert_1.strict.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);
|
|
118
121
|
applyOpList(client);
|
|
119
|
-
(0,
|
|
122
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
120
123
|
});
|
|
121
124
|
it("nacked insertSegment and removeRange", async () => {
|
|
122
125
|
opList.push({
|
|
@@ -129,27 +132,28 @@ describe("resetPendingSegmentsToOp", () => {
|
|
|
129
132
|
op: client.regeneratePendingOp(op.op, pending.shift()),
|
|
130
133
|
refSeq: client.getCurrentSeq(),
|
|
131
134
|
}));
|
|
132
|
-
|
|
135
|
+
node_assert_1.strict.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount * 2);
|
|
133
136
|
applyOpList(client);
|
|
134
|
-
(0,
|
|
137
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
135
138
|
});
|
|
136
139
|
it("acked annotateRange", async () => {
|
|
137
140
|
applyOpList(client);
|
|
138
|
-
(0,
|
|
141
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
139
142
|
opList.push({
|
|
140
143
|
op: client.annotateRangeLocal(0, client.getLength(), { foo: "bar" }),
|
|
141
144
|
refSeq: client.getCurrentSeq(),
|
|
142
145
|
});
|
|
143
146
|
applyOpList(client);
|
|
144
|
-
(0,
|
|
147
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
145
148
|
});
|
|
146
149
|
it("nacked annotateRange", async () => {
|
|
147
150
|
applyOpList(client);
|
|
148
|
-
(0,
|
|
151
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
149
152
|
opList.push({
|
|
150
153
|
op: client.annotateRangeLocal(0, client.getLength(), { foo: "bar" }),
|
|
151
154
|
refSeq: client.getCurrentSeq(),
|
|
152
155
|
});
|
|
156
|
+
// eslint-disable-next-line unicorn/no-array-push-push
|
|
153
157
|
opList.push({
|
|
154
158
|
op: client.regeneratePendingOp(opList.shift().op, client.mergeTree.pendingSegments.first.data),
|
|
155
159
|
refSeq: client.getCurrentSeq(),
|
|
@@ -157,9 +161,9 @@ describe("resetPendingSegmentsToOp", () => {
|
|
|
157
161
|
// we expect a nack op per segment since our original ops split segments
|
|
158
162
|
// we should expect mores nack ops then original ops.
|
|
159
163
|
// only the first op didn't split a segment, all the others did
|
|
160
|
-
|
|
164
|
+
node_assert_1.strict.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);
|
|
161
165
|
applyOpList(client);
|
|
162
|
-
(0,
|
|
166
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
163
167
|
});
|
|
164
168
|
it("nacked insertSegment and annotateRange", async () => {
|
|
165
169
|
opList.push({
|
|
@@ -175,9 +179,9 @@ describe("resetPendingSegmentsToOp", () => {
|
|
|
175
179
|
// we expect a nack op per segment since our original ops split segments
|
|
176
180
|
// we should expect mores nack ops then original ops.
|
|
177
181
|
// only the first op didn't split a segment, all the others did
|
|
178
|
-
|
|
182
|
+
node_assert_1.strict.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount * 2);
|
|
179
183
|
applyOpList(client);
|
|
180
|
-
(0,
|
|
184
|
+
(0, node_assert_1.strict)(client.mergeTree.pendingSegments?.empty);
|
|
181
185
|
});
|
|
182
186
|
});
|
|
183
187
|
describe("uses original properties on insert", () => {
|
|
@@ -188,31 +192,31 @@ describe("resetPendingSegmentsToOp", () => {
|
|
|
188
192
|
[mergeTreeNodes_js_1.reservedMarkerIdKey]: "id",
|
|
189
193
|
prop1: "foo",
|
|
190
194
|
});
|
|
191
|
-
(0,
|
|
195
|
+
(0, node_assert_1.strict)(insertOp);
|
|
192
196
|
const { segment } = client.getContainingSegment(0);
|
|
193
|
-
(0,
|
|
197
|
+
(0, node_assert_1.strict)(segment !== undefined && mergeTreeNodes_js_1.Marker.is(segment));
|
|
194
198
|
client.annotateMarker(segment, { prop2: "bar" });
|
|
195
199
|
const otherClient = new testClient_js_1.TestClient();
|
|
196
200
|
otherClient.startOrUpdateCollaboration("other user");
|
|
197
201
|
const regeneratedInsert = client.regeneratePendingOp(insertOp, client.mergeTree.pendingSegments.first.data);
|
|
198
202
|
otherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);
|
|
199
203
|
const { segment: otherSegment } = otherClient.getContainingSegment(0);
|
|
200
|
-
(0,
|
|
204
|
+
(0, node_assert_1.strict)(otherSegment !== undefined && mergeTreeNodes_js_1.Marker.is(otherSegment));
|
|
201
205
|
// `clone` here is because properties use a Object.create(null); to compare strict equal the prototype chain
|
|
202
206
|
// should therefore not include Object.
|
|
203
|
-
|
|
207
|
+
node_assert_1.strict.deepStrictEqual(otherSegment.properties, (0, properties_js_1.clone)({ [mergeTreeNodes_js_1.reservedMarkerIdKey]: "id", prop1: "foo" }));
|
|
204
208
|
});
|
|
205
209
|
it("for text segments", () => {
|
|
206
210
|
const insertOp = client.insertTextLocal(0, "abc", { prop1: "foo" });
|
|
207
|
-
(0,
|
|
211
|
+
(0, node_assert_1.strict)(insertOp);
|
|
208
212
|
client.annotateRangeLocal(0, 3, { prop2: "bar" });
|
|
209
213
|
const otherClient = new testClient_js_1.TestClient();
|
|
210
214
|
otherClient.startOrUpdateCollaboration("other user");
|
|
211
215
|
const regeneratedInsert = client.regeneratePendingOp(insertOp, client.mergeTree.pendingSegments.first.data);
|
|
212
216
|
otherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);
|
|
213
217
|
const { segment: otherSegment } = otherClient.getContainingSegment(0);
|
|
214
|
-
(0,
|
|
215
|
-
|
|
218
|
+
(0, node_assert_1.strict)(otherSegment !== undefined && textSegment_js_1.TextSegment.is(otherSegment));
|
|
219
|
+
node_assert_1.strict.deepStrictEqual(otherSegment.properties, (0, properties_js_1.clone)({ prop1: "foo" }));
|
|
216
220
|
});
|
|
217
221
|
});
|
|
218
222
|
});
|
|
@@ -230,7 +234,9 @@ describe("resetPendingSegmentsToOp.rebase", () => {
|
|
|
230
234
|
clients.A.makeOpMessage(clients.A.regeneratePendingOp(op.contents, sg), op.sequenceNumber),
|
|
231
235
|
clients.A.peekPendingSegmentGroups(),
|
|
232
236
|
]));
|
|
233
|
-
|
|
237
|
+
for (const [op] of ops)
|
|
238
|
+
for (const c of clients.all)
|
|
239
|
+
c.applyMsg(op);
|
|
234
240
|
logger.validate();
|
|
235
241
|
});
|
|
236
242
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resetPendingSegmentsToOp.spec.js","sourceRoot":"","sources":["../../src/test/resetPendingSegmentsToOp.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-non-null-assertion */\n\nimport { strict as assert } from \"assert\";\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { Marker, SegmentGroup, reservedMarkerIdKey } from \"../mergeTreeNodes.js\";\nimport { IMergeTreeOp, ReferenceType } from \"../ops.js\";\nimport { clone } from \"../properties.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\ndescribe(\"resetPendingSegmentsToOp\", () => {\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.startOrUpdateCollaboration(\"local user\");\n\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t});\n\n\tdescribe(\"with a number of nested inserts\", () => {\n\t\tconst insertCount = 5;\n\t\tconst expectedSegmentCount = insertCount * 2 - 1;\n\t\tlet opList: { op: IMergeTreeOp; refSeq: number }[];\n\t\tlet opCount: number = 0;\n\n\t\tfunction applyOpList(cli: TestClient) {\n\t\t\twhile (opList.length > 0) {\n\t\t\t\tconst op = opList.shift();\n\t\t\t\tif (op) {\n\t\t\t\t\tconst seqOp = cli.makeOpMessage(op.op, ++opCount, op.refSeq);\n\t\t\t\t\tcli.applyMsg(seqOp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbeforeEach(() => {\n\t\t\topList = [];\n\t\t\topCount = 0;\n\n\t\t\tfor (let i = 0; i < insertCount; i++) {\n\t\t\t\tconst op = client.insertTextLocal(i, \"hello\")!;\n\t\t\t\topList.push({ op, refSeq: client.getCurrentSeq() });\n\t\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, i + 1);\n\t\t\t}\n\t\t});\n\n\t\tit(\"acked insertSegment\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"only computes localPartialLengths once\", () => {\n\t\t\t// This test helps verify the asymptotic correctness of rebase.\n\t\t\t// Since local partial length information is reasonably expensive to store and compute compared to how\n\t\t\t// frequently it's used (i.e. only on reconnect), mergeTree has some logic to only do so when requested,\n\t\t\t// and invalidates that info whenever a segment update occurs.\n\t\t\t// This test verifies that local partial length information only gets computed once when regenerating\n\t\t\t// a number of ops for reconnection.\n\t\t\tlet localPartialsComputeCount = 0;\n\t\t\tconst spiedMergeTree = client.mergeTree as unknown as {\n\t\t\t\tlocalPartialsComputed: boolean;\n\t\t\t\t_localPartialsComputed: boolean;\n\t\t\t};\n\t\t\tspiedMergeTree._localPartialsComputed = spiedMergeTree.localPartialsComputed;\n\t\t\tObject.defineProperty(\n\t\t\t\tclient.mergeTree as unknown as { localPartialsComputed: boolean },\n\t\t\t\t\"localPartialsComputed\",\n\t\t\t\t{\n\t\t\t\t\tget() {\n\t\t\t\t\t\treturn this._localPartialsComputed as boolean;\n\t\t\t\t\t},\n\t\t\t\t\tset(newValue) {\n\t\t\t\t\t\tif (newValue) {\n\t\t\t\t\t\t\tlocalPartialsComputeCount++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._localPartialsComputed = newValue;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\t\t\tapplyOpList(client);\n\t\t\tassert.equal(localPartialsComputeCount, 1);\n\t\t});\n\n\t\tit(\"nacked insertSegment\", async () => {\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"acked removeRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.removeRangeLocal(0, client.getLength())!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked removeRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.removeRangeLocal(0, client.getLength())!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\topList.push({\n\t\t\t\top: client.regeneratePendingOp(\n\t\t\t\t\topList.shift()!.op,\n\t\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t\t),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked insertSegment and removeRange\", async () => {\n\t\t\topList.push({\n\t\t\t\top: client.removeRangeLocal(0, client.getLength())!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount * 2);\n\n\t\t\tapplyOpList(client);\n\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"acked annotateRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.annotateRangeLocal(0, client.getLength(), { foo: \"bar\" })!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked annotateRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.annotateRangeLocal(0, client.getLength(), { foo: \"bar\" })!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\topList.push({\n\t\t\t\top: client.regeneratePendingOp(\n\t\t\t\t\topList.shift()!.op,\n\t\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t\t),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked insertSegment and annotateRange\", async () => {\n\t\t\topList.push({\n\t\t\t\top: client.annotateRangeLocal(0, client.getLength(), { foo: \"bar\" })!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount * 2);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\t});\n\n\tdescribe(\"uses original properties on insert\", () => {\n\t\t// Regression tests for an issue where regenerated insert ops would use the properties of a segment\n\t\t// at the time of regeneration rather than its properties at insertion time.\n\t\tit(\"for markers\", () => {\n\t\t\tconst insertOp = client.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t\t[reservedMarkerIdKey]: \"id\",\n\t\t\t\tprop1: \"foo\",\n\t\t\t});\n\t\t\tassert(insertOp);\n\t\t\tconst { segment } = client.getContainingSegment(0);\n\t\t\tassert(segment !== undefined && Marker.is(segment));\n\t\t\tclient.annotateMarker(segment, { prop2: \"bar\" });\n\n\t\t\tconst otherClient = new TestClient();\n\t\t\totherClient.startOrUpdateCollaboration(\"other user\");\n\t\t\tconst regeneratedInsert = client.regeneratePendingOp(\n\t\t\t\tinsertOp,\n\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } = otherClient.getContainingSegment(0);\n\t\t\tassert(otherSegment !== undefined && Marker.is(otherSegment));\n\t\t\t// `clone` here is because properties use a Object.create(null); to compare strict equal the prototype chain\n\t\t\t// should therefore not include Object.\n\t\t\tassert.deepStrictEqual(\n\t\t\t\totherSegment.properties,\n\t\t\t\tclone({ [reservedMarkerIdKey]: \"id\", prop1: \"foo\" }),\n\t\t\t);\n\t\t});\n\n\t\tit(\"for text segments\", () => {\n\t\t\tconst insertOp = client.insertTextLocal(0, \"abc\", { prop1: \"foo\" });\n\t\t\tassert(insertOp);\n\t\t\tclient.annotateRangeLocal(0, 3, { prop2: \"bar\" });\n\n\t\t\tconst otherClient = new TestClient();\n\t\t\totherClient.startOrUpdateCollaboration(\"other user\");\n\t\t\tconst regeneratedInsert = client.regeneratePendingOp(\n\t\t\t\tinsertOp,\n\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } = otherClient.getContainingSegment(0);\n\t\t\tassert(otherSegment !== undefined && TextSegment.is(otherSegment));\n\t\t\tassert.deepStrictEqual(otherSegment.properties, clone({ prop1: \"foo\" }));\n\t\t});\n\t});\n});\n\ndescribe(\"resetPendingSegmentsToOp.rebase\", () => {\n\tit(\"rebase with oustanding ops\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"0123456789\" }, \"A\", \"B\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst ops: [ISequencedDocumentMessage, SegmentGroup][] = Array.from({ length: 10 }).map(\n\t\t\t(_, i) => [\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.annotateRangeLocal(0, clients.A.getLength(), { prop: i }),\n\t\t\t\t\ti + 1,\n\t\t\t\t),\n\t\t\t\tclients.A.peekPendingSegmentGroups()!,\n\t\t\t],\n\t\t);\n\n\t\tops.push(\n\t\t\t...ops\n\t\t\t\t.splice(Math.floor(ops.length / 2))\n\t\t\t\t.map<[ISequencedDocumentMessage, SegmentGroup]>(([op, sg]) => [\n\t\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\t\tclients.A.regeneratePendingOp(op.contents as IMergeTreeOp, sg),\n\t\t\t\t\t\top.sequenceNumber,\n\t\t\t\t\t),\n\t\t\t\t\tclients.A.peekPendingSegmentGroups()!,\n\t\t\t\t]),\n\t\t);\n\n\t\tops.forEach(([op]) => clients.all.forEach((c) => c.applyMsg(op)));\n\t\tlogger.validate();\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"resetPendingSegmentsToOp.spec.js","sourceRoot":"","sources":["../../src/test/resetPendingSegmentsToOp.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-non-null-assertion */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { Marker, SegmentGroup, reservedMarkerIdKey } from \"../mergeTreeNodes.js\";\nimport { IMergeTreeOp, ReferenceType } from \"../ops.js\";\nimport { clone } from \"../properties.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\ndescribe(\"resetPendingSegmentsToOp\", () => {\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.startOrUpdateCollaboration(\"local user\");\n\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t});\n\n\tdescribe(\"with a number of nested inserts\", () => {\n\t\tconst insertCount = 5;\n\t\tconst expectedSegmentCount = insertCount * 2 - 1;\n\t\tlet opList: { op: IMergeTreeOp; refSeq: number }[];\n\t\tlet opCount: number = 0;\n\n\t\tfunction applyOpList(cli: TestClient): void {\n\t\t\twhile (opList.length > 0) {\n\t\t\t\tconst op = opList.shift();\n\t\t\t\tif (op) {\n\t\t\t\t\tconst seqOp = cli.makeOpMessage(op.op, ++opCount, op.refSeq);\n\t\t\t\t\tcli.applyMsg(seqOp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbeforeEach(() => {\n\t\t\topList = [];\n\t\t\topCount = 0;\n\n\t\t\tfor (let i = 0; i < insertCount; i++) {\n\t\t\t\tconst op = client.insertTextLocal(i, \"hello\")!;\n\t\t\t\topList.push({ op, refSeq: client.getCurrentSeq() });\n\t\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, i + 1);\n\t\t\t}\n\t\t});\n\n\t\tit(\"acked insertSegment\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"only computes localPartialLengths once\", () => {\n\t\t\t// This test helps verify the asymptotic correctness of rebase.\n\t\t\t// Since local partial length information is reasonably expensive to store and compute compared to how\n\t\t\t// frequently it's used (i.e. only on reconnect), mergeTree has some logic to only do so when requested,\n\t\t\t// and invalidates that info whenever a segment update occurs.\n\t\t\t// This test verifies that local partial length information only gets computed once when regenerating\n\t\t\t// a number of ops for reconnection.\n\t\t\tlet localPartialsComputeCount = 0;\n\t\t\tconst spiedMergeTree = client.mergeTree as unknown as {\n\t\t\t\tlocalPartialsComputed: boolean;\n\t\t\t\t_localPartialsComputed: boolean;\n\t\t\t};\n\t\t\tspiedMergeTree._localPartialsComputed = spiedMergeTree.localPartialsComputed;\n\t\t\tObject.defineProperty(\n\t\t\t\tclient.mergeTree as unknown as { localPartialsComputed: boolean },\n\t\t\t\t\"localPartialsComputed\",\n\t\t\t\t{\n\t\t\t\t\tget() {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\treturn this._localPartialsComputed as boolean;\n\t\t\t\t\t},\n\t\t\t\t\tset(newValue) {\n\t\t\t\t\t\tif (newValue) {\n\t\t\t\t\t\t\tlocalPartialsComputeCount++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\tthis._localPartialsComputed = newValue;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\t\t\tapplyOpList(client);\n\t\t\tassert.equal(localPartialsComputeCount, 1);\n\t\t});\n\n\t\tit(\"nacked insertSegment\", async () => {\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"acked removeRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.removeRangeLocal(0, client.getLength())!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked removeRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.removeRangeLocal(0, client.getLength())!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\t// eslint-disable-next-line unicorn/no-array-push-push\n\t\t\topList.push({\n\t\t\t\top: client.regeneratePendingOp(\n\t\t\t\t\topList.shift()!.op,\n\t\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t\t),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked insertSegment and removeRange\", async () => {\n\t\t\topList.push({\n\t\t\t\top: client.removeRangeLocal(0, client.getLength())!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount * 2);\n\n\t\t\tapplyOpList(client);\n\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"acked annotateRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.annotateRangeLocal(0, client.getLength(), { foo: \"bar\" })!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked annotateRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.annotateRangeLocal(0, client.getLength(), { foo: \"bar\" })!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\t// eslint-disable-next-line unicorn/no-array-push-push\n\t\t\topList.push({\n\t\t\t\top: client.regeneratePendingOp(\n\t\t\t\t\topList.shift()!.op,\n\t\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t\t),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked insertSegment and annotateRange\", async () => {\n\t\t\topList.push({\n\t\t\t\top: client.annotateRangeLocal(0, client.getLength(), { foo: \"bar\" })!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount * 2);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\t});\n\n\tdescribe(\"uses original properties on insert\", () => {\n\t\t// Regression tests for an issue where regenerated insert ops would use the properties of a segment\n\t\t// at the time of regeneration rather than its properties at insertion time.\n\t\tit(\"for markers\", () => {\n\t\t\tconst insertOp = client.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t\t[reservedMarkerIdKey]: \"id\",\n\t\t\t\tprop1: \"foo\",\n\t\t\t});\n\t\t\tassert(insertOp);\n\t\t\tconst { segment } = client.getContainingSegment(0);\n\t\t\tassert(segment !== undefined && Marker.is(segment));\n\t\t\tclient.annotateMarker(segment, { prop2: \"bar\" });\n\n\t\t\tconst otherClient = new TestClient();\n\t\t\totherClient.startOrUpdateCollaboration(\"other user\");\n\t\t\tconst regeneratedInsert = client.regeneratePendingOp(\n\t\t\t\tinsertOp,\n\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } = otherClient.getContainingSegment(0);\n\t\t\tassert(otherSegment !== undefined && Marker.is(otherSegment));\n\t\t\t// `clone` here is because properties use a Object.create(null); to compare strict equal the prototype chain\n\t\t\t// should therefore not include Object.\n\t\t\tassert.deepStrictEqual(\n\t\t\t\totherSegment.properties,\n\t\t\t\tclone({ [reservedMarkerIdKey]: \"id\", prop1: \"foo\" }),\n\t\t\t);\n\t\t});\n\n\t\tit(\"for text segments\", () => {\n\t\t\tconst insertOp = client.insertTextLocal(0, \"abc\", { prop1: \"foo\" });\n\t\t\tassert(insertOp);\n\t\t\tclient.annotateRangeLocal(0, 3, { prop2: \"bar\" });\n\n\t\t\tconst otherClient = new TestClient();\n\t\t\totherClient.startOrUpdateCollaboration(\"other user\");\n\t\t\tconst regeneratedInsert = client.regeneratePendingOp(\n\t\t\t\tinsertOp,\n\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } = otherClient.getContainingSegment(0);\n\t\t\tassert(otherSegment !== undefined && TextSegment.is(otherSegment));\n\t\t\tassert.deepStrictEqual(otherSegment.properties, clone({ prop1: \"foo\" }));\n\t\t});\n\t});\n});\n\ndescribe(\"resetPendingSegmentsToOp.rebase\", () => {\n\tit(\"rebase with oustanding ops\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"0123456789\" }, \"A\", \"B\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst ops: [ISequencedDocumentMessage, SegmentGroup][] = Array.from({ length: 10 }).map(\n\t\t\t(_, i) => [\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.annotateRangeLocal(0, clients.A.getLength(), { prop: i }),\n\t\t\t\t\ti + 1,\n\t\t\t\t),\n\t\t\t\tclients.A.peekPendingSegmentGroups()!,\n\t\t\t],\n\t\t);\n\n\t\tops.push(\n\t\t\t...ops\n\t\t\t\t.splice(Math.floor(ops.length / 2))\n\t\t\t\t.map<[ISequencedDocumentMessage, SegmentGroup]>(([op, sg]) => [\n\t\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\t\tclients.A.regeneratePendingOp(op.contents as IMergeTreeOp, sg),\n\t\t\t\t\t\top.sequenceNumber,\n\t\t\t\t\t),\n\t\t\t\t\tclients.A.peekPendingSegmentGroups()!,\n\t\t\t\t]),\n\t\t);\n\n\t\tfor (const [op] of ops) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate();\n\t});\n});\n"]}
|
|
@@ -7,7 +7,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
7
7
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
8
|
};
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
const
|
|
10
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
11
11
|
const stochastic_test_utils_1 = require("@fluid-private/stochastic-test-utils");
|
|
12
12
|
const mergeTreeNodeWalk_js_1 = require("../mergeTreeNodeWalk.js");
|
|
13
13
|
const revertibles_js_1 = require("../revertibles.js");
|
|
@@ -28,14 +28,15 @@ describe("MergeTree.Client", () => {
|
|
|
28
28
|
(0, mergeTreeOperationRunner_js_1.doOverRanges)(defaultOptions, ({ minLength: minLen, concurrentOpsWithRevert, revertOps }) => {
|
|
29
29
|
for (const ackBeforeRevert of defaultOptions.ackBeforeRevert) {
|
|
30
30
|
it(`InitialOps: ${defaultOptions.initialOps} MinLen: ${minLen} ConcurrentOpsWithRevert: ${concurrentOpsWithRevert} RevertOps: ${revertOps} AckBeforeRevert: ${ackBeforeRevert}`, async () => {
|
|
31
|
-
const random = (0, stochastic_test_utils_1.makeRandom)(minLen, revertOps, [...ackBeforeRevert].reduce((pv, cv) => pv + cv.
|
|
31
|
+
const random = (0, stochastic_test_utils_1.makeRandom)(minLen, revertOps, [...ackBeforeRevert].reduce((pv, cv) => pv + (cv.codePointAt(0) ?? 0), 0), concurrentOpsWithRevert);
|
|
32
32
|
const clients = (0, testClientLogger_js_1.createClientsAtInitialState)({
|
|
33
33
|
initialState: "",
|
|
34
34
|
options: {},
|
|
35
35
|
}, "A", "B", "C");
|
|
36
36
|
let seq = 0;
|
|
37
37
|
for (let rnd = 0; rnd < defaultOptions.rounds; rnd++) {
|
|
38
|
-
|
|
38
|
+
for (const c of clients.all)
|
|
39
|
+
c.updateMinSeq(seq);
|
|
39
40
|
const logger = new testClientLogger_js_1.TestClientLogger(clients.all, `Round ${rnd}`);
|
|
40
41
|
{
|
|
41
42
|
// init with random values
|
|
@@ -80,8 +81,8 @@ describe("MergeTree.Client", () => {
|
|
|
80
81
|
(0, revertibles_js_1.revertMergeTreeDeltaRevertibles)(clientBDriver, clientB_Revertibles.splice(0));
|
|
81
82
|
seq = (0, mergeTreeOperationRunner_js_1.applyMessages)(seq, msgs.splice(0), clients.all, logger);
|
|
82
83
|
}
|
|
83
|
-
catch (
|
|
84
|
-
throw logger.addLogsToError(
|
|
84
|
+
catch (error) {
|
|
85
|
+
throw logger.addLogsToError(error);
|
|
85
86
|
}
|
|
86
87
|
logger.validate({
|
|
87
88
|
clear: true,
|
|
@@ -96,17 +97,17 @@ describe("MergeTree.Client", () => {
|
|
|
96
97
|
seq = (0, mergeTreeOperationRunner_js_1.applyMessages)(seq, msgs.splice(0), clients.all, logger);
|
|
97
98
|
(0, mergeTreeNodeWalk_js_1.walkAllChildSegments)(clients.B.mergeTree.root, (seg) => {
|
|
98
99
|
if (seg?.trackingCollection.empty === false) {
|
|
99
|
-
|
|
100
|
+
node_assert_1.default.notDeepStrictEqual(seg?.trackingCollection.empty, false, "there should be no left over tracking group");
|
|
100
101
|
}
|
|
101
102
|
if (seg?.localRefs?.empty === false) {
|
|
102
|
-
|
|
103
|
+
node_assert_1.default.notDeepStrictEqual(seg?.localRefs?.empty, false, "there should be no left over local references");
|
|
103
104
|
}
|
|
104
105
|
});
|
|
105
106
|
const mergeTreeWithRevert = clients.B.mergeTree;
|
|
106
|
-
|
|
107
|
+
node_assert_1.default.notDeepStrictEqual(mergeTreeWithRevert.__mergeTreeRevertible?.detachedReferences?.localRefs?.empty, false, "there should be no left over local references in detached references");
|
|
107
108
|
}
|
|
108
|
-
catch (
|
|
109
|
-
throw logger.addLogsToError(
|
|
109
|
+
catch (error) {
|
|
110
|
+
throw logger.addLogsToError(error);
|
|
110
111
|
}
|
|
111
112
|
logger.validate({
|
|
112
113
|
errorPrefix: "After Re-Revert (redo)",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revertibleFarm.spec.js","sourceRoot":"","sources":["../../src/test/revertibleFarm.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport assert from \"assert\";\n\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { ISegment, SegmentGroup } from \"../mergeTreeNodes.js\";\nimport {\n\tMergeTreeDeltaRevertible,\n\tMergeTreeWithRevert,\n\tappendToMergeTreeDeltaRevertibles,\n\trevertMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport {\n\tannotateRange,\n\tapplyMessages,\n\tdoOverRanges,\n\tgenerateOperationMessagesForClients,\n\tremoveRange,\n} from \"./mergeTreeOperationRunner.js\";\nimport { createRevertDriver } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\nconst defaultOptions = {\n\tinitialOps: 5,\n\tminLength: { min: 1, max: 256, growthFunc: (i) => i * i },\n\tconcurrentOpsWithRevert: { min: 0, max: 8 },\n\trevertOps: { min: 1, max: 16 },\n\tackBeforeRevert: [\"None\", \"Some\", \"All\"] as (\"None\" | \"Some\" | \"All\")[],\n\trounds: 10,\n\toperations: [removeRange, annotateRange],\n\tgrowthFunc: (i) => i * 2,\n};\n\ndescribe(\"MergeTree.Client\", () => {\n\tdoOverRanges(defaultOptions, ({ minLength: minLen, concurrentOpsWithRevert, revertOps }) => {\n\t\tfor (const ackBeforeRevert of defaultOptions.ackBeforeRevert) {\n\t\t\tit(`InitialOps: ${defaultOptions.initialOps} MinLen: ${minLen} ConcurrentOpsWithRevert: ${concurrentOpsWithRevert} RevertOps: ${revertOps} AckBeforeRevert: ${ackBeforeRevert}`, async () => {\n\t\t\t\tconst random = makeRandom(\n\t\t\t\t\tminLen,\n\t\t\t\t\trevertOps,\n\t\t\t\t\t[...ackBeforeRevert].reduce<number>((pv, cv) => pv + cv.charCodeAt(0), 0),\n\t\t\t\t\tconcurrentOpsWithRevert,\n\t\t\t\t);\n\n\t\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t\t{\n\t\t\t\t\t\tinitialState: \"\",\n\t\t\t\t\t\toptions: {},\n\t\t\t\t\t},\n\t\t\t\t\t\"A\",\n\t\t\t\t\t\"B\",\n\t\t\t\t\t\"C\",\n\t\t\t\t);\n\t\t\t\tlet seq = 0;\n\t\t\t\tfor (let rnd = 0; rnd < defaultOptions.rounds; rnd++) {\n\t\t\t\t\tclients.all.forEach((c) => c.updateMinSeq(seq));\n\n\t\t\t\t\tconst logger = new TestClientLogger(clients.all, `Round ${rnd}`);\n\t\t\t\t\t{\n\t\t\t\t\t\t// init with random values\n\t\t\t\t\t\tconst initialMsgs = generateOperationMessagesForClients(\n\t\t\t\t\t\t\trandom,\n\t\t\t\t\t\t\tseq,\n\t\t\t\t\t\t\tclients.all,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\tdefaultOptions.initialOps,\n\t\t\t\t\t\t\tminLen,\n\t\t\t\t\t\t\tdefaultOptions.operations,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tseq = applyMessages(seq, initialMsgs, clients.all, logger);\n\t\t\t\t\t}\n\n\t\t\t\t\t// cache the base text to ensure we get back to it after revert\n\t\t\t\t\tconst undoBaseText = logger.validate({\n\t\t\t\t\t\tclear: true,\n\t\t\t\t\t\terrorPrefix: \"After Initial Ops\",\n\t\t\t\t\t});\n\n\t\t\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\t\t\tconst deltaCallback = (op, delta) => {\n\t\t\t\t\t\tif (op.sequencedMessage === undefined) {\n\t\t\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tconst msgs: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][] = [];\n\t\t\t\t\t{\n\t\t\t\t\t\tclientBDriver.submitOpCallback = (op) =>\n\t\t\t\t\t\t\tmsgs.push([\n\t\t\t\t\t\t\t\tclients.B.makeOpMessage(op, undefined, undefined, undefined, seq),\n\t\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\t\t\tclients.B.peekPendingSegmentGroups()!,\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\tclients.B.on(\"delta\", deltaCallback);\n\t\t\t\t\t\tmsgs.push(\n\t\t\t\t\t\t\t...generateOperationMessagesForClients(\n\t\t\t\t\t\t\t\trandom,\n\t\t\t\t\t\t\t\tseq,\n\t\t\t\t\t\t\t\t[clients.A, clients.B],\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\trevertOps,\n\t\t\t\t\t\t\t\tminLen,\n\t\t\t\t\t\t\t\tdefaultOptions.operations,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (concurrentOpsWithRevert > 0) {\n\t\t\t\t\t\t// add modifications from another client\n\t\t\t\t\t\tmsgs.push(\n\t\t\t\t\t\t\t...generateOperationMessagesForClients(\n\t\t\t\t\t\t\t\trandom,\n\t\t\t\t\t\t\t\tseq,\n\t\t\t\t\t\t\t\t[clients.A, clients.C],\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\tconcurrentOpsWithRevert,\n\t\t\t\t\t\t\t\tminLen,\n\t\t\t\t\t\t\t\tdefaultOptions.operations,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet redoBaseText: string | undefined;\n\t\t\t\t\tif (ackBeforeRevert !== \"None\") {\n\t\t\t\t\t\tconst ackAll = ackBeforeRevert === \"All\";\n\t\t\t\t\t\tseq = applyMessages(\n\t\t\t\t\t\t\tseq,\n\t\t\t\t\t\t\tmsgs.splice(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tackAll ? msgs.length : random.integer(0, Math.floor(msgs.length / 2)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tclients.all,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (ackAll) {\n\t\t\t\t\t\t\tredoBaseText = logger.validate({ errorPrefix: \"Before Revert Ack\" });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\t\t\t\t\tseq = applyMessages(seq, msgs.splice(0), clients.all, logger);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tthrow logger.addLogsToError(e);\n\t\t\t\t\t}\n\t\t\t\t\tlogger.validate({\n\t\t\t\t\t\tclear: true,\n\t\t\t\t\t\tbaseText: concurrentOpsWithRevert === 0 ? undoBaseText : undefined,\n\t\t\t\t\t\terrorPrefix: \"After Revert (undo)\",\n\t\t\t\t\t});\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// reset the callback before the final revert\n\t\t\t\t\t\t// to avoid accruing any new detached references\n\t\t\t\t\t\tclients.B.off(\"delta\", deltaCallback);\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\t\t\t\t\tseq = applyMessages(seq, msgs.splice(0), clients.all, logger);\n\n\t\t\t\t\t\twalkAllChildSegments(clients.B.mergeTree.root, (seg: ISegment) => {\n\t\t\t\t\t\t\tif (seg?.trackingCollection.empty === false) {\n\t\t\t\t\t\t\t\tassert.notDeepStrictEqual(\n\t\t\t\t\t\t\t\t\tseg?.trackingCollection.empty,\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\t\"there should be no left over tracking group\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (seg?.localRefs?.empty === false) {\n\t\t\t\t\t\t\t\tassert.notDeepStrictEqual(\n\t\t\t\t\t\t\t\t\tseg?.localRefs?.empty,\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\t\"there should be no left over local references\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst mergeTreeWithRevert: Partial<MergeTreeWithRevert> = clients.B.mergeTree;\n\t\t\t\t\t\tassert.notDeepStrictEqual(\n\t\t\t\t\t\t\tmergeTreeWithRevert.__mergeTreeRevertible?.detachedReferences?.localRefs?.empty,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\"there should be no left over local references in detached references\",\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tthrow logger.addLogsToError(e);\n\t\t\t\t\t}\n\t\t\t\t\tlogger.validate({\n\t\t\t\t\t\terrorPrefix: \"After Re-Revert (redo)\",\n\t\t\t\t\t\tbaseText: redoBaseText,\n\t\t\t\t\t});\n\t\t\t\t\tlogger.dispose();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"revertibleFarm.spec.js","sourceRoot":"","sources":["../../src/test/revertibleFarm.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport assert from \"node:assert\";\n\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { ISegment, SegmentGroup } from \"../mergeTreeNodes.js\";\nimport {\n\tMergeTreeDeltaRevertible,\n\tMergeTreeWithRevert,\n\tappendToMergeTreeDeltaRevertibles,\n\trevertMergeTreeDeltaRevertibles,\n} from \"../revertibles.js\";\n\nimport {\n\tannotateRange,\n\tapplyMessages,\n\tdoOverRanges,\n\tgenerateOperationMessagesForClients,\n\tremoveRange,\n} from \"./mergeTreeOperationRunner.js\";\nimport { createRevertDriver } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\nconst defaultOptions = {\n\tinitialOps: 5,\n\tminLength: { min: 1, max: 256, growthFunc: (i): number => i * i },\n\tconcurrentOpsWithRevert: { min: 0, max: 8 },\n\trevertOps: { min: 1, max: 16 },\n\tackBeforeRevert: [\"None\", \"Some\", \"All\"] as (\"None\" | \"Some\" | \"All\")[],\n\trounds: 10,\n\toperations: [removeRange, annotateRange],\n\tgrowthFunc: (i): number => i * 2,\n};\n\ndescribe(\"MergeTree.Client\", () => {\n\tdoOverRanges(defaultOptions, ({ minLength: minLen, concurrentOpsWithRevert, revertOps }) => {\n\t\tfor (const ackBeforeRevert of defaultOptions.ackBeforeRevert) {\n\t\t\tit(`InitialOps: ${defaultOptions.initialOps} MinLen: ${minLen} ConcurrentOpsWithRevert: ${concurrentOpsWithRevert} RevertOps: ${revertOps} AckBeforeRevert: ${ackBeforeRevert}`, async () => {\n\t\t\t\tconst random = makeRandom(\n\t\t\t\t\tminLen,\n\t\t\t\t\trevertOps,\n\t\t\t\t\t[...ackBeforeRevert].reduce<number>((pv, cv) => pv + (cv.codePointAt(0) ?? 0), 0),\n\t\t\t\t\tconcurrentOpsWithRevert,\n\t\t\t\t);\n\n\t\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t\t{\n\t\t\t\t\t\tinitialState: \"\",\n\t\t\t\t\t\toptions: {},\n\t\t\t\t\t},\n\t\t\t\t\t\"A\",\n\t\t\t\t\t\"B\",\n\t\t\t\t\t\"C\",\n\t\t\t\t);\n\t\t\t\tlet seq = 0;\n\t\t\t\tfor (let rnd = 0; rnd < defaultOptions.rounds; rnd++) {\n\t\t\t\t\tfor (const c of clients.all) c.updateMinSeq(seq);\n\n\t\t\t\t\tconst logger = new TestClientLogger(clients.all, `Round ${rnd}`);\n\t\t\t\t\t{\n\t\t\t\t\t\t// init with random values\n\t\t\t\t\t\tconst initialMsgs = generateOperationMessagesForClients(\n\t\t\t\t\t\t\trandom,\n\t\t\t\t\t\t\tseq,\n\t\t\t\t\t\t\tclients.all,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\tdefaultOptions.initialOps,\n\t\t\t\t\t\t\tminLen,\n\t\t\t\t\t\t\tdefaultOptions.operations,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tseq = applyMessages(seq, initialMsgs, clients.all, logger);\n\t\t\t\t\t}\n\n\t\t\t\t\t// cache the base text to ensure we get back to it after revert\n\t\t\t\t\tconst undoBaseText = logger.validate({\n\t\t\t\t\t\tclear: true,\n\t\t\t\t\t\terrorPrefix: \"After Initial Ops\",\n\t\t\t\t\t});\n\n\t\t\t\t\tconst clientB_Revertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\t\t\tconst clientBDriver = createRevertDriver(clients.B);\n\t\t\t\t\tconst deltaCallback = (\n\t\t\t\t\t\top: IMergeTreeDeltaOpArgs,\n\t\t\t\t\t\tdelta: IMergeTreeDeltaCallbackArgs,\n\t\t\t\t\t): void => {\n\t\t\t\t\t\tif (op.sequencedMessage === undefined) {\n\t\t\t\t\t\t\tappendToMergeTreeDeltaRevertibles(delta, clientB_Revertibles);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tconst msgs: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][] = [];\n\t\t\t\t\t{\n\t\t\t\t\t\tclientBDriver.submitOpCallback = (op): number =>\n\t\t\t\t\t\t\tmsgs.push([\n\t\t\t\t\t\t\t\tclients.B.makeOpMessage(op, undefined, undefined, undefined, seq),\n\t\t\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\t\t\tclients.B.peekPendingSegmentGroups()!,\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\tclients.B.on(\"delta\", deltaCallback);\n\t\t\t\t\t\tmsgs.push(\n\t\t\t\t\t\t\t...generateOperationMessagesForClients(\n\t\t\t\t\t\t\t\trandom,\n\t\t\t\t\t\t\t\tseq,\n\t\t\t\t\t\t\t\t[clients.A, clients.B],\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\trevertOps,\n\t\t\t\t\t\t\t\tminLen,\n\t\t\t\t\t\t\t\tdefaultOptions.operations,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (concurrentOpsWithRevert > 0) {\n\t\t\t\t\t\t// add modifications from another client\n\t\t\t\t\t\tmsgs.push(\n\t\t\t\t\t\t\t...generateOperationMessagesForClients(\n\t\t\t\t\t\t\t\trandom,\n\t\t\t\t\t\t\t\tseq,\n\t\t\t\t\t\t\t\t[clients.A, clients.C],\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\tconcurrentOpsWithRevert,\n\t\t\t\t\t\t\t\tminLen,\n\t\t\t\t\t\t\t\tdefaultOptions.operations,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet redoBaseText: string | undefined;\n\t\t\t\t\tif (ackBeforeRevert !== \"None\") {\n\t\t\t\t\t\tconst ackAll = ackBeforeRevert === \"All\";\n\t\t\t\t\t\tseq = applyMessages(\n\t\t\t\t\t\t\tseq,\n\t\t\t\t\t\t\tmsgs.splice(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tackAll ? msgs.length : random.integer(0, Math.floor(msgs.length / 2)),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tclients.all,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (ackAll) {\n\t\t\t\t\t\t\tredoBaseText = logger.validate({ errorPrefix: \"Before Revert Ack\" });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\t\t\t\t\tseq = applyMessages(seq, msgs.splice(0), clients.all, logger);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthrow logger.addLogsToError(error);\n\t\t\t\t\t}\n\t\t\t\t\tlogger.validate({\n\t\t\t\t\t\tclear: true,\n\t\t\t\t\t\tbaseText: concurrentOpsWithRevert === 0 ? undoBaseText : undefined,\n\t\t\t\t\t\terrorPrefix: \"After Revert (undo)\",\n\t\t\t\t\t});\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// reset the callback before the final revert\n\t\t\t\t\t\t// to avoid accruing any new detached references\n\t\t\t\t\t\tclients.B.off(\"delta\", deltaCallback);\n\t\t\t\t\t\trevertMergeTreeDeltaRevertibles(clientBDriver, clientB_Revertibles.splice(0));\n\t\t\t\t\t\tseq = applyMessages(seq, msgs.splice(0), clients.all, logger);\n\n\t\t\t\t\t\twalkAllChildSegments(clients.B.mergeTree.root, (seg: ISegment) => {\n\t\t\t\t\t\t\tif (seg?.trackingCollection.empty === false) {\n\t\t\t\t\t\t\t\tassert.notDeepStrictEqual(\n\t\t\t\t\t\t\t\t\tseg?.trackingCollection.empty,\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\t\"there should be no left over tracking group\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (seg?.localRefs?.empty === false) {\n\t\t\t\t\t\t\t\tassert.notDeepStrictEqual(\n\t\t\t\t\t\t\t\t\tseg?.localRefs?.empty,\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\t\"there should be no left over local references\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst mergeTreeWithRevert: Partial<MergeTreeWithRevert> = clients.B.mergeTree;\n\t\t\t\t\t\tassert.notDeepStrictEqual(\n\t\t\t\t\t\t\tmergeTreeWithRevert.__mergeTreeRevertible?.detachedReferences?.localRefs?.empty,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\"there should be no left over local references in detached references\",\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthrow logger.addLogsToError(error);\n\t\t\t\t\t}\n\t\t\t\t\tlogger.validate({\n\t\t\t\t\t\terrorPrefix: \"After Re-Revert (redo)\",\n\t\t\t\t\t\tbaseText: redoBaseText,\n\t\t\t\t\t});\n\t\t\t\t\tlogger.dispose();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revertibles.spec.d.ts","sourceRoot":"","sources":["../../src/test/revertibles.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"revertibles.spec.d.ts","sourceRoot":"","sources":["../../src/test/revertibles.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAE1B,WAAW,EAAE,QAAQ,EACrB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,IAAI,GACb,MAAM,IAAI,CAeZ"}
|