@fluidframework/merge-tree 2.53.0 → 2.60.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/CHANGELOG.md +4 -0
- package/api-report/{merge-tree.legacy.alpha.api.md → merge-tree.legacy.beta.api.md} +62 -62
- package/dist/attributionCollection.d.ts +7 -12
- package/dist/attributionCollection.d.ts.map +1 -1
- package/dist/attributionCollection.js.map +1 -1
- package/dist/attributionPolicy.d.ts +1 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +11 -11
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/collections/index.d.ts +1 -1
- package/dist/collections/index.d.ts.map +1 -1
- package/dist/collections/index.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts +4 -4
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/index.d.ts +16 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/localReference.d.ts +6 -9
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +1 -2
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +9 -10
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts +12 -20
- package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/dist/mergeTreeDeltaCallback.js +1 -2
- package/dist/mergeTreeDeltaCallback.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts +1 -1
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +14 -21
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +4 -8
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.d.ts +6 -10
- package/dist/mergeTreeTracking.d.ts.map +1 -1
- package/dist/mergeTreeTracking.js +2 -4
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.d.ts +3 -3
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js.map +1 -1
- package/dist/ops.d.ts +17 -34
- package/dist/ops.d.ts.map +1 -1
- package/dist/ops.js +2 -4
- package/dist/ops.js.map +1 -1
- package/dist/partialLengths.d.ts +2 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js.map +1 -1
- package/dist/properties.d.ts +2 -4
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js.map +1 -1
- package/dist/referencePositions.d.ts +6 -9
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +2 -4
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.d.ts +11 -16
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +3 -6
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts +1 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentInfos.d.ts +1 -1
- package/dist/segmentInfos.d.ts.map +1 -1
- package/dist/segmentInfos.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +1 -1
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/sequencePlace.d.ts +4 -8
- package/dist/sequencePlace.d.ts.map +1 -1
- package/dist/sequencePlace.js +2 -4
- package/dist/sequencePlace.js.map +1 -1
- package/dist/snapshotChunks.d.ts +6 -6
- package/dist/snapshotChunks.d.ts.map +1 -1
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.d.ts +6 -6
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts +8 -8
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +6 -6
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts +2 -2
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/test/Removal.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.spec.js.map +1 -1
- package/dist/test/attributionPolicy.spec.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts +1 -1
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.apis.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.d.ts +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.d.ts +1 -1
- package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.conflictFarm.spec.d.ts +1 -1
- package/dist/test/client.conflictFarm.spec.d.ts.map +1 -1
- package/dist/test/client.conflictFarm.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.obliterateFarm.spec.d.ts +1 -1
- package/dist/test/client.obliterateFarm.spec.d.ts.map +1 -1
- package/dist/test/client.obliterateFarm.spec.js.map +1 -1
- package/dist/test/client.rebasePosition.spec.js.map +1 -1
- package/dist/test/client.reconnectFarm.spec.d.ts +1 -1
- package/dist/test/client.reconnectFarm.spec.d.ts.map +1 -1
- package/dist/test/client.reconnectFarm.spec.js.map +1 -1
- package/dist/test/client.replay.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/client.rollbackFarm.spec.js.map +1 -1
- package/dist/test/clientTestHelper.d.ts +1 -1
- package/dist/test/clientTestHelper.d.ts.map +1 -1
- package/dist/test/clientTestHelper.js.map +1 -1
- package/dist/test/index.d.ts +4 -4
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts +5 -5
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/dist/test/obliterateOperations.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js.map +1 -1
- package/dist/test/revertibles.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts +4 -4
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/snapshotlegacy.spec.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +9 -9
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts +2 -2
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testSerializer.d.ts +2 -2
- package/dist/test/testSerializer.d.ts.map +1 -1
- package/dist/test/testSerializer.js.map +1 -1
- package/dist/test/testServer.d.ts +2 -2
- package/dist/test/testServer.d.ts.map +1 -1
- package/dist/test/testServer.js.map +1 -1
- package/dist/test/testUtils.d.ts +3 -3
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts +1 -1
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js.map +1 -1
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/textSegment.d.ts +4 -6
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js +1 -2
- package/dist/textSegment.js.map +1 -1
- package/dist/zamboni.d.ts +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js.map +1 -1
- package/lib/attributionCollection.d.ts +7 -12
- package/lib/attributionCollection.d.ts.map +1 -1
- package/lib/attributionCollection.js.map +1 -1
- package/lib/attributionPolicy.d.ts +1 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +11 -11
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js.map +1 -1
- package/lib/collections/index.d.ts +1 -1
- package/lib/collections/index.d.ts.map +1 -1
- package/lib/collections/index.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts +4 -4
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/index.d.ts +16 -16
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/localReference.d.ts +6 -9
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +1 -2
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +9 -10
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts +12 -20
- package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/lib/mergeTreeDeltaCallback.js +1 -2
- package/lib/mergeTreeDeltaCallback.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts +1 -1
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +14 -21
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +4 -8
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/mergeTreeTracking.d.ts +6 -10
- package/lib/mergeTreeTracking.d.ts.map +1 -1
- package/lib/mergeTreeTracking.js +2 -4
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/opBuilder.d.ts +3 -3
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js.map +1 -1
- package/lib/ops.d.ts +17 -34
- package/lib/ops.d.ts.map +1 -1
- package/lib/ops.js +2 -4
- package/lib/ops.js.map +1 -1
- package/lib/partialLengths.d.ts +2 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js.map +1 -1
- package/lib/properties.d.ts +2 -4
- package/lib/properties.d.ts.map +1 -1
- package/lib/properties.js.map +1 -1
- package/lib/referencePositions.d.ts +6 -9
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +2 -4
- package/lib/referencePositions.js.map +1 -1
- package/lib/revertibles.d.ts +11 -16
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +4 -7
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts +1 -1
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentInfos.d.ts +1 -1
- package/lib/segmentInfos.d.ts.map +1 -1
- package/lib/segmentInfos.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts +1 -1
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/sequencePlace.d.ts +4 -8
- package/lib/sequencePlace.d.ts.map +1 -1
- package/lib/sequencePlace.js +2 -4
- package/lib/sequencePlace.js.map +1 -1
- package/lib/snapshotChunks.d.ts +6 -6
- package/lib/snapshotChunks.d.ts.map +1 -1
- package/lib/snapshotChunks.js.map +1 -1
- package/lib/snapshotLoader.d.ts +6 -6
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts +8 -8
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts +6 -6
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts +2 -2
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/test/Removal.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.spec.js.map +1 -1
- package/lib/test/attributionPolicy.spec.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts +1 -1
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.apis.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.d.ts +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.d.ts +1 -1
- package/lib/test/client.attributionFarm.spec.d.ts.map +1 -1
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.conflictFarm.spec.d.ts +1 -1
- package/lib/test/client.conflictFarm.spec.d.ts.map +1 -1
- package/lib/test/client.conflictFarm.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.obliterateFarm.spec.d.ts +1 -1
- package/lib/test/client.obliterateFarm.spec.d.ts.map +1 -1
- package/lib/test/client.obliterateFarm.spec.js.map +1 -1
- package/lib/test/client.rebasePosition.spec.js.map +1 -1
- package/lib/test/client.reconnectFarm.spec.d.ts +1 -1
- package/lib/test/client.reconnectFarm.spec.d.ts.map +1 -1
- package/lib/test/client.reconnectFarm.spec.js.map +1 -1
- package/lib/test/client.replay.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/client.rollbackFarm.spec.js.map +1 -1
- package/lib/test/clientTestHelper.d.ts +1 -1
- package/lib/test/clientTestHelper.d.ts.map +1 -1
- package/lib/test/clientTestHelper.js.map +1 -1
- package/lib/test/index.d.ts +4 -4
- package/lib/test/index.d.ts.map +1 -1
- package/lib/test/index.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js.map +1 -1
- package/lib/test/mergeTree.zamboni.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts +5 -5
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/lib/test/obliterateOperations.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/revertibleFarm.spec.js.map +1 -1
- package/lib/test/revertibles.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts +4 -4
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/snapshotlegacy.spec.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +9 -9
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts +2 -2
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testSerializer.d.ts +2 -2
- package/lib/test/testSerializer.d.ts.map +1 -1
- package/lib/test/testSerializer.js.map +1 -1
- package/lib/test/testServer.d.ts +2 -2
- package/lib/test/testServer.d.ts.map +1 -1
- package/lib/test/testServer.js.map +1 -1
- package/lib/test/testUtils.d.ts +3 -3
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts +1 -1
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js.map +1 -1
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/textSegment.d.ts +4 -6
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js +1 -2
- package/lib/textSegment.js.map +1 -1
- package/lib/zamboni.d.ts +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js.map +1 -1
- package/package.json +17 -17
- package/src/attributionCollection.ts +7 -12
- package/src/attributionPolicy.ts +8 -8
- package/src/client.ts +24 -24
- package/src/collections/index.ts +11 -11
- package/src/endOfTreeSegment.ts +4 -8
- package/src/index.ts +54 -54
- package/src/localReference.ts +8 -11
- package/src/mergeTree.ts +19 -20
- package/src/mergeTreeDeltaCallback.ts +12 -20
- package/src/mergeTreeNodeWalk.ts +1 -1
- package/src/mergeTreeNodes.ts +15 -22
- package/src/mergeTreeTracking.ts +6 -10
- package/src/opBuilder.ts +8 -8
- package/src/ops.ts +17 -34
- package/src/partialLengths.ts +4 -4
- package/src/properties.ts +2 -4
- package/src/referencePositions.ts +6 -9
- package/src/revertibles.ts +15 -16
- package/src/segmentGroupCollection.ts +1 -1
- package/src/segmentInfos.ts +2 -2
- package/src/segmentPropertiesManager.ts +1 -1
- package/src/sequencePlace.ts +4 -8
- package/src/snapshotChunks.ts +6 -6
- package/src/snapshotLoader.ts +11 -11
- package/src/snapshotV1.ts +13 -13
- package/src/snapshotlegacy.ts +8 -8
- package/src/sortedSegmentSet.ts +2 -2
- package/src/textSegment.ts +4 -6
- package/src/zamboni.ts +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeTreeOperationRunner.js","sourceRoot":"","sources":["../../src/test/mergeTreeOperationRunner.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\";\nimport * as fs from \"node:fs\";\n\nimport { IRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { ISegmentPrivate, SegmentGroup } from \"../mergeTreeNodes.js\";\nimport { IMergeTreeOp, MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { toRemovalInfo } from \"../segmentInfos.js\";\nimport { Side } from \"../sequencePlace.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { _dirname } from \"./dirname.cjs\";\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger } from \"./testClientLogger.js\";\n\nexport type TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => IMergeTreeOp[] | IMergeTreeOp | undefined;\n\nexport const removeRange: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n) => client.removeRangeLocal(opStart, opEnd);\n\nexport const obliterateRange: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n) => client.obliterateRangeLocal(opStart, opEnd);\n\nexport const obliterateRangeSided: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tlet startSide: Side;\n\tlet endSide: Side;\n\n\tconst oblEnd = random.integer(opStart, client.getLength() - 1);\n\t// TODO: to create zero length obliterate ops, change '<=' to '<'.\n\t// Doing so may cause different failures than those without zero length.\n\t// AB#19930\n\tif (oblEnd - opStart <= 1) {\n\t\tstartSide = Side.Before;\n\t\tendSide = Side.After;\n\t} else {\n\t\tstartSide = random.pick([Side.Before, Side.After]);\n\t\tendSide = random.pick([Side.Before, Side.After]);\n\t}\n\n\tconst start = { pos: opStart, side: startSide };\n\tconst end = { pos: oblEnd, side: endSide };\n\treturn client.obliterateRangeLocal(start, end);\n};\n\nexport const annotateRange: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tif (random.bool()) {\n\t\treturn client.annotateRangeLocal(opStart, opEnd, {\n\t\t\t[random.integer(1, 5)]: client.longClientId,\n\t\t});\n\t} else {\n\t\tconst max = random.pick([undefined, random.integer(-10, 100)]);\n\t\tconst min = random.pick([undefined, random.integer(-100, 10)]);\n\t\treturn client.annotateAdjustRangeLocal(opStart, opEnd, {\n\t\t\t[random.integer(0, 2).toString()]: {\n\t\t\t\tdelta: random.integer(-5, 5),\n\t\t\t\tmin: (min ?? max ?? 0) > (max ?? 0) ? undefined : min,\n\t\t\t\tmax,\n\t\t\t},\n\t\t});\n\t}\n};\n\nexport const insertAtRefPos: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tconst segs: ISegmentPrivate[] = [];\n\t// gather all the segments at the pos, including removed segments\n\twalkAllChildSegments(client.mergeTree.root, (seg) => {\n\t\tconst pos = client.getPosition(seg);\n\t\tif (pos >= opStart) {\n\t\t\tif (pos <= opStart) {\n\t\t\t\tsegs.push(seg);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t});\n\tif (segs.length > 0) {\n\t\tconst text = client.longClientId!.repeat(random.integer(1, 3));\n\t\tconst seg = random.pick(segs);\n\t\tconst removed = toRemovalInfo(seg);\n\t\tconst lref = client.createLocalReferencePosition(\n\t\t\tseg,\n\t\t\tremoved ? 0 : random.integer(0, seg.cachedLength - 1),\n\t\t\tremoved\n\t\t\t\t? ReferenceType.SlideOnRemove\n\t\t\t\t: random.pick([\n\t\t\t\t\t\tReferenceType.Simple,\n\t\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\t\tReferenceType.Transient,\n\t\t\t\t\t]),\n\t\t\tundefined,\n\t\t);\n\n\t\treturn client.insertAtReferencePositionLocal(lref, TextSegment.make(text));\n\t}\n};\n\nexport const insert: TestOperation = (\n\tclient: TestClient,\n\t_start: number,\n\t_end: number,\n\trandom: IRandom,\n) => {\n\t// Note: the _start param is generated using exclusive range. This provides more coverage by allowing\n\t// insertion at the end.\n\tconst start = random.integer(0, client.getLength());\n\tconst text = client.longClientId!.repeat(random.integer(1, 3));\n\treturn client.insertTextLocal(start, text);\n};\n\nconst generateInsert = (client: TestClient, random: IRandom): IMergeTreeOp | undefined => {\n\tconst len = client.getLength();\n\tconst text = client.longClientId!.repeat(random.integer(1, 3));\n\treturn client.insertTextLocal(random.integer(0, len), text);\n};\n\nexport interface IConfigRange {\n\tmin: number;\n\tmax: number;\n\tgrowthFunc?: (input: number) => number;\n}\n\nexport function doOverRange(\n\trange: IConfigRange,\n\tdefaultGrowthFunc: (input: number) => number,\n\tdoAction: (current: number) => void,\n): void {\n\tlet lastCurrent = Number.NaN;\n\tfor (\n\t\tlet current = range.min;\n\t\tcurrent <= range.max;\n\t\tcurrent = (range.growthFunc ?? defaultGrowthFunc)(current)\n\t) {\n\t\t// let growth funcs be simple\n\t\t// especially around 0 and 1\n\t\t// if the value didn't change,\n\t\t// just increment it\n\t\tif (current === lastCurrent) {\n\t\t\tcurrent++;\n\t\t}\n\t\tif (current <= range.max) {\n\t\t\tlastCurrent = current;\n\t\t\tdoAction(current);\n\t\t}\n\t}\n}\n\nexport function resolveRange(\n\trange: IConfigRange,\n\tdefaultGrowthFunc: (input: number) => number,\n): number[] {\n\tconst results: number[] = [];\n\tdoOverRange(range, range.growthFunc ?? defaultGrowthFunc, (num) => {\n\t\tresults.push(num);\n\t});\n\treturn results;\n}\n\nexport function resolveRanges<T extends object>(\n\tranges: T,\n\tdefaultGrowthFunc: (input: number) => number,\n): ResolvedRanges<T> {\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst resolvedRanges: ResolvedRanges<T> = {} as ResolvedRanges<T>;\n\tfor (const [key, value] of Object.entries(ranges)) {\n\t\tif (isConfigRange(value)) {\n\t\t\tresolvedRanges[key] = resolveRange(value, defaultGrowthFunc);\n\t\t}\n\t}\n\treturn resolvedRanges;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isConfigRange(t: any): t is IConfigRange {\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\treturn typeof t === \"object\" && typeof t.min === \"number\" && typeof t.max === \"number\";\n}\n\ntype ReplaceRangeWith<T, TReplace> = T extends { min: number; max: number } ? TReplace : never;\n\ntype RangePropertyNames<T> = {\n\t[K in keyof T]-?: T[K] extends IConfigRange ? K : never;\n}[keyof T];\n\ntype PickFromRanges<T> = {\n\t[K in RangePropertyNames<T>]: ReplaceRangeWith<T[K], number>;\n};\n\ntype ResolvedRanges<T> = {\n\t[K in RangePropertyNames<T>]: ReplaceRangeWith<T[K], number[]>;\n};\n\ninterface ProvidesGrowthFunc {\n\tgrowthFunc: (input: number) => number;\n}\n\nexport function doOverRanges<T extends ProvidesGrowthFunc>(\n\tranges: T,\n\tdoAction: (selection: PickFromRanges<T>, description: string) => void,\n): void {\n\tconst rangeEntries: [string, IConfigRange][] = [];\n\tfor (const [key, value] of Object.entries(ranges)) {\n\t\tif (isConfigRange(value)) {\n\t\t\trangeEntries.push([key, value]);\n\t\t}\n\t}\n\n\tconst doOverRangesHelper = (selections: [string, number][]): void => {\n\t\tif (selections.length === rangeEntries.length) {\n\t\t\tconst selectionsObj = {};\n\t\t\tfor (const [key, value] of selections) {\n\t\t\t\tselectionsObj[key] = value;\n\t\t\t}\n\t\t\tconst description = selections.map(([key, value]) => `${key}:${value}`).join(\"_\");\n\t\t\tdoAction(selectionsObj as PickFromRanges<T>, description);\n\t\t} else {\n\t\t\tconst [key, value] = rangeEntries[selections.length];\n\t\t\tdoOverRange(value, value.growthFunc ?? ranges.growthFunc, (selection) => {\n\t\t\t\tselections.push([key, selection]);\n\t\t\t\tdoOverRangesHelper(selections);\n\t\t\t\tselections.pop();\n\t\t\t});\n\t\t}\n\t};\n\n\tdoOverRangesHelper([]);\n}\n\nexport interface IMergeTreeOperationRunnerConfig {\n\treadonly rounds: number;\n\treadonly opsPerRoundRange: IConfigRange;\n\treadonly incrementalLog?: boolean;\n\treadonly operations: readonly TestOperation[];\n\treadonly applyOpDuringGeneration?: boolean;\n\tgrowthFunc(input: number): number;\n\tresultsFilePostfix?: string;\n\tinsertText?: (client: TestClient, random: IRandom) => IMergeTreeOp | undefined;\n\tupdateEndpoints?: (client: TestClient, random: IRandom) => { start: number; end: number };\n}\n\nexport interface ReplayGroup {\n\tmsgs: ISequencedDocumentMessage[];\n\tinitialText: string;\n\tresultText: string;\n\tseq: number;\n}\n\nexport const replayResultsPath = `${_dirname}/../../src/test/results`;\n\nexport function runMergeTreeOperationRunner(\n\trandom: IRandom,\n\tstartingSeq: number,\n\tclients: readonly TestClient[],\n\tminLength: number,\n\tconfig: IMergeTreeOperationRunnerConfig,\n\tapply: ApplyMessagesFn = applyMessages,\n): number {\n\tlet seq = startingSeq;\n\tconst results: ReplayGroup[] = [];\n\n\tlet fakeTime = 1725916319097;\n\n\tdoOverRange(config.opsPerRoundRange, config.growthFunc, (opsPerRound) => {\n\t\tif (config.incrementalLog) {\n\t\t\tconsole.log(\n\t\t\t\t`MinLength: ${minLength} Clients: ${clients.length} Ops: ${opsPerRound} Seq: ${seq}`,\n\t\t\t);\n\t\t}\n\t\tfor (let round = 0; round < config.rounds; round++) {\n\t\t\tconst initialText = clients[0].getText();\n\t\t\tconst logger = new TestClientLogger(\n\t\t\t\tclients,\n\t\t\t\t`Clients: ${clients.length} Ops: ${opsPerRound} Round: ${round}`,\n\t\t\t);\n\t\t\tconst messageData = generateOperationMessagesForClients(\n\t\t\t\trandom,\n\t\t\t\tseq,\n\t\t\t\tclients,\n\t\t\t\tlogger,\n\t\t\t\topsPerRound,\n\t\t\t\tminLength,\n\t\t\t\tconfig.operations,\n\t\t\t\tconfig.applyOpDuringGeneration,\n\t\t\t\tconfig.insertText,\n\t\t\t);\n\t\t\tseq = apply(messageData[0][0].sequenceNumber - 1, messageData, clients, logger, random);\n\t\t\tconst resultText = logger.validate();\n\t\t\tresults.push({\n\t\t\t\tinitialText,\n\t\t\t\tresultText,\n\t\t\t\tmsgs: messageData.map((md) => ({ ...md[0], timestamp: fakeTime++ })),\n\t\t\t\tseq,\n\t\t\t});\n\t\t\tlogger.dispose();\n\t\t}\n\t});\n\n\tif (config.resultsFilePostfix !== undefined) {\n\t\tconst resultsFilePath = `${replayResultsPath}/len_${minLength}-clients_${clients.length}-${config.resultsFilePostfix}`;\n\t\tfs.writeFileSync(resultsFilePath, JSON.stringify(results, undefined, \"\\t\"));\n\t}\n\n\treturn seq;\n}\n\nexport function generateOperationMessagesForClients(\n\trandom: IRandom,\n\tstartingSeq: number,\n\tclients: readonly TestClient[],\n\tlogger: TestClientLogger,\n\topsPerRound: number,\n\tminLength: number,\n\toperations: readonly TestOperation[],\n\tapplyOpDuringGeneration?: boolean,\n\tinsertText?: (client: TestClient, random: IRandom) => IMergeTreeOp | undefined,\n): [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][] {\n\tconst minimumSequenceNumber = startingSeq;\n\tlet runningSeq = startingSeq;\n\tconst messages: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][] = [];\n\n\tfor (let i = 0; i < opsPerRound; i++) {\n\t\t// pick a client greater than 0, client 0 only applies remote ops\n\t\t// and is our baseline\n\t\tconst client = clients[random.integer(1, clients.length - 1)];\n\n\t\tif (applyOpDuringGeneration === true && messages.length > 0 && random.bool()) {\n\t\t\tconst toApply = messages\n\t\t\t\t.filter(([msg]) => msg.sequenceNumber > client.getCollabWindow().currentSeq)\n\t\t\t\t.slice(0, random.integer(1, 3));\n\t\t\tapplyMessages(toApply[0][0].sequenceNumber - 1, toApply, [client], logger);\n\t\t}\n\n\t\tconst len = client.getLength();\n\t\tconst sg = client.peekPendingSegmentGroups();\n\t\tlet opOrOps: IMergeTreeOp[] | IMergeTreeOp | undefined;\n\t\tif (len === 0 || len < minLength) {\n\t\t\topOrOps =\n\t\t\t\tinsertText === undefined ? generateInsert(client, random) : insertText(client, random);\n\t\t} else {\n\t\t\tlet opIndex = random.integer(0, operations.length - 1);\n\t\t\tconst start = random.integer(0, len - 1);\n\t\t\tconst end = random.integer(start + 1, len);\n\n\t\t\tfor (let y = 0; y < operations.length && opOrOps === undefined; y++) {\n\t\t\t\topOrOps = operations[opIndex](client, start, end, random);\n\t\t\t\topIndex++;\n\t\t\t\topIndex %= operations.length;\n\t\t\t}\n\t\t}\n\t\tif (opOrOps !== undefined) {\n\t\t\t// Pre-check to avoid logger.toString() in the string template\n\t\t\tif (sg === client.peekPendingSegmentGroups()) {\n\t\t\t\tassert.notEqual(\n\t\t\t\t\tsg,\n\t\t\t\t\tclient.peekPendingSegmentGroups(),\n\t\t\t\t\t`op created but segment group not enqueued.${logger}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst ops = Array.isArray(opOrOps) ? opOrOps : [opOrOps];\n\t\t\tconst totalIndividualOps = ops\n\t\t\t\t.map((o) => (o.type === MergeTreeDeltaType.GROUP ? o.ops.length : 1))\n\t\t\t\t.reduce((a, b) => a + b, 0);\n\t\t\tlet allSegmentGroups = client.peekPendingSegmentGroups(totalIndividualOps)!;\n\t\t\tif (!Array.isArray(allSegmentGroups)) {\n\t\t\t\tallSegmentGroups = [allSegmentGroups];\n\t\t\t}\n\t\t\tassert(Array.isArray(allSegmentGroups), \"Expected array of segment groups\");\n\t\t\tfor (const op of ops) {\n\t\t\t\tconst message = client.makeOpMessage(op, ++runningSeq);\n\t\t\t\tmessage.minimumSequenceNumber = minimumSequenceNumber;\n\t\t\t\tconst segmentGroups = allSegmentGroups.splice(\n\t\t\t\t\t0,\n\t\t\t\t\top.type === MergeTreeDeltaType.GROUP ? op.ops.length : 1,\n\t\t\t\t);\n\t\t\t\tmessages.push([\n\t\t\t\t\tmessage,\n\t\t\t\t\top.type === MergeTreeDeltaType.GROUP ? segmentGroups : segmentGroups[0],\n\t\t\t\t]);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst maxProcessedSeq = Math.max(...clients.map((c) => c.getCollabWindow().currentSeq));\n\tif (messages.length > 0) {\n\t\tconst index = messages.findIndex(([msg]) => msg.sequenceNumber === maxProcessedSeq);\n\t\tif (index !== -1) {\n\t\t\tconst apply = messages.splice(0, index + 1);\n\t\t\tapplyMessages(apply[0][0].sequenceNumber - 1, apply, clients, logger);\n\t\t}\n\t}\n\n\treturn messages;\n}\n\nexport function generateClientNames(): string[] {\n\tconst clientNames: string[] = [];\n\tfunction addClientNames(startChar: string, count: number): void {\n\t\tconst startCode = startChar.codePointAt(0);\n\t\tif (startCode === undefined) {\n\t\t\tthrow new Error(\"startCode must be a single character\");\n\t\t}\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tclientNames.push(String.fromCodePoint(startCode + i));\n\t\t}\n\t}\n\n\taddClientNames(\"A\", 26);\n\taddClientNames(\"a\", 26);\n\taddClientNames(\"0\", 17);\n\n\treturn clientNames;\n}\n\ntype ApplyMessagesFn = (\n\tstartingSeq: number,\n\tmessageData: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][],\n\tclients: readonly TestClient[],\n\tlogger: TestClientLogger,\n\trandom: IRandom,\n) => number;\n\nexport function applyMessages(\n\tstartingSeq: number,\n\tmessageData: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][],\n\tclients: readonly TestClient[],\n\tlogger: TestClientLogger,\n): number {\n\tlet seq = startingSeq;\n\ttry {\n\t\t// log and apply all the ops created in the round\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\tfor (let i = 0; i < messageData.length; i++) {\n\t\t\tconst [message] = messageData[i];\n\t\t\tmessage.sequenceNumber = ++seq;\n\t\t\tfor (const c of clients) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < message.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(message);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tthrow logger.addLogsToError(error);\n\t}\n\treturn seq;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mergeTreeOperationRunner.js","sourceRoot":"","sources":["../../src/test/mergeTreeOperationRunner.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\";\nimport * as fs from \"node:fs\";\n\nimport type { IRandom } from \"@fluid-private/stochastic-test-utils\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport type { ISegmentPrivate, SegmentGroup } from \"../mergeTreeNodes.js\";\nimport { type IMergeTreeOp, MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { toRemovalInfo } from \"../segmentInfos.js\";\nimport { Side } from \"../sequencePlace.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { _dirname } from \"./dirname.cjs\";\nimport type { TestClient } from \"./testClient.js\";\nimport { TestClientLogger } from \"./testClientLogger.js\";\n\nexport type TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => IMergeTreeOp[] | IMergeTreeOp | undefined;\n\nexport const removeRange: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n) => client.removeRangeLocal(opStart, opEnd);\n\nexport const obliterateRange: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n) => client.obliterateRangeLocal(opStart, opEnd);\n\nexport const obliterateRangeSided: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tlet startSide: Side;\n\tlet endSide: Side;\n\n\tconst oblEnd = random.integer(opStart, client.getLength() - 1);\n\t// TODO: to create zero length obliterate ops, change '<=' to '<'.\n\t// Doing so may cause different failures than those without zero length.\n\t// AB#19930\n\tif (oblEnd - opStart <= 1) {\n\t\tstartSide = Side.Before;\n\t\tendSide = Side.After;\n\t} else {\n\t\tstartSide = random.pick([Side.Before, Side.After]);\n\t\tendSide = random.pick([Side.Before, Side.After]);\n\t}\n\n\tconst start = { pos: opStart, side: startSide };\n\tconst end = { pos: oblEnd, side: endSide };\n\treturn client.obliterateRangeLocal(start, end);\n};\n\nexport const annotateRange: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tif (random.bool()) {\n\t\treturn client.annotateRangeLocal(opStart, opEnd, {\n\t\t\t[random.integer(1, 5)]: client.longClientId,\n\t\t});\n\t} else {\n\t\tconst max = random.pick([undefined, random.integer(-10, 100)]);\n\t\tconst min = random.pick([undefined, random.integer(-100, 10)]);\n\t\treturn client.annotateAdjustRangeLocal(opStart, opEnd, {\n\t\t\t[random.integer(0, 2).toString()]: {\n\t\t\t\tdelta: random.integer(-5, 5),\n\t\t\t\tmin: (min ?? max ?? 0) > (max ?? 0) ? undefined : min,\n\t\t\t\tmax,\n\t\t\t},\n\t\t});\n\t}\n};\n\nexport const insertAtRefPos: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tconst segs: ISegmentPrivate[] = [];\n\t// gather all the segments at the pos, including removed segments\n\twalkAllChildSegments(client.mergeTree.root, (seg) => {\n\t\tconst pos = client.getPosition(seg);\n\t\tif (pos >= opStart) {\n\t\t\tif (pos <= opStart) {\n\t\t\t\tsegs.push(seg);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t});\n\tif (segs.length > 0) {\n\t\tconst text = client.longClientId!.repeat(random.integer(1, 3));\n\t\tconst seg = random.pick(segs);\n\t\tconst removed = toRemovalInfo(seg);\n\t\tconst lref = client.createLocalReferencePosition(\n\t\t\tseg,\n\t\t\tremoved ? 0 : random.integer(0, seg.cachedLength - 1),\n\t\t\tremoved\n\t\t\t\t? ReferenceType.SlideOnRemove\n\t\t\t\t: random.pick([\n\t\t\t\t\t\tReferenceType.Simple,\n\t\t\t\t\t\tReferenceType.SlideOnRemove,\n\t\t\t\t\t\tReferenceType.Transient,\n\t\t\t\t\t]),\n\t\t\tundefined,\n\t\t);\n\n\t\treturn client.insertAtReferencePositionLocal(lref, TextSegment.make(text));\n\t}\n};\n\nexport const insert: TestOperation = (\n\tclient: TestClient,\n\t_start: number,\n\t_end: number,\n\trandom: IRandom,\n) => {\n\t// Note: the _start param is generated using exclusive range. This provides more coverage by allowing\n\t// insertion at the end.\n\tconst start = random.integer(0, client.getLength());\n\tconst text = client.longClientId!.repeat(random.integer(1, 3));\n\treturn client.insertTextLocal(start, text);\n};\n\nconst generateInsert = (client: TestClient, random: IRandom): IMergeTreeOp | undefined => {\n\tconst len = client.getLength();\n\tconst text = client.longClientId!.repeat(random.integer(1, 3));\n\treturn client.insertTextLocal(random.integer(0, len), text);\n};\n\nexport interface IConfigRange {\n\tmin: number;\n\tmax: number;\n\tgrowthFunc?: (input: number) => number;\n}\n\nexport function doOverRange(\n\trange: IConfigRange,\n\tdefaultGrowthFunc: (input: number) => number,\n\tdoAction: (current: number) => void,\n): void {\n\tlet lastCurrent = Number.NaN;\n\tfor (\n\t\tlet current = range.min;\n\t\tcurrent <= range.max;\n\t\tcurrent = (range.growthFunc ?? defaultGrowthFunc)(current)\n\t) {\n\t\t// let growth funcs be simple\n\t\t// especially around 0 and 1\n\t\t// if the value didn't change,\n\t\t// just increment it\n\t\tif (current === lastCurrent) {\n\t\t\tcurrent++;\n\t\t}\n\t\tif (current <= range.max) {\n\t\t\tlastCurrent = current;\n\t\t\tdoAction(current);\n\t\t}\n\t}\n}\n\nexport function resolveRange(\n\trange: IConfigRange,\n\tdefaultGrowthFunc: (input: number) => number,\n): number[] {\n\tconst results: number[] = [];\n\tdoOverRange(range, range.growthFunc ?? defaultGrowthFunc, (num) => {\n\t\tresults.push(num);\n\t});\n\treturn results;\n}\n\nexport function resolveRanges<T extends object>(\n\tranges: T,\n\tdefaultGrowthFunc: (input: number) => number,\n): ResolvedRanges<T> {\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst resolvedRanges: ResolvedRanges<T> = {} as ResolvedRanges<T>;\n\tfor (const [key, value] of Object.entries(ranges)) {\n\t\tif (isConfigRange(value)) {\n\t\t\tresolvedRanges[key] = resolveRange(value, defaultGrowthFunc);\n\t\t}\n\t}\n\treturn resolvedRanges;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isConfigRange(t: any): t is IConfigRange {\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\treturn typeof t === \"object\" && typeof t.min === \"number\" && typeof t.max === \"number\";\n}\n\ntype ReplaceRangeWith<T, TReplace> = T extends { min: number; max: number } ? TReplace : never;\n\ntype RangePropertyNames<T> = {\n\t[K in keyof T]-?: T[K] extends IConfigRange ? K : never;\n}[keyof T];\n\ntype PickFromRanges<T> = {\n\t[K in RangePropertyNames<T>]: ReplaceRangeWith<T[K], number>;\n};\n\ntype ResolvedRanges<T> = {\n\t[K in RangePropertyNames<T>]: ReplaceRangeWith<T[K], number[]>;\n};\n\ninterface ProvidesGrowthFunc {\n\tgrowthFunc: (input: number) => number;\n}\n\nexport function doOverRanges<T extends ProvidesGrowthFunc>(\n\tranges: T,\n\tdoAction: (selection: PickFromRanges<T>, description: string) => void,\n): void {\n\tconst rangeEntries: [string, IConfigRange][] = [];\n\tfor (const [key, value] of Object.entries(ranges)) {\n\t\tif (isConfigRange(value)) {\n\t\t\trangeEntries.push([key, value]);\n\t\t}\n\t}\n\n\tconst doOverRangesHelper = (selections: [string, number][]): void => {\n\t\tif (selections.length === rangeEntries.length) {\n\t\t\tconst selectionsObj = {};\n\t\t\tfor (const [key, value] of selections) {\n\t\t\t\tselectionsObj[key] = value;\n\t\t\t}\n\t\t\tconst description = selections.map(([key, value]) => `${key}:${value}`).join(\"_\");\n\t\t\tdoAction(selectionsObj as PickFromRanges<T>, description);\n\t\t} else {\n\t\t\tconst [key, value] = rangeEntries[selections.length];\n\t\t\tdoOverRange(value, value.growthFunc ?? ranges.growthFunc, (selection) => {\n\t\t\t\tselections.push([key, selection]);\n\t\t\t\tdoOverRangesHelper(selections);\n\t\t\t\tselections.pop();\n\t\t\t});\n\t\t}\n\t};\n\n\tdoOverRangesHelper([]);\n}\n\nexport interface IMergeTreeOperationRunnerConfig {\n\treadonly rounds: number;\n\treadonly opsPerRoundRange: IConfigRange;\n\treadonly incrementalLog?: boolean;\n\treadonly operations: readonly TestOperation[];\n\treadonly applyOpDuringGeneration?: boolean;\n\tgrowthFunc(input: number): number;\n\tresultsFilePostfix?: string;\n\tinsertText?: (client: TestClient, random: IRandom) => IMergeTreeOp | undefined;\n\tupdateEndpoints?: (client: TestClient, random: IRandom) => { start: number; end: number };\n}\n\nexport interface ReplayGroup {\n\tmsgs: ISequencedDocumentMessage[];\n\tinitialText: string;\n\tresultText: string;\n\tseq: number;\n}\n\nexport const replayResultsPath = `${_dirname}/../../src/test/results`;\n\nexport function runMergeTreeOperationRunner(\n\trandom: IRandom,\n\tstartingSeq: number,\n\tclients: readonly TestClient[],\n\tminLength: number,\n\tconfig: IMergeTreeOperationRunnerConfig,\n\tapply: ApplyMessagesFn = applyMessages,\n): number {\n\tlet seq = startingSeq;\n\tconst results: ReplayGroup[] = [];\n\n\tlet fakeTime = 1725916319097;\n\n\tdoOverRange(config.opsPerRoundRange, config.growthFunc, (opsPerRound) => {\n\t\tif (config.incrementalLog) {\n\t\t\tconsole.log(\n\t\t\t\t`MinLength: ${minLength} Clients: ${clients.length} Ops: ${opsPerRound} Seq: ${seq}`,\n\t\t\t);\n\t\t}\n\t\tfor (let round = 0; round < config.rounds; round++) {\n\t\t\tconst initialText = clients[0].getText();\n\t\t\tconst logger = new TestClientLogger(\n\t\t\t\tclients,\n\t\t\t\t`Clients: ${clients.length} Ops: ${opsPerRound} Round: ${round}`,\n\t\t\t);\n\t\t\tconst messageData = generateOperationMessagesForClients(\n\t\t\t\trandom,\n\t\t\t\tseq,\n\t\t\t\tclients,\n\t\t\t\tlogger,\n\t\t\t\topsPerRound,\n\t\t\t\tminLength,\n\t\t\t\tconfig.operations,\n\t\t\t\tconfig.applyOpDuringGeneration,\n\t\t\t\tconfig.insertText,\n\t\t\t);\n\t\t\tseq = apply(messageData[0][0].sequenceNumber - 1, messageData, clients, logger, random);\n\t\t\tconst resultText = logger.validate();\n\t\t\tresults.push({\n\t\t\t\tinitialText,\n\t\t\t\tresultText,\n\t\t\t\tmsgs: messageData.map((md) => ({ ...md[0], timestamp: fakeTime++ })),\n\t\t\t\tseq,\n\t\t\t});\n\t\t\tlogger.dispose();\n\t\t}\n\t});\n\n\tif (config.resultsFilePostfix !== undefined) {\n\t\tconst resultsFilePath = `${replayResultsPath}/len_${minLength}-clients_${clients.length}-${config.resultsFilePostfix}`;\n\t\tfs.writeFileSync(resultsFilePath, JSON.stringify(results, undefined, \"\\t\"));\n\t}\n\n\treturn seq;\n}\n\nexport function generateOperationMessagesForClients(\n\trandom: IRandom,\n\tstartingSeq: number,\n\tclients: readonly TestClient[],\n\tlogger: TestClientLogger,\n\topsPerRound: number,\n\tminLength: number,\n\toperations: readonly TestOperation[],\n\tapplyOpDuringGeneration?: boolean,\n\tinsertText?: (client: TestClient, random: IRandom) => IMergeTreeOp | undefined,\n): [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][] {\n\tconst minimumSequenceNumber = startingSeq;\n\tlet runningSeq = startingSeq;\n\tconst messages: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][] = [];\n\n\tfor (let i = 0; i < opsPerRound; i++) {\n\t\t// pick a client greater than 0, client 0 only applies remote ops\n\t\t// and is our baseline\n\t\tconst client = clients[random.integer(1, clients.length - 1)];\n\n\t\tif (applyOpDuringGeneration === true && messages.length > 0 && random.bool()) {\n\t\t\tconst toApply = messages\n\t\t\t\t.filter(([msg]) => msg.sequenceNumber > client.getCollabWindow().currentSeq)\n\t\t\t\t.slice(0, random.integer(1, 3));\n\t\t\tapplyMessages(toApply[0][0].sequenceNumber - 1, toApply, [client], logger);\n\t\t}\n\n\t\tconst len = client.getLength();\n\t\tconst sg = client.peekPendingSegmentGroups();\n\t\tlet opOrOps: IMergeTreeOp[] | IMergeTreeOp | undefined;\n\t\tif (len === 0 || len < minLength) {\n\t\t\topOrOps =\n\t\t\t\tinsertText === undefined ? generateInsert(client, random) : insertText(client, random);\n\t\t} else {\n\t\t\tlet opIndex = random.integer(0, operations.length - 1);\n\t\t\tconst start = random.integer(0, len - 1);\n\t\t\tconst end = random.integer(start + 1, len);\n\n\t\t\tfor (let y = 0; y < operations.length && opOrOps === undefined; y++) {\n\t\t\t\topOrOps = operations[opIndex](client, start, end, random);\n\t\t\t\topIndex++;\n\t\t\t\topIndex %= operations.length;\n\t\t\t}\n\t\t}\n\t\tif (opOrOps !== undefined) {\n\t\t\t// Pre-check to avoid logger.toString() in the string template\n\t\t\tif (sg === client.peekPendingSegmentGroups()) {\n\t\t\t\tassert.notEqual(\n\t\t\t\t\tsg,\n\t\t\t\t\tclient.peekPendingSegmentGroups(),\n\t\t\t\t\t`op created but segment group not enqueued.${logger}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst ops = Array.isArray(opOrOps) ? opOrOps : [opOrOps];\n\t\t\tconst totalIndividualOps = ops\n\t\t\t\t.map((o) => (o.type === MergeTreeDeltaType.GROUP ? o.ops.length : 1))\n\t\t\t\t.reduce((a, b) => a + b, 0);\n\t\t\tlet allSegmentGroups = client.peekPendingSegmentGroups(totalIndividualOps)!;\n\t\t\tif (!Array.isArray(allSegmentGroups)) {\n\t\t\t\tallSegmentGroups = [allSegmentGroups];\n\t\t\t}\n\t\t\tassert(Array.isArray(allSegmentGroups), \"Expected array of segment groups\");\n\t\t\tfor (const op of ops) {\n\t\t\t\tconst message = client.makeOpMessage(op, ++runningSeq);\n\t\t\t\tmessage.minimumSequenceNumber = minimumSequenceNumber;\n\t\t\t\tconst segmentGroups = allSegmentGroups.splice(\n\t\t\t\t\t0,\n\t\t\t\t\top.type === MergeTreeDeltaType.GROUP ? op.ops.length : 1,\n\t\t\t\t);\n\t\t\t\tmessages.push([\n\t\t\t\t\tmessage,\n\t\t\t\t\top.type === MergeTreeDeltaType.GROUP ? segmentGroups : segmentGroups[0],\n\t\t\t\t]);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst maxProcessedSeq = Math.max(...clients.map((c) => c.getCollabWindow().currentSeq));\n\tif (messages.length > 0) {\n\t\tconst index = messages.findIndex(([msg]) => msg.sequenceNumber === maxProcessedSeq);\n\t\tif (index !== -1) {\n\t\t\tconst apply = messages.splice(0, index + 1);\n\t\t\tapplyMessages(apply[0][0].sequenceNumber - 1, apply, clients, logger);\n\t\t}\n\t}\n\n\treturn messages;\n}\n\nexport function generateClientNames(): string[] {\n\tconst clientNames: string[] = [];\n\tfunction addClientNames(startChar: string, count: number): void {\n\t\tconst startCode = startChar.codePointAt(0);\n\t\tif (startCode === undefined) {\n\t\t\tthrow new Error(\"startCode must be a single character\");\n\t\t}\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tclientNames.push(String.fromCodePoint(startCode + i));\n\t\t}\n\t}\n\n\taddClientNames(\"A\", 26);\n\taddClientNames(\"a\", 26);\n\taddClientNames(\"0\", 17);\n\n\treturn clientNames;\n}\n\ntype ApplyMessagesFn = (\n\tstartingSeq: number,\n\tmessageData: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][],\n\tclients: readonly TestClient[],\n\tlogger: TestClientLogger,\n\trandom: IRandom,\n) => number;\n\nexport function applyMessages(\n\tstartingSeq: number,\n\tmessageData: [ISequencedDocumentMessage, SegmentGroup | SegmentGroup[]][],\n\tclients: readonly TestClient[],\n\tlogger: TestClientLogger,\n): number {\n\tlet seq = startingSeq;\n\ttry {\n\t\t// log and apply all the ops created in the round\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\t\tfor (let i = 0; i < messageData.length; i++) {\n\t\t\tconst [message] = messageData[i];\n\t\t\tmessage.sequenceNumber = ++seq;\n\t\t\tfor (const c of clients) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < message.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(message);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tthrow logger.addLogsToError(error);\n\t}\n\treturn seq;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeTreeOperationRunner.spec.js","sourceRoot":"","sources":["../../src/test/mergeTreeOperationRunner.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 \"node:assert\";\n\nimport {\n\tIConfigRange,\n\tdoOverRange,\n\tdoOverRanges,\n\tresolveRange,\n\tresolveRanges,\n} from \"./mergeTreeOperationRunner.js\";\n\ndescribe(\"MergeTreeOperationRunner combinatorial utils\", () => {\n\tconst constant = (i: number): number => i;\n\tconst plusOne = (i: number): number => i + 1;\n\tconst plusTwo = (i: number): number => i + 2;\n\tconst timesTwo = (i: number): number => i * 2;\n\n\tconst oneRangeTestCases: {\n\t\tname: string;\n\t\trange: IConfigRange;\n\t\tdefaultGrowthFunc: (i: number) => number;\n\t\texpected: number[];\n\t}[] = [\n\t\t{\n\t\t\t// worth testing this as baking the policy into doOverRange helps avoid\n\t\t\t// bugs with less obvious cases like growthFunc: i => i * 2 and a value of 0.\n\t\t\tname: \"with constant growthFunc\",\n\t\t\trange: {\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 5,\n\t\t\t},\n\t\t\tdefaultGrowthFunc: constant,\n\t\t\texpected: [1, 2, 3, 4, 5],\n\t\t},\n\t\t{\n\t\t\tname: \"with single element\",\n\t\t\trange: {\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 1,\n\t\t\t},\n\t\t\tdefaultGrowthFunc: plusOne,\n\t\t\texpected: [1],\n\t\t},\n\t\t{\n\t\t\tname: \"over negative numbers\",\n\t\t\trange: {\n\t\t\t\tmin: -2,\n\t\t\t\tmax: 2,\n\t\t\t},\n\t\t\tdefaultGrowthFunc: plusTwo,\n\t\t\texpected: [-2, 0, 2],\n\t\t},\n\t\t{\n\t\t\tname: \"with simple growthFunc\",\n\t\t\trange: {\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 8,\n\t\t\t},\n\t\t\tdefaultGrowthFunc: timesTwo,\n\t\t\texpected: [0, 1, 2, 4, 8],\n\t\t},\n\t\t{\n\t\t\tname: \"overrides defaultGrowthFunc with config range's growthFunc\",\n\t\t\trange: {\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 4,\n\t\t\t\tgrowthFunc: timesTwo,\n\t\t\t},\n\t\t\tdefaultGrowthFunc: plusOne,\n\t\t\texpected: [1, 2, 4],\n\t\t},\n\t];\n\n\tdescribe(\"doOverRange\", () => {\n\t\tfor (const { name, range, defaultGrowthFunc, expected } of oneRangeTestCases) {\n\t\t\tit(name, () => {\n\t\t\t\tconst actual: number[] = [];\n\t\t\t\tdoOverRange(range, defaultGrowthFunc, (i) => actual.push(i));\n\t\t\t\tassert.deepEqual(actual, expected);\n\t\t\t});\n\t\t}\n\t});\n\n\tdescribe(\"resolveRange\", () => {\n\t\tfor (const { name, range, defaultGrowthFunc, expected } of oneRangeTestCases) {\n\t\t\tit(name, () => {\n\t\t\t\tassert.deepEqual(resolveRange(range, defaultGrowthFunc), expected);\n\t\t\t});\n\t\t}\n\t});\n\n\tdescribe(\"doOverRanges\", () => {\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tconst doOverRangesCases: { name: string; ranges: any; expected: any[] }[] = [\n\t\t\t{\n\t\t\t\tname: \"with no ranges\",\n\t\t\t\tranges: { a: 1, growthFunc: constant },\n\t\t\t\texpected: [{}],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"with single property range\",\n\t\t\t\tranges: { a: { min: 1, max: 2 }, growthFunc: plusOne },\n\t\t\t\texpected: [{ a: 1 }, { a: 2 }],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"with single property range and a property without a range\",\n\t\t\t\tranges: { a: { min: 1, max: 2 }, b: 3, growthFunc: plusOne },\n\t\t\t\texpected: [{ a: 1 }, { a: 2 }],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"with multiple property ranges\",\n\t\t\t\tranges: {\n\t\t\t\t\ta: { min: 1, max: 5, growthFunc: timesTwo },\n\t\t\t\t\tb: { min: 3, max: 4 },\n\t\t\t\t\tgrowthFunc: plusOne,\n\t\t\t\t},\n\t\t\t\texpected: [\n\t\t\t\t\t{ a: 1, b: 3 },\n\t\t\t\t\t{ a: 1, b: 4 },\n\t\t\t\t\t{ a: 2, b: 3 },\n\t\t\t\t\t{ a: 2, b: 4 },\n\t\t\t\t\t{ a: 4, b: 3 },\n\t\t\t\t\t{ a: 4, b: 4 },\n\t\t\t\t],\n\t\t\t},\n\t\t];\n\n\t\tfor (const { name, ranges, expected } of doOverRangesCases) {\n\t\t\tit(name, () => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\tconst actual: any[] = [];\n\t\t\t\tdoOverRanges(ranges, (i) => actual.push(i));\n\t\t\t\tassert.deepEqual(actual, expected);\n\t\t\t});\n\t\t}\n\t});\n\n\tdescribe(\"resolveRanges\", () => {\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tconst resolveRangesCases: { name: string; ranges: any; expected: any }[] = [\n\t\t\t{\n\t\t\t\tname: \"with no ranges\",\n\t\t\t\tranges: { a: 1, growthFunc: constant },\n\t\t\t\texpected: {},\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"with single property range\",\n\t\t\t\tranges: { a: { min: 1, max: 2 }, growthFunc: plusOne },\n\t\t\t\texpected: { a: [1, 2] },\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"with single property range and a property without a range\",\n\t\t\t\tranges: { a: { min: 1, max: 2 }, b: 3, growthFunc: plusOne },\n\t\t\t\texpected: { a: [1, 2] },\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"with multiple property ranges\",\n\t\t\t\tranges: {\n\t\t\t\t\ta: { min: 1, max: 5, growthFunc: timesTwo },\n\t\t\t\t\tb: { min: 3, max: 4 },\n\t\t\t\t\tgrowthFunc: plusOne,\n\t\t\t\t},\n\t\t\t\texpected: { a: [1, 2, 4], b: [3, 4] },\n\t\t\t},\n\t\t];\n\n\t\tfor (const { name, ranges, expected } of resolveRangesCases) {\n\t\t\tit(name, () => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n\t\t\t\tassert.deepEqual(resolveRanges(ranges, ranges.growthFunc), expected);\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"mergeTreeOperationRunner.spec.js","sourceRoot":"","sources":["../../src/test/mergeTreeOperationRunner.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,6CAA+C;AAE/C,+EAMuC;AAEvC,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC7D,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAE9C,MAAM,iBAAiB,GAKjB;QACL;YACC,uEAAuE;YACvE,6EAA6E;YAC7E,IAAI,EAAE,0BAA0B;YAChC,KAAK,EAAE;gBACN,GAAG,EAAE,CAAC;gBACN,GAAG,EAAE,CAAC;aACN;YACD,iBAAiB,EAAE,QAAQ;YAC3B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACzB;QACD;YACC,IAAI,EAAE,qBAAqB;YAC3B,KAAK,EAAE;gBACN,GAAG,EAAE,CAAC;gBACN,GAAG,EAAE,CAAC;aACN;YACD,iBAAiB,EAAE,OAAO;YAC1B,QAAQ,EAAE,CAAC,CAAC,CAAC;SACb;QACD;YACC,IAAI,EAAE,uBAAuB;YAC7B,KAAK,EAAE;gBACN,GAAG,EAAE,CAAC,CAAC;gBACP,GAAG,EAAE,CAAC;aACN;YACD,iBAAiB,EAAE,OAAO;YAC1B,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACpB;QACD;YACC,IAAI,EAAE,wBAAwB;YAC9B,KAAK,EAAE;gBACN,GAAG,EAAE,CAAC;gBACN,GAAG,EAAE,CAAC;aACN;YACD,iBAAiB,EAAE,QAAQ;YAC3B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACzB;QACD;YACC,IAAI,EAAE,4DAA4D;YAClE,KAAK,EAAE;gBACN,GAAG,EAAE,CAAC;gBACN,GAAG,EAAE,CAAC;gBACN,UAAU,EAAE,QAAQ;aACpB;YACD,iBAAiB,EAAE,OAAO;YAC1B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACnB;KACD,CAAC;IAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC5B,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,iBAAiB,EAAE,CAAC;YAC9E,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE;gBACb,MAAM,MAAM,GAAa,EAAE,CAAC;gBAC5B,IAAA,yCAAW,EAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,oBAAM,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC7B,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,iBAAiB,EAAE,CAAC;YAC9E,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE;gBACb,oBAAM,CAAC,SAAS,CAAC,IAAA,0CAAY,EAAC,KAAK,EAAE,iBAAiB,CAAC,EAAE,QAAQ,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC7B,8DAA8D;QAC9D,MAAM,iBAAiB,GAAqD;YAC3E;gBACC,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;gBACtC,QAAQ,EAAE,CAAC,EAAE,CAAC;aACd;YACD;gBACC,IAAI,EAAE,4BAA4B;gBAClC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;gBACtD,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;aAC9B;YACD;gBACC,IAAI,EAAE,2DAA2D;gBACjE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE;gBAC5D,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;aAC9B;YACD;gBACC,IAAI,EAAE,+BAA+B;gBACrC,MAAM,EAAE;oBACP,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;oBAC3C,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;oBACrB,UAAU,EAAE,OAAO;iBACnB;gBACD,QAAQ,EAAE;oBACT,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;oBACd,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;oBACd,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;oBACd,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;oBACd,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;oBACd,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;iBACd;aACD;SACD,CAAC;QAEF,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,iBAAiB,EAAE,CAAC;YAC5D,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE;gBACb,8DAA8D;gBAC9D,MAAM,MAAM,GAAU,EAAE,CAAC;gBACzB,IAAA,0CAAY,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5C,oBAAM,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC9B,8DAA8D;QAC9D,MAAM,kBAAkB,GAAmD;YAC1E;gBACC,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;gBACtC,QAAQ,EAAE,EAAE;aACZ;YACD;gBACC,IAAI,EAAE,4BAA4B;gBAClC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;gBACtD,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;aACvB;YACD;gBACC,IAAI,EAAE,2DAA2D;gBACjE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE;gBAC5D,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;aACvB;YACD;gBACC,IAAI,EAAE,+BAA+B;gBACrC,MAAM,EAAE;oBACP,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE;oBAC3C,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;oBACrB,UAAU,EAAE,OAAO;iBACnB;gBACD,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;aACrC;SACD,CAAC;QAEF,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,kBAAkB,EAAE,CAAC;YAC7D,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE;gBACb,6GAA6G;gBAC7G,oBAAM,CAAC,SAAS,CAAC,IAAA,2CAAa,EAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;YACtE,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport {\n\ttype IConfigRange,\n\tdoOverRange,\n\tdoOverRanges,\n\tresolveRange,\n\tresolveRanges,\n} from \"./mergeTreeOperationRunner.js\";\n\ndescribe(\"MergeTreeOperationRunner combinatorial utils\", () => {\n\tconst constant = (i: number): number => i;\n\tconst plusOne = (i: number): number => i + 1;\n\tconst plusTwo = (i: number): number => i + 2;\n\tconst timesTwo = (i: number): number => i * 2;\n\n\tconst oneRangeTestCases: {\n\t\tname: string;\n\t\trange: IConfigRange;\n\t\tdefaultGrowthFunc: (i: number) => number;\n\t\texpected: number[];\n\t}[] = [\n\t\t{\n\t\t\t// worth testing this as baking the policy into doOverRange helps avoid\n\t\t\t// bugs with less obvious cases like growthFunc: i => i * 2 and a value of 0.\n\t\t\tname: \"with constant growthFunc\",\n\t\t\trange: {\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 5,\n\t\t\t},\n\t\t\tdefaultGrowthFunc: constant,\n\t\t\texpected: [1, 2, 3, 4, 5],\n\t\t},\n\t\t{\n\t\t\tname: \"with single element\",\n\t\t\trange: {\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 1,\n\t\t\t},\n\t\t\tdefaultGrowthFunc: plusOne,\n\t\t\texpected: [1],\n\t\t},\n\t\t{\n\t\t\tname: \"over negative numbers\",\n\t\t\trange: {\n\t\t\t\tmin: -2,\n\t\t\t\tmax: 2,\n\t\t\t},\n\t\t\tdefaultGrowthFunc: plusTwo,\n\t\t\texpected: [-2, 0, 2],\n\t\t},\n\t\t{\n\t\t\tname: \"with simple growthFunc\",\n\t\t\trange: {\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 8,\n\t\t\t},\n\t\t\tdefaultGrowthFunc: timesTwo,\n\t\t\texpected: [0, 1, 2, 4, 8],\n\t\t},\n\t\t{\n\t\t\tname: \"overrides defaultGrowthFunc with config range's growthFunc\",\n\t\t\trange: {\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 4,\n\t\t\t\tgrowthFunc: timesTwo,\n\t\t\t},\n\t\t\tdefaultGrowthFunc: plusOne,\n\t\t\texpected: [1, 2, 4],\n\t\t},\n\t];\n\n\tdescribe(\"doOverRange\", () => {\n\t\tfor (const { name, range, defaultGrowthFunc, expected } of oneRangeTestCases) {\n\t\t\tit(name, () => {\n\t\t\t\tconst actual: number[] = [];\n\t\t\t\tdoOverRange(range, defaultGrowthFunc, (i) => actual.push(i));\n\t\t\t\tassert.deepEqual(actual, expected);\n\t\t\t});\n\t\t}\n\t});\n\n\tdescribe(\"resolveRange\", () => {\n\t\tfor (const { name, range, defaultGrowthFunc, expected } of oneRangeTestCases) {\n\t\t\tit(name, () => {\n\t\t\t\tassert.deepEqual(resolveRange(range, defaultGrowthFunc), expected);\n\t\t\t});\n\t\t}\n\t});\n\n\tdescribe(\"doOverRanges\", () => {\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tconst doOverRangesCases: { name: string; ranges: any; expected: any[] }[] = [\n\t\t\t{\n\t\t\t\tname: \"with no ranges\",\n\t\t\t\tranges: { a: 1, growthFunc: constant },\n\t\t\t\texpected: [{}],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"with single property range\",\n\t\t\t\tranges: { a: { min: 1, max: 2 }, growthFunc: plusOne },\n\t\t\t\texpected: [{ a: 1 }, { a: 2 }],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"with single property range and a property without a range\",\n\t\t\t\tranges: { a: { min: 1, max: 2 }, b: 3, growthFunc: plusOne },\n\t\t\t\texpected: [{ a: 1 }, { a: 2 }],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"with multiple property ranges\",\n\t\t\t\tranges: {\n\t\t\t\t\ta: { min: 1, max: 5, growthFunc: timesTwo },\n\t\t\t\t\tb: { min: 3, max: 4 },\n\t\t\t\t\tgrowthFunc: plusOne,\n\t\t\t\t},\n\t\t\t\texpected: [\n\t\t\t\t\t{ a: 1, b: 3 },\n\t\t\t\t\t{ a: 1, b: 4 },\n\t\t\t\t\t{ a: 2, b: 3 },\n\t\t\t\t\t{ a: 2, b: 4 },\n\t\t\t\t\t{ a: 4, b: 3 },\n\t\t\t\t\t{ a: 4, b: 4 },\n\t\t\t\t],\n\t\t\t},\n\t\t];\n\n\t\tfor (const { name, ranges, expected } of doOverRangesCases) {\n\t\t\tit(name, () => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\tconst actual: any[] = [];\n\t\t\t\tdoOverRanges(ranges, (i) => actual.push(i));\n\t\t\t\tassert.deepEqual(actual, expected);\n\t\t\t});\n\t\t}\n\t});\n\n\tdescribe(\"resolveRanges\", () => {\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tconst resolveRangesCases: { name: string; ranges: any; expected: any }[] = [\n\t\t\t{\n\t\t\t\tname: \"with no ranges\",\n\t\t\t\tranges: { a: 1, growthFunc: constant },\n\t\t\t\texpected: {},\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"with single property range\",\n\t\t\t\tranges: { a: { min: 1, max: 2 }, growthFunc: plusOne },\n\t\t\t\texpected: { a: [1, 2] },\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"with single property range and a property without a range\",\n\t\t\t\tranges: { a: { min: 1, max: 2 }, b: 3, growthFunc: plusOne },\n\t\t\t\texpected: { a: [1, 2] },\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"with multiple property ranges\",\n\t\t\t\tranges: {\n\t\t\t\t\ta: { min: 1, max: 5, growthFunc: timesTwo },\n\t\t\t\t\tb: { min: 3, max: 4 },\n\t\t\t\t\tgrowthFunc: plusOne,\n\t\t\t\t},\n\t\t\t\texpected: { a: [1, 2, 4], b: [3, 4] },\n\t\t\t},\n\t\t];\n\n\t\tfor (const { name, ranges, expected } of resolveRangesCases) {\n\t\t\tit(name, () => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n\t\t\t\tassert.deepEqual(resolveRanges(ranges, ranges.growthFunc), expected);\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obliterate.deltaCallback.spec.js","sourceRoot":"","sources":["../../src/test/obliterate.deltaCallback.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 \"node:assert\";\n\nimport { MergeTreeDeltaCallback } from \"../mergeTreeDeltaCallback.js\";\nimport { MergeTreeDeltaType } from \"../ops.js\";\n\nimport { ClientTestHelper } from \"./clientTestHelper.js\";\nimport { useStrictPartialLengthChecks } from \"./testUtils.js\";\n\nfor (const mergeTreeEnableSidedObliterate of [true, false]) {\n\tdescribe(`obliterate delta callback enableSidedObliterate = ${mergeTreeEnableSidedObliterate}`, () => {\n\t\tuseStrictPartialLengthChecks();\n\n\t\tlet length: number;\n\t\tlet cb: MergeTreeDeltaCallback;\n\n\t\tbeforeEach(() => {\n\t\t\tlength = 0;\n\t\t\tcb = (opArgs, deltaArgs): void => {\n\t\t\t\tswitch (opArgs.op.type) {\n\t\t\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\t\t\tfor (const { segment } of deltaArgs.deltaSegments) {\n\t\t\t\t\t\t\tlength += segment.cachedLength;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED:\n\t\t\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\t\t\tfor (const { segment } of deltaArgs.deltaSegments) {\n\t\t\t\t\t\t\tlength -= segment.cachedLength;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\n\t\tdescribe(\"is invoked\", () => {\n\t\t\tit(\"on local obliterate\", () => {\n\t\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\t\tlet count = 0;\n\n\t\t\t\thelper.clients.A.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE ||\n\t\t\t\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE_SIDED\n\t\t\t\t\t) {\n\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelper.insertText(\"A\", 0, \"a\");\n\t\t\t\tassert.equal(count, 0);\n\t\t\t\thelper.obliterateRange(\"A\", 0, 1);\n\t\t\t\tassert.equal(count, 1);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(count, 1);\n\t\t\t\tassert.equal(helper.clients.A.getText(), \"\");\n\n\t\t\t\thelper.logger.validate();\n\t\t\t});\n\n\t\t\tit(\"on remote obliterate\", () => {\n\t\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\t\tlet count = 0;\n\n\t\t\t\thelper.clients.A.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE ||\n\t\t\t\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE_SIDED\n\t\t\t\t\t) {\n\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelper.insertText(\"B\", 0, \"a\");\n\t\t\t\tassert.equal(count, 0);\n\t\t\t\thelper.obliterateRange(\"B\", 0, 1);\n\t\t\t\tassert.equal(count, 0);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(count, 1);\n\t\t\t\tassert.equal(helper.clients.A.getText(), \"\");\n\n\t\t\t\thelper.logger.validate();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"overlapping obliterate and remove\", () => {\n\t\t\tconst text = \"abcdef\";\n\n\t\t\tit(\"remove first\", () => {\n\t\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\t\thelper.clients.A.on(\"delta\", cb);\n\n\t\t\t\thelper.insertText(\"A\", 0, text);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, text.length);\n\t\t\t\thelper.removeRange(\"B\", 0, text.length);\n\t\t\t\thelper.obliterateRange(\"C\", 0, text.length);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, 0);\n\n\t\t\t\thelper.logger.validate();\n\n\t\t\t\thelper.clients.A.off(\"delta\", cb);\n\t\t\t});\n\n\t\t\tit(\"obliterate first\", () => {\n\t\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\t\thelper.clients.A.on(\"delta\", cb);\n\n\t\t\t\thelper.insertText(\"B\", 0, text);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, text.length);\n\t\t\t\thelper.obliterateRange(\"C\", 0, text.length);\n\t\t\t\thelper.removeRange(\"B\", 0, text.length);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, 0);\n\n\t\t\t\thelper.logger.validate();\n\n\t\t\t\thelper.clients.A.off(\"delta\", cb);\n\t\t\t});\n\t\t});\n\n\t\tit(\"overlapping obliterate and obliterate\", () => {\n\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\thelper.clients.A.on(\"delta\", cb);\n\n\t\t\tconst text = \"abcdef\";\n\n\t\t\thelper.insertText(\"B\", 0, text);\n\t\t\thelper.processAllOps();\n\t\t\tassert.equal(length, text.length);\n\t\t\thelper.obliterateRange(\"B\", 0, text.length);\n\t\t\thelper.obliterateRange(\"C\", 0, text.length);\n\t\t\thelper.processAllOps();\n\t\t\tassert.equal(length, 0);\n\n\t\t\thelper.logger.validate();\n\n\t\t\thelper.clients.A.off(\"delta\", cb);\n\t\t});\n\n\t\tdescribe(\"insert into obliterated range\", () => {\n\t\t\tconst text = \"abcdef\";\n\n\t\t\tit(\"insert first\", () => {\n\t\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\t\thelper.clients.A.on(\"delta\", cb);\n\n\t\t\t\thelper.insertText(\"B\", 0, text);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, text.length);\n\t\t\t\thelper.insertText(\"B\", 3, text);\n\t\t\t\thelper.obliterateRange(\"C\", 0, text.length);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, 0);\n\n\t\t\t\thelper.logger.validate();\n\n\t\t\t\thelper.clients.A.off(\"delta\", cb);\n\t\t\t});\n\n\t\t\tit(\"obliterate first\", () => {\n\t\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\t\thelper.clients.A.on(\"delta\", cb);\n\n\t\t\t\thelper.insertText(\"B\", 0, text);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, text.length);\n\t\t\t\thelper.obliterateRange(\"C\", 0, text.length);\n\t\t\t\thelper.insertText(\"B\", 3, text);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, 0);\n\n\t\t\t\thelper.logger.validate();\n\n\t\t\t\thelper.clients.A.off(\"delta\", cb);\n\t\t\t});\n\t\t});\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"obliterate.deltaCallback.spec.js","sourceRoot":"","sources":["../../src/test/obliterate.deltaCallback.spec.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,6CAA+C;AAG/C,sCAA+C;AAE/C,+DAAyD;AACzD,iDAA8D;AAE9D,KAAK,MAAM,8BAA8B,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;IAC5D,QAAQ,CAAC,qDAAqD,8BAA8B,EAAE,EAAE,GAAG,EAAE;QACpG,IAAA,2CAA4B,GAAE,CAAC;QAE/B,IAAI,MAAc,CAAC;QACnB,IAAI,EAA0B,CAAC;QAE/B,UAAU,CAAC,GAAG,EAAE;YACf,MAAM,GAAG,CAAC,CAAC;YACX,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAQ,EAAE;gBAChC,QAAQ,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;oBACxB,KAAK,2BAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;wBAChC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;4BACnD,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;wBAChC,CAAC;wBACD,MAAM;oBACP,CAAC;oBACD,KAAK,2BAAkB,CAAC,MAAM,CAAC;oBAC/B,KAAK,2BAAkB,CAAC,gBAAgB,CAAC;oBACzC,KAAK,2BAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;wBACpC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;4BACnD,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;wBAChC,CAAC;wBACD,MAAM;oBACP,CAAC;oBACD,QAAQ;gBACT,CAAC;YACF,CAAC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;YAC3B,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;gBAC9B,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,EAAE,8BAA8B,EAAE,CAAC,CAAC;gBAExE,IAAI,KAAK,GAAG,CAAC,CAAC;gBAEd,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;oBAClD,IACC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,2BAAkB,CAAC,UAAU;wBAChD,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,2BAAkB,CAAC,gBAAgB,EACrD,CAAC;wBACF,KAAK,IAAI,CAAC,CAAC;oBACZ,CAAC;gBACF,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC/B,oBAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACvB,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClC,oBAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACvB,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,oBAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACvB,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;gBAE7C,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;gBAC/B,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,EAAE,8BAA8B,EAAE,CAAC,CAAC;gBAExE,IAAI,KAAK,GAAG,CAAC,CAAC;gBAEd,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;oBAClD,IACC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,2BAAkB,CAAC,UAAU;wBAChD,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,2BAAkB,CAAC,gBAAgB,EACrD,CAAC;wBACF,KAAK,IAAI,CAAC,CAAC;oBACZ,CAAC;gBACF,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC/B,oBAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACvB,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClC,oBAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACvB,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,oBAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACvB,oBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;gBAE7C,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAClD,MAAM,IAAI,GAAG,QAAQ,CAAC;YAEtB,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;gBACvB,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,EAAE,8BAA8B,EAAE,CAAC,CAAC;gBAExE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAEjC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAChC,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,oBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACxC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC5C,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,oBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAExB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAEzB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;gBAC3B,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,EAAE,8BAA8B,EAAE,CAAC,CAAC;gBAExE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAEjC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAChC,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,oBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC5C,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBACxC,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,oBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAExB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAEzB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAChD,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,EAAE,8BAA8B,EAAE,CAAC,CAAC;YAExE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAEjC,MAAM,IAAI,GAAG,QAAQ,CAAC;YAEtB,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,aAAa,EAAE,CAAC;YACvB,oBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,CAAC,aAAa,EAAE,CAAC;YACvB,oBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAExB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAEzB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;YAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC;YAEtB,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;gBACvB,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,EAAE,8BAA8B,EAAE,CAAC,CAAC;gBAExE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAEjC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAChC,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,oBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAChC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC5C,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,oBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAExB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAEzB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;gBAC3B,MAAM,MAAM,GAAG,IAAI,sCAAgB,CAAC,EAAE,8BAA8B,EAAE,CAAC,CAAC;gBAExE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAEjC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAChC,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,oBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC5C,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAChC,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvB,oBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAExB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAEzB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport type { MergeTreeDeltaCallback } from \"../mergeTreeDeltaCallback.js\";\nimport { MergeTreeDeltaType } from \"../ops.js\";\n\nimport { ClientTestHelper } from \"./clientTestHelper.js\";\nimport { useStrictPartialLengthChecks } from \"./testUtils.js\";\n\nfor (const mergeTreeEnableSidedObliterate of [true, false]) {\n\tdescribe(`obliterate delta callback enableSidedObliterate = ${mergeTreeEnableSidedObliterate}`, () => {\n\t\tuseStrictPartialLengthChecks();\n\n\t\tlet length: number;\n\t\tlet cb: MergeTreeDeltaCallback;\n\n\t\tbeforeEach(() => {\n\t\t\tlength = 0;\n\t\t\tcb = (opArgs, deltaArgs): void => {\n\t\t\t\tswitch (opArgs.op.type) {\n\t\t\t\t\tcase MergeTreeDeltaType.INSERT: {\n\t\t\t\t\t\tfor (const { segment } of deltaArgs.deltaSegments) {\n\t\t\t\t\t\t\tlength += segment.cachedLength;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase MergeTreeDeltaType.REMOVE:\n\t\t\t\t\tcase MergeTreeDeltaType.OBLITERATE_SIDED:\n\t\t\t\t\tcase MergeTreeDeltaType.OBLITERATE: {\n\t\t\t\t\t\tfor (const { segment } of deltaArgs.deltaSegments) {\n\t\t\t\t\t\t\tlength -= segment.cachedLength;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\n\t\tdescribe(\"is invoked\", () => {\n\t\t\tit(\"on local obliterate\", () => {\n\t\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\t\tlet count = 0;\n\n\t\t\t\thelper.clients.A.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE ||\n\t\t\t\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE_SIDED\n\t\t\t\t\t) {\n\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelper.insertText(\"A\", 0, \"a\");\n\t\t\t\tassert.equal(count, 0);\n\t\t\t\thelper.obliterateRange(\"A\", 0, 1);\n\t\t\t\tassert.equal(count, 1);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(count, 1);\n\t\t\t\tassert.equal(helper.clients.A.getText(), \"\");\n\n\t\t\t\thelper.logger.validate();\n\t\t\t});\n\n\t\t\tit(\"on remote obliterate\", () => {\n\t\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\t\tlet count = 0;\n\n\t\t\t\thelper.clients.A.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE ||\n\t\t\t\t\t\topArgs.op.type === MergeTreeDeltaType.OBLITERATE_SIDED\n\t\t\t\t\t) {\n\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelper.insertText(\"B\", 0, \"a\");\n\t\t\t\tassert.equal(count, 0);\n\t\t\t\thelper.obliterateRange(\"B\", 0, 1);\n\t\t\t\tassert.equal(count, 0);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(count, 1);\n\t\t\t\tassert.equal(helper.clients.A.getText(), \"\");\n\n\t\t\t\thelper.logger.validate();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"overlapping obliterate and remove\", () => {\n\t\t\tconst text = \"abcdef\";\n\n\t\t\tit(\"remove first\", () => {\n\t\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\t\thelper.clients.A.on(\"delta\", cb);\n\n\t\t\t\thelper.insertText(\"A\", 0, text);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, text.length);\n\t\t\t\thelper.removeRange(\"B\", 0, text.length);\n\t\t\t\thelper.obliterateRange(\"C\", 0, text.length);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, 0);\n\n\t\t\t\thelper.logger.validate();\n\n\t\t\t\thelper.clients.A.off(\"delta\", cb);\n\t\t\t});\n\n\t\t\tit(\"obliterate first\", () => {\n\t\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\t\thelper.clients.A.on(\"delta\", cb);\n\n\t\t\t\thelper.insertText(\"B\", 0, text);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, text.length);\n\t\t\t\thelper.obliterateRange(\"C\", 0, text.length);\n\t\t\t\thelper.removeRange(\"B\", 0, text.length);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, 0);\n\n\t\t\t\thelper.logger.validate();\n\n\t\t\t\thelper.clients.A.off(\"delta\", cb);\n\t\t\t});\n\t\t});\n\n\t\tit(\"overlapping obliterate and obliterate\", () => {\n\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\thelper.clients.A.on(\"delta\", cb);\n\n\t\t\tconst text = \"abcdef\";\n\n\t\t\thelper.insertText(\"B\", 0, text);\n\t\t\thelper.processAllOps();\n\t\t\tassert.equal(length, text.length);\n\t\t\thelper.obliterateRange(\"B\", 0, text.length);\n\t\t\thelper.obliterateRange(\"C\", 0, text.length);\n\t\t\thelper.processAllOps();\n\t\t\tassert.equal(length, 0);\n\n\t\t\thelper.logger.validate();\n\n\t\t\thelper.clients.A.off(\"delta\", cb);\n\t\t});\n\n\t\tdescribe(\"insert into obliterated range\", () => {\n\t\t\tconst text = \"abcdef\";\n\n\t\t\tit(\"insert first\", () => {\n\t\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\t\thelper.clients.A.on(\"delta\", cb);\n\n\t\t\t\thelper.insertText(\"B\", 0, text);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, text.length);\n\t\t\t\thelper.insertText(\"B\", 3, text);\n\t\t\t\thelper.obliterateRange(\"C\", 0, text.length);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, 0);\n\n\t\t\t\thelper.logger.validate();\n\n\t\t\t\thelper.clients.A.off(\"delta\", cb);\n\t\t\t});\n\n\t\t\tit(\"obliterate first\", () => {\n\t\t\t\tconst helper = new ClientTestHelper({ mergeTreeEnableSidedObliterate });\n\n\t\t\t\thelper.clients.A.on(\"delta\", cb);\n\n\t\t\t\thelper.insertText(\"B\", 0, text);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, text.length);\n\t\t\t\thelper.obliterateRange(\"C\", 0, text.length);\n\t\t\t\thelper.insertText(\"B\", 3, text);\n\t\t\t\thelper.processAllOps();\n\t\t\t\tassert.equal(length, 0);\n\n\t\t\t\thelper.logger.validate();\n\n\t\t\t\thelper.clients.A.off(\"delta\", cb);\n\t\t\t});\n\t\t});\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obliterateOperations.js","sourceRoot":"","sources":["../../src/test/obliterateOperations.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 type { IRandom } from \"@fluid-private/stochastic-test-utils\";\n\n// import { createGroupOp } from \"../opBuilder.js\";\nimport type { IMergeTreeInsertMsg, IMergeTreeOp } from \"../ops.js\";\nimport { InteriorSequencePlace, Side } from \"../sequencePlace.js\";\n\nimport { annotateRange, removeRange, type TestOperation } from \"./mergeTreeOperationRunner.js\";\nimport type { TestClient } from \"./testClient.js\";\n\nconst posInField = (\n\tclient: TestClient,\n\tpos: number,\n): { startPos: number; endPos: number } | undefined => {\n\tconst isFieldCharacter = (char: string): boolean =>\n\t\tNumber.isInteger(Number(char)) || char === \"{\" || char === \"}\";\n\tif (pos >= client.getLength() || !isFieldCharacter(client.getText(pos, pos + 1))) {\n\t\t// pos is not within a field.\n\t\treturn undefined;\n\t}\n\n\tlet startPos = pos;\n\tlet endPos = pos;\n\t// To find the start and end separators, walk backwards and forwards until the desired character is found.\n\twhile (startPos > 0 && client.getText(startPos, startPos + 1) !== \"{\") {\n\t\tconst text = client.getText(endPos, endPos + 1);\n\t\tassert(\n\t\t\tNumber.isInteger(Number(text)) || text === \"}\",\n\t\t\t\"Non-integer character found within a field\",\n\t\t);\n\t\tstartPos--;\n\t}\n\n\twhile (endPos < client.getLength() && client.getText(endPos, endPos + 1) !== \"}\") {\n\t\tconst text = client.getText(endPos, endPos + 1);\n\t\tassert(\n\t\t\tNumber.isInteger(Number(text)) || text === \"{\",\n\t\t\t\"Non-integer character found within a field\",\n\t\t);\n\t\tendPos++;\n\t}\n\n\tassert(client.getText(startPos, startPos + 1) === \"{\", \"Start separator not found\");\n\tassert(\n\t\tendPos < client.getLength() && client.getText(endPos, endPos + 1) === \"}\",\n\t\t\"End separator not found\",\n\t);\n\n\treturn { startPos, endPos };\n};\n\nconst getFieldEndpoints = (\n\tclient: TestClient,\n\tstart: number,\n\tend: number,\n): { startPos: number; endPos: number } | undefined => {\n\tconst startField = posInField(client, start);\n\tconst endField = posInField(client, end);\n\n\tif (startField === undefined && endField === undefined) {\n\t\treturn undefined;\n\t}\n\treturn startField ?? endField;\n};\n\nconst generateFieldText = (client: TestClient, random: IRandom): string => {\n\tconst chunkLength = random.integer(1, 10);\n\treturn (client.longClientId!.codePointAt(0)! % 10).toString().repeat(chunkLength);\n};\n\nconst insertFieldText = (\n\tclient: TestClient,\n\topStart: number,\n\trandom: IRandom,\n): IMergeTreeInsertMsg | undefined => {\n\tconst text = generateFieldText(client, random);\n\treturn client.insertTextLocal(opStart, text);\n};\n\nexport const insertField: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tconst numberText = generateFieldText(client, random);\n\tif (posInField(client, opStart) === undefined) {\n\t\treturn client.insertTextLocal(opStart, `{${numberText}}`);\n\t}\n};\n\nconst obliterateHelper = (\n\tclient: TestClient,\n\tstartPos: number,\n\tendPos: number,\n\trandom: IRandom,\n): IMergeTreeOp[] => {\n\tconst obliterateOp = client.obliterateRangeLocal(\n\t\t{ pos: startPos, side: Side.After },\n\t\t{ pos: endPos, side: Side.Before },\n\t);\n\tconst insertOp = insertFieldText(client, startPos + 1, random);\n\tassert(insertOp !== undefined, \"Insert op should not be undefined\");\n\t// TODO: AB#31001: We should be able to sometimes use group ops here rather than submit two separate ops,\n\t// but this causes failures which likely indicate there are bugs with the intersection of obliterate and grouped batching.\n\t// const op = createGroupOp(obliterateOp, insertOp);\n\treturn [obliterateOp, insertOp];\n};\n\nexport const obliterateField: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tconst fieldEndpoints = getFieldEndpoints(\n\t\tclient,\n\t\topStart,\n\t\t// the operation runner generates endpoints with client length, but this model only supports up to client length - 1.\n\t\tMath.min(opEnd, client.getLength() - 1),\n\t);\n\n\tlet endISP: InteriorSequencePlace | undefined;\n\tif (fieldEndpoints !== undefined) {\n\t\tconst { startPos, endPos } = fieldEndpoints;\n\t\t// Obliterate text between the separators, but avoid the case where the obliterate range is zero length.\n\t\treturn endPos - startPos > 1\n\t\t\t? obliterateHelper(client, startPos, endPos, random)\n\t\t\t: undefined;\n\t}\n\tif (opEnd >= client.getLength()) {\n\t\tendISP = { pos: client.getLength() - 1, side: Side.After };\n\t}\n\tif (!client.getText(opStart, opEnd).includes(\"{\")) {\n\t\t// Avoid issuing obliterates that might contain multiple fields.\n\t\t// Otherwise we may end up with field characters that look like they're outside of the field,\n\t\t// since one of these obliterates can wipe out the field including the `{}` delimiters, but\n\t\t// a \"field replace\" obliterate + insert can win and insert the numerical characters.\n\t\treturn client.obliterateRangeLocal(\n\t\t\t{ pos: opStart, side: Side.Before },\n\t\t\tendISP ?? { pos: opEnd, side: Side.After },\n\t\t);\n\t}\n};\n\nexport const obliterateFieldZeroLength: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tconst fieldEndpoints = getFieldEndpoints(\n\t\tclient,\n\t\topStart,\n\t\t// the operation runner generates endpoints with client length, but this model only supports up to client length - 1.\n\t\tMath.min(opEnd, client.getLength() - 1),\n\t);\n\n\tlet endISP: InteriorSequencePlace | undefined;\n\tif (fieldEndpoints !== undefined) {\n\t\tconst { startPos, endPos } = fieldEndpoints;\n\t\t// Obliterate text between the separators, including the case where the obliterate range is zero length.\n\t\treturn obliterateHelper(client, startPos, endPos, random);\n\t}\n\tif (opEnd >= client.getLength()) {\n\t\tendISP = { pos: client.getLength() - 1, side: Side.After };\n\t}\n\tif (!client.getText(opStart, opEnd).includes(\"{\")) {\n\t\t// Avoid issuing obliterates that might contain multiple fields.\n\t\t// Otherwise we may end up with field characters that look like they're outside of the field,\n\t\t// since one of these obliterates can wipe out the field including the `{}` delimiters, but\n\t\t// a \"field replace\" obliterate + insert can win and insert the numerical characters.\n\t\treturn client.obliterateRangeLocal(\n\t\t\t{ pos: opStart, side: Side.Before },\n\t\t\tendISP ?? { pos: opEnd, side: Side.After },\n\t\t);\n\t}\n};\n\nexport const insertAvoidField: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tlet start = opStart;\n\tconst endpoints = posInField(client, opStart);\n\tif (endpoints !== undefined) {\n\t\tstart = endpoints.startPos;\n\t}\n\treturn client.insertTextLocal(start, client.longClientId!.repeat(random.integer(1, 3)));\n};\n\nexport const removeWithField: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tlet start = opStart;\n\tlet end = opEnd;\n\tconst fieldEndpoints = getFieldEndpoints(client, opStart, opEnd);\n\tif (fieldEndpoints !== undefined) {\n\t\tstart = fieldEndpoints.startPos;\n\t\tend = fieldEndpoints.endPos + 1;\n\t}\n\treturn removeRange(client, start, end, random);\n};\n\nexport const annotateWithField: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tlet start = opStart;\n\tlet end = opEnd;\n\tconst fieldEndpoints = getFieldEndpoints(client, opStart, opEnd);\n\tif (fieldEndpoints !== undefined) {\n\t\tstart = fieldEndpoints.startPos;\n\t\tend = fieldEndpoints.endPos + 1;\n\t}\n\treturn annotateRange(client, start, end, random);\n};\n\nexport const generateInsertWithField = (\n\tclient: TestClient,\n\trandom: IRandom,\n): IMergeTreeOp | undefined => {\n\tconst text = client.longClientId!.repeat(random.integer(1, 3));\n\tlet pos = random.integer(0, client.getLength());\n\tconst endpoints = posInField(client, pos);\n\tif (endpoints !== undefined) {\n\t\tpos = 0;\n\t}\n\treturn client.insertTextLocal(pos, text);\n};\n"]}
|
|
1
|
+
{"version":3,"file":"obliterateOperations.js","sourceRoot":"","sources":["../../src/test/obliterateOperations.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 type { IRandom } from \"@fluid-private/stochastic-test-utils\";\n\n// import { createGroupOp } from \"../opBuilder.js\";\nimport type { IMergeTreeInsertMsg, IMergeTreeOp } from \"../ops.js\";\nimport { type InteriorSequencePlace, Side } from \"../sequencePlace.js\";\n\nimport { annotateRange, removeRange, type TestOperation } from \"./mergeTreeOperationRunner.js\";\nimport type { TestClient } from \"./testClient.js\";\n\nconst posInField = (\n\tclient: TestClient,\n\tpos: number,\n): { startPos: number; endPos: number } | undefined => {\n\tconst isFieldCharacter = (char: string): boolean =>\n\t\tNumber.isInteger(Number(char)) || char === \"{\" || char === \"}\";\n\tif (pos >= client.getLength() || !isFieldCharacter(client.getText(pos, pos + 1))) {\n\t\t// pos is not within a field.\n\t\treturn undefined;\n\t}\n\n\tlet startPos = pos;\n\tlet endPos = pos;\n\t// To find the start and end separators, walk backwards and forwards until the desired character is found.\n\twhile (startPos > 0 && client.getText(startPos, startPos + 1) !== \"{\") {\n\t\tconst text = client.getText(endPos, endPos + 1);\n\t\tassert(\n\t\t\tNumber.isInteger(Number(text)) || text === \"}\",\n\t\t\t\"Non-integer character found within a field\",\n\t\t);\n\t\tstartPos--;\n\t}\n\n\twhile (endPos < client.getLength() && client.getText(endPos, endPos + 1) !== \"}\") {\n\t\tconst text = client.getText(endPos, endPos + 1);\n\t\tassert(\n\t\t\tNumber.isInteger(Number(text)) || text === \"{\",\n\t\t\t\"Non-integer character found within a field\",\n\t\t);\n\t\tendPos++;\n\t}\n\n\tassert(client.getText(startPos, startPos + 1) === \"{\", \"Start separator not found\");\n\tassert(\n\t\tendPos < client.getLength() && client.getText(endPos, endPos + 1) === \"}\",\n\t\t\"End separator not found\",\n\t);\n\n\treturn { startPos, endPos };\n};\n\nconst getFieldEndpoints = (\n\tclient: TestClient,\n\tstart: number,\n\tend: number,\n): { startPos: number; endPos: number } | undefined => {\n\tconst startField = posInField(client, start);\n\tconst endField = posInField(client, end);\n\n\tif (startField === undefined && endField === undefined) {\n\t\treturn undefined;\n\t}\n\treturn startField ?? endField;\n};\n\nconst generateFieldText = (client: TestClient, random: IRandom): string => {\n\tconst chunkLength = random.integer(1, 10);\n\treturn (client.longClientId!.codePointAt(0)! % 10).toString().repeat(chunkLength);\n};\n\nconst insertFieldText = (\n\tclient: TestClient,\n\topStart: number,\n\trandom: IRandom,\n): IMergeTreeInsertMsg | undefined => {\n\tconst text = generateFieldText(client, random);\n\treturn client.insertTextLocal(opStart, text);\n};\n\nexport const insertField: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tconst numberText = generateFieldText(client, random);\n\tif (posInField(client, opStart) === undefined) {\n\t\treturn client.insertTextLocal(opStart, `{${numberText}}`);\n\t}\n};\n\nconst obliterateHelper = (\n\tclient: TestClient,\n\tstartPos: number,\n\tendPos: number,\n\trandom: IRandom,\n): IMergeTreeOp[] => {\n\tconst obliterateOp = client.obliterateRangeLocal(\n\t\t{ pos: startPos, side: Side.After },\n\t\t{ pos: endPos, side: Side.Before },\n\t);\n\tconst insertOp = insertFieldText(client, startPos + 1, random);\n\tassert(insertOp !== undefined, \"Insert op should not be undefined\");\n\t// TODO: AB#31001: We should be able to sometimes use group ops here rather than submit two separate ops,\n\t// but this causes failures which likely indicate there are bugs with the intersection of obliterate and grouped batching.\n\t// const op = createGroupOp(obliterateOp, insertOp);\n\treturn [obliterateOp, insertOp];\n};\n\nexport const obliterateField: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tconst fieldEndpoints = getFieldEndpoints(\n\t\tclient,\n\t\topStart,\n\t\t// the operation runner generates endpoints with client length, but this model only supports up to client length - 1.\n\t\tMath.min(opEnd, client.getLength() - 1),\n\t);\n\n\tlet endISP: InteriorSequencePlace | undefined;\n\tif (fieldEndpoints !== undefined) {\n\t\tconst { startPos, endPos } = fieldEndpoints;\n\t\t// Obliterate text between the separators, but avoid the case where the obliterate range is zero length.\n\t\treturn endPos - startPos > 1\n\t\t\t? obliterateHelper(client, startPos, endPos, random)\n\t\t\t: undefined;\n\t}\n\tif (opEnd >= client.getLength()) {\n\t\tendISP = { pos: client.getLength() - 1, side: Side.After };\n\t}\n\tif (!client.getText(opStart, opEnd).includes(\"{\")) {\n\t\t// Avoid issuing obliterates that might contain multiple fields.\n\t\t// Otherwise we may end up with field characters that look like they're outside of the field,\n\t\t// since one of these obliterates can wipe out the field including the `{}` delimiters, but\n\t\t// a \"field replace\" obliterate + insert can win and insert the numerical characters.\n\t\treturn client.obliterateRangeLocal(\n\t\t\t{ pos: opStart, side: Side.Before },\n\t\t\tendISP ?? { pos: opEnd, side: Side.After },\n\t\t);\n\t}\n};\n\nexport const obliterateFieldZeroLength: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tconst fieldEndpoints = getFieldEndpoints(\n\t\tclient,\n\t\topStart,\n\t\t// the operation runner generates endpoints with client length, but this model only supports up to client length - 1.\n\t\tMath.min(opEnd, client.getLength() - 1),\n\t);\n\n\tlet endISP: InteriorSequencePlace | undefined;\n\tif (fieldEndpoints !== undefined) {\n\t\tconst { startPos, endPos } = fieldEndpoints;\n\t\t// Obliterate text between the separators, including the case where the obliterate range is zero length.\n\t\treturn obliterateHelper(client, startPos, endPos, random);\n\t}\n\tif (opEnd >= client.getLength()) {\n\t\tendISP = { pos: client.getLength() - 1, side: Side.After };\n\t}\n\tif (!client.getText(opStart, opEnd).includes(\"{\")) {\n\t\t// Avoid issuing obliterates that might contain multiple fields.\n\t\t// Otherwise we may end up with field characters that look like they're outside of the field,\n\t\t// since one of these obliterates can wipe out the field including the `{}` delimiters, but\n\t\t// a \"field replace\" obliterate + insert can win and insert the numerical characters.\n\t\treturn client.obliterateRangeLocal(\n\t\t\t{ pos: opStart, side: Side.Before },\n\t\t\tendISP ?? { pos: opEnd, side: Side.After },\n\t\t);\n\t}\n};\n\nexport const insertAvoidField: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tlet start = opStart;\n\tconst endpoints = posInField(client, opStart);\n\tif (endpoints !== undefined) {\n\t\tstart = endpoints.startPos;\n\t}\n\treturn client.insertTextLocal(start, client.longClientId!.repeat(random.integer(1, 3)));\n};\n\nexport const removeWithField: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tlet start = opStart;\n\tlet end = opEnd;\n\tconst fieldEndpoints = getFieldEndpoints(client, opStart, opEnd);\n\tif (fieldEndpoints !== undefined) {\n\t\tstart = fieldEndpoints.startPos;\n\t\tend = fieldEndpoints.endPos + 1;\n\t}\n\treturn removeRange(client, start, end, random);\n};\n\nexport const annotateWithField: TestOperation = (\n\tclient: TestClient,\n\topStart: number,\n\topEnd: number,\n\trandom: IRandom,\n) => {\n\tlet start = opStart;\n\tlet end = opEnd;\n\tconst fieldEndpoints = getFieldEndpoints(client, opStart, opEnd);\n\tif (fieldEndpoints !== undefined) {\n\t\tstart = fieldEndpoints.startPos;\n\t\tend = fieldEndpoints.endPos + 1;\n\t}\n\treturn annotateRange(client, start, end, random);\n};\n\nexport const generateInsertWithField = (\n\tclient: TestClient,\n\trandom: IRandom,\n): IMergeTreeOp | undefined => {\n\tconst text = client.longClientId!.repeat(random.integer(1, 3));\n\tlet pos = random.integer(0, client.getLength());\n\tconst endpoints = posInField(client, pos);\n\tif (endpoints !== undefined) {\n\t\tpos = 0;\n\t}\n\treturn client.insertTextLocal(pos, text);\n};\n"]}
|
|
@@ -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 \"node:assert\";\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport {\n\tMarker,\n\tSegmentGroup,\n\treservedMarkerIdKey,\n\ttype ISegmentPrivate,\n} 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()!, false),\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()!, false),\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\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\tfalse,\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()!, false),\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\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\tfalse,\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()!, false),\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<ISegmentPrivate>(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\tfalse,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } =\n\t\t\t\totherClient.getContainingSegment<ISegmentPrivate>(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\tfalse,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } =\n\t\t\t\totherClient.getContainingSegment<ISegmentPrivate>(0) ?? {};\n\t\t\tassert(otherSegment !== undefined && TextSegment.is(otherSegment));\n\t\t\tassert.deepStrictEqual(otherSegment.properties, clone({ prop1: \"foo\" }));\n\t\t});\n\n\t\tit(\"for text segments with no initial properties\", () => {\n\t\t\tconst insertOp = client.insertTextLocal(0, \"abc\");\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\tfalse,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } =\n\t\t\t\totherClient.getContainingSegment<ISegmentPrivate>(0) ?? {};\n\t\t\tassert(otherSegment !== undefined && TextSegment.is(otherSegment));\n\t\t\tassert.deepStrictEqual(otherSegment.properties, undefined);\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, false),\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"]}
|
|
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 type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport {\n\tMarker,\n\ttype SegmentGroup,\n\treservedMarkerIdKey,\n\ttype ISegmentPrivate,\n} from \"../mergeTreeNodes.js\";\nimport { type 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()!, false),\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()!, false),\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\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\tfalse,\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()!, false),\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\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\tfalse,\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()!, false),\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<ISegmentPrivate>(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\tfalse,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } =\n\t\t\t\totherClient.getContainingSegment<ISegmentPrivate>(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\tfalse,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } =\n\t\t\t\totherClient.getContainingSegment<ISegmentPrivate>(0) ?? {};\n\t\t\tassert(otherSegment !== undefined && TextSegment.is(otherSegment));\n\t\t\tassert.deepStrictEqual(otherSegment.properties, clone({ prop1: \"foo\" }));\n\t\t});\n\n\t\tit(\"for text segments with no initial properties\", () => {\n\t\t\tconst insertOp = client.insertTextLocal(0, \"abc\");\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\tfalse,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } =\n\t\t\t\totherClient.getContainingSegment<ISegmentPrivate>(0) ?? {};\n\t\t\tassert(otherSegment !== undefined && TextSegment.is(otherSegment));\n\t\t\tassert.deepStrictEqual(otherSegment.properties, undefined);\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, false),\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"]}
|
|
@@ -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 { strict as 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 { SegmentGroup, type ISegmentPrivate } 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: { mergeTreeEnableAnnotateAdjust: true },\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: ISegmentPrivate) => {\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
|
+
{"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 { strict as assert } from \"node:assert\";\n\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeDeltaOpArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport type { SegmentGroup, ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport {\n\ttype MergeTreeDeltaRevertible,\n\ttype MergeTreeWithRevert,\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: { mergeTreeEnableAnnotateAdjust: true },\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: ISegmentPrivate) => {\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"]}
|