@fluidframework/merge-tree 2.1.0-276985 → 2.1.0-281041
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.cjs +2 -4
- package/README.md +109 -1
- package/api-extractor/api-extractor.current.json +5 -0
- package/api-extractor/api-extractor.legacy.json +1 -1
- package/api-extractor.json +1 -1
- package/api-report/merge-tree.legacy.alpha.api.md +10 -22
- package/api-report/merge-tree.legacy.public.api.md +9 -0
- package/dist/MergeTreeTextHelper.d.ts.map +1 -1
- package/dist/MergeTreeTextHelper.js +1 -1
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionCollection.d.ts.map +1 -1
- package/dist/attributionCollection.js +65 -17
- package/dist/attributionCollection.js.map +1 -1
- package/dist/attributionPolicy.d.ts +2 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +10 -3
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +3 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +65 -37
- package/dist/client.js.map +1 -1
- package/dist/collections/list.d.ts.map +1 -1
- package/dist/collections/list.js +5 -2
- package/dist/collections/list.js.map +1 -1
- package/dist/collections/rbTree.d.ts +2 -2
- package/dist/collections/rbTree.d.ts.map +1 -1
- package/dist/collections/rbTree.js +23 -35
- package/dist/collections/rbTree.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js +4 -1
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/legacy.d.ts +1 -1
- package/dist/localReference.d.ts +16 -6
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +31 -20
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +0 -1
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +127 -112
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js +1 -1
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +6 -5
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +29 -20
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.js +3 -3
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.d.ts +6 -1
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js +5 -0
- package/dist/opBuilder.js.map +1 -1
- package/dist/ops.d.ts.map +1 -1
- package/dist/ops.js.map +1 -1
- package/dist/ordinal.d.ts.map +1 -1
- package/dist/ordinal.js +7 -0
- package/dist/ordinal.js.map +1 -1
- package/dist/partialLengths.d.ts +4 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +101 -53
- package/dist/partialLengths.js.map +1 -1
- package/dist/perspective.d.ts +4 -1
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js +7 -6
- package/dist/perspective.js.map +1 -1
- package/dist/properties.d.ts +13 -10
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +22 -11
- package/dist/properties.js.map +1 -1
- package/dist/public.d.ts +1 -1
- package/dist/referencePositions.d.ts +7 -0
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +7 -0
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.d.ts +6 -0
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +50 -21
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +2 -0
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +7 -3
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js +20 -15
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/snapshotChunks.d.ts.map +1 -1
- package/dist/snapshotChunks.js +10 -5
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +14 -10
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +20 -8
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +4 -2
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js +8 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/sortedSet.d.ts.map +1 -1
- package/dist/sortedSet.js +4 -0
- package/dist/sortedSet.js.map +1 -1
- package/dist/test/Insertion.perf.spec.js.map +1 -1
- package/dist/test/Removal.perf.spec.js.map +1 -1
- package/dist/test/Snapshot.perf.spec.js +1 -0
- package/dist/test/Snapshot.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.perf.spec.js +3 -1
- package/dist/test/attributionCollection.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.spec.js +69 -68
- package/dist/test/attributionCollection.spec.js.map +1 -1
- package/dist/test/attributionPolicy.spec.js +29 -27
- package/dist/test/attributionPolicy.spec.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts +1 -4
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +32 -30
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js +5 -5
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.apis.spec.d.ts.map +1 -1
- package/dist/test/client.apis.spec.js +5 -7
- package/dist/test/client.apis.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +125 -103
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.js +18 -10
- package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.js +13 -8
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.conflictFarm.spec.js +4 -2
- package/dist/test/client.conflictFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +10 -10
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +111 -104
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js +14 -10
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.rebasePosition.spec.js +12 -12
- package/dist/test/client.rebasePosition.spec.js.map +1 -1
- package/dist/test/client.reconnectFarm.spec.js +12 -9
- package/dist/test/client.reconnectFarm.spec.js.map +1 -1
- package/dist/test/client.replay.spec.js +11 -10
- package/dist/test/client.replay.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js +87 -84
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/client.rollbackFarm.spec.js +3 -1
- package/dist/test/client.rollbackFarm.spec.js.map +1 -1
- package/dist/test/client.searchForMarker.spec.js +122 -112
- package/dist/test/client.searchForMarker.spec.js.map +1 -1
- package/dist/test/client.walkSegments.spec.js +7 -7
- package/dist/test/client.walkSegments.spec.js.map +1 -1
- package/dist/test/collections.list.spec.js +14 -14
- package/dist/test/collections.list.spec.js.map +1 -1
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js +3 -3
- package/dist/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/dist/test/dirname.cjs +1 -0
- package/dist/test/dirname.cjs.map +1 -1
- package/dist/test/dirname.d.cts.map +1 -1
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js +7 -7
- package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +87 -87
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insert.deltaCallback.spec.js +6 -6
- package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +24 -24
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +6 -6
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +23 -23
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js +3 -3
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTree.zamboni.spec.js +10 -10
- package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +28 -16
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.spec.js +9 -5
- package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/dist/test/obliterate.concurrent.spec.js +165 -165
- package/dist/test/obliterate.concurrent.spec.js.map +1 -1
- package/dist/test/obliterate.deltaCallback.spec.js +20 -21
- package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/dist/test/obliterate.partialLength.spec.js +7 -7
- package/dist/test/obliterate.partialLength.spec.js.map +1 -1
- package/dist/test/obliterate.reconnect.spec.js +13 -13
- package/dist/test/obliterate.reconnect.spec.js.map +1 -1
- package/dist/test/obliterate.spec.js +9 -9
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/ordinal.spec.js +10 -4
- package/dist/test/ordinal.spec.js.map +1 -1
- package/dist/test/partialLength.spec.js.map +1 -1
- package/dist/test/properties.spec.js +15 -15
- package/dist/test/properties.spec.js.map +1 -1
- package/dist/test/reconnectHelper.d.ts +4 -4
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js +28 -20
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js +35 -29
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js +11 -10
- package/dist/test/revertibleFarm.spec.js.map +1 -1
- package/dist/test/revertibles.spec.d.ts.map +1 -1
- package/dist/test/revertibles.spec.js +96 -57
- package/dist/test/revertibles.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +17 -17
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.spec.js +5 -5
- package/dist/test/snapshot.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js +6 -6
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/snapshotlegacy.spec.js +18 -13
- package/dist/test/snapshotlegacy.spec.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +22 -18
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +6 -5
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +30 -32
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +39 -38
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testSerializer.d.ts +5 -5
- package/dist/test/testSerializer.d.ts.map +1 -1
- package/dist/test/testSerializer.js +0 -1
- package/dist/test/testSerializer.js.map +1 -1
- package/dist/test/testServer.d.ts.map +1 -1
- package/dist/test/testServer.js.map +1 -1
- package/dist/test/testUtils.d.ts +1 -1
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +15 -17
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js +1 -1
- package/dist/test/text.js.map +1 -1
- package/dist/test/tracking.spec.js +50 -46
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/wordUnitTests.spec.d.ts.map +1 -1
- package/dist/test/wordUnitTests.spec.js +10 -10
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/textSegment.d.ts +1 -1
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js +3 -3
- package/dist/textSegment.js.map +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js +7 -2
- package/dist/zamboni.js.map +1 -1
- package/internal.d.ts +1 -1
- package/legacy.d.ts +1 -1
- package/lib/MergeTreeTextHelper.d.ts.map +1 -1
- package/lib/MergeTreeTextHelper.js +1 -1
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/attributionCollection.d.ts.map +1 -1
- package/lib/attributionCollection.js +65 -17
- package/lib/attributionCollection.js.map +1 -1
- package/lib/attributionPolicy.d.ts +2 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js +10 -3
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +3 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +65 -37
- package/lib/client.js.map +1 -1
- package/lib/collections/list.d.ts.map +1 -1
- package/lib/collections/list.js +5 -2
- package/lib/collections/list.js.map +1 -1
- package/lib/collections/rbTree.d.ts +2 -2
- package/lib/collections/rbTree.d.ts.map +1 -1
- package/lib/collections/rbTree.js +23 -35
- package/lib/collections/rbTree.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js +4 -1
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/localReference.d.ts +16 -6
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +31 -20
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +0 -1
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +127 -112
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js +1 -1
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +6 -5
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +29 -20
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/mergeTreeTracking.js +3 -3
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/opBuilder.d.ts +6 -1
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js +5 -0
- package/lib/opBuilder.js.map +1 -1
- package/lib/ops.d.ts.map +1 -1
- package/lib/ops.js.map +1 -1
- package/lib/ordinal.d.ts.map +1 -1
- package/lib/ordinal.js +7 -0
- package/lib/ordinal.js.map +1 -1
- package/lib/partialLengths.d.ts +4 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +101 -53
- package/lib/partialLengths.js.map +1 -1
- package/lib/perspective.d.ts +4 -1
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js +7 -6
- package/lib/perspective.js.map +1 -1
- package/lib/properties.d.ts +13 -10
- package/lib/properties.d.ts.map +1 -1
- package/lib/properties.js +22 -11
- package/lib/properties.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/referencePositions.d.ts +7 -0
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +7 -0
- package/lib/referencePositions.js.map +1 -1
- package/lib/revertibles.d.ts +6 -0
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +50 -21
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +2 -0
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts +7 -3
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js +20 -15
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/snapshotChunks.d.ts.map +1 -1
- package/lib/snapshotChunks.js +10 -5
- package/lib/snapshotChunks.js.map +1 -1
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +14 -10
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +20 -8
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +4 -2
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js +8 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/sortedSet.d.ts.map +1 -1
- package/lib/sortedSet.js +4 -0
- package/lib/sortedSet.js.map +1 -1
- package/lib/test/Insertion.perf.spec.js.map +1 -1
- package/lib/test/Removal.perf.spec.js.map +1 -1
- package/lib/test/Snapshot.perf.spec.js +1 -0
- package/lib/test/Snapshot.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.perf.spec.js +3 -1
- package/lib/test/attributionCollection.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.spec.js +3 -2
- package/lib/test/attributionCollection.spec.js.map +1 -1
- package/lib/test/attributionPolicy.spec.js +3 -1
- package/lib/test/attributionPolicy.spec.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts +1 -4
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +26 -24
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js +1 -1
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.apis.spec.d.ts.map +1 -1
- package/lib/test/client.apis.spec.js +4 -6
- package/lib/test/client.apis.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +72 -50
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.js +18 -10
- package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.js +12 -7
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.conflictFarm.spec.js +4 -2
- package/lib/test/client.conflictFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js +1 -1
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +14 -7
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js +13 -9
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.rebasePosition.spec.js +1 -1
- package/lib/test/client.rebasePosition.spec.js.map +1 -1
- package/lib/test/client.reconnectFarm.spec.js +11 -8
- package/lib/test/client.reconnectFarm.spec.js.map +1 -1
- package/lib/test/client.replay.spec.js +8 -7
- package/lib/test/client.replay.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +14 -11
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/client.rollbackFarm.spec.js +3 -1
- package/lib/test/client.rollbackFarm.spec.js.map +1 -1
- package/lib/test/client.searchForMarker.spec.js +29 -19
- package/lib/test/client.searchForMarker.spec.js.map +1 -1
- package/lib/test/client.walkSegments.spec.js +1 -1
- package/lib/test/client.walkSegments.spec.js.map +1 -1
- package/lib/test/collections.list.spec.js +1 -1
- package/lib/test/collections.list.spec.js.map +1 -1
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js +1 -1
- package/lib/test/createInsertOnlyAttributionPolicy.spec.js.map +1 -1
- package/lib/test/dirname.cjs +1 -0
- package/lib/test/dirname.cjs.map +1 -1
- package/lib/test/dirname.d.cts.map +1 -1
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +1 -1
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.insert.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js +8 -8
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js +1 -1
- package/lib/test/mergeTree.walk.spec.js.map +1 -1
- package/lib/test/mergeTree.zamboni.spec.js +1 -1
- package/lib/test/mergeTree.zamboni.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +27 -15
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.spec.js +5 -1
- package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/lib/test/obliterate.concurrent.spec.js +4 -4
- package/lib/test/obliterate.concurrent.spec.js.map +1 -1
- package/lib/test/obliterate.deltaCallback.spec.js +2 -3
- package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/lib/test/obliterate.partialLength.spec.js +1 -1
- package/lib/test/obliterate.partialLength.spec.js.map +1 -1
- package/lib/test/obliterate.reconnect.spec.js +1 -1
- package/lib/test/obliterate.reconnect.spec.js.map +1 -1
- package/lib/test/obliterate.spec.js +1 -1
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/ordinal.spec.js +7 -1
- package/lib/test/ordinal.spec.js.map +1 -1
- package/lib/test/partialLength.spec.js.map +1 -1
- package/lib/test/properties.spec.js +1 -1
- package/lib/test/properties.spec.js.map +1 -1
- package/lib/test/reconnectHelper.d.ts +4 -4
- package/lib/test/reconnectHelper.d.ts.map +1 -1
- package/lib/test/reconnectHelper.js +22 -14
- package/lib/test/reconnectHelper.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js +8 -2
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/revertibleFarm.spec.js +8 -7
- package/lib/test/revertibleFarm.spec.js.map +1 -1
- package/lib/test/revertibles.spec.d.ts.map +1 -1
- package/lib/test/revertibles.spec.js +93 -54
- package/lib/test/revertibles.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js +1 -1
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.spec.js +1 -1
- package/lib/test/snapshot.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/snapshotlegacy.spec.js +10 -5
- package/lib/test/snapshotlegacy.spec.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js +6 -2
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +6 -5
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +25 -27
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +37 -36
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testSerializer.d.ts +5 -5
- package/lib/test/testSerializer.d.ts.map +1 -1
- package/lib/test/testSerializer.js +0 -1
- package/lib/test/testSerializer.js.map +1 -1
- package/lib/test/testServer.d.ts.map +1 -1
- package/lib/test/testServer.js.map +1 -1
- package/lib/test/testUtils.d.ts +1 -1
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +6 -8
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js +1 -1
- package/lib/test/text.js.map +1 -1
- package/lib/test/tracking.spec.js +9 -5
- package/lib/test/tracking.spec.js.map +1 -1
- package/lib/test/wordUnitTests.spec.d.ts.map +1 -1
- package/lib/test/wordUnitTests.spec.js +9 -9
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/textSegment.d.ts +1 -1
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js +3 -3
- package/lib/textSegment.js.map +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js +7 -2
- package/lib/zamboni.js.map +1 -1
- package/package.json +29 -27
- package/src/MergeTreeTextHelper.ts +2 -2
- package/src/attributionCollection.ts +71 -28
- package/src/attributionPolicy.ts +14 -9
- package/src/client.ts +120 -71
- package/src/collections/list.ts +9 -6
- package/src/collections/rbTree.ts +62 -71
- package/src/endOfTreeSegment.ts +21 -10
- package/src/localReference.ts +61 -43
- package/src/mergeTree.ts +229 -178
- package/src/mergeTreeNodeWalk.ts +2 -1
- package/src/mergeTreeNodes.ts +59 -46
- package/src/mergeTreeTracking.ts +3 -3
- package/src/opBuilder.ts +6 -1
- package/src/ops.ts +5 -0
- package/src/ordinal.ts +8 -1
- package/src/partialLengths.ts +143 -87
- package/src/perspective.ts +10 -7
- package/src/properties.ts +36 -18
- package/src/referencePositions.ts +7 -0
- package/src/revertibles.ts +71 -41
- package/src/segmentGroupCollection.ts +8 -6
- package/src/segmentPropertiesManager.ts +28 -24
- package/src/snapshotChunks.ts +12 -7
- package/src/snapshotLoader.ts +20 -17
- package/src/snapshotV1.ts +36 -18
- package/src/snapshotlegacy.ts +7 -5
- package/src/sortedSegmentSet.ts +9 -3
- package/src/sortedSet.ts +7 -3
- package/src/textSegment.ts +9 -9
- package/src/zamboni.ts +14 -10
- package/tsconfig.json +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributionCollection.spec.js","sourceRoot":"","sources":["../../src/test/attributionCollection.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\n\nimport {\n\tGenerator,\n\tIRandom,\n\tcreateWeightedGenerator,\n\tmakeRandom,\n\tperformFuzzActions,\n\ttake,\n} from \"@fluid-private/stochastic-test-utils\";\nimport { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport {\n\tAttributionCollection,\n\tSerializedAttributionCollection,\n} from \"../attributionCollection.js\";\nimport { BaseSegment, ISegment } from \"../mergeTreeNodes.js\";\n\nconst opKey = (seq: number): AttributionKey => ({ type: \"op\", seq });\nconst detachedKey: AttributionKey = { type: \"detached\", id: 0 };\n\ndescribe(\"AttributionCollection\", () => {\n\tconst makeCollectionWithChannel = ({ length, seq }: { length: number; seq: number }) => {\n\t\tconst collection = new AttributionCollection(length, null);\n\t\tcollection.update(\"foo\", new AttributionCollection(length, opKey(seq)));\n\t\treturn collection;\n\t};\n\n\tdescribe(\".getAtOffset\", () => {\n\t\tdescribe(\"on a collection with a single entry\", () => {\n\t\t\tconst collection = new AttributionCollection(5, opKey(100));\n\n\t\t\tit(\"returns the entry for offsets within the length range\", () => {\n\t\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\t\tassert.deepEqual(collection.getAtOffset(i), opKey(100));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"throws for queries outside the range\", () => {\n\t\t\t\tassert.throws(() => collection.getAtOffset(-1));\n\t\t\t\tassert.throws(() => collection.getAtOffset(5));\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"on a collection with multiple entries\", () => {\n\t\t\tconst collection = new AttributionCollection(3, opKey(100));\n\t\t\tcollection.append(new AttributionCollection(5, opKey(101)));\n\t\t\tit(\"returns the correct entries\", () => {\n\t\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\t\tassert.deepEqual(collection.getAtOffset(i), opKey(100));\n\t\t\t\t}\n\n\t\t\t\tfor (let i = 3; i < 8; i++) {\n\t\t\t\t\tassert.deepEqual(collection.getAtOffset(i), opKey(101));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tit(\"works on collections with entries in channels\", () => {\n\t\t\tconst collection = makeCollectionWithChannel({ length: 3, seq: 300 });\n\t\t\tfor (const offset of [0, 1, 2]) {\n\t\t\t\tassert.deepEqual(collection.getAtOffset(offset, \"foo\"), opKey(300));\n\t\t\t}\n\t\t});\n\t});\n\n\tdescribe(\".getKeysInOffsetRange\", () => {\n\t\tdescribe(\"on a collection with a single entry\", () => {\n\t\t\tconst collection = new AttributionCollection(5, opKey(100));\n\n\t\t\tit(\"returns the entry for offsets within the length range\", () => {\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(1),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"first\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(4),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"second\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(1, 4),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"third\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(0, 4),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"fourth\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"throws for queries outside the range\", () => {\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(-1));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(7));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(0, -1));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(1, 7));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(2, 1));\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"on a collection with multiple entries\", () => {\n\t\t\tconst collection = new AttributionCollection(10, opKey(10));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(20)));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(30)));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(40)));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(50)));\n\n\t\t\tit(\"returns the correct entries\", () => {\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 25), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 19), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 49), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t\t{ offset: 30, key: { type: \"op\", seq: 40 } },\n\t\t\t\t\t{ offset: 40, key: { type: \"op\", seq: 50 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 40), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t\t{ offset: 30, key: { type: \"op\", seq: 40 } },\n\t\t\t\t\t{ offset: 40, key: { type: \"op\", seq: 50 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(0), [\n\t\t\t\t\t{ offset: 0, key: { type: \"op\", seq: 10 } },\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t\t{ offset: 30, key: { type: \"op\", seq: 40 } },\n\t\t\t\t\t{ offset: 40, key: { type: \"op\", seq: 50 } },\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\n\t\tit(\"works on collections with entries in channels\", () => {\n\t\t\tconst collection = makeCollectionWithChannel({ length: 3, seq: 300 });\n\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(1, undefined, \"foo\"), [\n\t\t\t\t{ offset: 0, key: opKey(300) },\n\t\t\t]);\n\t\t});\n\t});\n\n\tdescribe(\".splitAt\", () => {\n\t\tdescribe(\"on a collection with 3 entries\", () => {\n\t\t\tlet collection: AttributionCollection;\n\t\t\tbeforeEach(() => {\n\t\t\t\tcollection = new AttributionCollection(3, opKey(100));\n\t\t\t\tcollection.append(new AttributionCollection(2, opKey(101)));\n\t\t\t\tcollection.append(new AttributionCollection(1, opKey(102)));\n\t\t\t});\n\n\t\t\tit(\"can split on non-breakpoints\", () => {\n\t\t\t\tconst splitCollection = collection.splitAt(4);\n\t\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t\t{ offset: 3, key: opKey(101) },\n\t\t\t\t]);\n\t\t\t\tassert.equal(collection.length, 4);\n\t\t\t\tassert.deepEqual(splitCollection.getAll().root, [\n\t\t\t\t\t{ offset: 0, key: opKey(101) },\n\t\t\t\t\t{ offset: 1, key: opKey(102) },\n\t\t\t\t]);\n\t\t\t\tassert.equal(splitCollection.length, 2);\n\t\t\t});\n\n\t\t\tit(\"can split on breakpoints\", () => {\n\t\t\t\tconst splitCollection = collection.splitAt(5);\n\t\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t\t{ offset: 3, key: opKey(101) },\n\t\t\t\t]);\n\t\t\t\tassert.equal(collection.length, 5);\n\t\t\t\tassert.deepEqual(splitCollection.getAll().root, [{ offset: 0, key: opKey(102) }]);\n\t\t\t\tassert.equal(splitCollection.length, 1);\n\t\t\t});\n\t\t});\n\n\t\tit(\"can split collection with a single value\", () => {\n\t\t\tconst collection = new AttributionCollection(5, opKey(100));\n\t\t\tconst splitCollection = collection.splitAt(3);\n\t\t\tassert.equal(collection.length, 3);\n\t\t\tassert.equal(splitCollection.length, 2);\n\t\t\tassert.deepEqual(collection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t\tassert.deepEqual(splitCollection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t});\n\n\t\tit(\"splits channels\", () => {\n\t\t\tconst collection = new AttributionCollection(5, null);\n\t\t\tcollection.update(\"foo\", new AttributionCollection(5, opKey(100)));\n\t\t\tconst splitCollection = collection.splitAt(2);\n\t\t\tassert.deepEqual(collection.getAll().channels, {\n\t\t\t\tfoo: [{ offset: 0, key: opKey(100) }],\n\t\t\t});\n\t\t\tassert.deepEqual(splitCollection.getAll().channels, {\n\t\t\t\tfoo: [{ offset: 0, key: opKey(100) }],\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\".append\", () => {\n\t\tit(\"modifies the receiving collection\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tassert.deepEqual(collection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t\tcollection.append(new AttributionCollection(1, opKey(101)));\n\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t{ offset: 2, key: opKey(101) },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"does not modify the argument collection\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tconst appendedCollection = new AttributionCollection(1, opKey(101));\n\t\t\tassert.deepEqual(appendedCollection.getAll().root, [{ offset: 0, key: opKey(101) }]);\n\t\t\tcollection.append(appendedCollection);\n\t\t\tassert.deepEqual(appendedCollection.getAll().root, [{ offset: 0, key: opKey(101) }]);\n\t\t});\n\n\t\tit(\"coalesces referentially equal values at the join point\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tcollection.append(new AttributionCollection(7, opKey(100)));\n\t\t\tassert.deepEqual(collection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t\tassert.equal(collection.length, 9);\n\t\t});\n\n\t\tdescribe(\"appends channels\", () => {\n\t\t\tit(\"when both collections have the channel\", () => {\n\t\t\t\tconst appender = makeCollectionWithChannel({ length: 2, seq: 100 });\n\t\t\t\tappender.append(makeCollectionWithChannel({ length: 5, seq: 200 }));\n\t\t\t\tassert.deepEqual(appender.getAll(), {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\troot: [{ offset: 0, key: null }],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tkey: opKey(100),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 2,\n\t\t\t\t\t\t\t\tkey: opKey(200),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(\"when only appended collection has a channel\", () => {\n\t\t\t\tconst appender = new AttributionCollection(2, null);\n\t\t\t\tappender.append(makeCollectionWithChannel({ length: 5, seq: 200 }));\n\t\t\t\tassert.deepEqual(appender.getAll(), {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\troot: [{ offset: 0, key: null }],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tkey: null,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 2,\n\t\t\t\t\t\t\t\tkey: opKey(200),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(\"when only segment being appended to has a channel\", () => {\n\t\t\t\tconst appender = makeCollectionWithChannel({ length: 2, seq: 100 });\n\t\t\t\tappender.append(new AttributionCollection(5, null));\n\t\t\t\tassert.deepEqual(appender.getAll(), {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\troot: [{ offset: 0, key: null }],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tkey: opKey(100),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 2,\n\t\t\t\t\t\t\t\tkey: null,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\".channelNames\", () => {\n\t\tit(\"is empty when collection has no channels\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tassert.deepEqual(collection.channelNames, []);\n\t\t});\n\n\t\tit(\"returns all channels with content for collection with channels\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2));\n\t\t\tcollection.update(\"bar\", new AttributionCollection(2));\n\t\t\tassert.deepEqual(collection.channelNames, [\"foo\", \"bar\"]);\n\t\t});\n\t});\n\n\tdescribe(\".populateAttributionCollections\", () => {\n\t\tit(\"correctly splits segment boundaries on breakpoints\", () => {\n\t\t\tconst segments = [{ cachedLength: 5 }, { cachedLength: 4 }] as ISegment[];\n\t\t\tAttributionCollection.populateAttributionCollections(segments, {\n\t\t\t\tlength: 9,\n\t\t\t\tposBreakpoints: [0, 2, 5, 7],\n\t\t\t\tseqs: [10, 12, 15, 17],\n\t\t\t});\n\t\t\tassert.deepEqual(segments[0].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(10) },\n\t\t\t\t{ offset: 2, key: opKey(12) },\n\t\t\t]);\n\n\t\t\tassert.deepEqual(segments[1].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(15) },\n\t\t\t\t{ offset: 2, key: opKey(17) },\n\t\t\t]);\n\n\t\t\tfor (const segment of segments) {\n\t\t\t\tassert.equal(segment.attribution?.length, segment.cachedLength);\n\t\t\t}\n\t\t});\n\n\t\tit(\"correctly splits segment boundaries between breakpoints\", () => {\n\t\t\tconst segments = [{ cachedLength: 4 }, { cachedLength: 5 }] as ISegment[];\n\t\t\tAttributionCollection.populateAttributionCollections(segments, {\n\t\t\t\tlength: 9,\n\t\t\t\tposBreakpoints: [0, 2, 5, 7],\n\t\t\t\tseqs: [10, 12, 15, 17],\n\t\t\t});\n\t\t\tassert.deepEqual(segments[0].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(10) },\n\t\t\t\t{ offset: 2, key: opKey(12) },\n\t\t\t]);\n\n\t\t\tassert.deepEqual(segments[1].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(12) },\n\t\t\t\t{ offset: 1, key: opKey(15) },\n\t\t\t\t{ offset: 3, key: opKey(17) },\n\t\t\t]);\n\n\t\t\tfor (const segment of segments) {\n\t\t\t\tassert.equal(segment.attribution?.length, segment.cachedLength);\n\t\t\t}\n\t\t});\n\t});\n\n\tdescribe(\"serializeAttributionCollections\", () => {\n\t\tit(\"combines equal values on endpoints\", () => {\n\t\t\tconst segments = [\n\t\t\t\t{\n\t\t\t\t\tattribution: new AttributionCollection(4, opKey(0)),\n\t\t\t\t\tcachedLength: 4,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tattribution: new AttributionCollection(5, opKey(0)),\n\t\t\t\t\tcachedLength: 5,\n\t\t\t\t},\n\t\t\t] as unknown as ISegment[];\n\t\t\tconst blob = AttributionCollection.serializeAttributionCollections(segments);\n\t\t\tassert.deepEqual(blob, {\n\t\t\t\tposBreakpoints: [0],\n\t\t\t\tseqs: [0],\n\t\t\t\tlength: 9,\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"serializeAttributionCollections and populateAttributionCollections round-trip\", () => {\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst seg = (length: number): ISegment => ({ cachedLength: length }) as ISegment;\n\t\tconst testCases: {\n\t\t\tname: string;\n\t\t\tblob: SerializedAttributionCollection;\n\t\t\tsegments: ISegment[];\n\t\t}[] = [\n\t\t\t{\n\t\t\t\tname: \"single key\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 3,\n\t\t\t\t\tposBreakpoints: [0],\n\t\t\t\t\tseqs: [51],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"several keys on a single segment\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 1, 3, 5],\n\t\t\t\t\tseqs: [1, 2, 3, 4],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(7)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"key spanning multiple segments\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0],\n\t\t\t\t\tseqs: [1],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"key and segment boundary that align\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 3],\n\t\t\t\t\tseqs: [0, 1],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"detached attribution keys\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 3],\n\t\t\t\t\tseqs: [1, detachedKey],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"entry with channels\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 5],\n\t\t\t\t\tseqs: [3, null],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: {\n\t\t\t\t\t\t\tposBreakpoints: [0, 3, 5],\n\t\t\t\t\t\t\tseqs: [4, null, 5],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t];\n\n\t\tfor (const { name, blob, segments } of testCases) {\n\t\t\tit(name, () => {\n\t\t\t\tAttributionCollection.populateAttributionCollections(segments, blob);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tAttributionCollection.serializeAttributionCollections(segments),\n\t\t\t\t\tblob,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t});\n\n\tdescribe(\".clone\", () => {\n\t\tit(\"copies the original collection\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tconst appendedCollection = new AttributionCollection(1, opKey(101));\n\t\t\tconst copy = collection.clone();\n\t\t\tcollection.append(appendedCollection);\n\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t{ offset: 2, key: opKey(101) },\n\t\t\t]);\n\t\t\tassert.deepEqual(copy.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t});\n\n\t\tit(\"copies channels\", () => {\n\t\t\tconst collection = makeCollectionWithChannel({ length: 2, seq: 25 });\n\t\t\tconst appendedCollection = makeCollectionWithChannel({ length: 3, seq: 26 });\n\t\t\tconst copy = collection.clone();\n\t\t\tcollection.append(appendedCollection);\n\t\t\tassert.deepEqual(collection.getAll().channels?.foo, [\n\t\t\t\t{ offset: 0, key: opKey(25) },\n\t\t\t\t{ offset: 2, key: opKey(26) },\n\t\t\t]);\n\t\t\tassert.deepEqual(copy.getAll().channels?.foo, [{ offset: 0, key: opKey(25) }]);\n\t\t});\n\t});\n\n\tdescribe(\".update\", () => {\n\t\tlet collection: AttributionCollection;\n\t\tbeforeEach(() => {\n\t\t\tcollection = new AttributionCollection(2, null);\n\t\t\tcollection.update(\"bar\", new AttributionCollection(2, opKey(10)));\n\t\t\tassert.deepEqual(\n\t\t\t\tcollection.getAtOffset(0, \"foo\"),\n\t\t\t\tundefined,\n\t\t\t\t\"channel should be undefined on creation\",\n\t\t\t);\n\t\t});\n\n\t\tafterEach(() => {\n\t\t\tassert.deepEqual(\n\t\t\t\tcollection.getAtOffset(0, \"bar\"),\n\t\t\t\topKey(10),\n\t\t\t\t\"update should never modify unrelated channels\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"creates a new channel when updating from an undefined state\", () => {\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2, opKey(5)));\n\t\t\tassert.deepEqual(collection.getAtOffset(0, \"foo\"), opKey(5));\n\t\t});\n\n\t\tit(\"overrides earlier calls with later ones\", () => {\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2, opKey(3)));\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2, opKey(5)));\n\t\t\tassert.deepEqual(collection.getAtOffset(0, \"foo\"), opKey(5));\n\t\t});\n\n\t\tit(\"can update the root channel\", () => {\n\t\t\tcollection.update(undefined, new AttributionCollection(2, opKey(3)));\n\t\t\tassert.deepEqual(collection.getAtOffset(0), opKey(3));\n\t\t});\n\n\t\tit(\"doesn't tolerate updates to channels having inconsistent length fields\", () => {\n\t\t\tassert.throws(() => collection.update(\"foo\", new AttributionCollection(3, null)));\n\t\t});\n\t});\n\n\tdescribe(\"serialized structure is independent of segment lengths\", () => {\n\t\tinterface State {\n\t\t\trandom: IRandom;\n\t\t\tsegments: ISegment[];\n\t\t}\n\n\t\tinterface InsertAction {\n\t\t\ttype: \"insert\";\n\t\t\tcollection: AttributionCollection;\n\t\t}\n\n\t\tinterface SplitAction {\n\t\t\ttype: \"split\";\n\t\t\tsegIndex: number;\n\t\t\toffset: number;\n\t\t}\n\n\t\tinterface AppendAction {\n\t\t\ttype: \"append\";\n\t\t\tsegIndex: number;\n\t\t}\n\n\t\tclass Segment extends BaseSegment {\n\t\t\tpublic readonly type = \"testSeg\";\n\t\t\tpublic constructor(length: number) {\n\t\t\t\tsuper();\n\t\t\t\tthis.cachedLength = length;\n\t\t\t}\n\n\t\t\tpublic toJSONObject() {\n\t\t\t\treturn { length: this.cachedLength, props: this.properties };\n\t\t\t}\n\n\t\t\tpublic clone(): ISegment {\n\t\t\t\tconst seg = new Segment(this.cachedLength);\n\t\t\t\tthis.cloneInto(seg);\n\t\t\t\treturn seg;\n\t\t\t}\n\n\t\t\tprotected createSplitSegmentAt(pos: number): BaseSegment | undefined {\n\t\t\t\tif (pos > 0) {\n\t\t\t\t\tconst leafSegment = new Segment(this.cachedLength - pos);\n\t\t\t\t\tthis.cachedLength = pos;\n\t\t\t\t\treturn leafSegment;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (let seed = 0; seed < 10; seed++) {\n\t\t\tconst segmentCount = 100;\n\t\t\tit(`with randomly generated segments, seed ${seed}`, () => {\n\t\t\t\tconst generateAttributionKey = (random: IRandom): AttributionKey | null =>\n\t\t\t\t\trandom.bool(0.8) ? opKey(random.integer(0, 10)) : random.bool() ? detachedKey : null;\n\n\t\t\t\tconst channelNamePool = [\"ch1\", \"ch2\", \"ch3\"];\n\t\t\t\tconst insertGenerator: Generator<InsertAction, State> = take(\n\t\t\t\t\tsegmentCount,\n\t\t\t\t\t({ random }) => {\n\t\t\t\t\t\tconst length = random.integer(1, 20);\n\t\t\t\t\t\tconst collection = new AttributionCollection(\n\t\t\t\t\t\t\tlength,\n\t\t\t\t\t\t\tgenerateAttributionKey(random),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (random.bool(0.25)) {\n\t\t\t\t\t\t\tfor (const channel of channelNamePool) {\n\t\t\t\t\t\t\t\tif (random.bool()) {\n\t\t\t\t\t\t\t\t\tcollection.update(\n\t\t\t\t\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t\t\t\t\tnew AttributionCollection(length, generateAttributionKey(random)),\n\t\t\t\t\t\t\t\t\t);\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\treturn {\n\t\t\t\t\t\t\ttype: \"insert\",\n\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst initialState = performFuzzActions<InsertAction, State>(\n\t\t\t\t\tinsertGenerator,\n\t\t\t\t\t{\n\t\t\t\t\t\tinsert: (state, { collection }) => {\n\t\t\t\t\t\t\tconst { segments } = state;\n\t\t\t\t\t\t\tconst seg = new Segment(collection.length);\n\t\t\t\t\t\t\tseg.attribution = collection;\n\t\t\t\t\t\t\tsegments.push(seg);\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{ random: makeRandom(seed), segments: [] },\n\t\t\t\t);\n\n\t\t\t\tconst expected = AttributionCollection.serializeAttributionCollections(\n\t\t\t\t\tinitialState.segments,\n\t\t\t\t);\n\n\t\t\t\tconst split: Generator<SplitAction, State> = ({ segments, random }) => {\n\t\t\t\t\tconst validIndices = segments\n\t\t\t\t\t\t.map((seg, i) => (seg.cachedLength > 1 ? i : -1))\n\t\t\t\t\t\t.filter((i) => i >= 0);\n\n\t\t\t\t\tconst segIndex = random.pick(validIndices);\n\t\t\t\t\tconst offset = random.integer(1, segments[segIndex].cachedLength - 1);\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"split\",\n\t\t\t\t\t\tsegIndex,\n\t\t\t\t\t\toffset,\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tconst append: Generator<AppendAction, State> = ({ random, segments }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"append\",\n\t\t\t\t\t\tsegIndex: random.integer(0, segments.length - 2),\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tconst finalState = performFuzzActions<SplitAction | AppendAction, State>(\n\t\t\t\t\ttake(\n\t\t\t\t\t\tsegmentCount,\n\t\t\t\t\t\t// Note: if playing around with constants in this test, it may be necessary to\n\t\t\t\t\t\t// introduce acceptance criteria here for split.\n\t\t\t\t\t\tcreateWeightedGenerator<SplitAction | AppendAction, State>([\n\t\t\t\t\t\t\t[split, 1],\n\t\t\t\t\t\t\t[append, 1, ({ segments }) => segments.length > 1],\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\tsplit: (state, { segIndex, offset }) => {\n\t\t\t\t\t\t\tconst { segments } = state;\n\t\t\t\t\t\t\tconst splitSeg = segments[segIndex].splitAt(offset);\n\t\t\t\t\t\t\tassert(splitSeg !== undefined);\n\t\t\t\t\t\t\tsegments.splice(segIndex + 1, 0, splitSeg);\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tappend: (state, { segIndex }) => {\n\t\t\t\t\t\t\tconst { segments } = state;\n\t\t\t\t\t\t\tsegments[segIndex].append(segments[segIndex + 1]);\n\t\t\t\t\t\t\tsegments.splice(segIndex + 1, 1);\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tinitialState,\n\t\t\t\t);\n\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tAttributionCollection.serializeAttributionCollections(finalState.segments),\n\t\t\t\t\texpected,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"attributionCollection.spec.js","sourceRoot":"","sources":["../../src/test/attributionCollection.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 unicorn/no-null */\n\nimport { strict as assert } from \"node:assert\";\n\nimport {\n\tGenerator,\n\tIRandom,\n\tcreateWeightedGenerator,\n\tmakeRandom,\n\tperformFuzzActions,\n\ttake,\n} from \"@fluid-private/stochastic-test-utils\";\nimport { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport {\n\tAttributionCollection,\n\tSerializedAttributionCollection,\n} from \"../attributionCollection.js\";\nimport { BaseSegment, ISegment } from \"../mergeTreeNodes.js\";\nimport type { PropertySet } from \"../properties.js\";\n\nconst opKey = (seq: number): AttributionKey => ({ type: \"op\", seq });\nconst detachedKey: AttributionKey = { type: \"detached\", id: 0 };\n\ndescribe(\"AttributionCollection\", () => {\n\tconst makeCollectionWithChannel = ({\n\t\tlength,\n\t\tseq,\n\t}: {\n\t\tlength: number;\n\t\tseq: number;\n\t}): AttributionCollection => {\n\t\tconst collection = new AttributionCollection(length, null);\n\t\tcollection.update(\"foo\", new AttributionCollection(length, opKey(seq)));\n\t\treturn collection;\n\t};\n\n\tdescribe(\".getAtOffset\", () => {\n\t\tdescribe(\"on a collection with a single entry\", () => {\n\t\t\tconst collection = new AttributionCollection(5, opKey(100));\n\n\t\t\tit(\"returns the entry for offsets within the length range\", () => {\n\t\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\t\tassert.deepEqual(collection.getAtOffset(i), opKey(100));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tit(\"throws for queries outside the range\", () => {\n\t\t\t\tassert.throws(() => collection.getAtOffset(-1));\n\t\t\t\tassert.throws(() => collection.getAtOffset(5));\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"on a collection with multiple entries\", () => {\n\t\t\tconst collection = new AttributionCollection(3, opKey(100));\n\t\t\tcollection.append(new AttributionCollection(5, opKey(101)));\n\t\t\tit(\"returns the correct entries\", () => {\n\t\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\t\tassert.deepEqual(collection.getAtOffset(i), opKey(100));\n\t\t\t\t}\n\n\t\t\t\tfor (let i = 3; i < 8; i++) {\n\t\t\t\t\tassert.deepEqual(collection.getAtOffset(i), opKey(101));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tit(\"works on collections with entries in channels\", () => {\n\t\t\tconst collection = makeCollectionWithChannel({ length: 3, seq: 300 });\n\t\t\tfor (const offset of [0, 1, 2]) {\n\t\t\t\tassert.deepEqual(collection.getAtOffset(offset, \"foo\"), opKey(300));\n\t\t\t}\n\t\t});\n\t});\n\n\tdescribe(\".getKeysInOffsetRange\", () => {\n\t\tdescribe(\"on a collection with a single entry\", () => {\n\t\t\tconst collection = new AttributionCollection(5, opKey(100));\n\n\t\t\tit(\"returns the entry for offsets within the length range\", () => {\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(1),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"first\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(4),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"second\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(1, 4),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"third\",\n\t\t\t\t);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tcollection.getKeysInOffsetRange(0, 4),\n\t\t\t\t\t[{ offset: 0, key: opKey(100) }],\n\t\t\t\t\t\"fourth\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"throws for queries outside the range\", () => {\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(-1));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(7));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(0, -1));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(1, 7));\n\t\t\t\tassert.throws(() => collection.getKeysInOffsetRange(2, 1));\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"on a collection with multiple entries\", () => {\n\t\t\tconst collection = new AttributionCollection(10, opKey(10));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(20)));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(30)));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(40)));\n\t\t\tcollection.append(new AttributionCollection(10, opKey(50)));\n\n\t\t\tit(\"returns the correct entries\", () => {\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 25), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 19), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 49), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t\t{ offset: 30, key: { type: \"op\", seq: 40 } },\n\t\t\t\t\t{ offset: 40, key: { type: \"op\", seq: 50 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(15, 40), [\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t\t{ offset: 30, key: { type: \"op\", seq: 40 } },\n\t\t\t\t\t{ offset: 40, key: { type: \"op\", seq: 50 } },\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(0), [\n\t\t\t\t\t{ offset: 0, key: { type: \"op\", seq: 10 } },\n\t\t\t\t\t{ offset: 10, key: { type: \"op\", seq: 20 } },\n\t\t\t\t\t{ offset: 20, key: { type: \"op\", seq: 30 } },\n\t\t\t\t\t{ offset: 30, key: { type: \"op\", seq: 40 } },\n\t\t\t\t\t{ offset: 40, key: { type: \"op\", seq: 50 } },\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\n\t\tit(\"works on collections with entries in channels\", () => {\n\t\t\tconst collection = makeCollectionWithChannel({ length: 3, seq: 300 });\n\t\t\tassert.deepEqual(collection.getKeysInOffsetRange(1, undefined, \"foo\"), [\n\t\t\t\t{ offset: 0, key: opKey(300) },\n\t\t\t]);\n\t\t});\n\t});\n\n\tdescribe(\".splitAt\", () => {\n\t\tdescribe(\"on a collection with 3 entries\", () => {\n\t\t\tlet collection: AttributionCollection;\n\t\t\tbeforeEach(() => {\n\t\t\t\tcollection = new AttributionCollection(3, opKey(100));\n\t\t\t\tcollection.append(new AttributionCollection(2, opKey(101)));\n\t\t\t\tcollection.append(new AttributionCollection(1, opKey(102)));\n\t\t\t});\n\n\t\t\tit(\"can split on non-breakpoints\", () => {\n\t\t\t\tconst splitCollection = collection.splitAt(4);\n\t\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t\t{ offset: 3, key: opKey(101) },\n\t\t\t\t]);\n\t\t\t\tassert.equal(collection.length, 4);\n\t\t\t\tassert.deepEqual(splitCollection.getAll().root, [\n\t\t\t\t\t{ offset: 0, key: opKey(101) },\n\t\t\t\t\t{ offset: 1, key: opKey(102) },\n\t\t\t\t]);\n\t\t\t\tassert.equal(splitCollection.length, 2);\n\t\t\t});\n\n\t\t\tit(\"can split on breakpoints\", () => {\n\t\t\t\tconst splitCollection = collection.splitAt(5);\n\t\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t\t{ offset: 3, key: opKey(101) },\n\t\t\t\t]);\n\t\t\t\tassert.equal(collection.length, 5);\n\t\t\t\tassert.deepEqual(splitCollection.getAll().root, [{ offset: 0, key: opKey(102) }]);\n\t\t\t\tassert.equal(splitCollection.length, 1);\n\t\t\t});\n\t\t});\n\n\t\tit(\"can split collection with a single value\", () => {\n\t\t\tconst collection = new AttributionCollection(5, opKey(100));\n\t\t\tconst splitCollection = collection.splitAt(3);\n\t\t\tassert.equal(collection.length, 3);\n\t\t\tassert.equal(splitCollection.length, 2);\n\t\t\tassert.deepEqual(collection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t\tassert.deepEqual(splitCollection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t});\n\n\t\tit(\"splits channels\", () => {\n\t\t\tconst collection = new AttributionCollection(5, null);\n\t\t\tcollection.update(\"foo\", new AttributionCollection(5, opKey(100)));\n\t\t\tconst splitCollection = collection.splitAt(2);\n\t\t\tassert.deepEqual(collection.getAll().channels, {\n\t\t\t\tfoo: [{ offset: 0, key: opKey(100) }],\n\t\t\t});\n\t\t\tassert.deepEqual(splitCollection.getAll().channels, {\n\t\t\t\tfoo: [{ offset: 0, key: opKey(100) }],\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\".append\", () => {\n\t\tit(\"modifies the receiving collection\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tassert.deepEqual(collection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t\tcollection.append(new AttributionCollection(1, opKey(101)));\n\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t{ offset: 2, key: opKey(101) },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"does not modify the argument collection\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tconst appendedCollection = new AttributionCollection(1, opKey(101));\n\t\t\tassert.deepEqual(appendedCollection.getAll().root, [{ offset: 0, key: opKey(101) }]);\n\t\t\tcollection.append(appendedCollection);\n\t\t\tassert.deepEqual(appendedCollection.getAll().root, [{ offset: 0, key: opKey(101) }]);\n\t\t});\n\n\t\tit(\"coalesces referentially equal values at the join point\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tcollection.append(new AttributionCollection(7, opKey(100)));\n\t\t\tassert.deepEqual(collection.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t\tassert.equal(collection.length, 9);\n\t\t});\n\n\t\tdescribe(\"appends channels\", () => {\n\t\t\tit(\"when both collections have the channel\", () => {\n\t\t\t\tconst appender = makeCollectionWithChannel({ length: 2, seq: 100 });\n\t\t\t\tappender.append(makeCollectionWithChannel({ length: 5, seq: 200 }));\n\t\t\t\tassert.deepEqual(appender.getAll(), {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\troot: [{ offset: 0, key: null }],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tkey: opKey(100),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 2,\n\t\t\t\t\t\t\t\tkey: opKey(200),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(\"when only appended collection has a channel\", () => {\n\t\t\t\tconst appender = new AttributionCollection(2, null);\n\t\t\t\tappender.append(makeCollectionWithChannel({ length: 5, seq: 200 }));\n\t\t\t\tassert.deepEqual(appender.getAll(), {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\troot: [{ offset: 0, key: null }],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tkey: null,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 2,\n\t\t\t\t\t\t\t\tkey: opKey(200),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(\"when only segment being appended to has a channel\", () => {\n\t\t\t\tconst appender = makeCollectionWithChannel({ length: 2, seq: 100 });\n\t\t\t\tappender.append(new AttributionCollection(5, null));\n\t\t\t\tassert.deepEqual(appender.getAll(), {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\troot: [{ offset: 0, key: null }],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\t\tkey: opKey(100),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toffset: 2,\n\t\t\t\t\t\t\t\tkey: null,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\".channelNames\", () => {\n\t\tit(\"is empty when collection has no channels\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tassert.deepEqual(collection.channelNames, []);\n\t\t});\n\n\t\tit(\"returns all channels with content for collection with channels\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2));\n\t\t\tcollection.update(\"bar\", new AttributionCollection(2));\n\t\t\tassert.deepEqual(collection.channelNames, [\"foo\", \"bar\"]);\n\t\t});\n\t});\n\n\tdescribe(\".populateAttributionCollections\", () => {\n\t\tit(\"correctly splits segment boundaries on breakpoints\", () => {\n\t\t\tconst segments = [{ cachedLength: 5 }, { cachedLength: 4 }] as ISegment[];\n\t\t\tAttributionCollection.populateAttributionCollections(segments, {\n\t\t\t\tlength: 9,\n\t\t\t\tposBreakpoints: [0, 2, 5, 7],\n\t\t\t\tseqs: [10, 12, 15, 17],\n\t\t\t});\n\t\t\tassert.deepEqual(segments[0].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(10) },\n\t\t\t\t{ offset: 2, key: opKey(12) },\n\t\t\t]);\n\n\t\t\tassert.deepEqual(segments[1].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(15) },\n\t\t\t\t{ offset: 2, key: opKey(17) },\n\t\t\t]);\n\n\t\t\tfor (const segment of segments) {\n\t\t\t\tassert.equal(segment.attribution?.length, segment.cachedLength);\n\t\t\t}\n\t\t});\n\n\t\tit(\"correctly splits segment boundaries between breakpoints\", () => {\n\t\t\tconst segments = [{ cachedLength: 4 }, { cachedLength: 5 }] as ISegment[];\n\t\t\tAttributionCollection.populateAttributionCollections(segments, {\n\t\t\t\tlength: 9,\n\t\t\t\tposBreakpoints: [0, 2, 5, 7],\n\t\t\t\tseqs: [10, 12, 15, 17],\n\t\t\t});\n\t\t\tassert.deepEqual(segments[0].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(10) },\n\t\t\t\t{ offset: 2, key: opKey(12) },\n\t\t\t]);\n\n\t\t\tassert.deepEqual(segments[1].attribution?.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(12) },\n\t\t\t\t{ offset: 1, key: opKey(15) },\n\t\t\t\t{ offset: 3, key: opKey(17) },\n\t\t\t]);\n\n\t\t\tfor (const segment of segments) {\n\t\t\t\tassert.equal(segment.attribution?.length, segment.cachedLength);\n\t\t\t}\n\t\t});\n\t});\n\n\tdescribe(\"serializeAttributionCollections\", () => {\n\t\tit(\"combines equal values on endpoints\", () => {\n\t\t\tconst segments = [\n\t\t\t\t{\n\t\t\t\t\tattribution: new AttributionCollection(4, opKey(0)),\n\t\t\t\t\tcachedLength: 4,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tattribution: new AttributionCollection(5, opKey(0)),\n\t\t\t\t\tcachedLength: 5,\n\t\t\t\t},\n\t\t\t] as unknown as ISegment[];\n\t\t\tconst blob = AttributionCollection.serializeAttributionCollections(segments);\n\t\t\tassert.deepEqual(blob, {\n\t\t\t\tposBreakpoints: [0],\n\t\t\t\tseqs: [0],\n\t\t\t\tlength: 9,\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"serializeAttributionCollections and populateAttributionCollections round-trip\", () => {\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst seg = (length: number): ISegment => ({ cachedLength: length }) as ISegment;\n\t\tconst testCases: {\n\t\t\tname: string;\n\t\t\tblob: SerializedAttributionCollection;\n\t\t\tsegments: ISegment[];\n\t\t}[] = [\n\t\t\t{\n\t\t\t\tname: \"single key\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 3,\n\t\t\t\t\tposBreakpoints: [0],\n\t\t\t\t\tseqs: [51],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"several keys on a single segment\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 1, 3, 5],\n\t\t\t\t\tseqs: [1, 2, 3, 4],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(7)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"key spanning multiple segments\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0],\n\t\t\t\t\tseqs: [1],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"key and segment boundary that align\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 3],\n\t\t\t\t\tseqs: [0, 1],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"detached attribution keys\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 3],\n\t\t\t\t\tseqs: [1, detachedKey],\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"entry with channels\",\n\t\t\t\tblob: {\n\t\t\t\t\tlength: 7,\n\t\t\t\t\tposBreakpoints: [0, 5],\n\t\t\t\t\tseqs: [3, null],\n\t\t\t\t\tchannels: {\n\t\t\t\t\t\tfoo: {\n\t\t\t\t\t\t\tposBreakpoints: [0, 3, 5],\n\t\t\t\t\t\t\tseqs: [4, null, 5],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsegments: [seg(3), seg(4)],\n\t\t\t},\n\t\t];\n\n\t\tfor (const { name, blob, segments } of testCases) {\n\t\t\tit(name, () => {\n\t\t\t\tAttributionCollection.populateAttributionCollections(segments, blob);\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tAttributionCollection.serializeAttributionCollections(segments),\n\t\t\t\t\tblob,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t});\n\n\tdescribe(\".clone\", () => {\n\t\tit(\"copies the original collection\", () => {\n\t\t\tconst collection = new AttributionCollection(2, opKey(100));\n\t\t\tconst appendedCollection = new AttributionCollection(1, opKey(101));\n\t\t\tconst copy = collection.clone();\n\t\t\tcollection.append(appendedCollection);\n\t\t\tassert.deepEqual(collection.getAll().root, [\n\t\t\t\t{ offset: 0, key: opKey(100) },\n\t\t\t\t{ offset: 2, key: opKey(101) },\n\t\t\t]);\n\t\t\tassert.deepEqual(copy.getAll().root, [{ offset: 0, key: opKey(100) }]);\n\t\t});\n\n\t\tit(\"copies channels\", () => {\n\t\t\tconst collection = makeCollectionWithChannel({ length: 2, seq: 25 });\n\t\t\tconst appendedCollection = makeCollectionWithChannel({ length: 3, seq: 26 });\n\t\t\tconst copy = collection.clone();\n\t\t\tcollection.append(appendedCollection);\n\t\t\tassert.deepEqual(collection.getAll().channels?.foo, [\n\t\t\t\t{ offset: 0, key: opKey(25) },\n\t\t\t\t{ offset: 2, key: opKey(26) },\n\t\t\t]);\n\t\t\tassert.deepEqual(copy.getAll().channels?.foo, [{ offset: 0, key: opKey(25) }]);\n\t\t});\n\t});\n\n\tdescribe(\".update\", () => {\n\t\tlet collection: AttributionCollection;\n\t\tbeforeEach(() => {\n\t\t\tcollection = new AttributionCollection(2, null);\n\t\t\tcollection.update(\"bar\", new AttributionCollection(2, opKey(10)));\n\t\t\tassert.deepEqual(\n\t\t\t\tcollection.getAtOffset(0, \"foo\"),\n\t\t\t\tundefined,\n\t\t\t\t\"channel should be undefined on creation\",\n\t\t\t);\n\t\t});\n\n\t\tafterEach(() => {\n\t\t\tassert.deepEqual(\n\t\t\t\tcollection.getAtOffset(0, \"bar\"),\n\t\t\t\topKey(10),\n\t\t\t\t\"update should never modify unrelated channels\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"creates a new channel when updating from an undefined state\", () => {\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2, opKey(5)));\n\t\t\tassert.deepEqual(collection.getAtOffset(0, \"foo\"), opKey(5));\n\t\t});\n\n\t\tit(\"overrides earlier calls with later ones\", () => {\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2, opKey(3)));\n\t\t\tcollection.update(\"foo\", new AttributionCollection(2, opKey(5)));\n\t\t\tassert.deepEqual(collection.getAtOffset(0, \"foo\"), opKey(5));\n\t\t});\n\n\t\tit(\"can update the root channel\", () => {\n\t\t\tcollection.update(undefined, new AttributionCollection(2, opKey(3)));\n\t\t\tassert.deepEqual(collection.getAtOffset(0), opKey(3));\n\t\t});\n\n\t\tit(\"doesn't tolerate updates to channels having inconsistent length fields\", () => {\n\t\t\tassert.throws(() => collection.update(\"foo\", new AttributionCollection(3, null)));\n\t\t});\n\t});\n\n\tdescribe(\"serialized structure is independent of segment lengths\", () => {\n\t\tinterface State {\n\t\t\trandom: IRandom;\n\t\t\tsegments: ISegment[];\n\t\t}\n\n\t\tinterface InsertAction {\n\t\t\ttype: \"insert\";\n\t\t\tcollection: AttributionCollection;\n\t\t}\n\n\t\tinterface SplitAction {\n\t\t\ttype: \"split\";\n\t\t\tsegIndex: number;\n\t\t\toffset: number;\n\t\t}\n\n\t\tinterface AppendAction {\n\t\t\ttype: \"append\";\n\t\t\tsegIndex: number;\n\t\t}\n\n\t\tclass Segment extends BaseSegment {\n\t\t\tpublic readonly type = \"testSeg\";\n\t\t\tpublic constructor(length: number) {\n\t\t\t\tsuper();\n\t\t\t\tthis.cachedLength = length;\n\t\t\t}\n\n\t\t\tpublic toJSONObject(): {\n\t\t\t\tlength: number;\n\t\t\t\tprops: PropertySet | undefined;\n\t\t\t} {\n\t\t\t\treturn { length: this.cachedLength, props: this.properties };\n\t\t\t}\n\n\t\t\tpublic clone(): ISegment {\n\t\t\t\tconst seg = new Segment(this.cachedLength);\n\t\t\t\tthis.cloneInto(seg);\n\t\t\t\treturn seg;\n\t\t\t}\n\n\t\t\tprotected createSplitSegmentAt(pos: number): BaseSegment | undefined {\n\t\t\t\tif (pos > 0) {\n\t\t\t\t\tconst leafSegment = new Segment(this.cachedLength - pos);\n\t\t\t\t\tthis.cachedLength = pos;\n\t\t\t\t\treturn leafSegment;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (let seed = 0; seed < 10; seed++) {\n\t\t\tconst segmentCount = 100;\n\t\t\tit(`with randomly generated segments, seed ${seed}`, () => {\n\t\t\t\tconst generateAttributionKey = (random: IRandom): AttributionKey | null =>\n\t\t\t\t\trandom.bool(0.8) ? opKey(random.integer(0, 10)) : random.bool() ? detachedKey : null;\n\n\t\t\t\tconst channelNamePool = [\"ch1\", \"ch2\", \"ch3\"];\n\t\t\t\tconst insertGenerator: Generator<InsertAction, State> = take(\n\t\t\t\t\tsegmentCount,\n\t\t\t\t\t({ random }) => {\n\t\t\t\t\t\tconst length = random.integer(1, 20);\n\t\t\t\t\t\tconst collection = new AttributionCollection(\n\t\t\t\t\t\t\tlength,\n\t\t\t\t\t\t\tgenerateAttributionKey(random),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (random.bool(0.25)) {\n\t\t\t\t\t\t\tfor (const channel of channelNamePool) {\n\t\t\t\t\t\t\t\tif (random.bool()) {\n\t\t\t\t\t\t\t\t\tcollection.update(\n\t\t\t\t\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t\t\t\t\tnew AttributionCollection(length, generateAttributionKey(random)),\n\t\t\t\t\t\t\t\t\t);\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\treturn {\n\t\t\t\t\t\t\ttype: \"insert\",\n\t\t\t\t\t\t\tcollection,\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst initialState = performFuzzActions<InsertAction, State>(\n\t\t\t\t\tinsertGenerator,\n\t\t\t\t\t{\n\t\t\t\t\t\tinsert: (state, { collection }) => {\n\t\t\t\t\t\t\tconst { segments } = state;\n\t\t\t\t\t\t\tconst seg = new Segment(collection.length);\n\t\t\t\t\t\t\tseg.attribution = collection;\n\t\t\t\t\t\t\tsegments.push(seg);\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{ random: makeRandom(seed), segments: [] },\n\t\t\t\t);\n\n\t\t\t\tconst expected = AttributionCollection.serializeAttributionCollections(\n\t\t\t\t\tinitialState.segments,\n\t\t\t\t);\n\n\t\t\t\tconst split: Generator<SplitAction, State> = ({ segments, random }) => {\n\t\t\t\t\tconst validIndices = segments\n\t\t\t\t\t\t.map((seg, i) => (seg.cachedLength > 1 ? i : -1))\n\t\t\t\t\t\t.filter((i) => i >= 0);\n\n\t\t\t\t\tconst segIndex = random.pick(validIndices);\n\t\t\t\t\tconst offset = random.integer(1, segments[segIndex].cachedLength - 1);\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"split\",\n\t\t\t\t\t\tsegIndex,\n\t\t\t\t\t\toffset,\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tconst append: Generator<AppendAction, State> = ({ random, segments }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"append\",\n\t\t\t\t\t\tsegIndex: random.integer(0, segments.length - 2),\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tconst finalState = performFuzzActions<SplitAction | AppendAction, State>(\n\t\t\t\t\ttake(\n\t\t\t\t\t\tsegmentCount,\n\t\t\t\t\t\t// Note: if playing around with constants in this test, it may be necessary to\n\t\t\t\t\t\t// introduce acceptance criteria here for split.\n\t\t\t\t\t\tcreateWeightedGenerator<SplitAction | AppendAction, State>([\n\t\t\t\t\t\t\t[split, 1],\n\t\t\t\t\t\t\t[append, 1, ({ segments }): boolean => segments.length > 1],\n\t\t\t\t\t\t]),\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\tsplit: (state, { segIndex, offset }) => {\n\t\t\t\t\t\t\tconst { segments } = state;\n\t\t\t\t\t\t\tconst splitSeg = segments[segIndex].splitAt(offset);\n\t\t\t\t\t\t\tassert(splitSeg !== undefined);\n\t\t\t\t\t\t\tsegments.splice(segIndex + 1, 0, splitSeg);\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tappend: (state, { segIndex }) => {\n\t\t\t\t\t\t\tconst { segments } = state;\n\t\t\t\t\t\t\tsegments[segIndex].append(segments[segIndex + 1]);\n\t\t\t\t\t\t\tsegments.splice(segIndex + 1, 1);\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tinitialState,\n\t\t\t\t);\n\n\t\t\t\tassert.deepEqual(\n\t\t\t\t\tAttributionCollection.serializeAttributionCollections(finalState.segments),\n\t\t\t\t\texpected,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t});\n});\n"]}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
const
|
|
7
|
+
const node_assert_1 = require("node:assert");
|
|
8
8
|
const attributionPolicy_js_1 = require("../attributionPolicy.js");
|
|
9
9
|
const testClient_js_1 = require("./testClient.js");
|
|
10
10
|
const local = { type: "local" };
|
|
@@ -19,73 +19,73 @@ describe("Attribution Policy", () => {
|
|
|
19
19
|
function runInsertVerificationTests() {
|
|
20
20
|
it("attributes segments inserted locally", () => {
|
|
21
21
|
const mergeTreeOp = client.insertTextLocal(0, "123");
|
|
22
|
-
|
|
22
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs(), [local, local, local]);
|
|
23
23
|
client.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));
|
|
24
|
-
|
|
24
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);
|
|
25
25
|
});
|
|
26
26
|
it("attributes segments inserted remotely", () => {
|
|
27
27
|
client.insertTextRemote(0, "123", undefined, ++seq, seq - 1, remoteUserLongId);
|
|
28
|
-
|
|
28
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);
|
|
29
29
|
});
|
|
30
30
|
it("attributes insertion in a detached state", () => {
|
|
31
31
|
client = new testClient_js_1.TestClient(client.mergeTree.options);
|
|
32
32
|
client.insertTextLocal(0, "1", undefined);
|
|
33
|
-
|
|
33
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs(), [{ type: "detached", id: 0 }]);
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
36
|
function runAnnotateVerificationTests() {
|
|
37
37
|
it("attributes local property changes", () => {
|
|
38
38
|
client.applyMsg(client.makeOpMessage(client.insertTextLocal(0, "123"), ++seq));
|
|
39
39
|
const annotateOp = client.annotateRangeLocal(1, 2, { foo: 1 });
|
|
40
|
-
|
|
40
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [undefined, local, undefined]);
|
|
41
41
|
client.applyMsg(client.makeOpMessage(annotateOp, ++seq));
|
|
42
42
|
client.applyMsg(client.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq));
|
|
43
|
-
|
|
43
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [undefined, 2, undefined]);
|
|
44
44
|
});
|
|
45
45
|
it("attributes remote property changes", () => {
|
|
46
46
|
client.insertTextRemote(0, "123", undefined, ++seq, seq - 1, remoteUserLongId);
|
|
47
47
|
client.annotateRangeRemote(1, 2, { foo: 1 }, ++seq, seq - 1, remoteUserLongId);
|
|
48
|
-
|
|
48
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [undefined, 2, undefined]);
|
|
49
49
|
});
|
|
50
50
|
it("uses LWW semantics for conflicting attribution of props", () => {
|
|
51
51
|
client.applyMsg(client.makeOpMessage(client.insertTextLocal(0, "123"), ++seq));
|
|
52
52
|
const localPropChange = client.annotateRangeLocal(1, 2, { foo: 1 });
|
|
53
53
|
client.annotateRangeRemote(0, 2, { foo: 2 }, ++seq, seq - 1, remoteUserLongId);
|
|
54
54
|
const firstRemoteAnnotateSeq = seq;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
node_assert_1.strict.equal(client.getPropertiesAtPosition(0)?.foo, 2);
|
|
56
|
+
node_assert_1.strict.equal(client.getPropertiesAtPosition(1)?.foo, 1);
|
|
57
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [
|
|
58
58
|
firstRemoteAnnotateSeq,
|
|
59
59
|
local,
|
|
60
60
|
undefined,
|
|
61
61
|
]);
|
|
62
62
|
client.applyMsg(client.makeOpMessage(localPropChange, ++seq, seq - 1, localUserLongId));
|
|
63
|
-
|
|
63
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [firstRemoteAnnotateSeq, seq, undefined], "property change should have been attributed to the winning, local op");
|
|
64
64
|
client.annotateRangeRemote(1, 2, { foo: 3 }, ++seq, seq - 1, remoteUserLongId);
|
|
65
|
-
|
|
65
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [firstRemoteAnnotateSeq, seq, undefined], "second property change should have been attributed to a remote change");
|
|
66
66
|
});
|
|
67
67
|
describe("attributes properties set on a segment at insertion time", () => {
|
|
68
68
|
it("for remote insertions", () => {
|
|
69
69
|
client.insertTextRemote(0, "123", { foo: "bar" }, ++seq, seq - 1, remoteUserLongId);
|
|
70
|
-
|
|
70
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [1, 1, 1]);
|
|
71
71
|
});
|
|
72
72
|
it("for local insertions", () => {
|
|
73
73
|
const mergeTreeOp = client.insertTextLocal(0, "123", { foo: "bar" });
|
|
74
|
-
|
|
74
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [local, local, local]);
|
|
75
75
|
client.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));
|
|
76
|
-
|
|
76
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [1, 1, 1]);
|
|
77
77
|
});
|
|
78
78
|
});
|
|
79
79
|
it("attributes annotation in a detached state", () => {
|
|
80
80
|
client = new testClient_js_1.TestClient(client.mergeTree.options);
|
|
81
81
|
client.insertTextLocal(0, "1", undefined);
|
|
82
82
|
client.annotateRangeLocal(0, 1, { foo: "bar" });
|
|
83
|
-
|
|
83
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [{ type: "detached", id: 0 }]);
|
|
84
84
|
});
|
|
85
85
|
it("attributes annotation on insertion in a detached state", () => {
|
|
86
86
|
client = new testClient_js_1.TestClient(client.mergeTree.options);
|
|
87
87
|
client.insertTextLocal(0, "1", { foo: "bar" });
|
|
88
|
-
|
|
88
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [{ type: "detached", id: 0 }]);
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
describe("using insert-only attribution", () => {
|
|
@@ -103,12 +103,12 @@ describe("Attribution Policy", () => {
|
|
|
103
103
|
client.applyMsg(client.makeOpMessage(client.insertTextLocal(0, "123"), ++seq));
|
|
104
104
|
client.applyMsg(client.makeOpMessage(client.annotateRangeLocal(1, 2, { foo: 1 }), ++seq));
|
|
105
105
|
client.applyMsg(client.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq));
|
|
106
|
-
|
|
106
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);
|
|
107
107
|
});
|
|
108
108
|
it("ignores remote property changes", () => {
|
|
109
109
|
client.insertTextRemote(0, "123", undefined, ++seq, seq - 1, remoteUserLongId);
|
|
110
110
|
client.annotateRangeRemote(1, 2, { foo: 1 }, ++seq, seq - 1, remoteUserLongId);
|
|
111
|
-
|
|
111
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);
|
|
112
112
|
});
|
|
113
113
|
});
|
|
114
114
|
describe("using foo-property-only attribution", () => {
|
|
@@ -124,17 +124,19 @@ describe("Attribution Policy", () => {
|
|
|
124
124
|
runAnnotateVerificationTests();
|
|
125
125
|
it("ignores segments inserted locally", () => {
|
|
126
126
|
const mergeTreeOp = client.insertTextLocal(0, "123");
|
|
127
|
-
|
|
127
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [undefined, undefined, undefined]);
|
|
128
128
|
client.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));
|
|
129
|
-
|
|
129
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [undefined, undefined, undefined]);
|
|
130
130
|
});
|
|
131
131
|
it("ignores segments inserted remotely", () => {
|
|
132
132
|
client.insertTextRemote(0, "123", undefined, ++seq, seq - 1, remoteUserLongId);
|
|
133
|
-
|
|
133
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs(), [undefined, undefined, undefined]);
|
|
134
134
|
});
|
|
135
135
|
it("can correctly combine segment attribution on append", () => {
|
|
136
136
|
client.insertTextRemote(0, "1", { foo: "bar", bar: 1 }, ++seq, seq - 1, remoteUserLongId);
|
|
137
137
|
client.insertTextRemote(1, "2", { bar: 1 }, ++seq, seq - 1, remoteUserLongId);
|
|
138
|
+
// Null is used to represent deleting a property, since undefined will not be sent over the wire.
|
|
139
|
+
// eslint-disable-next-line unicorn/no-null
|
|
138
140
|
client.annotateRangeRemote(0, 1, { foo: null }, ++seq, seq - 1, remoteUserLongId);
|
|
139
141
|
client.updateMinSeq(seq);
|
|
140
142
|
let segmentCount = 0;
|
|
@@ -142,8 +144,8 @@ describe("Attribution Policy", () => {
|
|
|
142
144
|
segmentCount++;
|
|
143
145
|
return true;
|
|
144
146
|
});
|
|
145
|
-
|
|
146
|
-
|
|
147
|
+
node_assert_1.strict.equal(segmentCount, 1);
|
|
148
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [seq, undefined]);
|
|
147
149
|
});
|
|
148
150
|
});
|
|
149
151
|
describe("using an attribution policy which tracks insertion and annotation", () => {
|
|
@@ -173,8 +175,8 @@ describe("Attribution Policy", () => {
|
|
|
173
175
|
client.applyMsg(client.makeOpMessage(client.insertTextLocal(0, "123"), ++seq));
|
|
174
176
|
client.applyMsg(client.makeOpMessage(client.annotateRangeLocal(1, 2, { foo: 1 }), ++seq));
|
|
175
177
|
client.applyMsg(client.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq));
|
|
176
|
-
|
|
177
|
-
|
|
178
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("foo"), [undefined, 2, undefined]);
|
|
179
|
+
node_assert_1.strict.deepEqual(client.getAllAttributionSeqs("bar"), [3, 3, 3]);
|
|
178
180
|
});
|
|
179
181
|
});
|
|
180
182
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributionPolicy.spec.js","sourceRoot":"","sources":["../../src/test/attributionPolicy.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\n\nimport { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport {\n\tcreateInsertOnlyAttributionPolicy,\n\tcreatePropertyTrackingAndInsertionAttributionPolicyFactory,\n\tcreatePropertyTrackingAttributionPolicyFactory,\n} from \"../attributionPolicy.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\nconst local: AttributionKey = { type: \"local\" };\n\ndescribe(\"Attribution Policy\", () => {\n\tconst localUserLongId = \"localUser\";\n\tconst remoteUserLongId = \"remoteUser\";\n\tlet client: TestClient;\n\tlet seq: number = 0;\n\tbeforeEach(() => {\n\t\tseq = 0;\n\t});\n\n\tfunction runInsertVerificationTests() {\n\t\tit(\"attributes segments inserted locally\", () => {\n\t\t\tconst mergeTreeOp = client.insertTextLocal(0, \"123\");\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [local, local, local]);\n\t\t\tclient.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\n\t\tit(\"attributes segments inserted remotely\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\n\t\tit(\"attributes insertion in a detached state\", () => {\n\t\t\tclient = new TestClient(client.mergeTree.options);\n\t\t\tclient.insertTextLocal(0, \"1\", undefined);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [{ type: \"detached\", id: 0 }]);\n\t\t});\n\t}\n\n\tfunction runAnnotateVerificationTests() {\n\t\tit(\"attributes local property changes\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tconst annotateOp = client.annotateRangeLocal(1, 2, { foo: 1 });\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, local, undefined]);\n\t\t\tclient.applyMsg(client.makeOpMessage(annotateOp, ++seq));\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq),\n\t\t\t);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, 2, undefined]);\n\t\t});\n\n\t\tit(\"attributes remote property changes\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.annotateRangeRemote(1, 2, { foo: 1 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, 2, undefined]);\n\t\t});\n\n\t\tit(\"uses LWW semantics for conflicting attribution of props\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tconst localPropChange = client.annotateRangeLocal(1, 2, { foo: 1 });\n\t\t\tclient.annotateRangeRemote(0, 2, { foo: 2 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tconst firstRemoteAnnotateSeq = seq;\n\t\t\tassert.equal(client.getPropertiesAtPosition(0)?.foo, 2);\n\t\t\tassert.equal(client.getPropertiesAtPosition(1)?.foo, 1);\n\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [\n\t\t\t\tfirstRemoteAnnotateSeq,\n\t\t\t\tlocal,\n\t\t\t\tundefined,\n\t\t\t]);\n\t\t\tclient.applyMsg(client.makeOpMessage(localPropChange, ++seq, seq - 1, localUserLongId));\n\t\t\tassert.deepEqual(\n\t\t\t\tclient.getAllAttributionSeqs(\"foo\"),\n\t\t\t\t[firstRemoteAnnotateSeq, seq, undefined],\n\t\t\t\t\"property change should have been attributed to the winning, local op\",\n\t\t\t);\n\t\t\tclient.annotateRangeRemote(1, 2, { foo: 3 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(\n\t\t\t\tclient.getAllAttributionSeqs(\"foo\"),\n\t\t\t\t[firstRemoteAnnotateSeq, seq, undefined],\n\t\t\t\t\"second property change should have been attributed to a remote change\",\n\t\t\t);\n\t\t});\n\n\t\tdescribe(\"attributes properties set on a segment at insertion time\", () => {\n\t\t\tit(\"for remote insertions\", () => {\n\t\t\t\tclient.insertTextRemote(0, \"123\", { foo: \"bar\" }, ++seq, seq - 1, remoteUserLongId);\n\t\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [1, 1, 1]);\n\t\t\t});\n\n\t\t\tit(\"for local insertions\", () => {\n\t\t\t\tconst mergeTreeOp = client.insertTextLocal(0, \"123\", { foo: \"bar\" });\n\t\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [local, local, local]);\n\t\t\t\tclient.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));\n\t\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [1, 1, 1]);\n\t\t\t});\n\t\t});\n\n\t\tit(\"attributes annotation in a detached state\", () => {\n\t\t\tclient = new TestClient(client.mergeTree.options);\n\t\t\tclient.insertTextLocal(0, \"1\", undefined);\n\t\t\tclient.annotateRangeLocal(0, 1, { foo: \"bar\" });\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [{ type: \"detached\", id: 0 }]);\n\t\t});\n\n\t\tit(\"attributes annotation on insertion in a detached state\", () => {\n\t\t\tclient = new TestClient(client.mergeTree.options);\n\t\t\tclient.insertTextLocal(0, \"1\", { foo: \"bar\" });\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [{ type: \"detached\", id: 0 }]);\n\t\t});\n\t}\n\n\tdescribe(\"using insert-only attribution\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createInsertOnlyAttributionPolicy,\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\trunInsertVerificationTests();\n\n\t\tit(\"ignores local property changes\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(1, 2, { foo: 1 }), ++seq),\n\t\t\t);\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq),\n\t\t\t);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\n\t\tit(\"ignores remote property changes\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.annotateRangeRemote(1, 2, { foo: 1 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\t});\n\n\tdescribe(\"using foo-property-only attribution\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createPropertyTrackingAttributionPolicyFactory(\"foo\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\trunAnnotateVerificationTests();\n\n\t\tit(\"ignores segments inserted locally\", () => {\n\t\t\tconst mergeTreeOp = client.insertTextLocal(0, \"123\");\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, undefined, undefined]);\n\t\t\tclient.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, undefined, undefined]);\n\t\t});\n\n\t\tit(\"ignores segments inserted remotely\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [undefined, undefined, undefined]);\n\t\t});\n\n\t\tit(\"can correctly combine segment attribution on append\", () => {\n\t\t\tclient.insertTextRemote(\n\t\t\t\t0,\n\t\t\t\t\"1\",\n\t\t\t\t{ foo: \"bar\", bar: 1 },\n\t\t\t\t++seq,\n\t\t\t\tseq - 1,\n\t\t\t\tremoteUserLongId,\n\t\t\t);\n\t\t\tclient.insertTextRemote(1, \"2\", { bar: 1 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.annotateRangeRemote(0, 1, { foo: null }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.updateMinSeq(seq);\n\t\t\tlet segmentCount = 0;\n\t\t\tclient.walkSegments(() => {\n\t\t\t\tsegmentCount++;\n\t\t\t\treturn true;\n\t\t\t});\n\t\t\tassert.equal(segmentCount, 1);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [seq, undefined]);\n\t\t});\n\t});\n\n\tdescribe(\"using an attribution policy which tracks insertion and annotation\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createPropertyTrackingAndInsertionAttributionPolicyFactory(\"foo\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\trunAnnotateVerificationTests();\n\n\t\trunInsertVerificationTests();\n\t});\n\n\tdescribe(\"using an attribution policy which tracks annotation of multiple properties\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createPropertyTrackingAttributionPolicyFactory(\"foo\", \"bar\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\tit(\"attributes local property change on ack\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(1, 2, { foo: 1 }), ++seq),\n\t\t\t);\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq),\n\t\t\t);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, 2, undefined]);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"bar\"), [3, 3, 3]);\n\t\t});\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"attributionPolicy.spec.js","sourceRoot":"","sources":["../../src/test/attributionPolicy.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 { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\n\nimport {\n\tcreateInsertOnlyAttributionPolicy,\n\tcreatePropertyTrackingAndInsertionAttributionPolicyFactory,\n\tcreatePropertyTrackingAttributionPolicyFactory,\n} from \"../attributionPolicy.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\nconst local: AttributionKey = { type: \"local\" };\n\ndescribe(\"Attribution Policy\", () => {\n\tconst localUserLongId = \"localUser\";\n\tconst remoteUserLongId = \"remoteUser\";\n\tlet client: TestClient;\n\tlet seq: number = 0;\n\tbeforeEach(() => {\n\t\tseq = 0;\n\t});\n\n\tfunction runInsertVerificationTests(): void {\n\t\tit(\"attributes segments inserted locally\", () => {\n\t\t\tconst mergeTreeOp = client.insertTextLocal(0, \"123\");\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [local, local, local]);\n\t\t\tclient.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\n\t\tit(\"attributes segments inserted remotely\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\n\t\tit(\"attributes insertion in a detached state\", () => {\n\t\t\tclient = new TestClient(client.mergeTree.options);\n\t\t\tclient.insertTextLocal(0, \"1\", undefined);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [{ type: \"detached\", id: 0 }]);\n\t\t});\n\t}\n\n\tfunction runAnnotateVerificationTests(): void {\n\t\tit(\"attributes local property changes\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tconst annotateOp = client.annotateRangeLocal(1, 2, { foo: 1 });\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, local, undefined]);\n\t\t\tclient.applyMsg(client.makeOpMessage(annotateOp, ++seq));\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq),\n\t\t\t);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, 2, undefined]);\n\t\t});\n\n\t\tit(\"attributes remote property changes\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.annotateRangeRemote(1, 2, { foo: 1 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, 2, undefined]);\n\t\t});\n\n\t\tit(\"uses LWW semantics for conflicting attribution of props\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tconst localPropChange = client.annotateRangeLocal(1, 2, { foo: 1 });\n\t\t\tclient.annotateRangeRemote(0, 2, { foo: 2 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tconst firstRemoteAnnotateSeq = seq;\n\t\t\tassert.equal(client.getPropertiesAtPosition(0)?.foo, 2);\n\t\t\tassert.equal(client.getPropertiesAtPosition(1)?.foo, 1);\n\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [\n\t\t\t\tfirstRemoteAnnotateSeq,\n\t\t\t\tlocal,\n\t\t\t\tundefined,\n\t\t\t]);\n\t\t\tclient.applyMsg(client.makeOpMessage(localPropChange, ++seq, seq - 1, localUserLongId));\n\t\t\tassert.deepEqual(\n\t\t\t\tclient.getAllAttributionSeqs(\"foo\"),\n\t\t\t\t[firstRemoteAnnotateSeq, seq, undefined],\n\t\t\t\t\"property change should have been attributed to the winning, local op\",\n\t\t\t);\n\t\t\tclient.annotateRangeRemote(1, 2, { foo: 3 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(\n\t\t\t\tclient.getAllAttributionSeqs(\"foo\"),\n\t\t\t\t[firstRemoteAnnotateSeq, seq, undefined],\n\t\t\t\t\"second property change should have been attributed to a remote change\",\n\t\t\t);\n\t\t});\n\n\t\tdescribe(\"attributes properties set on a segment at insertion time\", () => {\n\t\t\tit(\"for remote insertions\", () => {\n\t\t\t\tclient.insertTextRemote(0, \"123\", { foo: \"bar\" }, ++seq, seq - 1, remoteUserLongId);\n\t\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [1, 1, 1]);\n\t\t\t});\n\n\t\t\tit(\"for local insertions\", () => {\n\t\t\t\tconst mergeTreeOp = client.insertTextLocal(0, \"123\", { foo: \"bar\" });\n\t\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [local, local, local]);\n\t\t\t\tclient.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));\n\t\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [1, 1, 1]);\n\t\t\t});\n\t\t});\n\n\t\tit(\"attributes annotation in a detached state\", () => {\n\t\t\tclient = new TestClient(client.mergeTree.options);\n\t\t\tclient.insertTextLocal(0, \"1\", undefined);\n\t\t\tclient.annotateRangeLocal(0, 1, { foo: \"bar\" });\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [{ type: \"detached\", id: 0 }]);\n\t\t});\n\n\t\tit(\"attributes annotation on insertion in a detached state\", () => {\n\t\t\tclient = new TestClient(client.mergeTree.options);\n\t\t\tclient.insertTextLocal(0, \"1\", { foo: \"bar\" });\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [{ type: \"detached\", id: 0 }]);\n\t\t});\n\t}\n\n\tdescribe(\"using insert-only attribution\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createInsertOnlyAttributionPolicy,\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\trunInsertVerificationTests();\n\n\t\tit(\"ignores local property changes\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(1, 2, { foo: 1 }), ++seq),\n\t\t\t);\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq),\n\t\t\t);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\n\t\tit(\"ignores remote property changes\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.annotateRangeRemote(1, 2, { foo: 1 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [1, 1, 1]);\n\t\t});\n\t});\n\n\tdescribe(\"using foo-property-only attribution\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createPropertyTrackingAttributionPolicyFactory(\"foo\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\trunAnnotateVerificationTests();\n\n\t\tit(\"ignores segments inserted locally\", () => {\n\t\t\tconst mergeTreeOp = client.insertTextLocal(0, \"123\");\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, undefined, undefined]);\n\t\t\tclient.applyMsg(client.makeOpMessage(mergeTreeOp, ++seq));\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, undefined, undefined]);\n\t\t});\n\n\t\tit(\"ignores segments inserted remotely\", () => {\n\t\t\tclient.insertTextRemote(0, \"123\", undefined, ++seq, seq - 1, remoteUserLongId);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(), [undefined, undefined, undefined]);\n\t\t});\n\n\t\tit(\"can correctly combine segment attribution on append\", () => {\n\t\t\tclient.insertTextRemote(\n\t\t\t\t0,\n\t\t\t\t\"1\",\n\t\t\t\t{ foo: \"bar\", bar: 1 },\n\t\t\t\t++seq,\n\t\t\t\tseq - 1,\n\t\t\t\tremoteUserLongId,\n\t\t\t);\n\t\t\tclient.insertTextRemote(1, \"2\", { bar: 1 }, ++seq, seq - 1, remoteUserLongId);\n\t\t\t// Null is used to represent deleting a property, since undefined will not be sent over the wire.\n\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\tclient.annotateRangeRemote(0, 1, { foo: null }, ++seq, seq - 1, remoteUserLongId);\n\t\t\tclient.updateMinSeq(seq);\n\t\t\tlet segmentCount = 0;\n\t\t\tclient.walkSegments(() => {\n\t\t\t\tsegmentCount++;\n\t\t\t\treturn true;\n\t\t\t});\n\t\t\tassert.equal(segmentCount, 1);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [seq, undefined]);\n\t\t});\n\t});\n\n\tdescribe(\"using an attribution policy which tracks insertion and annotation\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createPropertyTrackingAndInsertionAttributionPolicyFactory(\"foo\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\trunAnnotateVerificationTests();\n\n\t\trunInsertVerificationTests();\n\t});\n\n\tdescribe(\"using an attribution policy which tracks annotation of multiple properties\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient({\n\t\t\t\tattribution: {\n\t\t\t\t\ttrack: true,\n\t\t\t\t\tpolicyFactory: createPropertyTrackingAttributionPolicyFactory(\"foo\", \"bar\"),\n\t\t\t\t},\n\t\t\t});\n\t\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t\t});\n\n\t\tit(\"attributes local property change on ack\", () => {\n\t\t\tclient.applyMsg(client.makeOpMessage(client.insertTextLocal(0, \"123\"), ++seq));\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(1, 2, { foo: 1 }), ++seq),\n\t\t\t);\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(client.annotateRangeLocal(0, 3, { bar: 2 }), ++seq),\n\t\t\t);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"foo\"), [undefined, 2, undefined]);\n\t\t\tassert.deepEqual(client.getAllAttributionSeqs(\"bar\"), [3, 3, 3]);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -37,10 +37,7 @@ export declare class DocumentTree {
|
|
|
37
37
|
name: string;
|
|
38
38
|
children: DocumentNode[];
|
|
39
39
|
pos: number;
|
|
40
|
-
ids:
|
|
41
|
-
box: number;
|
|
42
|
-
row: number;
|
|
43
|
-
};
|
|
40
|
+
ids: Record<string, number>;
|
|
44
41
|
id: string | undefined;
|
|
45
42
|
static randPack: RandomPack;
|
|
46
43
|
constructor(name: string, children: DocumentNode[]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beastTest.spec.d.ts","sourceRoot":"","sources":["../../src/test/beastTest.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAAE,OAAO,EAAc,MAAM,sCAAsC,CAAC;AAoB3E,OAAO,EAEN,UAAU,EAKV,MAAM,sBAAsB,CAAC;AAS9B,OAAO,EAAE,UAAU,EAA2B,MAAM,iBAAiB,CAAC;AAmHtE,wBAAgB,UAAU,
|
|
1
|
+
{"version":3,"file":"beastTest.spec.d.ts","sourceRoot":"","sources":["../../src/test/beastTest.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,EAAE,OAAO,EAAc,MAAM,sCAAsC,CAAC;AAoB3E,OAAO,EAEN,UAAU,EAKV,MAAM,sBAAsB,CAAC;AAS9B,OAAO,EAAE,UAAU,EAA2B,MAAM,iBAAiB,CAAC;AAmHtE,wBAAgB,UAAU,IAAI,IAAI,CAYjC;AAcD,wBAAgB,YAAY,IAAI,MAAM,CAsCrC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAoDhC;AAQD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAExD;AA6ED,wBAAgB,cAAc,IAAI,IAAI,CAwBrC;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAoFzC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAwM7C;AAID,wBAAgB,QAAQ,CAAC,OAAO,UAAO,GAAG;IACzC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,YAAY,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClE,cAAc,EAAE,MAAM,IAAI,CAAC;CAC3B,CAqpBA;AAYD,qBAAa,UAAU;IACtB,MAAM,EAAE,OAAO,CAAC;;IAKhB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAI7C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CA+BrC;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,CAAC;AACjD;;;;;;;GAOG;AACH,qBAAa,YAAY;IAOhB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,YAAY,EAAE;IAPhC,GAAG,SAAK;IACR,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAsB;IACjD,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IACvB,MAAM,CAAC,QAAQ,aAAoB;gBAG3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EAAE;IAGhC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IA2C/D,MAAM,CAAC,gBAAgB,IAAI,YAAY;IAKvC,MAAM,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,EAAE;IAuB9D,MAAM,CAAC,iBAAiB,IAAI,YAAY;IAOxC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY;IAUxD,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY;CAGxD"}
|