@fluidframework/merge-tree 2.53.0 → 2.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/api-report/{merge-tree.legacy.alpha.api.md → merge-tree.legacy.beta.api.md} +62 -62
- package/dist/attributionCollection.d.ts +7 -12
- package/dist/attributionCollection.d.ts.map +1 -1
- package/dist/attributionCollection.js.map +1 -1
- package/dist/attributionPolicy.d.ts +1 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +11 -11
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/collections/index.d.ts +1 -1
- package/dist/collections/index.d.ts.map +1 -1
- package/dist/collections/index.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts +4 -4
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/index.d.ts +16 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/localReference.d.ts +6 -9
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +1 -2
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +9 -10
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts +12 -20
- package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/dist/mergeTreeDeltaCallback.js +1 -2
- package/dist/mergeTreeDeltaCallback.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts +1 -1
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +14 -21
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +4 -8
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.d.ts +6 -10
- package/dist/mergeTreeTracking.d.ts.map +1 -1
- package/dist/mergeTreeTracking.js +2 -4
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.d.ts +3 -3
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js.map +1 -1
- package/dist/ops.d.ts +17 -34
- package/dist/ops.d.ts.map +1 -1
- package/dist/ops.js +2 -4
- package/dist/ops.js.map +1 -1
- package/dist/partialLengths.d.ts +2 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js.map +1 -1
- package/dist/properties.d.ts +2 -4
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js.map +1 -1
- package/dist/referencePositions.d.ts +6 -9
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +2 -4
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.d.ts +11 -16
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +3 -6
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts +1 -1
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentInfos.d.ts +1 -1
- package/dist/segmentInfos.d.ts.map +1 -1
- package/dist/segmentInfos.js.map +1 -1
- package/dist/segmentPropertiesManager.d.ts +1 -1
- package/dist/segmentPropertiesManager.d.ts.map +1 -1
- package/dist/segmentPropertiesManager.js.map +1 -1
- package/dist/sequencePlace.d.ts +4 -8
- package/dist/sequencePlace.d.ts.map +1 -1
- package/dist/sequencePlace.js +2 -4
- package/dist/sequencePlace.js.map +1 -1
- package/dist/snapshotChunks.d.ts +6 -6
- package/dist/snapshotChunks.d.ts.map +1 -1
- package/dist/snapshotChunks.js.map +1 -1
- package/dist/snapshotLoader.d.ts +6 -6
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts +8 -8
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +6 -6
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts +2 -2
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/test/Removal.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.perf.spec.js.map +1 -1
- package/dist/test/attributionCollection.spec.js.map +1 -1
- package/dist/test/attributionPolicy.spec.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts +1 -1
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.apis.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.d.ts +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
- package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.d.ts +1 -1
- package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.conflictFarm.spec.d.ts +1 -1
- package/dist/test/client.conflictFarm.spec.d.ts.map +1 -1
- package/dist/test/client.conflictFarm.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.obliterateFarm.spec.d.ts +1 -1
- package/dist/test/client.obliterateFarm.spec.d.ts.map +1 -1
- package/dist/test/client.obliterateFarm.spec.js.map +1 -1
- package/dist/test/client.rebasePosition.spec.js.map +1 -1
- package/dist/test/client.reconnectFarm.spec.d.ts +1 -1
- package/dist/test/client.reconnectFarm.spec.d.ts.map +1 -1
- package/dist/test/client.reconnectFarm.spec.js.map +1 -1
- package/dist/test/client.replay.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/client.rollbackFarm.spec.js.map +1 -1
- package/dist/test/clientTestHelper.d.ts +1 -1
- package/dist/test/clientTestHelper.d.ts.map +1 -1
- package/dist/test/clientTestHelper.js.map +1 -1
- package/dist/test/index.d.ts +4 -4
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTree.zamboni.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts +5 -5
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/dist/test/obliterateOperations.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js.map +1 -1
- package/dist/test/revertibles.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts +4 -4
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/snapshotlegacy.spec.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +9 -9
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts +2 -2
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testSerializer.d.ts +2 -2
- package/dist/test/testSerializer.d.ts.map +1 -1
- package/dist/test/testSerializer.js.map +1 -1
- package/dist/test/testServer.d.ts +2 -2
- package/dist/test/testServer.d.ts.map +1 -1
- package/dist/test/testServer.js.map +1 -1
- package/dist/test/testUtils.d.ts +3 -3
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts +1 -1
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js.map +1 -1
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/textSegment.d.ts +4 -6
- package/dist/textSegment.d.ts.map +1 -1
- package/dist/textSegment.js +1 -2
- package/dist/textSegment.js.map +1 -1
- package/dist/zamboni.d.ts +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js.map +1 -1
- package/lib/attributionCollection.d.ts +7 -12
- package/lib/attributionCollection.d.ts.map +1 -1
- package/lib/attributionCollection.js.map +1 -1
- package/lib/attributionPolicy.d.ts +1 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +11 -11
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js.map +1 -1
- package/lib/collections/index.d.ts +1 -1
- package/lib/collections/index.d.ts.map +1 -1
- package/lib/collections/index.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts +4 -4
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/index.d.ts +16 -16
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/localReference.d.ts +6 -9
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +1 -2
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +9 -10
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts +12 -20
- package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/lib/mergeTreeDeltaCallback.js +1 -2
- package/lib/mergeTreeDeltaCallback.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts +1 -1
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +14 -21
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +4 -8
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/mergeTreeTracking.d.ts +6 -10
- package/lib/mergeTreeTracking.d.ts.map +1 -1
- package/lib/mergeTreeTracking.js +2 -4
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/opBuilder.d.ts +3 -3
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js.map +1 -1
- package/lib/ops.d.ts +17 -34
- package/lib/ops.d.ts.map +1 -1
- package/lib/ops.js +2 -4
- package/lib/ops.js.map +1 -1
- package/lib/partialLengths.d.ts +2 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js.map +1 -1
- package/lib/properties.d.ts +2 -4
- package/lib/properties.d.ts.map +1 -1
- package/lib/properties.js.map +1 -1
- package/lib/referencePositions.d.ts +6 -9
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +2 -4
- package/lib/referencePositions.js.map +1 -1
- package/lib/revertibles.d.ts +11 -16
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +4 -7
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts +1 -1
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentInfos.d.ts +1 -1
- package/lib/segmentInfos.d.ts.map +1 -1
- package/lib/segmentInfos.js.map +1 -1
- package/lib/segmentPropertiesManager.d.ts +1 -1
- package/lib/segmentPropertiesManager.d.ts.map +1 -1
- package/lib/segmentPropertiesManager.js.map +1 -1
- package/lib/sequencePlace.d.ts +4 -8
- package/lib/sequencePlace.d.ts.map +1 -1
- package/lib/sequencePlace.js +2 -4
- package/lib/sequencePlace.js.map +1 -1
- package/lib/snapshotChunks.d.ts +6 -6
- package/lib/snapshotChunks.d.ts.map +1 -1
- package/lib/snapshotChunks.js.map +1 -1
- package/lib/snapshotLoader.d.ts +6 -6
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts +8 -8
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts +6 -6
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts +2 -2
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/test/Removal.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.perf.spec.js.map +1 -1
- package/lib/test/attributionCollection.spec.js.map +1 -1
- package/lib/test/attributionPolicy.spec.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts +1 -1
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.apis.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.d.ts +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
- package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.d.ts +1 -1
- package/lib/test/client.attributionFarm.spec.d.ts.map +1 -1
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.conflictFarm.spec.d.ts +1 -1
- package/lib/test/client.conflictFarm.spec.d.ts.map +1 -1
- package/lib/test/client.conflictFarm.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.obliterateFarm.spec.d.ts +1 -1
- package/lib/test/client.obliterateFarm.spec.d.ts.map +1 -1
- package/lib/test/client.obliterateFarm.spec.js.map +1 -1
- package/lib/test/client.rebasePosition.spec.js.map +1 -1
- package/lib/test/client.reconnectFarm.spec.d.ts +1 -1
- package/lib/test/client.reconnectFarm.spec.d.ts.map +1 -1
- package/lib/test/client.reconnectFarm.spec.js.map +1 -1
- package/lib/test/client.replay.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/client.rollbackFarm.spec.js.map +1 -1
- package/lib/test/clientTestHelper.d.ts +1 -1
- package/lib/test/clientTestHelper.d.ts.map +1 -1
- package/lib/test/clientTestHelper.js.map +1 -1
- package/lib/test/index.d.ts +4 -4
- package/lib/test/index.d.ts.map +1 -1
- package/lib/test/index.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js.map +1 -1
- package/lib/test/mergeTree.zamboni.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts +5 -5
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.spec.js.map +1 -1
- package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/lib/test/obliterateOperations.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/revertibleFarm.spec.js.map +1 -1
- package/lib/test/revertibles.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts +4 -4
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/snapshotlegacy.spec.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +9 -9
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts +2 -2
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testSerializer.d.ts +2 -2
- package/lib/test/testSerializer.d.ts.map +1 -1
- package/lib/test/testSerializer.js.map +1 -1
- package/lib/test/testServer.d.ts +2 -2
- package/lib/test/testServer.d.ts.map +1 -1
- package/lib/test/testServer.js.map +1 -1
- package/lib/test/testUtils.d.ts +3 -3
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts +1 -1
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js.map +1 -1
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/textSegment.d.ts +4 -6
- package/lib/textSegment.d.ts.map +1 -1
- package/lib/textSegment.js +1 -2
- package/lib/textSegment.js.map +1 -1
- package/lib/zamboni.d.ts +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js.map +1 -1
- package/package.json +17 -17
- package/src/attributionCollection.ts +7 -12
- package/src/attributionPolicy.ts +8 -8
- package/src/client.ts +24 -24
- package/src/collections/index.ts +11 -11
- package/src/endOfTreeSegment.ts +4 -8
- package/src/index.ts +54 -54
- package/src/localReference.ts +8 -11
- package/src/mergeTree.ts +19 -20
- package/src/mergeTreeDeltaCallback.ts +12 -20
- package/src/mergeTreeNodeWalk.ts +1 -1
- package/src/mergeTreeNodes.ts +15 -22
- package/src/mergeTreeTracking.ts +6 -10
- package/src/opBuilder.ts +8 -8
- package/src/ops.ts +17 -34
- package/src/partialLengths.ts +4 -4
- package/src/properties.ts +2 -4
- package/src/referencePositions.ts +6 -9
- package/src/revertibles.ts +15 -16
- package/src/segmentGroupCollection.ts +1 -1
- package/src/segmentInfos.ts +2 -2
- package/src/segmentPropertiesManager.ts +1 -1
- package/src/sequencePlace.ts +4 -8
- package/src/snapshotChunks.ts +6 -6
- package/src/snapshotLoader.ts +11 -11
- package/src/snapshotV1.ts +13 -13
- package/src/snapshotlegacy.ts +8 -8
- package/src/sortedSegmentSet.ts +2 -2
- package/src/textSegment.ts +4 -6
- package/src/zamboni.ts +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testClient.js","sourceRoot":"","sources":["../../src/test/testClient.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 { Trace } from \"@fluid-internal/client-utils\";\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { DoublyLinkedList } from \"@fluidframework/core-utils/internal\";\nimport { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions/internal\";\nimport { ISummaryTree } from \"@fluidframework/driver-definitions\";\nimport {\n\tITree,\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\nimport { MockStorage } from \"@fluidframework/test-runtime-utils/internal\";\n\nimport { MergeTreeTextHelper } from \"../MergeTreeTextHelper.js\";\nimport { Client } from \"../client.js\";\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport { IMergeTreeOptions, ReferencePosition } from \"../index.js\";\nimport { MergeTree, getSlideToSegoff } from \"../mergeTree.js\";\nimport {\n\tbackwardExcursion,\n\tforwardExcursion,\n\twalkAllChildSegments,\n} from \"../mergeTreeNodeWalk.js\";\nimport {\n\tMergeBlock,\n\tISegmentPrivate,\n\tMarker,\n\tMaxNodesInBlock,\n\ttype SegmentGroup,\n\tassertSegmentLeaf,\n} from \"../mergeTreeNodes.js\";\nimport {\n\tcreateAnnotateRangeOp,\n\tcreateInsertSegmentOp,\n\tcreateObliterateRangeOp,\n\tcreateRemoveRangeOp,\n} from \"../opBuilder.js\";\nimport {\n\tIJSONSegment,\n\tIMarkerDef,\n\tIMergeTreeOp,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\ttype IMergeTreeInsertMsg,\n} from \"../ops.js\";\nimport { LocalReconnectingPerspective, PriorPerspective } from \"../perspective.js\";\nimport { PropertySet } from \"../properties.js\";\nimport { DetachedReferencePosition, refHasTileLabel } from \"../referencePositions.js\";\nimport { MergeTreeRevertibleDriver } from \"../revertibles.js\";\nimport { assertInserted, assertMergeNode, isRemoved } from \"../segmentInfos.js\";\nimport { SnapshotLegacy } from \"../snapshotlegacy.js\";\nimport type { OperationStamp } from \"../stamps.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestSerializer } from \"./testSerializer.js\";\nimport { nodeOrdinalsHaveIntegrity } from \"./testUtils.js\";\n\nexport function specToSegment(spec: IJSONSegment): ISegmentPrivate {\n\tconst maybeText = TextSegment.fromJSONObject(spec);\n\tif (maybeText) {\n\t\treturn maybeText;\n\t}\n\n\tconst maybeMarker = Marker.fromJSONObject(spec);\n\tif (maybeMarker) {\n\t\treturn maybeMarker;\n\t}\n\n\tthrow new Error(`Unrecognized IJSONSegment type: '${JSON.stringify(spec)}'`);\n}\n\nconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\nfunction opStampToString(stamp: OperationStamp): string {\n\treturn stamp.seq === UnassignedSequenceNumber ? `L${stamp.localSeq}` : `${stamp.seq}`;\n}\n\nexport class TestClient extends Client {\n\tpublic static searchChunkSize = 256;\n\tpublic static readonly serializer = new TestSerializer();\n\tpublic measureOps = false;\n\tpublic accumTime = 0;\n\tpublic accumWindowTime = 0;\n\tpublic accumWindow = 0;\n\tpublic accumOps = 0;\n\tpublic maxWindowTime = 0;\n\n\t/**\n\t * Used for in-memory testing. This will queue a reference string for each client message.\n\t */\n\tpublic static useCheckQ = false;\n\n\tpublic static async createFromClientSnapshot(\n\t\tclient1: TestClient,\n\t\tnewLongClientId: string,\n\t): Promise<TestClient> {\n\t\tconst snapshot = new SnapshotLegacy(\n\t\t\tclient1.mergeTree,\n\t\t\tcreateChildLogger({ namespace: \"fluid:snapshot\" }),\n\t\t);\n\t\tsnapshot.extractSync();\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst summaryTree = snapshot.emit([], TestClient.serializer, undefined!).summary;\n\t\treturn TestClient.createFromSummary(\n\t\t\tsummaryTree,\n\t\t\tnewLongClientId,\n\t\t\tclient1.specToSegment,\n\t\t\tclient1.mergeTree.options,\n\t\t);\n\t}\n\n\tpublic static async createFromSnapshot(\n\t\tsnapshotTree: ITree,\n\t\tnewLongClientId: string,\n\t\tspecToSeg: (spec: IJSONSegment) => ISegmentPrivate,\n\t\toptions?: PropertySet,\n\t): Promise<TestClient> {\n\t\treturn TestClient.createFromStorage(\n\t\t\tnew MockStorage(snapshotTree),\n\t\t\tnewLongClientId,\n\t\t\tspecToSeg,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tpublic static async createFromSummary(\n\t\tsummaryTree: ISummaryTree,\n\t\tnewLongClientId: string,\n\t\tspecToSeg: (spec: IJSONSegment) => ISegmentPrivate,\n\t\toptions?: PropertySet,\n\t): Promise<TestClient> {\n\t\treturn TestClient.createFromStorage(\n\t\t\tMockStorage.createFromSummary(summaryTree),\n\t\t\tnewLongClientId,\n\t\t\tspecToSeg,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tpublic static async createFromStorage(\n\t\tstorage: MockStorage,\n\t\tnewLongClientId: string,\n\t\tspecToSeg: (spec: IJSONSegment) => ISegmentPrivate,\n\t\toptions?: PropertySet,\n\t): Promise<TestClient> {\n\t\tconst client2 = new TestClient(options, specToSeg);\n\t\tconst { catchupOpsP } = await client2.load(\n\t\t\t{\n\t\t\t\tlogger: client2.logger,\n\t\t\t\tclientId: newLongClientId,\n\t\t\t} as unknown as IFluidDataStoreRuntime,\n\t\t\tstorage,\n\t\t\tTestClient.serializer,\n\t\t);\n\t\tawait catchupOpsP;\n\t\treturn client2;\n\t}\n\n\tpublic readonly mergeTree: MergeTree;\n\n\tpublic readonly checkQ: DoublyLinkedList<string> = new DoublyLinkedList<string>();\n\tprotected readonly q: DoublyLinkedList<ISequencedDocumentMessage> =\n\t\tnew DoublyLinkedList<ISequencedDocumentMessage>();\n\n\tprivate readonly textHelper: MergeTreeTextHelper;\n\tconstructor(\n\t\toptions?: IMergeTreeOptions & PropertySet,\n\t\tspecToSeg = specToSegment,\n\t\tgetMinInFlightRefSeq: () => number | undefined = (): undefined => undefined,\n\t) {\n\t\tsuper(\n\t\t\tspecToSeg,\n\t\t\tcreateChildLogger({ namespace: \"fluid:testClient\" }),\n\t\t\toptions,\n\t\t\tgetMinInFlightRefSeq,\n\t\t);\n\t\tthis.mergeTree = (this as Record<\"_mergeTree\", MergeTree>)._mergeTree;\n\t\tthis.textHelper = new MergeTreeTextHelper(this.mergeTree);\n\n\t\t// Validate by default\n\t\tthis.on(\"delta\", (o, d) => {\n\t\t\t// assert.notEqual(d.deltaSegments.length, 0);\n\t\t\tfor (const s of d.deltaSegments) {\n\t\t\t\tif (d.operation === MergeTreeDeltaType.INSERT) {\n\t\t\t\t\tassertMergeNode(s.segment);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic getText(start?: number, end?: number): string {\n\t\treturn this.textHelper.getText(this.mergeTree.localPerspective, \"\", start, end);\n\t}\n\n\tpublic enqueueTestString(): void {\n\t\tthis.checkQ.push(this.getText());\n\t}\n\tpublic getMessageCount(): number {\n\t\treturn this.q.length;\n\t}\n\tpublic enqueueMsg(msg: ISequencedDocumentMessage): void {\n\t\tthis.q.push(msg);\n\t}\n\tpublic dequeueMsg(): ISequencedDocumentMessage | undefined {\n\t\treturn this.q.shift()?.data;\n\t}\n\tpublic applyMessages(msgCount: number): boolean {\n\t\tlet currMsgCount = msgCount;\n\t\twhile (currMsgCount > 0) {\n\t\t\tconst msg = this.dequeueMsg();\n\t\t\tif (msg) {\n\t\t\t\tthis.applyMsg(msg);\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcurrMsgCount--;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic insertTextLocal(\n\t\tpos: number,\n\t\ttext: string,\n\t\tprops?: PropertySet,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst segment = TextSegment.make(text, props);\n\t\treturn this.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic insertTextRemote(\n\t\tpos: number,\n\t\ttext: string,\n\t\tprops: PropertySet | undefined,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tconst segment = TextSegment.make(text, props);\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createInsertSegmentOp(pos, segment), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic removeRangeRemote(\n\t\tstart: number,\n\t\tend: number,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createRemoveRangeOp(start, end), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic obliterateRangeRemote(\n\t\tstart: number,\n\t\tend: number,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createObliterateRangeOp(start, end), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic annotateRangeRemote(\n\t\tstart: number,\n\t\tend: number,\n\t\tprops: PropertySet,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createAnnotateRangeOp(start, end, props), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic insertMarkerLocal(\n\t\tpos: number,\n\t\tbehaviors: ReferenceType,\n\t\tprops?: PropertySet,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst segment = Marker.make(behaviors, props);\n\n\t\treturn this.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic insertMarkerRemote(\n\t\tpos: number,\n\t\tmarkerDef: IMarkerDef,\n\t\tprops: PropertySet,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tconst segment = Marker.make(markerDef.refType ?? ReferenceType.Tile, props);\n\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createInsertSegmentOp(pos, segment), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic relText(clientId: number, refSeq: number): string {\n\t\treturn `cli: ${this.getLongClientId(\n\t\t\tclientId,\n\t\t)} refSeq: ${refSeq}: ${this.textHelper.getText(new PriorPerspective(refSeq, clientId))}`;\n\t}\n\n\tpublic makeOpMessage(\n\t\top: IMergeTreeOp | undefined,\n\t\tseq: number = UnassignedSequenceNumber,\n\t\trefSeq: number = this.getCurrentSeq(),\n\t\tlongClientId?: string,\n\t\tminSeqNumber = 0,\n\t): ISequencedDocumentMessage {\n\t\tif (op === undefined) {\n\t\t\tthrow new Error(\"op cannot be undefined\");\n\t\t}\n\t\tconst msg: ISequencedDocumentMessage = {\n\t\t\tclientId: longClientId ?? this.longClientId ?? \"\",\n\t\t\tclientSequenceNumber: 1,\n\t\t\tcontents: op,\n\t\t\tmetadata: undefined,\n\t\t\tminimumSequenceNumber: minSeqNumber,\n\t\t\treferenceSequenceNumber: refSeq,\n\t\t\tsequenceNumber: seq,\n\t\t\ttimestamp: Date.now(),\n\t\t\ttraces: [],\n\t\t\ttype: MessageType.Operation,\n\t\t};\n\t\treturn msg;\n\t}\n\n\tpublic validate(): void {\n\t\tassert(nodeOrdinalsHaveIntegrity(this.mergeTree.root));\n\t}\n\n\tpublic searchFromPos(\n\t\tpos: number,\n\t\ttarget: RegExp,\n\t): { text: string; pos: number } | undefined {\n\t\tlet start = pos;\n\t\tlet chunk = \"\";\n\t\twhile (start < this.getLength()) {\n\t\t\tchunk = this.getText(start, start + TestClient.searchChunkSize);\n\n\t\t\tconst result = chunk.match(target);\n\t\t\tif (result?.index) {\n\t\t\t\treturn { text: result[0], pos: result.index + start };\n\t\t\t}\n\t\t\tstart += TestClient.searchChunkSize;\n\t\t}\n\t}\n\n\tpublic findRandomWord(): { text: string; pos: number } | undefined {\n\t\tconst len = this.getLength();\n\t\tconst pos = random.integer(0, len);\n\t\tconst nextWord = this.searchFromPos(pos, /\\s\\w+\\b/);\n\t\treturn nextWord;\n\t}\n\n\tpublic debugDumpTree(tree: MergeTree): string[] {\n\t\t// want the segment's content and the state of insert/remove\n\t\tconst test: string[] = [];\n\t\twalkAllChildSegments(tree.root, (segment: ISegmentPrivate) => {\n\t\t\tconst prefixes: (string | undefined | number)[] = [];\n\t\t\tassertInserted(segment);\n\t\t\tprefixes.push(opStampToString(segment.insert));\n\t\t\tif (isRemoved(segment)) {\n\t\t\t\tprefixes.push(opStampToString(segment.removes[0]));\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\ttest.push(`${prefixes.join(\",\")}:${(segment as any).text}`);\n\t\t});\n\t\treturn test;\n\t}\n\n\t/**\n\t * Rebases a (local) position from the perspective `{ seq: seqNumberFrom, localSeq }` to the perspective\n\t * of the current sequence number. This is desirable when rebasing operations for reconnection. Perform\n\t * slow-path computations in this function without leveraging the merge-tree's structure\n\t */\n\tpublic rebasePosition(pos: number, seqNumberFrom: number, localSeq: number): number {\n\t\tlet segment: ISegmentPrivate | undefined;\n\t\tlet posAccumulated = 0;\n\t\tlet offset = pos;\n\n\t\tconst perspective = new LocalReconnectingPerspective(\n\t\t\tseqNumberFrom,\n\t\t\tthis.getCollabWindow().clientId,\n\t\t\tlocalSeq,\n\t\t);\n\n\t\twalkAllChildSegments(this.mergeTree.root, (seg) => {\n\t\t\tassertInserted(seg);\n\t\t\tsegment = seg;\n\n\t\t\tif (perspective.isSegmentPresent(seg)) {\n\t\t\t\tposAccumulated += seg.cachedLength;\n\t\t\t\tif (offset >= seg.cachedLength) {\n\t\t\t\t\toffset -= seg.cachedLength;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Keep going while we've yet to reach the segment at the desired position\n\t\t\treturn posAccumulated <= pos;\n\t\t});\n\n\t\tassert(segment !== undefined, \"No segment found\");\n\t\tconst segoff = getSlideToSegoff({ segment, offset }, undefined, perspective);\n\t\tif (segoff === undefined) {\n\t\t\treturn DetachedReferencePosition;\n\t\t}\n\n\t\treturn this.findReconnectionPosition(segoff.segment, localSeq) + segoff.offset;\n\t}\n\n\tpublic findReconnectionPosition(segment: ISegmentPrivate, localSeq: number): number {\n\t\tconst fasterComputedPosition = super.findReconnectionPosition(segment, localSeq);\n\n\t\tconst perspective = new LocalReconnectingPerspective(\n\t\t\tNumber.MAX_SAFE_INTEGER,\n\t\t\tthis.getCollabWindow().clientId,\n\t\t\tlocalSeq,\n\t\t);\n\t\tlet segmentPosition = 0;\n\n\t\t/*\n Walk the segments up to the current segment, and calculate its\n position taking into account local segments that were modified,\n after the current segment.\n */\n\t\twalkAllChildSegments(this.mergeTree.root, (seg) => {\n\t\t\t// If we've found the desired segment, terminate the walk and return 'segmentPosition'.\n\t\t\tif (seg === segment) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Otherwise, advance segmentPosition if the segment is visible at the given perspective.\n\t\t\tif (perspective.isSegmentPresent(seg)) {\n\t\t\t\tsegmentPosition += seg.cachedLength;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\tassert.equal(\n\t\t\tfasterComputedPosition,\n\t\t\tsegmentPosition,\n\t\t\t\"Expected fast-path computation to match result from walk all segments\",\n\t\t);\n\t\treturn segmentPosition;\n\t}\n\n\t/**\n\t * Validates segments either all have attribution information or none of them.\n\t * If no segment has attribution information, returns undefined.\n\t *\n\t * @param channel - Attribution channel name to request information from.\n\t * @returns an array of all attribution seq#s from the current perspective.\n\t * The `i`th entry of the array is the attribution key for the character at position `i`.\n\t */\n\tpublic getAllAttributionSeqs(channel?: string): (number | AttributionKey | undefined)[] {\n\t\tconst seqs: (number | AttributionKey | undefined)[] = [];\n\t\tthis.walkAllSegments((segment) => {\n\t\t\tfor (let i = 0; i < segment.cachedLength; i++) {\n\t\t\t\tconst key = segment.attribution?.getAtOffset(i, channel);\n\t\t\t\tseqs.push(key?.type === \"op\" ? key.seq : key);\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\treturn seqs;\n\t}\n\n\tpublic peekPendingSegmentGroups(): SegmentGroup | undefined;\n\tpublic peekPendingSegmentGroups(count: number): SegmentGroup | SegmentGroup[] | undefined;\n\tpublic peekPendingSegmentGroups(\n\t\tcount: number = 1,\n\t): SegmentGroup | SegmentGroup[] | undefined {\n\t\treturn super.peekPendingSegmentGroups(count) as SegmentGroup | SegmentGroup[] | undefined;\n\t}\n\n\t/**\n\t * Override and add some test only metrics\n\t */\n\tpublic applyMsg(msg: ISequencedDocumentMessage, local: boolean = false): void {\n\t\tlet traceStart: Trace | undefined;\n\t\tif (this.measureOps) {\n\t\t\ttraceStart = Trace.start();\n\t\t}\n\n\t\tsuper.applyMsg(msg, local);\n\n\t\tif (traceStart) {\n\t\t\tthis.accumTime += elapsedMicroseconds(traceStart);\n\t\t\tthis.accumOps++;\n\t\t\tthis.accumWindow += this.getCurrentSeq() - this.getCollabWindow().minSeq;\n\t\t}\n\t}\n\n\t/**\n\t * Override and add some test only metrics\n\t */\n\tupdateMinSeq(minSeq: number): void {\n\t\tlet trace: Trace | undefined;\n\t\tif (this.measureOps) {\n\t\t\ttrace = Trace.start();\n\t\t}\n\n\t\tsuper.updateMinSeq(minSeq);\n\t\tif (trace) {\n\t\t\tconst elapsed = elapsedMicroseconds(trace);\n\t\t\tthis.accumWindowTime += elapsed;\n\t\t\tif (elapsed > this.maxWindowTime) {\n\t\t\t\tthis.maxWindowTime = elapsed;\n\t\t\t}\n\t\t}\n\t}\n\n\tslowSearchForMarker(\n\t\tstartPos: number,\n\t\tmarkerLabel: string,\n\t\tforwards = true,\n\t): ReferencePosition | undefined {\n\t\tlet foundMarker: Marker | undefined;\n\n\t\tconst { segment } = this.getContainingSegment<ISegmentPrivate>(startPos) ?? {};\n\t\tassertSegmentLeaf(segment);\n\t\tif (Marker.is(segment)) {\n\t\t\tif (refHasTileLabel(segment, markerLabel)) {\n\t\t\t\tfoundMarker = segment;\n\t\t\t}\n\t\t} else {\n\t\t\tif (forwards) {\n\t\t\t\tforwardExcursion(segment, (seg) => {\n\t\t\t\t\tif (Marker.is(seg) && refHasTileLabel(seg, markerLabel)) {\n\t\t\t\t\t\tfoundMarker = seg;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tbackwardExcursion(segment, (seg) => {\n\t\t\t\t\tif (Marker.is(seg) && refHasTileLabel(seg, markerLabel)) {\n\t\t\t\t\t\tfoundMarker = seg;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn foundMarker;\n\t}\n}\n\nfunction elapsedMicroseconds(trace: Trace): number {\n\treturn trace.trace().duration * 1000;\n}\n\n// the client doesn't submit ops, so this adds a callback to capture them\nexport type TestClientRevertibleDriver = MergeTreeRevertibleDriver &\n\tPartial<{ submitOpCallback?: (op: IMergeTreeOp | undefined) => void }>;\n\nexport const createRevertDriver = (client: TestClient): TestClientRevertibleDriver => {\n\treturn {\n\t\tremoveRange(start: number, end: number): void {\n\t\t\tconst op = client.removeRangeLocal(start, end);\n\t\t\tthis.submitOpCallback?.(op);\n\t\t},\n\t\tannotateRange(start: number, end: number, props: PropertySet): void {\n\t\t\tconst op = client.annotateRangeLocal(start, end, props);\n\t\t\tthis.submitOpCallback?.(op);\n\t\t},\n\t\tinsertFromSpec(pos: number, spec: IJSONSegment): void {\n\t\t\tconst op = client.insertSegmentLocal(pos, client.specToSegment(spec));\n\t\t\tthis.submitOpCallback?.(op);\n\t\t},\n\t};\n};\n\nexport interface MergeTreeStats {\n\tmaxHeight: number;\n\tnodeCount: number;\n\tleafCount: number;\n\tremovedLeafCount: number;\n\tliveCount: number;\n\thisto: number[];\n\twindowTime?: number;\n\tpackTime?: number;\n\tordTime?: number;\n\tmaxOrdTime?: number;\n}\n\nexport function getStats(tree: MergeTree): MergeTreeStats {\n\tconst nodeGetStats = (block: MergeBlock): MergeTreeStats => {\n\t\tconst stats: MergeTreeStats = {\n\t\t\tmaxHeight: 0,\n\t\t\tnodeCount: 0,\n\t\t\tleafCount: 0,\n\t\t\tremovedLeafCount: 0,\n\t\t\tliveCount: 0,\n\t\t\thisto: [],\n\t\t};\n\t\tfor (let k = 0; k < MaxNodesInBlock; k++) {\n\t\t\tstats.histo[k] = 0;\n\t\t}\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\tconst child = block.children[i];\n\t\t\tlet height = 1;\n\t\t\tif (child.isLeaf()) {\n\t\t\t\tstats.leafCount++;\n\t\t\t\tconst segment = child;\n\t\t\t\tif (isRemoved(segment)) {\n\t\t\t\t\tstats.removedLeafCount++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst childStats = nodeGetStats(child);\n\t\t\t\theight = 1 + childStats.maxHeight;\n\t\t\t\tstats.nodeCount += childStats.nodeCount;\n\t\t\t\tstats.leafCount += childStats.leafCount;\n\t\t\t\tstats.removedLeafCount += childStats.removedLeafCount;\n\t\t\t\tstats.liveCount += childStats.liveCount;\n\t\t\t\tfor (let j = 0; j < MaxNodesInBlock; j++) {\n\t\t\t\t\tstats.histo[j] += childStats.histo[j];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (height > stats.maxHeight) {\n\t\t\t\tstats.maxHeight = height;\n\t\t\t}\n\t\t}\n\t\tstats.histo[block.childCount]++;\n\t\tstats.nodeCount++;\n\t\tstats.liveCount += block.childCount;\n\t\treturn stats;\n\t};\n\tconst rootStats = nodeGetStats(tree.root);\n\treturn rootStats;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"testClient.js","sourceRoot":"","sources":["../../src/test/testClient.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6CAA+C;AAE/C,+DAAqD;AACrD,gFAAkE;AAClE,kEAAuE;AAGvE,0EAIqD;AAErD,uEAA6E;AAC7E,0EAA0E;AAE1E,sEAAgE;AAChE,4CAAsC;AACtC,kDAA2D;AAE3D,kDAAmE;AACnE,kEAIiC;AACjC,4DAO8B;AAC9B,kDAKyB;AACzB,sCAOmB;AACnB,sDAAmF;AAEnF,oEAAsF;AAEtF,wDAAgF;AAChF,4DAAsD;AAEtD,sDAAgD;AAEhD,2DAAqD;AACrD,iDAA2D;AAE3D,SAAgB,aAAa,CAAC,IAAkB;IAC/C,MAAM,SAAS,GAAG,4BAAW,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,SAAS,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,0BAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9E,CAAC;AAZD,sCAYC;AAED,MAAM,MAAM,GAAG,IAAA,kCAAU,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAEjD,SAAS,eAAe,CAAC,KAAqB;IAC7C,OAAO,KAAK,CAAC,GAAG,KAAK,uCAAwB,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;AACvF,CAAC;AAED,MAAa,UAAW,SAAQ,kBAAM;IAe9B,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAC3C,OAAmB,EACnB,eAAuB;QAEvB,MAAM,QAAQ,GAAG,IAAI,kCAAc,CAClC,OAAO,CAAC,SAAS,EACjB,IAAA,4BAAiB,EAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAClD,CAAC;QACF,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvB,oEAAoE;QACpE,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,UAAU,EAAE,SAAU,CAAC,CAAC,OAAO,CAAC;QACjF,OAAO,UAAU,CAAC,iBAAiB,CAClC,WAAW,EACX,eAAe,EACf,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,SAAS,CAAC,OAAO,CACzB,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,kBAAkB,CACrC,YAAmB,EACnB,eAAuB,EACvB,SAAkD,EAClD,OAAqB;QAErB,OAAO,UAAU,CAAC,iBAAiB,CAClC,IAAI,sBAAW,CAAC,YAAY,CAAC,EAC7B,eAAe,EACf,SAAS,EACT,OAAO,CACP,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CACpC,WAAyB,EACzB,eAAuB,EACvB,SAAkD,EAClD,OAAqB;QAErB,OAAO,UAAU,CAAC,iBAAiB,CAClC,sBAAW,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAC1C,eAAe,EACf,SAAS,EACT,OAAO,CACP,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CACpC,OAAoB,EACpB,eAAuB,EACvB,SAAkD,EAClD,OAAqB;QAErB,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACnD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CACzC;YACC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,eAAe;SACY,EACtC,OAAO,EACP,UAAU,CAAC,UAAU,CACrB,CAAC;QACF,MAAM,WAAW,CAAC;QAClB,OAAO,OAAO,CAAC;IAChB,CAAC;IASD,YACC,OAAyC,EACzC,SAAS,GAAG,aAAa,EACzB,uBAAiD,GAAc,EAAE,CAAC,SAAS;QAE3E,KAAK,CACJ,SAAS,EACT,IAAA,4BAAiB,EAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,EACpD,OAAO,EACP,oBAAoB,CACpB,CAAC;QA/FI,eAAU,GAAG,KAAK,CAAC;QACnB,cAAS,GAAG,CAAC,CAAC;QACd,oBAAe,GAAG,CAAC,CAAC;QACpB,gBAAW,GAAG,CAAC,CAAC;QAChB,aAAQ,GAAG,CAAC,CAAC;QACb,kBAAa,GAAG,CAAC,CAAC;QA2ET,WAAM,GAA6B,IAAI,2BAAgB,EAAU,CAAC;QAC/D,MAAC,GACnB,IAAI,2BAAgB,EAA6B,CAAC;QAclD,IAAI,CAAC,SAAS,GAAI,IAAwC,CAAC,UAAU,CAAC;QACtE,IAAI,CAAC,UAAU,GAAG,IAAI,4CAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1D,sBAAsB;QACtB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACzB,8CAA8C;YAC9C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;gBACjC,IAAI,CAAC,CAAC,SAAS,KAAK,2BAAkB,CAAC,MAAM,EAAE,CAAC;oBAC/C,IAAA,iCAAe,EAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC5B,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,OAAO,CAAC,KAAc,EAAE,GAAY;QAC1C,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC;IAEM,iBAAiB;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAClC,CAAC;IACM,eAAe;QACrB,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACtB,CAAC;IACM,UAAU,CAAC,GAA8B;QAC/C,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IACM,UAAU;QAChB,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC;IAC7B,CAAC;IACM,aAAa,CAAC,QAAgB;QACpC,IAAI,YAAY,GAAG,QAAQ,CAAC;QAC5B,OAAO,YAAY,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9B,IAAI,GAAG,EAAE,CAAC;gBACT,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACP,MAAM;YACP,CAAC;YACD,YAAY,EAAE,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,eAAe,CACrB,GAAW,EACX,IAAY,EACZ,KAAmB;QAEnB,MAAM,OAAO,GAAG,4BAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAEM,gBAAgB,CACtB,GAAW,EACX,IAAY,EACZ,KAA8B,EAC9B,GAAW,EACX,MAAc,EACd,YAAoB;QAEpB,MAAM,OAAO,GAAG,4BAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CACZ,IAAI,CAAC,aAAa,CAAC,IAAA,oCAAqB,EAAC,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAClF,CAAC;IACH,CAAC;IAEM,iBAAiB,CACvB,KAAa,EACb,GAAW,EACX,GAAW,EACX,MAAc,EACd,YAAoB;QAEpB,IAAI,CAAC,QAAQ,CACZ,IAAI,CAAC,aAAa,CAAC,IAAA,kCAAmB,EAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAC9E,CAAC;IACH,CAAC;IAEM,qBAAqB,CAC3B,KAAa,EACb,GAAW,EACX,GAAW,EACX,MAAc,EACd,YAAoB;QAEpB,IAAI,CAAC,QAAQ,CACZ,IAAI,CAAC,aAAa,CAAC,IAAA,sCAAuB,EAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAClF,CAAC;IACH,CAAC;IAEM,mBAAmB,CACzB,KAAa,EACb,GAAW,EACX,KAAkB,EAClB,GAAW,EACX,MAAc,EACd,YAAoB;QAEpB,IAAI,CAAC,QAAQ,CACZ,IAAI,CAAC,aAAa,CAAC,IAAA,oCAAqB,EAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CACvF,CAAC;IACH,CAAC;IAEM,iBAAiB,CACvB,GAAW,EACX,SAAwB,EACxB,KAAmB;QAEnB,MAAM,OAAO,GAAG,0BAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAE9C,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAEM,kBAAkB,CACxB,GAAW,EACX,SAAqB,EACrB,KAAkB,EAClB,GAAW,EACX,MAAc,EACd,YAAoB;QAEpB,MAAM,OAAO,GAAG,0BAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,sBAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE5E,IAAI,CAAC,QAAQ,CACZ,IAAI,CAAC,aAAa,CAAC,IAAA,oCAAqB,EAAC,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAClF,CAAC;IACH,CAAC;IAEM,OAAO,CAAC,QAAgB,EAAE,MAAc;QAC9C,OAAO,QAAQ,IAAI,CAAC,eAAe,CAClC,QAAQ,CACR,YAAY,MAAM,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,iCAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC3F,CAAC;IAEM,aAAa,CACnB,EAA4B,EAC5B,MAAc,uCAAwB,EACtC,SAAiB,IAAI,CAAC,aAAa,EAAE,EACrC,YAAqB,EACrB,YAAY,GAAG,CAAC;QAEhB,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,GAAG,GAA8B;YACtC,QAAQ,EAAE,YAAY,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE;YACjD,oBAAoB,EAAE,CAAC;YACvB,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,SAAS;YACnB,qBAAqB,EAAE,YAAY;YACnC,uBAAuB,EAAE,MAAM;YAC/B,cAAc,EAAE,GAAG;YACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,sBAAW,CAAC,SAAS;SAC3B,CAAC;QACF,OAAO,GAAG,CAAC;IACZ,CAAC;IAEM,QAAQ;QACd,IAAA,oBAAM,EAAC,IAAA,wCAAyB,EAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;IAEM,aAAa,CACnB,GAAW,EACX,MAAc;QAEd,IAAI,KAAK,GAAG,GAAG,CAAC;QAChB,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,OAAO,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACjC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;YAEhE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC;gBACnB,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;YACvD,CAAC;YACD,KAAK,IAAI,UAAU,CAAC,eAAe,CAAC;QACrC,CAAC;IACF,CAAC;IAEM,cAAc;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAEM,aAAa,CAAC,IAAe;QACnC,4DAA4D;QAC5D,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAA,2CAAoB,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAwB,EAAE,EAAE;YAC5D,MAAM,QAAQ,GAAoC,EAAE,CAAC;YACrD,IAAA,gCAAc,EAAC,OAAO,CAAC,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,IAAI,IAAA,2BAAS,EAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,CAAC;YACD,0GAA0G;YAC1G,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAK,OAAe,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,GAAW,EAAE,aAAqB,EAAE,QAAgB;QACzE,IAAI,OAAoC,CAAC;QACzC,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,MAAM,GAAG,GAAG,CAAC;QAEjB,MAAM,WAAW,GAAG,IAAI,6CAA4B,CACnD,aAAa,EACb,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAC/B,QAAQ,CACR,CAAC;QAEF,IAAA,2CAAoB,EAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACjD,IAAA,gCAAc,EAAC,GAAG,CAAC,CAAC;YACpB,OAAO,GAAG,GAAG,CAAC;YAEd,IAAI,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,cAAc,IAAI,GAAG,CAAC,YAAY,CAAC;gBACnC,IAAI,MAAM,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;oBAChC,MAAM,IAAI,GAAG,CAAC,YAAY,CAAC;gBAC5B,CAAC;YACF,CAAC;YAED,0EAA0E;YAC1E,OAAO,cAAc,IAAI,GAAG,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,IAAA,oBAAM,EAAC,OAAO,KAAK,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAA,+BAAgB,EAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC7E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,iDAAyB,CAAC;QAClC,CAAC;QAED,OAAO,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAChF,CAAC;IAEM,wBAAwB,CAAC,OAAwB,EAAE,QAAgB;QACzE,MAAM,sBAAsB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEjF,MAAM,WAAW,GAAG,IAAI,6CAA4B,CACnD,MAAM,CAAC,gBAAgB,EACvB,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAC/B,QAAQ,CACR,CAAC;QACF,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB;;;;UAIQ;QACR,IAAA,2CAAoB,EAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACjD,uFAAuF;YACvF,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;gBACrB,OAAO,KAAK,CAAC;YACd,CAAC;YAED,yFAAyF;YACzF,IAAI,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,eAAe,IAAI,GAAG,CAAC,YAAY,CAAC;YACrC,CAAC;YAED,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,oBAAM,CAAC,KAAK,CACX,sBAAsB,EACtB,eAAe,EACf,uEAAuE,CACvE,CAAC;QACF,OAAO,eAAe,CAAC;IACxB,CAAC;IAED;;;;;;;OAOG;IACI,qBAAqB,CAAC,OAAgB;QAC5C,MAAM,IAAI,GAA4C,EAAE,CAAC;QACzD,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,EAAE;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACzD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACb,CAAC;IAIM,wBAAwB,CAC9B,QAAgB,CAAC;QAEjB,OAAO,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAA8C,CAAC;IAC3F,CAAC;IAED;;OAEG;IACI,QAAQ,CAAC,GAA8B,EAAE,QAAiB,KAAK;QACrE,IAAI,UAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,UAAU,GAAG,oBAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAE3B,IAAI,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC;QAC1E,CAAC;IACF,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAc;QAC1B,IAAI,KAAwB,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,KAAK,GAAG,oBAAK,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC;YAChC,IAAI,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBAClC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC9B,CAAC;QACF,CAAC;IACF,CAAC;IAED,mBAAmB,CAClB,QAAgB,EAChB,WAAmB,EACnB,QAAQ,GAAG,IAAI;QAEf,IAAI,WAA+B,CAAC;QAEpC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAkB,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/E,IAAA,qCAAiB,EAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,0BAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,IAAI,IAAA,uCAAe,EAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;gBAC3C,WAAW,GAAG,OAAO,CAAC;YACvB,CAAC;QACF,CAAC;aAAM,CAAC;YACP,IAAI,QAAQ,EAAE,CAAC;gBACd,IAAA,uCAAgB,EAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBACjC,IAAI,0BAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAA,uCAAe,EAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC;wBACzD,WAAW,GAAG,GAAG,CAAC;wBAClB,OAAO,KAAK,CAAC;oBACd,CAAC;gBACF,CAAC,CAAC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACP,IAAA,wCAAiB,EAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBAClC,IAAI,0BAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAA,uCAAe,EAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC;wBACzD,WAAW,GAAG,GAAG,CAAC;wBAClB,OAAO,KAAK,CAAC;oBACd,CAAC;gBACF,CAAC,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QAED,OAAO,WAAW,CAAC;IACpB,CAAC;;AA/dF,gCAgeC;AA/dc,0BAAe,GAAG,GAAG,AAAN,CAAO;AACb,qBAAU,GAAG,IAAI,kCAAc,EAAE,AAAvB,CAAwB;AAQzD;;GAEG;AACW,oBAAS,GAAG,KAAK,AAAR,CAAS;AAqdjC,SAAS,mBAAmB,CAAC,KAAY;IACxC,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC;AACtC,CAAC;AAMM,MAAM,kBAAkB,GAAG,CAAC,MAAkB,EAA8B,EAAE;IACpF,OAAO;QACN,WAAW,CAAC,KAAa,EAAE,GAAW;YACrC,MAAM,EAAE,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,aAAa,CAAC,KAAa,EAAE,GAAW,EAAE,KAAkB;YAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACxD,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,cAAc,CAAC,GAAW,EAAE,IAAkB;YAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YACtE,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;KACD,CAAC;AACH,CAAC,CAAC;AAfW,QAAA,kBAAkB,sBAe7B;AAeF,SAAgB,QAAQ,CAAC,IAAe;IACvC,MAAM,YAAY,GAAG,CAAC,KAAiB,EAAkB,EAAE;QAC1D,MAAM,KAAK,GAAmB;YAC7B,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,gBAAgB,EAAE,CAAC;YACnB,SAAS,EAAE,CAAC;YACZ,KAAK,EAAE,EAAE;SACT,CAAC;QACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mCAAe,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACpB,KAAK,CAAC,SAAS,EAAE,CAAC;gBAClB,MAAM,OAAO,GAAG,KAAK,CAAC;gBACtB,IAAI,IAAA,2BAAS,EAAC,OAAO,CAAC,EAAE,CAAC;oBACxB,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;gBACvC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC;gBAClC,KAAK,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC;gBACxC,KAAK,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC;gBACxC,KAAK,CAAC,gBAAgB,IAAI,UAAU,CAAC,gBAAgB,CAAC;gBACtD,KAAK,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC;gBACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mCAAe,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACvC,CAAC;YACF,CAAC;YACD,IAAI,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC9B,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;YAC1B,CAAC;QACF,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,SAAS,EAAE,CAAC;QAClB,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC;QACpC,OAAO,KAAK,CAAC;IACd,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,SAAS,CAAC;AAClB,CAAC;AA5CD,4BA4CC","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 { Trace } from \"@fluid-internal/client-utils\";\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { DoublyLinkedList } from \"@fluidframework/core-utils/internal\";\nimport type { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions/internal\";\nimport type { ISummaryTree } from \"@fluidframework/driver-definitions\";\nimport {\n\ttype ITree,\n\tMessageType,\n\ttype ISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport type { AttributionKey } from \"@fluidframework/runtime-definitions/internal\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\nimport { MockStorage } from \"@fluidframework/test-runtime-utils/internal\";\n\nimport { MergeTreeTextHelper } from \"../MergeTreeTextHelper.js\";\nimport { Client } from \"../client.js\";\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport type { IMergeTreeOptions, ReferencePosition } from \"../index.js\";\nimport { type MergeTree, getSlideToSegoff } from \"../mergeTree.js\";\nimport {\n\tbackwardExcursion,\n\tforwardExcursion,\n\twalkAllChildSegments,\n} from \"../mergeTreeNodeWalk.js\";\nimport {\n\ttype MergeBlock,\n\ttype ISegmentPrivate,\n\tMarker,\n\tMaxNodesInBlock,\n\ttype SegmentGroup,\n\tassertSegmentLeaf,\n} from \"../mergeTreeNodes.js\";\nimport {\n\tcreateAnnotateRangeOp,\n\tcreateInsertSegmentOp,\n\tcreateObliterateRangeOp,\n\tcreateRemoveRangeOp,\n} from \"../opBuilder.js\";\nimport {\n\ttype IJSONSegment,\n\ttype IMarkerDef,\n\ttype IMergeTreeOp,\n\tMergeTreeDeltaType,\n\tReferenceType,\n\ttype IMergeTreeInsertMsg,\n} from \"../ops.js\";\nimport { LocalReconnectingPerspective, PriorPerspective } from \"../perspective.js\";\nimport type { PropertySet } from \"../properties.js\";\nimport { DetachedReferencePosition, refHasTileLabel } from \"../referencePositions.js\";\nimport type { MergeTreeRevertibleDriver } from \"../revertibles.js\";\nimport { assertInserted, assertMergeNode, isRemoved } from \"../segmentInfos.js\";\nimport { SnapshotLegacy } from \"../snapshotlegacy.js\";\nimport type { OperationStamp } from \"../stamps.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestSerializer } from \"./testSerializer.js\";\nimport { nodeOrdinalsHaveIntegrity } from \"./testUtils.js\";\n\nexport function specToSegment(spec: IJSONSegment): ISegmentPrivate {\n\tconst maybeText = TextSegment.fromJSONObject(spec);\n\tif (maybeText) {\n\t\treturn maybeText;\n\t}\n\n\tconst maybeMarker = Marker.fromJSONObject(spec);\n\tif (maybeMarker) {\n\t\treturn maybeMarker;\n\t}\n\n\tthrow new Error(`Unrecognized IJSONSegment type: '${JSON.stringify(spec)}'`);\n}\n\nconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\nfunction opStampToString(stamp: OperationStamp): string {\n\treturn stamp.seq === UnassignedSequenceNumber ? `L${stamp.localSeq}` : `${stamp.seq}`;\n}\n\nexport class TestClient extends Client {\n\tpublic static searchChunkSize = 256;\n\tpublic static readonly serializer = new TestSerializer();\n\tpublic measureOps = false;\n\tpublic accumTime = 0;\n\tpublic accumWindowTime = 0;\n\tpublic accumWindow = 0;\n\tpublic accumOps = 0;\n\tpublic maxWindowTime = 0;\n\n\t/**\n\t * Used for in-memory testing. This will queue a reference string for each client message.\n\t */\n\tpublic static useCheckQ = false;\n\n\tpublic static async createFromClientSnapshot(\n\t\tclient1: TestClient,\n\t\tnewLongClientId: string,\n\t): Promise<TestClient> {\n\t\tconst snapshot = new SnapshotLegacy(\n\t\t\tclient1.mergeTree,\n\t\t\tcreateChildLogger({ namespace: \"fluid:snapshot\" }),\n\t\t);\n\t\tsnapshot.extractSync();\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst summaryTree = snapshot.emit([], TestClient.serializer, undefined!).summary;\n\t\treturn TestClient.createFromSummary(\n\t\t\tsummaryTree,\n\t\t\tnewLongClientId,\n\t\t\tclient1.specToSegment,\n\t\t\tclient1.mergeTree.options,\n\t\t);\n\t}\n\n\tpublic static async createFromSnapshot(\n\t\tsnapshotTree: ITree,\n\t\tnewLongClientId: string,\n\t\tspecToSeg: (spec: IJSONSegment) => ISegmentPrivate,\n\t\toptions?: PropertySet,\n\t): Promise<TestClient> {\n\t\treturn TestClient.createFromStorage(\n\t\t\tnew MockStorage(snapshotTree),\n\t\t\tnewLongClientId,\n\t\t\tspecToSeg,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tpublic static async createFromSummary(\n\t\tsummaryTree: ISummaryTree,\n\t\tnewLongClientId: string,\n\t\tspecToSeg: (spec: IJSONSegment) => ISegmentPrivate,\n\t\toptions?: PropertySet,\n\t): Promise<TestClient> {\n\t\treturn TestClient.createFromStorage(\n\t\t\tMockStorage.createFromSummary(summaryTree),\n\t\t\tnewLongClientId,\n\t\t\tspecToSeg,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tpublic static async createFromStorage(\n\t\tstorage: MockStorage,\n\t\tnewLongClientId: string,\n\t\tspecToSeg: (spec: IJSONSegment) => ISegmentPrivate,\n\t\toptions?: PropertySet,\n\t): Promise<TestClient> {\n\t\tconst client2 = new TestClient(options, specToSeg);\n\t\tconst { catchupOpsP } = await client2.load(\n\t\t\t{\n\t\t\t\tlogger: client2.logger,\n\t\t\t\tclientId: newLongClientId,\n\t\t\t} as unknown as IFluidDataStoreRuntime,\n\t\t\tstorage,\n\t\t\tTestClient.serializer,\n\t\t);\n\t\tawait catchupOpsP;\n\t\treturn client2;\n\t}\n\n\tpublic readonly mergeTree: MergeTree;\n\n\tpublic readonly checkQ: DoublyLinkedList<string> = new DoublyLinkedList<string>();\n\tprotected readonly q: DoublyLinkedList<ISequencedDocumentMessage> =\n\t\tnew DoublyLinkedList<ISequencedDocumentMessage>();\n\n\tprivate readonly textHelper: MergeTreeTextHelper;\n\tconstructor(\n\t\toptions?: IMergeTreeOptions & PropertySet,\n\t\tspecToSeg = specToSegment,\n\t\tgetMinInFlightRefSeq: () => number | undefined = (): undefined => undefined,\n\t) {\n\t\tsuper(\n\t\t\tspecToSeg,\n\t\t\tcreateChildLogger({ namespace: \"fluid:testClient\" }),\n\t\t\toptions,\n\t\t\tgetMinInFlightRefSeq,\n\t\t);\n\t\tthis.mergeTree = (this as Record<\"_mergeTree\", MergeTree>)._mergeTree;\n\t\tthis.textHelper = new MergeTreeTextHelper(this.mergeTree);\n\n\t\t// Validate by default\n\t\tthis.on(\"delta\", (o, d) => {\n\t\t\t// assert.notEqual(d.deltaSegments.length, 0);\n\t\t\tfor (const s of d.deltaSegments) {\n\t\t\t\tif (d.operation === MergeTreeDeltaType.INSERT) {\n\t\t\t\t\tassertMergeNode(s.segment);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic getText(start?: number, end?: number): string {\n\t\treturn this.textHelper.getText(this.mergeTree.localPerspective, \"\", start, end);\n\t}\n\n\tpublic enqueueTestString(): void {\n\t\tthis.checkQ.push(this.getText());\n\t}\n\tpublic getMessageCount(): number {\n\t\treturn this.q.length;\n\t}\n\tpublic enqueueMsg(msg: ISequencedDocumentMessage): void {\n\t\tthis.q.push(msg);\n\t}\n\tpublic dequeueMsg(): ISequencedDocumentMessage | undefined {\n\t\treturn this.q.shift()?.data;\n\t}\n\tpublic applyMessages(msgCount: number): boolean {\n\t\tlet currMsgCount = msgCount;\n\t\twhile (currMsgCount > 0) {\n\t\t\tconst msg = this.dequeueMsg();\n\t\t\tif (msg) {\n\t\t\t\tthis.applyMsg(msg);\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcurrMsgCount--;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic insertTextLocal(\n\t\tpos: number,\n\t\ttext: string,\n\t\tprops?: PropertySet,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst segment = TextSegment.make(text, props);\n\t\treturn this.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic insertTextRemote(\n\t\tpos: number,\n\t\ttext: string,\n\t\tprops: PropertySet | undefined,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tconst segment = TextSegment.make(text, props);\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createInsertSegmentOp(pos, segment), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic removeRangeRemote(\n\t\tstart: number,\n\t\tend: number,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createRemoveRangeOp(start, end), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic obliterateRangeRemote(\n\t\tstart: number,\n\t\tend: number,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createObliterateRangeOp(start, end), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic annotateRangeRemote(\n\t\tstart: number,\n\t\tend: number,\n\t\tprops: PropertySet,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createAnnotateRangeOp(start, end, props), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic insertMarkerLocal(\n\t\tpos: number,\n\t\tbehaviors: ReferenceType,\n\t\tprops?: PropertySet,\n\t): IMergeTreeInsertMsg | undefined {\n\t\tconst segment = Marker.make(behaviors, props);\n\n\t\treturn this.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic insertMarkerRemote(\n\t\tpos: number,\n\t\tmarkerDef: IMarkerDef,\n\t\tprops: PropertySet,\n\t\tseq: number,\n\t\trefSeq: number,\n\t\tlongClientId: string,\n\t): void {\n\t\tconst segment = Marker.make(markerDef.refType ?? ReferenceType.Tile, props);\n\n\t\tthis.applyMsg(\n\t\t\tthis.makeOpMessage(createInsertSegmentOp(pos, segment), seq, refSeq, longClientId),\n\t\t);\n\t}\n\n\tpublic relText(clientId: number, refSeq: number): string {\n\t\treturn `cli: ${this.getLongClientId(\n\t\t\tclientId,\n\t\t)} refSeq: ${refSeq}: ${this.textHelper.getText(new PriorPerspective(refSeq, clientId))}`;\n\t}\n\n\tpublic makeOpMessage(\n\t\top: IMergeTreeOp | undefined,\n\t\tseq: number = UnassignedSequenceNumber,\n\t\trefSeq: number = this.getCurrentSeq(),\n\t\tlongClientId?: string,\n\t\tminSeqNumber = 0,\n\t): ISequencedDocumentMessage {\n\t\tif (op === undefined) {\n\t\t\tthrow new Error(\"op cannot be undefined\");\n\t\t}\n\t\tconst msg: ISequencedDocumentMessage = {\n\t\t\tclientId: longClientId ?? this.longClientId ?? \"\",\n\t\t\tclientSequenceNumber: 1,\n\t\t\tcontents: op,\n\t\t\tmetadata: undefined,\n\t\t\tminimumSequenceNumber: minSeqNumber,\n\t\t\treferenceSequenceNumber: refSeq,\n\t\t\tsequenceNumber: seq,\n\t\t\ttimestamp: Date.now(),\n\t\t\ttraces: [],\n\t\t\ttype: MessageType.Operation,\n\t\t};\n\t\treturn msg;\n\t}\n\n\tpublic validate(): void {\n\t\tassert(nodeOrdinalsHaveIntegrity(this.mergeTree.root));\n\t}\n\n\tpublic searchFromPos(\n\t\tpos: number,\n\t\ttarget: RegExp,\n\t): { text: string; pos: number } | undefined {\n\t\tlet start = pos;\n\t\tlet chunk = \"\";\n\t\twhile (start < this.getLength()) {\n\t\t\tchunk = this.getText(start, start + TestClient.searchChunkSize);\n\n\t\t\tconst result = chunk.match(target);\n\t\t\tif (result?.index) {\n\t\t\t\treturn { text: result[0], pos: result.index + start };\n\t\t\t}\n\t\t\tstart += TestClient.searchChunkSize;\n\t\t}\n\t}\n\n\tpublic findRandomWord(): { text: string; pos: number } | undefined {\n\t\tconst len = this.getLength();\n\t\tconst pos = random.integer(0, len);\n\t\tconst nextWord = this.searchFromPos(pos, /\\s\\w+\\b/);\n\t\treturn nextWord;\n\t}\n\n\tpublic debugDumpTree(tree: MergeTree): string[] {\n\t\t// want the segment's content and the state of insert/remove\n\t\tconst test: string[] = [];\n\t\twalkAllChildSegments(tree.root, (segment: ISegmentPrivate) => {\n\t\t\tconst prefixes: (string | undefined | number)[] = [];\n\t\t\tassertInserted(segment);\n\t\t\tprefixes.push(opStampToString(segment.insert));\n\t\t\tif (isRemoved(segment)) {\n\t\t\t\tprefixes.push(opStampToString(segment.removes[0]));\n\t\t\t}\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t\t\ttest.push(`${prefixes.join(\",\")}:${(segment as any).text}`);\n\t\t});\n\t\treturn test;\n\t}\n\n\t/**\n\t * Rebases a (local) position from the perspective `{ seq: seqNumberFrom, localSeq }` to the perspective\n\t * of the current sequence number. This is desirable when rebasing operations for reconnection. Perform\n\t * slow-path computations in this function without leveraging the merge-tree's structure\n\t */\n\tpublic rebasePosition(pos: number, seqNumberFrom: number, localSeq: number): number {\n\t\tlet segment: ISegmentPrivate | undefined;\n\t\tlet posAccumulated = 0;\n\t\tlet offset = pos;\n\n\t\tconst perspective = new LocalReconnectingPerspective(\n\t\t\tseqNumberFrom,\n\t\t\tthis.getCollabWindow().clientId,\n\t\t\tlocalSeq,\n\t\t);\n\n\t\twalkAllChildSegments(this.mergeTree.root, (seg) => {\n\t\t\tassertInserted(seg);\n\t\t\tsegment = seg;\n\n\t\t\tif (perspective.isSegmentPresent(seg)) {\n\t\t\t\tposAccumulated += seg.cachedLength;\n\t\t\t\tif (offset >= seg.cachedLength) {\n\t\t\t\t\toffset -= seg.cachedLength;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Keep going while we've yet to reach the segment at the desired position\n\t\t\treturn posAccumulated <= pos;\n\t\t});\n\n\t\tassert(segment !== undefined, \"No segment found\");\n\t\tconst segoff = getSlideToSegoff({ segment, offset }, undefined, perspective);\n\t\tif (segoff === undefined) {\n\t\t\treturn DetachedReferencePosition;\n\t\t}\n\n\t\treturn this.findReconnectionPosition(segoff.segment, localSeq) + segoff.offset;\n\t}\n\n\tpublic findReconnectionPosition(segment: ISegmentPrivate, localSeq: number): number {\n\t\tconst fasterComputedPosition = super.findReconnectionPosition(segment, localSeq);\n\n\t\tconst perspective = new LocalReconnectingPerspective(\n\t\t\tNumber.MAX_SAFE_INTEGER,\n\t\t\tthis.getCollabWindow().clientId,\n\t\t\tlocalSeq,\n\t\t);\n\t\tlet segmentPosition = 0;\n\n\t\t/*\n Walk the segments up to the current segment, and calculate its\n position taking into account local segments that were modified,\n after the current segment.\n */\n\t\twalkAllChildSegments(this.mergeTree.root, (seg) => {\n\t\t\t// If we've found the desired segment, terminate the walk and return 'segmentPosition'.\n\t\t\tif (seg === segment) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Otherwise, advance segmentPosition if the segment is visible at the given perspective.\n\t\t\tif (perspective.isSegmentPresent(seg)) {\n\t\t\t\tsegmentPosition += seg.cachedLength;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\tassert.equal(\n\t\t\tfasterComputedPosition,\n\t\t\tsegmentPosition,\n\t\t\t\"Expected fast-path computation to match result from walk all segments\",\n\t\t);\n\t\treturn segmentPosition;\n\t}\n\n\t/**\n\t * Validates segments either all have attribution information or none of them.\n\t * If no segment has attribution information, returns undefined.\n\t *\n\t * @param channel - Attribution channel name to request information from.\n\t * @returns an array of all attribution seq#s from the current perspective.\n\t * The `i`th entry of the array is the attribution key for the character at position `i`.\n\t */\n\tpublic getAllAttributionSeqs(channel?: string): (number | AttributionKey | undefined)[] {\n\t\tconst seqs: (number | AttributionKey | undefined)[] = [];\n\t\tthis.walkAllSegments((segment) => {\n\t\t\tfor (let i = 0; i < segment.cachedLength; i++) {\n\t\t\t\tconst key = segment.attribution?.getAtOffset(i, channel);\n\t\t\t\tseqs.push(key?.type === \"op\" ? key.seq : key);\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\treturn seqs;\n\t}\n\n\tpublic peekPendingSegmentGroups(): SegmentGroup | undefined;\n\tpublic peekPendingSegmentGroups(count: number): SegmentGroup | SegmentGroup[] | undefined;\n\tpublic peekPendingSegmentGroups(\n\t\tcount: number = 1,\n\t): SegmentGroup | SegmentGroup[] | undefined {\n\t\treturn super.peekPendingSegmentGroups(count) as SegmentGroup | SegmentGroup[] | undefined;\n\t}\n\n\t/**\n\t * Override and add some test only metrics\n\t */\n\tpublic applyMsg(msg: ISequencedDocumentMessage, local: boolean = false): void {\n\t\tlet traceStart: Trace | undefined;\n\t\tif (this.measureOps) {\n\t\t\ttraceStart = Trace.start();\n\t\t}\n\n\t\tsuper.applyMsg(msg, local);\n\n\t\tif (traceStart) {\n\t\t\tthis.accumTime += elapsedMicroseconds(traceStart);\n\t\t\tthis.accumOps++;\n\t\t\tthis.accumWindow += this.getCurrentSeq() - this.getCollabWindow().minSeq;\n\t\t}\n\t}\n\n\t/**\n\t * Override and add some test only metrics\n\t */\n\tupdateMinSeq(minSeq: number): void {\n\t\tlet trace: Trace | undefined;\n\t\tif (this.measureOps) {\n\t\t\ttrace = Trace.start();\n\t\t}\n\n\t\tsuper.updateMinSeq(minSeq);\n\t\tif (trace) {\n\t\t\tconst elapsed = elapsedMicroseconds(trace);\n\t\t\tthis.accumWindowTime += elapsed;\n\t\t\tif (elapsed > this.maxWindowTime) {\n\t\t\t\tthis.maxWindowTime = elapsed;\n\t\t\t}\n\t\t}\n\t}\n\n\tslowSearchForMarker(\n\t\tstartPos: number,\n\t\tmarkerLabel: string,\n\t\tforwards = true,\n\t): ReferencePosition | undefined {\n\t\tlet foundMarker: Marker | undefined;\n\n\t\tconst { segment } = this.getContainingSegment<ISegmentPrivate>(startPos) ?? {};\n\t\tassertSegmentLeaf(segment);\n\t\tif (Marker.is(segment)) {\n\t\t\tif (refHasTileLabel(segment, markerLabel)) {\n\t\t\t\tfoundMarker = segment;\n\t\t\t}\n\t\t} else {\n\t\t\tif (forwards) {\n\t\t\t\tforwardExcursion(segment, (seg) => {\n\t\t\t\t\tif (Marker.is(seg) && refHasTileLabel(seg, markerLabel)) {\n\t\t\t\t\t\tfoundMarker = seg;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tbackwardExcursion(segment, (seg) => {\n\t\t\t\t\tif (Marker.is(seg) && refHasTileLabel(seg, markerLabel)) {\n\t\t\t\t\t\tfoundMarker = seg;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn foundMarker;\n\t}\n}\n\nfunction elapsedMicroseconds(trace: Trace): number {\n\treturn trace.trace().duration * 1000;\n}\n\n// the client doesn't submit ops, so this adds a callback to capture them\nexport type TestClientRevertibleDriver = MergeTreeRevertibleDriver &\n\tPartial<{ submitOpCallback?: (op: IMergeTreeOp | undefined) => void }>;\n\nexport const createRevertDriver = (client: TestClient): TestClientRevertibleDriver => {\n\treturn {\n\t\tremoveRange(start: number, end: number): void {\n\t\t\tconst op = client.removeRangeLocal(start, end);\n\t\t\tthis.submitOpCallback?.(op);\n\t\t},\n\t\tannotateRange(start: number, end: number, props: PropertySet): void {\n\t\t\tconst op = client.annotateRangeLocal(start, end, props);\n\t\t\tthis.submitOpCallback?.(op);\n\t\t},\n\t\tinsertFromSpec(pos: number, spec: IJSONSegment): void {\n\t\t\tconst op = client.insertSegmentLocal(pos, client.specToSegment(spec));\n\t\t\tthis.submitOpCallback?.(op);\n\t\t},\n\t};\n};\n\nexport interface MergeTreeStats {\n\tmaxHeight: number;\n\tnodeCount: number;\n\tleafCount: number;\n\tremovedLeafCount: number;\n\tliveCount: number;\n\thisto: number[];\n\twindowTime?: number;\n\tpackTime?: number;\n\tordTime?: number;\n\tmaxOrdTime?: number;\n}\n\nexport function getStats(tree: MergeTree): MergeTreeStats {\n\tconst nodeGetStats = (block: MergeBlock): MergeTreeStats => {\n\t\tconst stats: MergeTreeStats = {\n\t\t\tmaxHeight: 0,\n\t\t\tnodeCount: 0,\n\t\t\tleafCount: 0,\n\t\t\tremovedLeafCount: 0,\n\t\t\tliveCount: 0,\n\t\t\thisto: [],\n\t\t};\n\t\tfor (let k = 0; k < MaxNodesInBlock; k++) {\n\t\t\tstats.histo[k] = 0;\n\t\t}\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\tconst child = block.children[i];\n\t\t\tlet height = 1;\n\t\t\tif (child.isLeaf()) {\n\t\t\t\tstats.leafCount++;\n\t\t\t\tconst segment = child;\n\t\t\t\tif (isRemoved(segment)) {\n\t\t\t\t\tstats.removedLeafCount++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst childStats = nodeGetStats(child);\n\t\t\t\theight = 1 + childStats.maxHeight;\n\t\t\t\tstats.nodeCount += childStats.nodeCount;\n\t\t\t\tstats.leafCount += childStats.leafCount;\n\t\t\t\tstats.removedLeafCount += childStats.removedLeafCount;\n\t\t\t\tstats.liveCount += childStats.liveCount;\n\t\t\t\tfor (let j = 0; j < MaxNodesInBlock; j++) {\n\t\t\t\t\tstats.histo[j] += childStats.histo[j];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (height > stats.maxHeight) {\n\t\t\t\tstats.maxHeight = height;\n\t\t\t}\n\t\t}\n\t\tstats.histo[block.childCount]++;\n\t\tstats.nodeCount++;\n\t\tstats.liveCount += block.childCount;\n\t\treturn stats;\n\t};\n\tconst rootStats = nodeGetStats(tree.root);\n\treturn rootStats;\n}\n"]}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { IMergeTreeOptions } from "../index.js";
|
|
6
|
-
import { PropertySet } from "../properties.js";
|
|
5
|
+
import type { IMergeTreeOptions } from "../index.js";
|
|
6
|
+
import { type PropertySet } from "../properties.js";
|
|
7
7
|
import { TestClient } from "./testClient.js";
|
|
8
8
|
type ClientMap<TClientName extends string> = Partial<Record<TClientName, TestClient>>;
|
|
9
9
|
export declare function createClientsAtInitialState<TClients extends ClientMap<TClientName>, TClientName extends string = string & keyof TClients>(opts: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testClientLogger.d.ts","sourceRoot":"","sources":["../../src/test/testClientLogger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"testClientLogger.d.ts","sourceRoot":"","sources":["../../src/test/testClientLogger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AASrD,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAKrE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA4C7C,KAAK,SAAS,CAAC,WAAW,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAEtF,wBAAgB,2BAA2B,CAC1C,QAAQ,SAAS,SAAS,CAAC,WAAW,CAAC,EACvC,WAAW,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,QAAQ,EAEpD,IAAI,EAAE;IACL,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,iBAAiB,GAAG,WAAW,CAAC;CAC1C,EACD,GAAG,SAAS,EAAE,WAAW,EAAE,GACzB,MAAM,CAAC,MAAM,QAAQ,EAAE,UAAU,CAAC,GAAG;IAAE,GAAG,EAAE,UAAU,EAAE,CAAA;CAAE,CAuB5D;AACD,qBAAa,gBAAgB;IA0C3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;WA1CV,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM;IAiB9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAEhD,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,SAAS,CAAgB;IAEjC,OAAO,CAAC,aAAa,CAAoC;IAEzD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsB;IAEvD;;;OAGG;IACI,OAAO,IAAI,IAAI;gBAQJ,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,KAAK,CAAC,oBAAQ;IA4DhC,OAAO,CAAC,aAAa;IA+Bd,QAAQ,CAAC,IAAI,CAAC,EAAE;QACtB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,MAAM;IA+DV,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAOhE,QAAQ,CAAC,aAAa,GAAE,OAAe,GAAG,MAAM;IAyBhD,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,KAAK;IASxC;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;CAqD3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testClientLogger.js","sourceRoot":"","sources":["../../src/test/testClientLogger.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 { DoublyLinkedList } from \"@fluidframework/core-utils/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { LoggingError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport { IMergeTreeOptions } from \"../index.js\";\nimport {\n\tIMergeTreeDeltaOpArgs,\n\tMergeTreeMaintenanceType,\n\ttype IMergeTreeMaintenanceCallbackArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { depthFirstNodeWalk } from \"../mergeTreeNodeWalk.js\";\nimport { IMergeNode, Marker, seqLTE, type ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport { IMergeTreeOp, MergeTreeDeltaType } from \"../ops.js\";\nimport { PropertySet, matchProperties } from \"../properties.js\";\nimport type { IHasInsertionInfo, IHasRemovalInfo } from \"../segmentInfos.js\";\nimport type { RemoveOperationStamp } from \"../stamps.js\";\nimport { TextSegment, TextSegmentGranularity } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\nfunction getOpString(msg: ISequencedDocumentMessage | undefined): string {\n\tif (msg === undefined) {\n\t\treturn \"\";\n\t}\n\tconst op = msg.contents as IMergeTreeOp;\n\tconst opType = op.type.toString();\n\tlet opPos;\n\tif (op.type === MergeTreeDeltaType.OBLITERATE_SIDED) {\n\t\tconst pos1Side =\n\t\t\top.type === MergeTreeDeltaType.OBLITERATE_SIDED ? (op.pos1.before ? \"[\" : \"(\") : \"\";\n\t\tconst pos2Side =\n\t\t\top.type === MergeTreeDeltaType.OBLITERATE_SIDED ? (op.pos2.before ? \")\" : \"]\") : \"\";\n\t\topPos = `@${pos1Side}${op.pos1.pos},${op.pos2.pos}${pos2Side}`;\n\t} else {\n\t\topPos =\n\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\top?.[\"pos1\"] === undefined\n\t\t\t\t? \"\"\n\t\t\t\t: // eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\t\t`@${op[\"pos1\"]}${op[\"pos2\"] === undefined ? \"\" : `,${op[\"pos2\"]}`}`;\n\t}\n\n\tconst seq = msg.sequenceNumber < 0 ? \"L\" : msg.sequenceNumber.toString();\n\tconst ref = msg.referenceSequenceNumber.toString();\n\tconst client = msg.clientId;\n\treturn `${seq}:${ref}:${client}${opType}${opPos}`;\n}\n\nfunction arePropsEmpty(props: PropertySet | undefined): boolean {\n\treturn props === undefined || Object.entries(props).length === 0;\n}\n\n/**\n * Compare properties, allowing empty to match undefined\n */\nfunction matchPropertiesHandleEmpty(\n\ta: PropertySet | undefined,\n\tb: PropertySet | undefined,\n): boolean {\n\treturn matchProperties(a, b) || (arePropsEmpty(a) && arePropsEmpty(b));\n}\n\ntype ClientMap<TClientName extends string> = Partial<Record<TClientName, TestClient>>;\n\nexport function createClientsAtInitialState<\n\tTClients extends ClientMap<TClientName>,\n\tTClientName extends string = string & keyof TClients,\n>(\n\topts: {\n\t\tinitialState: string;\n\t\toptions?: IMergeTreeOptions & PropertySet;\n\t},\n\t...clientIds: TClientName[]\n): Record<keyof TClients, TestClient> & { all: TestClient[] } {\n\tconst setup = (c: TestClient): void => {\n\t\tif (opts.initialState.length > 0) {\n\t\t\tc.insertTextLocal(0, opts.initialState);\n\t\t\twhile (c.getText().includes(\"-\")) {\n\t\t\t\tconst index = c.getText().indexOf(\"-\");\n\t\t\t\tc.removeRangeLocal(index, index + 1);\n\t\t\t}\n\t\t}\n\t};\n\tconst all: TestClient[] = [];\n\tconst clients: Partial<Record<keyof TClients, TestClient>> = {};\n\tfor (const id of clientIds) {\n\t\tif (clients[id] === undefined) {\n\t\t\tconst client = new TestClient(opts.options);\n\t\t\tclients[id] = client;\n\t\t\tall.push(client);\n\t\t\tsetup(client);\n\t\t\tclient.startOrUpdateCollaboration(id);\n\t\t}\n\t}\n\n\treturn { ...(clients as Record<keyof TClients, TestClient>), all };\n}\nexport class TestClientLogger {\n\tpublic static toString(clients: readonly TestClient[]): string {\n\t\treturn (\n\t\t\tclients\n\t\t\t\t.map((c) => this.getSegString(c))\n\t\t\t\t// eslint-disable-next-line unicorn/no-array-reduce\n\t\t\t\t.reduce<[string, string]>(\n\t\t\t\t\t(pv, cv) => {\n\t\t\t\t\t\tpv[0] += `|${cv.acked.padEnd(cv.local.length, \"\")}`;\n\t\t\t\t\t\tpv[1] += `|${cv.local.padEnd(cv.acked.length, \"\")}`;\n\t\t\t\t\t\treturn pv;\n\t\t\t\t\t},\n\t\t\t\t\t[\"\", \"\"],\n\t\t\t\t)\n\t\t\t\t.join(\"\\n\")\n\t\t);\n\t}\n\n\tprivate readonly incrementalLog = false;\n\n\tprivate readonly paddings: number[] = [];\n\tprivate readonly roundLogLines: string[][] = [];\n\n\tprivate ackedLine: string[] = [];\n\tprivate localLine: string[] = [];\n\t// initialize to private instance, so first real edit will create a new line\n\tprivate lastDeltaArgs: IMergeTreeDeltaOpArgs | undefined;\n\n\tprivate readonly disposeCallbacks: (() => void)[] = [];\n\n\t/**\n\t * Unsubscribes this logger from its clients' events. Consider using this for tests with client lifetime\n\t * extending significantly past the logger's.\n\t */\n\tpublic dispose(): void {\n\t\tfor (const cb of this.disposeCallbacks) {\n\t\t\tcb();\n\t\t}\n\t\tthis.disposeCallbacks.length = 0;\n\t}\n\n\tconstructor(\n\t\tprivate readonly clients: readonly TestClient[],\n\t\tprivate readonly title?: string,\n\t) {\n\t\tconst logHeaders: string[] = [];\n\t\tfor (const [i, c] of clients.entries()) {\n\t\t\tlogHeaders.push(\"op\", `client ${c.longClientId}`);\n\t\t\tconst callback = (deltaArgs: IMergeTreeDeltaOpArgs | undefined): void => {\n\t\t\t\tif (\n\t\t\t\t\tthis.lastDeltaArgs?.sequencedMessage !== deltaArgs?.sequencedMessage ||\n\t\t\t\t\tthis.lastDeltaArgs?.op !== deltaArgs?.op\n\t\t\t\t) {\n\t\t\t\t\tthis.addNewLogLine();\n\t\t\t\t\tthis.lastDeltaArgs = deltaArgs;\n\t\t\t\t}\n\t\t\t\tconst clientLogIndex = i * 2;\n\n\t\t\t\tthis.ackedLine[clientLogIndex] =\n\t\t\t\t\tdeltaArgs === undefined\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: getOpString(\n\t\t\t\t\t\t\t\tdeltaArgs.sequencedMessage === undefined\n\t\t\t\t\t\t\t\t\t? c.makeOpMessage(deltaArgs.op)\n\t\t\t\t\t\t\t\t\t: { ...deltaArgs.sequencedMessage, contents: deltaArgs.op },\n\t\t\t\t\t\t\t);\n\t\t\t\tconst segStrings = TestClientLogger.getSegString(c);\n\t\t\t\tthis.ackedLine[clientLogIndex + 1] = segStrings.acked;\n\t\t\t\tthis.localLine[clientLogIndex + 1] = segStrings.local;\n\n\t\t\t\tthis.paddings[clientLogIndex] = Math.max(\n\t\t\t\t\tthis.ackedLine[clientLogIndex].length,\n\t\t\t\t\tthis.localLine[clientLogIndex].length,\n\t\t\t\t\tthis.paddings[clientLogIndex],\n\t\t\t\t);\n\n\t\t\t\tthis.paddings[clientLogIndex + 1] = Math.max(\n\t\t\t\t\tthis.ackedLine[clientLogIndex + 1].length,\n\t\t\t\t\tthis.localLine[clientLogIndex + 1].length,\n\t\t\t\t\tthis.paddings[clientLogIndex + 1],\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tconst maintenanceCallback = (\n\t\t\t\tmain: IMergeTreeMaintenanceCallbackArgs,\n\t\t\t\top: IMergeTreeDeltaOpArgs | undefined,\n\t\t\t): void => {\n\t\t\t\tif (main.operation === MergeTreeMaintenanceType.ACKNOWLEDGED) {\n\t\t\t\t\tcallback(op);\n\t\t\t\t}\n\t\t\t};\n\t\t\tc.on(\"delta\", callback);\n\t\t\tc.on(\"maintenance\", maintenanceCallback);\n\t\t\tthis.disposeCallbacks.push(() => {\n\t\t\t\tc.off(\"delta\", callback);\n\t\t\t\tc.off(\"maintenance\", maintenanceCallback);\n\t\t\t});\n\t\t}\n\t\tthis.roundLogLines.push(logHeaders);\n\t\tfor (const v of this.roundLogLines[0]) this.paddings.push(v.length);\n\t\tthis.addNewLogLine(); // capture initial state\n\t}\n\n\tprivate addNewLogLine(): void {\n\t\tif (this.incrementalLog) {\n\t\t\twhile (this.roundLogLines.length > 0) {\n\t\t\t\tconst logLine = this.roundLogLines.shift();\n\t\t\t\tif (logLine?.some((c) => c.trim().length > 0)) {\n\t\t\t\t\tconsole.log(logLine.map((v, i) => v.padEnd(this.paddings[i])).join(\" | \"));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.ackedLine = [];\n\t\tthis.localLine = [];\n\t\tfor (const [clientLogIndex, cc] of this.clients.entries()) {\n\t\t\tconst segStrings = TestClientLogger.getSegString(cc);\n\t\t\tthis.ackedLine.push(\"\", segStrings.acked);\n\t\t\tthis.localLine.push(\"\", segStrings.local);\n\n\t\t\tthis.paddings[clientLogIndex] = Math.max(\n\t\t\t\tthis.ackedLine[clientLogIndex].length,\n\t\t\t\tthis.localLine[clientLogIndex].length,\n\t\t\t\tthis.paddings[clientLogIndex],\n\t\t\t);\n\n\t\t\tthis.paddings[clientLogIndex + 1] = Math.max(\n\t\t\t\tthis.ackedLine[clientLogIndex + 1].length,\n\t\t\t\tthis.localLine[clientLogIndex + 1].length,\n\t\t\t\tthis.paddings[clientLogIndex + 1],\n\t\t\t);\n\t\t}\n\t\tthis.roundLogLines.push(this.ackedLine, this.localLine);\n\t}\n\n\tpublic validate(opts?: {\n\t\tclear?: boolean;\n\t\tbaseText?: string;\n\t\terrorPrefix?: string;\n\t}): string {\n\t\tconst baseText = opts?.baseText ?? this.clients[0].getText();\n\t\tconst errorPrefix = opts?.errorPrefix ? `${opts?.errorPrefix}: ` : \"\";\n\t\t// cache all the properties of client 0 for faster look up\n\t\tconst properties = Array.from({ length: this.clients[0].getLength() }).map((_, i) =>\n\t\t\tthis.clients[0].getPropertiesAtPosition(i),\n\t\t);\n\t\tfor (const c of this.clients) {\n\t\t\tif (opts?.baseText === undefined && c === this.clients[0]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// ensure all clients have seen the same ops\n\t\t\tassert.equal(\n\t\t\t\tc.getCurrentSeq(),\n\t\t\t\tthis.clients[0].getCurrentSeq(),\n\t\t\t\t`${errorPrefix}${c.longClientId} current seq does not match client ${this.clients[0].longClientId}`,\n\t\t\t);\n\t\t\t// Pre-check to avoid this.toString() in the string template\n\t\t\tif (c.getText() !== baseText) {\n\t\t\t\tassert.equal(\n\t\t\t\t\tc.getText(),\n\t\t\t\t\tbaseText,\n\t\t\t\t\t`${errorPrefix}\\n${this.toString()}\\nClient ${\n\t\t\t\t\t\tc.longClientId\n\t\t\t\t\t} does not match client ${\n\t\t\t\t\t\topts?.baseText ? \"baseText\" : this.clients[0].longClientId\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (c === this.clients[0]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet pos = 0;\n\t\t\tdepthFirstNodeWalk(c.mergeTree.root, c.mergeTree.root.children[0], undefined, (seg) => {\n\t\t\t\tif (toMoveOrRemove(seg) === undefined) {\n\t\t\t\t\tconst segProps = seg.properties;\n\t\t\t\t\tfor (let i = 0; i < seg.cachedLength; i++) {\n\t\t\t\t\t\tif (!matchPropertiesHandleEmpty(segProps, properties[pos + i])) {\n\t\t\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\t\t\tsegProps,\n\t\t\t\t\t\t\t\tproperties[pos + i],\n\t\t\t\t\t\t\t\t`${errorPrefix}\\n${this.toString()}\\nClient ${\n\t\t\t\t\t\t\t\t\tc.longClientId\n\t\t\t\t\t\t\t\t} does not match client ${this.clients[0].longClientId} properties at pos ${\n\t\t\t\t\t\t\t\t\tpos + i\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}\n\t\t\t\t\tpos += seg.cachedLength;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (opts?.clear === true) {\n\t\t\tthis.roundLogLines.splice(1, this.roundLogLines.length);\n\t\t\tfor (const [i, v] of this.roundLogLines[0].entries()) this.paddings[i] = v.length;\n\t\t\tthis.addNewLogLine(); // capture initial state\n\t\t}\n\t\treturn baseText;\n\t}\n\n\tstatic validate(clients: readonly TestClient[], title?: string): string {\n\t\tconst logger = new TestClientLogger(clients, title);\n\t\tconst result = logger.validate();\n\t\tlogger.dispose();\n\t\treturn result;\n\t}\n\n\tpublic toString(excludeHeader: boolean = false): string {\n\t\tlet str = \"\";\n\t\tif (!excludeHeader) {\n\t\t\tstr +=\n\t\t\t\t`_: Local State\\n` +\n\t\t\t\t`-: Deleted ~:Deleted <= MinSeq\\n` +\n\t\t\t\t`*: Unacked Insert and Delete\\n` +\n\t\t\t\t`${this.clients[0].getCollabWindow().minSeq}: msn/offset\\n` +\n\t\t\t\t`Op format <seq>:<ref>:<client><type>@<side1><pos1>,<pos2><side2>\\n` +\n\t\t\t\t`sequence number represented as offset from msn. L means local.\\n` +\n\t\t\t\t`op types: 0) insert 1) remove 2) annotate 4) obliterate\\n` +\n\t\t\t\t`for obliterates: [] indicates that the range includes the position,\\n` +\n\t\t\t\t`and () indicates that the range excludes that position from the obliterate.\\n`;\n\n\t\t\tif (this.title) {\n\t\t\t\tstr += `${this.title}\\n`;\n\t\t\t}\n\t\t}\n\t\tstr += this.roundLogLines\n\t\t\t.filter((line) => line.some((c) => c.trim().length > 0))\n\t\t\t.map((line) => line.map((v, i) => v.padEnd(this.paddings[i])).join(\" | \"))\n\t\t\t.join(\"\\n\");\n\t\treturn str;\n\t}\n\n\tpublic addLogsToError(e: unknown): Error {\n\t\tif (e instanceof Error) {\n\t\t\te.message += `\\n${this.toString()}`;\n\t\t\treturn e;\n\t\t}\n\n\t\treturn new LoggingError(`${e}\\n${this.toString()}`);\n\t}\n\n\t/**\n\t * Get a string representation of the merge-tree state.\n\t *\n\t * @privateRemarks\n\t * This function is a dominating bottleneck in operation runner tests, as they log multiple client states per operation performed.\n\t * This takes more than 50% of the overall test time, so some inner-loop elements of this favor performance over readability/safety\n\t * (e.g. precomputing removed string representations, casting to the more internal segment interfaces to view insertion/removal info\n\t * rather than import typeguards, etc.)\n\t */\n\tprivate static getSegString(client: TestClient): { acked: string; local: string } {\n\t\tlet acked: string = \"\";\n\t\tlet local: string = \"\";\n\t\tconst nodes = new DoublyLinkedList<IMergeNode>([client.mergeTree.root]);\n\t\tlet parent: IMergeNode | undefined;\n\t\tconst { minSeq } = client.getCollabWindow();\n\t\twhile (nodes.length > 0) {\n\t\t\t// Safe due to length check above\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst node = nodes.shift()!.data;\n\t\t\tif (node.isLeaf()) {\n\t\t\t\tif (node.parent !== parent) {\n\t\t\t\t\tif (acked.length > 0) {\n\t\t\t\t\t\tacked += \" \";\n\t\t\t\t\t\tlocal += \" \";\n\t\t\t\t\t}\n\t\t\t\t\tparent = node.parent;\n\t\t\t\t}\n\t\t\t\tconst text = TextSegment.is(node) ? node.text : Marker.is(node) ? \"¶\" : undefined;\n\t\t\t\tif (text !== undefined) {\n\t\t\t\t\tconst insertionSeq = (node as IHasInsertionInfo).insert.seq;\n\t\t\t\t\tconst removedNode = toMoveOrRemove(node);\n\t\t\t\t\tif (removedNode === undefined) {\n\t\t\t\t\t\tif (insertionSeq === UnassignedSequenceNumber) {\n\t\t\t\t\t\t\tacked += underscores[text.length];\n\t\t\t\t\t\t\tlocal += text;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tacked += text;\n\t\t\t\t\t\t\tlocal += spaces[text.length];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (removedNode.seq === UnassignedSequenceNumber) {\n\t\t\t\t\t\t\tacked += underscores[text.length];\n\t\t\t\t\t\t\tlocal +=\n\t\t\t\t\t\t\t\tinsertionSeq === UnassignedSequenceNumber\n\t\t\t\t\t\t\t\t\t? asterisks[text.length]\n\t\t\t\t\t\t\t\t\t: dashes[text.length];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tacked += seqLTE(removedNode.seq, minSeq)\n\t\t\t\t\t\t\t\t? tildes[text.length]\n\t\t\t\t\t\t\t\t: dashes[text.length];\n\t\t\t\t\t\t\tlocal += spaces[text.length];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < node.childCount; i++) {\n\t\t\t\t\tnodes.push(node.children[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { acked, local };\n\t}\n}\n\nconst maxSegmentLength = TextSegmentGranularity * 2;\nconst underscores = Array.from({ length: maxSegmentLength }, (_, i) => \"_\".repeat(i));\nconst spaces = Array.from({ length: maxSegmentLength }, (_, i) => \" \".repeat(i));\nconst dashes = Array.from({ length: maxSegmentLength }, (_, i) => \"-\".repeat(i));\nconst asterisks = Array.from({ length: maxSegmentLength }, (_, i) => \"*\".repeat(i));\nconst tildes = Array.from({ length: maxSegmentLength }, (_, i) => \"~\".repeat(i));\n\nfunction toMoveOrRemove(segment: ISegmentPrivate): RemoveOperationStamp | undefined {\n\tif ((segment as unknown as IHasRemovalInfo).removes !== undefined) {\n\t\treturn (segment as unknown as IHasRemovalInfo).removes[0];\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"testClientLogger.js","sourceRoot":"","sources":["../../src/test/testClientLogger.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 { DoublyLinkedList } from \"@fluidframework/core-utils/internal\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { LoggingError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport type { IMergeTreeOptions } from \"../index.js\";\nimport {\n\ttype IMergeTreeDeltaOpArgs,\n\tMergeTreeMaintenanceType,\n\ttype IMergeTreeMaintenanceCallbackArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { depthFirstNodeWalk } from \"../mergeTreeNodeWalk.js\";\nimport { type IMergeNode, Marker, seqLTE, type ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport { type IMergeTreeOp, MergeTreeDeltaType } from \"../ops.js\";\nimport { type PropertySet, matchProperties } from \"../properties.js\";\nimport type { IHasInsertionInfo, IHasRemovalInfo } from \"../segmentInfos.js\";\nimport type { RemoveOperationStamp } from \"../stamps.js\";\nimport { TextSegment, TextSegmentGranularity } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\nfunction getOpString(msg: ISequencedDocumentMessage | undefined): string {\n\tif (msg === undefined) {\n\t\treturn \"\";\n\t}\n\tconst op = msg.contents as IMergeTreeOp;\n\tconst opType = op.type.toString();\n\tlet opPos;\n\tif (op.type === MergeTreeDeltaType.OBLITERATE_SIDED) {\n\t\tconst pos1Side =\n\t\t\top.type === MergeTreeDeltaType.OBLITERATE_SIDED ? (op.pos1.before ? \"[\" : \"(\") : \"\";\n\t\tconst pos2Side =\n\t\t\top.type === MergeTreeDeltaType.OBLITERATE_SIDED ? (op.pos2.before ? \")\" : \"]\") : \"\";\n\t\topPos = `@${pos1Side}${op.pos1.pos},${op.pos2.pos}${pos2Side}`;\n\t} else {\n\t\topPos =\n\t\t\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\top?.[\"pos1\"] === undefined\n\t\t\t\t? \"\"\n\t\t\t\t: // eslint-disable-next-line @typescript-eslint/dot-notation\n\t\t\t\t\t`@${op[\"pos1\"]}${op[\"pos2\"] === undefined ? \"\" : `,${op[\"pos2\"]}`}`;\n\t}\n\n\tconst seq = msg.sequenceNumber < 0 ? \"L\" : msg.sequenceNumber.toString();\n\tconst ref = msg.referenceSequenceNumber.toString();\n\tconst client = msg.clientId;\n\treturn `${seq}:${ref}:${client}${opType}${opPos}`;\n}\n\nfunction arePropsEmpty(props: PropertySet | undefined): boolean {\n\treturn props === undefined || Object.entries(props).length === 0;\n}\n\n/**\n * Compare properties, allowing empty to match undefined\n */\nfunction matchPropertiesHandleEmpty(\n\ta: PropertySet | undefined,\n\tb: PropertySet | undefined,\n): boolean {\n\treturn matchProperties(a, b) || (arePropsEmpty(a) && arePropsEmpty(b));\n}\n\ntype ClientMap<TClientName extends string> = Partial<Record<TClientName, TestClient>>;\n\nexport function createClientsAtInitialState<\n\tTClients extends ClientMap<TClientName>,\n\tTClientName extends string = string & keyof TClients,\n>(\n\topts: {\n\t\tinitialState: string;\n\t\toptions?: IMergeTreeOptions & PropertySet;\n\t},\n\t...clientIds: TClientName[]\n): Record<keyof TClients, TestClient> & { all: TestClient[] } {\n\tconst setup = (c: TestClient): void => {\n\t\tif (opts.initialState.length > 0) {\n\t\t\tc.insertTextLocal(0, opts.initialState);\n\t\t\twhile (c.getText().includes(\"-\")) {\n\t\t\t\tconst index = c.getText().indexOf(\"-\");\n\t\t\t\tc.removeRangeLocal(index, index + 1);\n\t\t\t}\n\t\t}\n\t};\n\tconst all: TestClient[] = [];\n\tconst clients: Partial<Record<keyof TClients, TestClient>> = {};\n\tfor (const id of clientIds) {\n\t\tif (clients[id] === undefined) {\n\t\t\tconst client = new TestClient(opts.options);\n\t\t\tclients[id] = client;\n\t\t\tall.push(client);\n\t\t\tsetup(client);\n\t\t\tclient.startOrUpdateCollaboration(id);\n\t\t}\n\t}\n\n\treturn { ...(clients as Record<keyof TClients, TestClient>), all };\n}\nexport class TestClientLogger {\n\tpublic static toString(clients: readonly TestClient[]): string {\n\t\treturn (\n\t\t\tclients\n\t\t\t\t.map((c) => this.getSegString(c))\n\t\t\t\t// eslint-disable-next-line unicorn/no-array-reduce\n\t\t\t\t.reduce<[string, string]>(\n\t\t\t\t\t(pv, cv) => {\n\t\t\t\t\t\tpv[0] += `|${cv.acked.padEnd(cv.local.length, \"\")}`;\n\t\t\t\t\t\tpv[1] += `|${cv.local.padEnd(cv.acked.length, \"\")}`;\n\t\t\t\t\t\treturn pv;\n\t\t\t\t\t},\n\t\t\t\t\t[\"\", \"\"],\n\t\t\t\t)\n\t\t\t\t.join(\"\\n\")\n\t\t);\n\t}\n\n\tprivate readonly incrementalLog = false;\n\n\tprivate readonly paddings: number[] = [];\n\tprivate readonly roundLogLines: string[][] = [];\n\n\tprivate ackedLine: string[] = [];\n\tprivate localLine: string[] = [];\n\t// initialize to private instance, so first real edit will create a new line\n\tprivate lastDeltaArgs: IMergeTreeDeltaOpArgs | undefined;\n\n\tprivate readonly disposeCallbacks: (() => void)[] = [];\n\n\t/**\n\t * Unsubscribes this logger from its clients' events. Consider using this for tests with client lifetime\n\t * extending significantly past the logger's.\n\t */\n\tpublic dispose(): void {\n\t\tfor (const cb of this.disposeCallbacks) {\n\t\t\tcb();\n\t\t}\n\t\tthis.disposeCallbacks.length = 0;\n\t}\n\n\tconstructor(\n\t\tprivate readonly clients: readonly TestClient[],\n\t\tprivate readonly title?: string,\n\t) {\n\t\tconst logHeaders: string[] = [];\n\t\tfor (const [i, c] of clients.entries()) {\n\t\t\tlogHeaders.push(\"op\", `client ${c.longClientId}`);\n\t\t\tconst callback = (deltaArgs: IMergeTreeDeltaOpArgs | undefined): void => {\n\t\t\t\tif (\n\t\t\t\t\tthis.lastDeltaArgs?.sequencedMessage !== deltaArgs?.sequencedMessage ||\n\t\t\t\t\tthis.lastDeltaArgs?.op !== deltaArgs?.op\n\t\t\t\t) {\n\t\t\t\t\tthis.addNewLogLine();\n\t\t\t\t\tthis.lastDeltaArgs = deltaArgs;\n\t\t\t\t}\n\t\t\t\tconst clientLogIndex = i * 2;\n\n\t\t\t\tthis.ackedLine[clientLogIndex] =\n\t\t\t\t\tdeltaArgs === undefined\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: getOpString(\n\t\t\t\t\t\t\t\tdeltaArgs.sequencedMessage === undefined\n\t\t\t\t\t\t\t\t\t? c.makeOpMessage(deltaArgs.op)\n\t\t\t\t\t\t\t\t\t: { ...deltaArgs.sequencedMessage, contents: deltaArgs.op },\n\t\t\t\t\t\t\t);\n\t\t\t\tconst segStrings = TestClientLogger.getSegString(c);\n\t\t\t\tthis.ackedLine[clientLogIndex + 1] = segStrings.acked;\n\t\t\t\tthis.localLine[clientLogIndex + 1] = segStrings.local;\n\n\t\t\t\tthis.paddings[clientLogIndex] = Math.max(\n\t\t\t\t\tthis.ackedLine[clientLogIndex].length,\n\t\t\t\t\tthis.localLine[clientLogIndex].length,\n\t\t\t\t\tthis.paddings[clientLogIndex],\n\t\t\t\t);\n\n\t\t\t\tthis.paddings[clientLogIndex + 1] = Math.max(\n\t\t\t\t\tthis.ackedLine[clientLogIndex + 1].length,\n\t\t\t\t\tthis.localLine[clientLogIndex + 1].length,\n\t\t\t\t\tthis.paddings[clientLogIndex + 1],\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tconst maintenanceCallback = (\n\t\t\t\tmain: IMergeTreeMaintenanceCallbackArgs,\n\t\t\t\top: IMergeTreeDeltaOpArgs | undefined,\n\t\t\t): void => {\n\t\t\t\tif (main.operation === MergeTreeMaintenanceType.ACKNOWLEDGED) {\n\t\t\t\t\tcallback(op);\n\t\t\t\t}\n\t\t\t};\n\t\t\tc.on(\"delta\", callback);\n\t\t\tc.on(\"maintenance\", maintenanceCallback);\n\t\t\tthis.disposeCallbacks.push(() => {\n\t\t\t\tc.off(\"delta\", callback);\n\t\t\t\tc.off(\"maintenance\", maintenanceCallback);\n\t\t\t});\n\t\t}\n\t\tthis.roundLogLines.push(logHeaders);\n\t\tfor (const v of this.roundLogLines[0]) this.paddings.push(v.length);\n\t\tthis.addNewLogLine(); // capture initial state\n\t}\n\n\tprivate addNewLogLine(): void {\n\t\tif (this.incrementalLog) {\n\t\t\twhile (this.roundLogLines.length > 0) {\n\t\t\t\tconst logLine = this.roundLogLines.shift();\n\t\t\t\tif (logLine?.some((c) => c.trim().length > 0)) {\n\t\t\t\t\tconsole.log(logLine.map((v, i) => v.padEnd(this.paddings[i])).join(\" | \"));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.ackedLine = [];\n\t\tthis.localLine = [];\n\t\tfor (const [clientLogIndex, cc] of this.clients.entries()) {\n\t\t\tconst segStrings = TestClientLogger.getSegString(cc);\n\t\t\tthis.ackedLine.push(\"\", segStrings.acked);\n\t\t\tthis.localLine.push(\"\", segStrings.local);\n\n\t\t\tthis.paddings[clientLogIndex] = Math.max(\n\t\t\t\tthis.ackedLine[clientLogIndex].length,\n\t\t\t\tthis.localLine[clientLogIndex].length,\n\t\t\t\tthis.paddings[clientLogIndex],\n\t\t\t);\n\n\t\t\tthis.paddings[clientLogIndex + 1] = Math.max(\n\t\t\t\tthis.ackedLine[clientLogIndex + 1].length,\n\t\t\t\tthis.localLine[clientLogIndex + 1].length,\n\t\t\t\tthis.paddings[clientLogIndex + 1],\n\t\t\t);\n\t\t}\n\t\tthis.roundLogLines.push(this.ackedLine, this.localLine);\n\t}\n\n\tpublic validate(opts?: {\n\t\tclear?: boolean;\n\t\tbaseText?: string;\n\t\terrorPrefix?: string;\n\t}): string {\n\t\tconst baseText = opts?.baseText ?? this.clients[0].getText();\n\t\tconst errorPrefix = opts?.errorPrefix ? `${opts?.errorPrefix}: ` : \"\";\n\t\t// cache all the properties of client 0 for faster look up\n\t\tconst properties = Array.from({ length: this.clients[0].getLength() }).map((_, i) =>\n\t\t\tthis.clients[0].getPropertiesAtPosition(i),\n\t\t);\n\t\tfor (const c of this.clients) {\n\t\t\tif (opts?.baseText === undefined && c === this.clients[0]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// ensure all clients have seen the same ops\n\t\t\tassert.equal(\n\t\t\t\tc.getCurrentSeq(),\n\t\t\t\tthis.clients[0].getCurrentSeq(),\n\t\t\t\t`${errorPrefix}${c.longClientId} current seq does not match client ${this.clients[0].longClientId}`,\n\t\t\t);\n\t\t\t// Pre-check to avoid this.toString() in the string template\n\t\t\tif (c.getText() !== baseText) {\n\t\t\t\tassert.equal(\n\t\t\t\t\tc.getText(),\n\t\t\t\t\tbaseText,\n\t\t\t\t\t`${errorPrefix}\\n${this.toString()}\\nClient ${\n\t\t\t\t\t\tc.longClientId\n\t\t\t\t\t} does not match client ${\n\t\t\t\t\t\topts?.baseText ? \"baseText\" : this.clients[0].longClientId\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (c === this.clients[0]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet pos = 0;\n\t\t\tdepthFirstNodeWalk(c.mergeTree.root, c.mergeTree.root.children[0], undefined, (seg) => {\n\t\t\t\tif (toMoveOrRemove(seg) === undefined) {\n\t\t\t\t\tconst segProps = seg.properties;\n\t\t\t\t\tfor (let i = 0; i < seg.cachedLength; i++) {\n\t\t\t\t\t\tif (!matchPropertiesHandleEmpty(segProps, properties[pos + i])) {\n\t\t\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\t\t\tsegProps,\n\t\t\t\t\t\t\t\tproperties[pos + i],\n\t\t\t\t\t\t\t\t`${errorPrefix}\\n${this.toString()}\\nClient ${\n\t\t\t\t\t\t\t\t\tc.longClientId\n\t\t\t\t\t\t\t\t} does not match client ${this.clients[0].longClientId} properties at pos ${\n\t\t\t\t\t\t\t\t\tpos + i\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}\n\t\t\t\t\tpos += seg.cachedLength;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (opts?.clear === true) {\n\t\t\tthis.roundLogLines.splice(1, this.roundLogLines.length);\n\t\t\tfor (const [i, v] of this.roundLogLines[0].entries()) this.paddings[i] = v.length;\n\t\t\tthis.addNewLogLine(); // capture initial state\n\t\t}\n\t\treturn baseText;\n\t}\n\n\tstatic validate(clients: readonly TestClient[], title?: string): string {\n\t\tconst logger = new TestClientLogger(clients, title);\n\t\tconst result = logger.validate();\n\t\tlogger.dispose();\n\t\treturn result;\n\t}\n\n\tpublic toString(excludeHeader: boolean = false): string {\n\t\tlet str = \"\";\n\t\tif (!excludeHeader) {\n\t\t\tstr +=\n\t\t\t\t`_: Local State\\n` +\n\t\t\t\t`-: Deleted ~:Deleted <= MinSeq\\n` +\n\t\t\t\t`*: Unacked Insert and Delete\\n` +\n\t\t\t\t`${this.clients[0].getCollabWindow().minSeq}: msn/offset\\n` +\n\t\t\t\t`Op format <seq>:<ref>:<client><type>@<side1><pos1>,<pos2><side2>\\n` +\n\t\t\t\t`sequence number represented as offset from msn. L means local.\\n` +\n\t\t\t\t`op types: 0) insert 1) remove 2) annotate 4) obliterate\\n` +\n\t\t\t\t`for obliterates: [] indicates that the range includes the position,\\n` +\n\t\t\t\t`and () indicates that the range excludes that position from the obliterate.\\n`;\n\n\t\t\tif (this.title) {\n\t\t\t\tstr += `${this.title}\\n`;\n\t\t\t}\n\t\t}\n\t\tstr += this.roundLogLines\n\t\t\t.filter((line) => line.some((c) => c.trim().length > 0))\n\t\t\t.map((line) => line.map((v, i) => v.padEnd(this.paddings[i])).join(\" | \"))\n\t\t\t.join(\"\\n\");\n\t\treturn str;\n\t}\n\n\tpublic addLogsToError(e: unknown): Error {\n\t\tif (e instanceof Error) {\n\t\t\te.message += `\\n${this.toString()}`;\n\t\t\treturn e;\n\t\t}\n\n\t\treturn new LoggingError(`${e}\\n${this.toString()}`);\n\t}\n\n\t/**\n\t * Get a string representation of the merge-tree state.\n\t *\n\t * @privateRemarks\n\t * This function is a dominating bottleneck in operation runner tests, as they log multiple client states per operation performed.\n\t * This takes more than 50% of the overall test time, so some inner-loop elements of this favor performance over readability/safety\n\t * (e.g. precomputing removed string representations, casting to the more internal segment interfaces to view insertion/removal info\n\t * rather than import typeguards, etc.)\n\t */\n\tprivate static getSegString(client: TestClient): { acked: string; local: string } {\n\t\tlet acked: string = \"\";\n\t\tlet local: string = \"\";\n\t\tconst nodes = new DoublyLinkedList<IMergeNode>([client.mergeTree.root]);\n\t\tlet parent: IMergeNode | undefined;\n\t\tconst { minSeq } = client.getCollabWindow();\n\t\twhile (nodes.length > 0) {\n\t\t\t// Safe due to length check above\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst node = nodes.shift()!.data;\n\t\t\tif (node.isLeaf()) {\n\t\t\t\tif (node.parent !== parent) {\n\t\t\t\t\tif (acked.length > 0) {\n\t\t\t\t\t\tacked += \" \";\n\t\t\t\t\t\tlocal += \" \";\n\t\t\t\t\t}\n\t\t\t\t\tparent = node.parent;\n\t\t\t\t}\n\t\t\t\tconst text = TextSegment.is(node) ? node.text : Marker.is(node) ? \"¶\" : undefined;\n\t\t\t\tif (text !== undefined) {\n\t\t\t\t\tconst insertionSeq = (node as IHasInsertionInfo).insert.seq;\n\t\t\t\t\tconst removedNode = toMoveOrRemove(node);\n\t\t\t\t\tif (removedNode === undefined) {\n\t\t\t\t\t\tif (insertionSeq === UnassignedSequenceNumber) {\n\t\t\t\t\t\t\tacked += underscores[text.length];\n\t\t\t\t\t\t\tlocal += text;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tacked += text;\n\t\t\t\t\t\t\tlocal += spaces[text.length];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (removedNode.seq === UnassignedSequenceNumber) {\n\t\t\t\t\t\t\tacked += underscores[text.length];\n\t\t\t\t\t\t\tlocal +=\n\t\t\t\t\t\t\t\tinsertionSeq === UnassignedSequenceNumber\n\t\t\t\t\t\t\t\t\t? asterisks[text.length]\n\t\t\t\t\t\t\t\t\t: dashes[text.length];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tacked += seqLTE(removedNode.seq, minSeq)\n\t\t\t\t\t\t\t\t? tildes[text.length]\n\t\t\t\t\t\t\t\t: dashes[text.length];\n\t\t\t\t\t\t\tlocal += spaces[text.length];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < node.childCount; i++) {\n\t\t\t\t\tnodes.push(node.children[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { acked, local };\n\t}\n}\n\nconst maxSegmentLength = TextSegmentGranularity * 2;\nconst underscores = Array.from({ length: maxSegmentLength }, (_, i) => \"_\".repeat(i));\nconst spaces = Array.from({ length: maxSegmentLength }, (_, i) => \" \".repeat(i));\nconst dashes = Array.from({ length: maxSegmentLength }, (_, i) => \"-\".repeat(i));\nconst asterisks = Array.from({ length: maxSegmentLength }, (_, i) => \"*\".repeat(i));\nconst tildes = Array.from({ length: maxSegmentLength }, (_, i) => \"~\".repeat(i));\n\nfunction toMoveOrRemove(segment: ISegmentPrivate): RemoveOperationStamp | undefined {\n\tif ((segment as unknown as IHasRemovalInfo).removes !== undefined) {\n\t\treturn (segment as unknown as IHasRemovalInfo).removes[0];\n\t}\n}\n"]}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
6
|
-
import { IFluidSerializer } from "@fluidframework/shared-object-base/internal";
|
|
5
|
+
import type { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
6
|
+
import type { IFluidSerializer } from "@fluidframework/shared-object-base/internal";
|
|
7
7
|
/**
|
|
8
8
|
* Test serializer implementation for merge tree tests
|
|
9
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testSerializer.d.ts","sourceRoot":"","sources":["../../src/test/testSerializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"testSerializer.d.ts","sourceRoot":"","sources":["../../src/test/testSerializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAEpF;;GAEG;AACH,qBAAa,cAAe,YAAW,gBAAgB;;IAGtD,IAAW,gBAAgB,IAAI,cAAc,CAE5C;IAEM,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO;IAInD,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAI/B,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM;IAKrD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testSerializer.js","sourceRoot":"","sources":["../../src/test/testSerializer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,kEAA6D;AAG7D;;GAEG;AACH,MAAa,cAAc;IAC1B,gBAAsB,CAAC;IAEvB,IAAW,gBAAgB;QAC1B,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,MAAM,CAAC,KAAc,EAAE,IAAkB;QAC/C,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,MAAM,CAAC,KAAc;QAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,SAAS,CAAC,KAAc,EAAE,IAAkB;QAClD,IAAA,iBAAM,EAAC,IAAI,KAAK,SAAS,EAAE,wDAAwD,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;CACD;AAvBD,wCAuBC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\n\n/**\n * Test serializer implementation for merge tree tests\n */\nexport class TestSerializer implements IFluidSerializer {\n\tpublic constructor() {}\n\n\tpublic get IFluidSerializer(): TestSerializer {\n\t\treturn this;\n\t}\n\n\tpublic encode(input: unknown, bind: IFluidHandle): unknown {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\n\tpublic decode(input: unknown): unknown {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\n\tpublic stringify(value: unknown, bind: IFluidHandle): string {\n\t\tassert(bind === undefined, \"Test serializer should not be called with bind handles\");\n\t\treturn JSON.stringify(value);\n\t}\n\n\tpublic parse(value: string): unknown {\n\t\treturn JSON.parse(value);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"testSerializer.js","sourceRoot":"","sources":["../../src/test/testSerializer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,kEAA6D;AAG7D;;GAEG;AACH,MAAa,cAAc;IAC1B,gBAAsB,CAAC;IAEvB,IAAW,gBAAgB;QAC1B,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,MAAM,CAAC,KAAc,EAAE,IAAkB;QAC/C,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,MAAM,CAAC,KAAc;QAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,SAAS,CAAC,KAAc,EAAE,IAAkB;QAClD,IAAA,iBAAM,EAAC,IAAI,KAAK,SAAS,EAAE,wDAAwD,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;CACD;AAvBD,wCAuBC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport type { IFluidSerializer } from \"@fluidframework/shared-object-base/internal\";\n\n/**\n * Test serializer implementation for merge tree tests\n */\nexport class TestSerializer implements IFluidSerializer {\n\tpublic constructor() {}\n\n\tpublic get IFluidSerializer(): TestSerializer {\n\t\treturn this;\n\t}\n\n\tpublic encode(input: unknown, bind: IFluidHandle): unknown {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\n\tpublic decode(input: unknown): unknown {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\n\tpublic stringify(value: unknown, bind: IFluidHandle): string {\n\t\tassert(bind === undefined, \"Test serializer should not be called with bind handles\");\n\t\treturn JSON.stringify(value);\n\t}\n\n\tpublic parse(value: string): unknown {\n\t\treturn JSON.parse(value);\n\t}\n}\n"]}
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { Heap } from "@fluidframework/core-utils/internal";
|
|
6
|
-
import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
|
|
6
|
+
import type { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
|
|
7
7
|
import { RedBlackTree } from "../collections/index.js";
|
|
8
8
|
import { PriorPerspective } from "../perspective.js";
|
|
9
|
-
import { PropertySet } from "../properties.js";
|
|
9
|
+
import type { PropertySet } from "../properties.js";
|
|
10
10
|
import { TestClient } from "./testClient.js";
|
|
11
11
|
interface ClientSeq {
|
|
12
12
|
refSeq: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testServer.d.ts","sourceRoot":"","sources":["../../src/test/testServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"testServer.d.ts","sourceRoot":"","sources":["../../src/test/testServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAkB,MAAM,qCAAqC,CAAC;AAC3E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAG7F,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,UAAU,SAAS;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACjB;AAOD;;;GAGG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACzC,GAAG,SAAK;IACR,OAAO,EAAE,UAAU,EAAE,CAAM;IAC3B,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAA0C;IAC3E,WAAW,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAoD;gBACjF,OAAO,CAAC,EAAE,WAAW;IAIjC,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAWvC,QAAQ,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO;IAajD,wBAAwB,CAAC,GAAG,EAAE,yBAAyB,GAAG,IAAI;IAc9D,OAAO,CAAC,GAAG,EAAE,yBAAyB,GAAG,yBAAyB;IAYlE,OAAO,CAAC,MAAM,CAAK;IAEnB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CA0CxC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,yBAAyB,GAC5B,OAAO,CAcT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testServer.js","sourceRoot":"","sources":["../../src/test/testServer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,
|
|
1
|
+
{"version":3,"file":"testServer.js","sourceRoot":"","sources":["../../src/test/testServer.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 { Heap, type IComparer } from \"@fluidframework/core-utils/internal\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { MergeTreeTextHelper } from \"../MergeTreeTextHelper.js\";\nimport { RedBlackTree } from \"../collections/index.js\";\nimport { compareNumbers } from \"../mergeTreeNodes.js\";\nimport { PriorPerspective } from \"../perspective.js\";\nimport type { PropertySet } from \"../properties.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\ninterface ClientSeq {\n\trefSeq: number;\n\tclientId: string;\n}\n\nconst clientSeqComparer: IComparer<ClientSeq> = {\n\tmin: { refSeq: -1, clientId: \"\" },\n\tcompare: (a, b) => a.refSeq - b.refSeq,\n};\n\n/**\n * Server for tests. Simulates client communication by directing placing\n * messages in client queues.\n */\nexport class TestServer extends TestClient {\n\tseq = 1;\n\tclients: TestClient[] = [];\n\tclientSeqNumbers: Heap<ClientSeq> = new Heap<ClientSeq>(clientSeqComparer);\n\tupstreamMap: RedBlackTree<number, number> = new RedBlackTree<number, number>(compareNumbers);\n\tconstructor(options?: PropertySet) {\n\t\tsuper(options);\n\t}\n\n\taddClients(clients: TestClient[]): void {\n\t\tthis.clientSeqNumbers = new Heap<ClientSeq>(clientSeqComparer);\n\t\tthis.clients = clients;\n\t\tfor (const client of clients) {\n\t\t\tthis.clientSeqNumbers.add({\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t\tclientId: client.longClientId ?? \"\",\n\t\t\t});\n\t\t}\n\t}\n\n\tapplyMsg(msg: ISequencedDocumentMessage): boolean {\n\t\tsuper.applyMsg(msg);\n\t\tif (TestClient.useCheckQ) {\n\t\t\tconst clientId = this.getShortClientId(msg.clientId as string);\n\t\t\tconst perspective = new PriorPerspective(msg.referenceSequenceNumber, clientId);\n\t\t\treturn checkTextMatchRelative(perspective, this, msg);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// TODO: remove mappings when no longer needed using min seq\n\t// in upstream message\n\ttransformUpstreamMessage(msg: ISequencedDocumentMessage): void {\n\t\tif (msg.referenceSequenceNumber > 0) {\n\t\t\tmsg.referenceSequenceNumber =\n\t\t\t\tthis.upstreamMap.get(msg.referenceSequenceNumber)?.data ?? 0;\n\t\t}\n\t\tmsg.origin = {\n\t\t\tid: \"A\",\n\t\t\tsequenceNumber: msg.sequenceNumber,\n\t\t\tminimumSequenceNumber: msg.minimumSequenceNumber,\n\t\t};\n\t\tthis.upstreamMap.put(msg.sequenceNumber, this.seq);\n\t\tmsg.sequenceNumber = -1;\n\t}\n\n\tcopyMsg(msg: ISequencedDocumentMessage): ISequencedDocumentMessage {\n\t\treturn {\n\t\t\tclientId: msg.clientId,\n\t\t\tclientSequenceNumber: msg.clientSequenceNumber,\n\t\t\tcontents: msg.contents,\n\t\t\tminimumSequenceNumber: msg.minimumSequenceNumber,\n\t\t\treferenceSequenceNumber: msg.referenceSequenceNumber,\n\t\t\tsequenceNumber: msg.sequenceNumber,\n\t\t\ttype: msg.type,\n\t\t} as unknown as ISequencedDocumentMessage;\n\t}\n\n\tprivate minSeq = 0;\n\n\tapplyMessages(msgCount: number): boolean {\n\t\tlet _msgCount = msgCount;\n\t\twhile (_msgCount > 0) {\n\t\t\tconst msg = this.dequeueMsg();\n\t\t\tif (msg) {\n\t\t\t\tif (msg.sequenceNumber >= 0) {\n\t\t\t\t\tthis.transformUpstreamMessage(msg);\n\t\t\t\t}\n\t\t\t\tmsg.sequenceNumber = this.seq++;\n\t\t\t\tmsg.minimumSequenceNumber = this.minSeq;\n\t\t\t\tif (this.applyMsg(msg)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (this.clients) {\n\t\t\t\t\tlet minCli = this.clientSeqNumbers.peek()?.value;\n\t\t\t\t\tif (\n\t\t\t\t\t\tminCli &&\n\t\t\t\t\t\tminCli.clientId === msg.clientId &&\n\t\t\t\t\t\tminCli.refSeq < msg.referenceSequenceNumber\n\t\t\t\t\t) {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\tconst cliSeq = this.clientSeqNumbers.get()!;\n\t\t\t\t\t\tconst oldSeq = cliSeq.refSeq;\n\t\t\t\t\t\tcliSeq.refSeq = msg.referenceSequenceNumber;\n\t\t\t\t\t\tthis.clientSeqNumbers.add(cliSeq);\n\t\t\t\t\t\tminCli = this.clientSeqNumbers.peek()?.value;\n\t\t\t\t\t\tif (minCli && minCli.refSeq > oldSeq) {\n\t\t\t\t\t\t\tmsg.minimumSequenceNumber = minCli.refSeq;\n\t\t\t\t\t\t\tthis.minSeq = minCli.refSeq;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const client of this.clients) {\n\t\t\t\t\t\tclient.enqueueMsg(msg);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t_msgCount--;\n\t\t}\n\t\treturn false;\n\t}\n}\n\n/**\n * Used for in-memory testing. This will queue a reference string for each client message.\n */\nexport function checkTextMatchRelative(\n\tperspective: PriorPerspective,\n\tserver: TestServer,\n\tmsg: ISequencedDocumentMessage,\n): boolean {\n\tconst client = server.clients[perspective.clientId];\n\tconst serverText = new MergeTreeTextHelper(server.mergeTree).getText(perspective);\n\tconst cliText = client.checkQ.shift()?.data;\n\tif (cliText === undefined || cliText !== serverText) {\n\t\tconsole.log(`mismatch `);\n\t\tconsole.log(msg);\n\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\tconsole.log(server.mergeTree.toString());\n\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\tconsole.log(client.mergeTree.toString());\n\t\treturn true;\n\t}\n\treturn false;\n}\n"]}
|
package/dist/test/testUtils.d.ts
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
/// <reference types="mocha" />
|
|
6
|
-
import { LocalReferenceCollection } from "../localReference.js";
|
|
7
|
-
import { MergeTree } from "../mergeTree.js";
|
|
8
|
-
import { MergeBlock } from "../mergeTreeNodes.js";
|
|
6
|
+
import type { LocalReferenceCollection } from "../localReference.js";
|
|
7
|
+
import type { MergeTree } from "../mergeTree.js";
|
|
8
|
+
import type { MergeBlock } from "../mergeTreeNodes.js";
|
|
9
9
|
import { type Perspective } from "../perspective.js";
|
|
10
10
|
import type { OperationStamp } from "../stamps.js";
|
|
11
11
|
import { ClientTestHelper } from "./clientTestHelper.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../src/test/testUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAKH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../src/test/testUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAKH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMvD,OAAO,EAGN,KAAK,WAAW,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,wBAAgB,gBAAgB,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,QAAQ,SAAI,GACV,SAAS,CAGX;AAED,wBAAgB,2BAA2B,CAC1C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,QAAQ,SAAI,GACV,SAAS,CAGX;AAED,MAAM,WAAW,gBAAgB;IAChC,aAAa,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,CAAC;IACrD,OAAO,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CAAC;IAC/C;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;CACX;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAUrF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAqBpE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAmB5D;AAiCD,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,cAAc,GAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAAO,EACtE,oBAAoB,sBAA4B,EAChD,UAAU,GAAE,UAA2B,GACrC,IAAI,CAsDN;AAED,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,wBAAwB,GAAG,IAAI,CAS5E;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAUnD;AAmBD,UAAU,kBAAkB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3C,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAE3E;yBAFe,sBAAsB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../src/test/testUtils.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\";\nimport fs from \"node:fs\";\n\nimport { LocalReferenceCollection } from \"../localReference.js\";\nimport { MergeTree } from \"../mergeTree.js\";\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeMaintenanceCallbackArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { MergeBlock } from \"../mergeTreeNodes.js\";\nimport {\n\tPartialSequenceLengths,\n\tverifyExpectedPartialLengths,\n\tverifyPartialLengths,\n} from \"../partialLengths.js\";\nimport {\n\tLocalReconnectingPerspective,\n\tPriorPerspective,\n\ttype Perspective,\n} from \"../perspective.js\";\nimport type { OperationStamp } from \"../stamps.js\";\n\nimport { ClientTestHelper } from \"./clientTestHelper.js\";\nimport { loadText } from \"./text.js\";\n\nexport function loadTextFromFile(\n\tfilename: string,\n\tmergeTree: MergeTree,\n\tsegLimit = 0,\n): MergeTree {\n\tconst content = fs.readFileSync(filename, \"utf8\");\n\treturn loadText(content, mergeTree, segLimit);\n}\n\nexport function loadTextFromFileWithMarkers(\n\tfilename: string,\n\tmergeTree: MergeTree,\n\tsegLimit = 0,\n): MergeTree {\n\tconst content = fs.readFileSync(filename, \"utf8\");\n\treturn loadText(content, mergeTree, segLimit, true);\n}\n\nexport interface MockRemoteClient {\n\tperspectiveAt(args: { refSeq: number }): Perspective;\n\tstampAt(args: { seq: number }): OperationStamp;\n\t/**\n\t * Short client id for this client.\n\t */\n\tid: number;\n}\n\n/**\n * Creates a \"mock remote client\" which allows ergonomically generating {@link Perspective}s and {@link OperationStamp}s\n * for use in tests that interact directly with a {@link MergeTree}.\n *\n * Example:\n *\n * ```typescript\n * let seq = 0;\n * const remoteClient = makeRemoteClient({ clientId: 18 });\n *\n * mergeTree.insertSegments(\n * 0,\n * [TextSegment.make(\"some text\")],\n * remoteClient.perspectiveAt({ refSeq: seq }),\n * remoteClient.stampAt({ seq: ++seq }),\n * undefined\n * );\n * ```\n */\nexport function makeRemoteClient({ clientId }: { clientId: number }): MockRemoteClient {\n\treturn {\n\t\tperspectiveAt({ refSeq }: { refSeq: number }): Perspective {\n\t\t\treturn new PriorPerspective(refSeq, clientId);\n\t\t},\n\t\tstampAt({ seq }: { seq: number }): OperationStamp {\n\t\t\treturn { seq, clientId };\n\t\t},\n\t\tid: clientId,\n\t};\n}\n\nexport function nodeOrdinalsHaveIntegrity(block: MergeBlock): boolean {\n\tconst olen = block.ordinal.length;\n\tfor (let i = 0; i < block.childCount; i++) {\n\t\tif (block.children[i].ordinal) {\n\t\t\tif (olen !== block.children[i].ordinal.length - 1) {\n\t\t\t\tconsole.log(\"node integrity issue\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (i > 0 && block.children[i].ordinal <= block.children[i - 1].ordinal) {\n\t\t\t\tconsole.log(\"node sib integrity issue\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!block.children[i].isLeaf()) {\n\t\t\t\treturn nodeOrdinalsHaveIntegrity(block.children[i] as MergeBlock);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(`node child ordinal not set ${i}`);\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Returns an object that tallies each delta and maintenance operation observed\n * for the given 'mergeTree'.\n */\nexport function countOperations(mergeTree: MergeTree): object {\n\tconst counts = {};\n\n\tassert.strictEqual(mergeTree.mergeTreeDeltaCallback, undefined);\n\tassert.strictEqual(mergeTree.mergeTreeMaintenanceCallback, undefined);\n\n\tconst fn = (\n\t\tdeltaArgs: IMergeTreeDeltaCallbackArgs | IMergeTreeMaintenanceCallbackArgs,\n\t): void => {\n\t\tconst previous = counts[deltaArgs.operation] as undefined | number;\n\t\tcounts[deltaArgs.operation] = previous === undefined ? 1 : previous + 1;\n\t};\n\n\tmergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs): void => {\n\t\tfn(deltaArgs);\n\t};\n\tmergeTree.mergeTreeMaintenanceCallback = fn;\n\n\treturn counts;\n}\n\nfunction getPartialLengths(\n\tclientId: number,\n\tseq: number,\n\tmergeTree: MergeTree,\n\tlocalSeq?: number,\n\tmergeBlock: MergeBlock = mergeTree.root,\n): {\n\tpartialLen: number | undefined;\n\tactualLen: number;\n} {\n\tconst partialLen = mergeBlock.partialLengths?.getPartialLength(seq, clientId, localSeq);\n\n\tconst perspective =\n\t\tlocalSeq === undefined\n\t\t\t? new PriorPerspective(seq, clientId)\n\t\t\t: new LocalReconnectingPerspective(seq, clientId, localSeq);\n\tlet actualLen = 0;\n\n\twalkAllChildSegments(mergeBlock, (segment) => {\n\t\tif (perspective.isSegmentPresent(segment)) {\n\t\t\tactualLen += segment.cachedLength;\n\t\t}\n\t\treturn true;\n\t});\n\n\treturn {\n\t\tpartialLen,\n\t\tactualLen,\n\t};\n}\n\nexport function validatePartialLengths(\n\tclientId: number,\n\tmergeTree: MergeTree,\n\texpectedValues: { seq: number; len: number; localSeq?: number }[] = [],\n\tminRefSeqForLocalSeq = new Map<number, number>(),\n\tmergeBlock: MergeBlock = mergeTree.root,\n): void {\n\tfunction validatePartialLengthAt(seq: number, localSeq?: number, len?: number): void {\n\t\tconst { partialLen, actualLen } = getPartialLengths(\n\t\t\tclientId,\n\t\t\tseq,\n\t\t\tmergeTree,\n\t\t\tlocalSeq,\n\t\t\tmergeBlock,\n\t\t);\n\n\t\tif (partialLen && partialLen < 0) {\n\t\t\tassert.fail(\"Negative partial length returned\");\n\t\t}\n\t\tassert.equal(\n\t\t\tpartialLen,\n\t\t\tactualLen,\n\t\t\t\"Partial length did not match value obtained from walking all segments in the block.\",\n\t\t);\n\t\tif (len !== undefined) {\n\t\t\tassert.equal(partialLen, len, \"Partial length did not match expected value.\");\n\t\t}\n\t}\n\n\tif (clientId === mergeTree.collabWindow.clientId) {\n\t\tmergeTree.computeLocalPartials(0);\n\t\t// We don't add entries to the local partial lengths entries that ensure that a query for a given localSeq includes any dependent removes.\n\t\t// For example, in a scenario where segments are inserted between seqs 1 and 10 causing a length increase of 10, but then this entire range\n\t\t// is removed locally at localSeq 5, computing the length of the block using partial lengths at (seq: 1, localSeq: 5) can yield a negative\n\t\t// result since the computation \"sees\" the removal of length 10 but only one of the inserts that this removal affected.\n\t\t//\n\t\t// In the production codepath, this doesn't matter because we only ever query for (refSeq, localSeq) for which the refSeq is at or above the original\n\t\t// context in which the edit was applied, which means this 'dependency' is always included in the query.\n\t\t// We could fix it if we wanted to by using a similar solution to what we do for non-local edits (add adjustments to the unsequenced lengths\n\t\t// to ensure whenever the removal of a segment applies, so does existence of that segment), at which point we could validate for a wider range\n\t\t// of local perspectives.\n\t\tfor (const [localSeq, minRefSeq] of minRefSeqForLocalSeq.entries()) {\n\t\t\tfor (let refSeq = minRefSeq; refSeq <= mergeTree.collabWindow.currentSeq; refSeq++) {\n\t\t\t\tvalidatePartialLengthAt(refSeq, localSeq);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// We don't use partial lengths for the local client unless it's a reconnecting perspective (we just use the mergeBlock's cachedLength field).\n\t\tfor (\n\t\t\tlet seq = mergeTree.collabWindow.minSeq + 1;\n\t\t\tseq <= mergeTree.collabWindow.currentSeq;\n\t\t\tseq++\n\t\t) {\n\t\t\tvalidatePartialLengthAt(seq);\n\t\t}\n\t}\n\n\tfor (const { seq, len, localSeq } of expectedValues) {\n\t\tvalidatePartialLengthAt(seq, localSeq, len);\n\t}\n}\n\nexport function validateRefCount(collection?: LocalReferenceCollection): void {\n\tif (!collection) {\n\t\treturn;\n\t}\n\n\tconst expectedLength = [...collection].length;\n\n\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\tassert.equal(collection[\"refCount\"], expectedLength);\n}\n\n/**\n * Enable stricter partial length assertions inside tests\n *\n * Note that these assertions can be expensive, and so should not be enabled in\n * production code or tests that run through thousands of ops (e.g. the SharedString\n * fuzz tests).\n */\nexport function useStrictPartialLengthChecks(): void {\n\tbeforeEach(\"Enable strict partial lengths\", () => {\n\t\tPartialSequenceLengths.options.verifier = verifyPartialLengths;\n\t\tPartialSequenceLengths.options.verifyExpected = verifyExpectedPartialLengths;\n\t});\n\n\tafterEach(\"Disable strict partial lengths\", () => {\n\t\tPartialSequenceLengths.options.verifier = undefined;\n\t\tPartialSequenceLengths.options.verifyExpected = undefined;\n\t});\n}\n\nfunction createObliterateTestBody({ action, expectedText }: ObliterateTestArgs): () => void {\n\treturn () => {\n\t\tconst events: number[] = [];\n\n\t\tconst helper = new ClientTestHelper({\n\t\t\tmergeTreeEnableSidedObliterate: true,\n\t\t});\n\t\thelper.clients.A.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tevents.push(deltaArgs.operation);\n\t\t});\n\t\taction(helper);\n\t\thelper.processAllOps();\n\n\t\thelper.logger.validate({ baseText: expectedText });\n\t};\n}\n\ninterface ObliterateTestArgs {\n\ttitle: string;\n\taction: (helper: ClientTestHelper) => void;\n\texpectedText: string;\n}\n\nexport function itCorrectlyObliterates(args: ObliterateTestArgs): Mocha.Test {\n\treturn it(args.title, createObliterateTestBody(args));\n}\nitCorrectlyObliterates.skip = (args: ObliterateTestArgs) =>\n\tit.skip(args.title, createObliterateTestBody(args));\nitCorrectlyObliterates.only = (args: ObliterateTestArgs) =>\n\tit.only(args.title, createObliterateTestBody(args));\n"]}
|
|
1
|
+
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../src/test/testUtils.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\";\nimport fs from \"node:fs\";\n\nimport type { LocalReferenceCollection } from \"../localReference.js\";\nimport type { MergeTree } from \"../mergeTree.js\";\nimport type {\n\tIMergeTreeDeltaCallbackArgs,\n\tIMergeTreeMaintenanceCallbackArgs,\n} from \"../mergeTreeDeltaCallback.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport type { MergeBlock } from \"../mergeTreeNodes.js\";\nimport {\n\tPartialSequenceLengths,\n\tverifyExpectedPartialLengths,\n\tverifyPartialLengths,\n} from \"../partialLengths.js\";\nimport {\n\tLocalReconnectingPerspective,\n\tPriorPerspective,\n\ttype Perspective,\n} from \"../perspective.js\";\nimport type { OperationStamp } from \"../stamps.js\";\n\nimport { ClientTestHelper } from \"./clientTestHelper.js\";\nimport { loadText } from \"./text.js\";\n\nexport function loadTextFromFile(\n\tfilename: string,\n\tmergeTree: MergeTree,\n\tsegLimit = 0,\n): MergeTree {\n\tconst content = fs.readFileSync(filename, \"utf8\");\n\treturn loadText(content, mergeTree, segLimit);\n}\n\nexport function loadTextFromFileWithMarkers(\n\tfilename: string,\n\tmergeTree: MergeTree,\n\tsegLimit = 0,\n): MergeTree {\n\tconst content = fs.readFileSync(filename, \"utf8\");\n\treturn loadText(content, mergeTree, segLimit, true);\n}\n\nexport interface MockRemoteClient {\n\tperspectiveAt(args: { refSeq: number }): Perspective;\n\tstampAt(args: { seq: number }): OperationStamp;\n\t/**\n\t * Short client id for this client.\n\t */\n\tid: number;\n}\n\n/**\n * Creates a \"mock remote client\" which allows ergonomically generating {@link Perspective}s and {@link OperationStamp}s\n * for use in tests that interact directly with a {@link MergeTree}.\n *\n * Example:\n *\n * ```typescript\n * let seq = 0;\n * const remoteClient = makeRemoteClient({ clientId: 18 });\n *\n * mergeTree.insertSegments(\n * 0,\n * [TextSegment.make(\"some text\")],\n * remoteClient.perspectiveAt({ refSeq: seq }),\n * remoteClient.stampAt({ seq: ++seq }),\n * undefined\n * );\n * ```\n */\nexport function makeRemoteClient({ clientId }: { clientId: number }): MockRemoteClient {\n\treturn {\n\t\tperspectiveAt({ refSeq }: { refSeq: number }): Perspective {\n\t\t\treturn new PriorPerspective(refSeq, clientId);\n\t\t},\n\t\tstampAt({ seq }: { seq: number }): OperationStamp {\n\t\t\treturn { seq, clientId };\n\t\t},\n\t\tid: clientId,\n\t};\n}\n\nexport function nodeOrdinalsHaveIntegrity(block: MergeBlock): boolean {\n\tconst olen = block.ordinal.length;\n\tfor (let i = 0; i < block.childCount; i++) {\n\t\tif (block.children[i].ordinal) {\n\t\t\tif (olen !== block.children[i].ordinal.length - 1) {\n\t\t\t\tconsole.log(\"node integrity issue\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (i > 0 && block.children[i].ordinal <= block.children[i - 1].ordinal) {\n\t\t\t\tconsole.log(\"node sib integrity issue\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!block.children[i].isLeaf()) {\n\t\t\t\treturn nodeOrdinalsHaveIntegrity(block.children[i] as MergeBlock);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(`node child ordinal not set ${i}`);\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Returns an object that tallies each delta and maintenance operation observed\n * for the given 'mergeTree'.\n */\nexport function countOperations(mergeTree: MergeTree): object {\n\tconst counts = {};\n\n\tassert.strictEqual(mergeTree.mergeTreeDeltaCallback, undefined);\n\tassert.strictEqual(mergeTree.mergeTreeMaintenanceCallback, undefined);\n\n\tconst fn = (\n\t\tdeltaArgs: IMergeTreeDeltaCallbackArgs | IMergeTreeMaintenanceCallbackArgs,\n\t): void => {\n\t\tconst previous = counts[deltaArgs.operation] as undefined | number;\n\t\tcounts[deltaArgs.operation] = previous === undefined ? 1 : previous + 1;\n\t};\n\n\tmergeTree.mergeTreeDeltaCallback = (opArgs, deltaArgs): void => {\n\t\tfn(deltaArgs);\n\t};\n\tmergeTree.mergeTreeMaintenanceCallback = fn;\n\n\treturn counts;\n}\n\nfunction getPartialLengths(\n\tclientId: number,\n\tseq: number,\n\tmergeTree: MergeTree,\n\tlocalSeq?: number,\n\tmergeBlock: MergeBlock = mergeTree.root,\n): {\n\tpartialLen: number | undefined;\n\tactualLen: number;\n} {\n\tconst partialLen = mergeBlock.partialLengths?.getPartialLength(seq, clientId, localSeq);\n\n\tconst perspective =\n\t\tlocalSeq === undefined\n\t\t\t? new PriorPerspective(seq, clientId)\n\t\t\t: new LocalReconnectingPerspective(seq, clientId, localSeq);\n\tlet actualLen = 0;\n\n\twalkAllChildSegments(mergeBlock, (segment) => {\n\t\tif (perspective.isSegmentPresent(segment)) {\n\t\t\tactualLen += segment.cachedLength;\n\t\t}\n\t\treturn true;\n\t});\n\n\treturn {\n\t\tpartialLen,\n\t\tactualLen,\n\t};\n}\n\nexport function validatePartialLengths(\n\tclientId: number,\n\tmergeTree: MergeTree,\n\texpectedValues: { seq: number; len: number; localSeq?: number }[] = [],\n\tminRefSeqForLocalSeq = new Map<number, number>(),\n\tmergeBlock: MergeBlock = mergeTree.root,\n): void {\n\tfunction validatePartialLengthAt(seq: number, localSeq?: number, len?: number): void {\n\t\tconst { partialLen, actualLen } = getPartialLengths(\n\t\t\tclientId,\n\t\t\tseq,\n\t\t\tmergeTree,\n\t\t\tlocalSeq,\n\t\t\tmergeBlock,\n\t\t);\n\n\t\tif (partialLen && partialLen < 0) {\n\t\t\tassert.fail(\"Negative partial length returned\");\n\t\t}\n\t\tassert.equal(\n\t\t\tpartialLen,\n\t\t\tactualLen,\n\t\t\t\"Partial length did not match value obtained from walking all segments in the block.\",\n\t\t);\n\t\tif (len !== undefined) {\n\t\t\tassert.equal(partialLen, len, \"Partial length did not match expected value.\");\n\t\t}\n\t}\n\n\tif (clientId === mergeTree.collabWindow.clientId) {\n\t\tmergeTree.computeLocalPartials(0);\n\t\t// We don't add entries to the local partial lengths entries that ensure that a query for a given localSeq includes any dependent removes.\n\t\t// For example, in a scenario where segments are inserted between seqs 1 and 10 causing a length increase of 10, but then this entire range\n\t\t// is removed locally at localSeq 5, computing the length of the block using partial lengths at (seq: 1, localSeq: 5) can yield a negative\n\t\t// result since the computation \"sees\" the removal of length 10 but only one of the inserts that this removal affected.\n\t\t//\n\t\t// In the production codepath, this doesn't matter because we only ever query for (refSeq, localSeq) for which the refSeq is at or above the original\n\t\t// context in which the edit was applied, which means this 'dependency' is always included in the query.\n\t\t// We could fix it if we wanted to by using a similar solution to what we do for non-local edits (add adjustments to the unsequenced lengths\n\t\t// to ensure whenever the removal of a segment applies, so does existence of that segment), at which point we could validate for a wider range\n\t\t// of local perspectives.\n\t\tfor (const [localSeq, minRefSeq] of minRefSeqForLocalSeq.entries()) {\n\t\t\tfor (let refSeq = minRefSeq; refSeq <= mergeTree.collabWindow.currentSeq; refSeq++) {\n\t\t\t\tvalidatePartialLengthAt(refSeq, localSeq);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// We don't use partial lengths for the local client unless it's a reconnecting perspective (we just use the mergeBlock's cachedLength field).\n\t\tfor (\n\t\t\tlet seq = mergeTree.collabWindow.minSeq + 1;\n\t\t\tseq <= mergeTree.collabWindow.currentSeq;\n\t\t\tseq++\n\t\t) {\n\t\t\tvalidatePartialLengthAt(seq);\n\t\t}\n\t}\n\n\tfor (const { seq, len, localSeq } of expectedValues) {\n\t\tvalidatePartialLengthAt(seq, localSeq, len);\n\t}\n}\n\nexport function validateRefCount(collection?: LocalReferenceCollection): void {\n\tif (!collection) {\n\t\treturn;\n\t}\n\n\tconst expectedLength = [...collection].length;\n\n\t// eslint-disable-next-line @typescript-eslint/dot-notation\n\tassert.equal(collection[\"refCount\"], expectedLength);\n}\n\n/**\n * Enable stricter partial length assertions inside tests\n *\n * Note that these assertions can be expensive, and so should not be enabled in\n * production code or tests that run through thousands of ops (e.g. the SharedString\n * fuzz tests).\n */\nexport function useStrictPartialLengthChecks(): void {\n\tbeforeEach(\"Enable strict partial lengths\", () => {\n\t\tPartialSequenceLengths.options.verifier = verifyPartialLengths;\n\t\tPartialSequenceLengths.options.verifyExpected = verifyExpectedPartialLengths;\n\t});\n\n\tafterEach(\"Disable strict partial lengths\", () => {\n\t\tPartialSequenceLengths.options.verifier = undefined;\n\t\tPartialSequenceLengths.options.verifyExpected = undefined;\n\t});\n}\n\nfunction createObliterateTestBody({ action, expectedText }: ObliterateTestArgs): () => void {\n\treturn () => {\n\t\tconst events: number[] = [];\n\n\t\tconst helper = new ClientTestHelper({\n\t\t\tmergeTreeEnableSidedObliterate: true,\n\t\t});\n\t\thelper.clients.A.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tevents.push(deltaArgs.operation);\n\t\t});\n\t\taction(helper);\n\t\thelper.processAllOps();\n\n\t\thelper.logger.validate({ baseText: expectedText });\n\t};\n}\n\ninterface ObliterateTestArgs {\n\ttitle: string;\n\taction: (helper: ClientTestHelper) => void;\n\texpectedText: string;\n}\n\nexport function itCorrectlyObliterates(args: ObliterateTestArgs): Mocha.Test {\n\treturn it(args.title, createObliterateTestBody(args));\n}\nitCorrectlyObliterates.skip = (args: ObliterateTestArgs) =>\n\tit.skip(args.title, createObliterateTestBody(args));\nitCorrectlyObliterates.only = (args: ObliterateTestArgs) =>\n\tit.only(args.title, createObliterateTestBody(args));\n"]}
|
package/dist/test/text.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { MergeTree } from "../mergeTree.js";
|
|
5
|
+
import type { MergeTree } from "../mergeTree.js";
|
|
6
6
|
import { type IHasInsertionInfo, type SegmentWithInfo } from "../segmentInfos.js";
|
|
7
7
|
export declare function loadSegments(content: string, segLimit: number, markers?: boolean, withProps?: boolean): SegmentWithInfo<IHasInsertionInfo>[];
|
|
8
8
|
export declare function loadText(content: string, mergeTree: MergeTree, segLimit: number, markers?: boolean): MergeTree;
|
package/dist/test/text.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/test/text.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/test/text.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,OAAO,EAEN,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,MAAM,oBAAoB,CAAC;AAW5B,wBAAgB,YAAY,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,OAAe,EACxB,SAAS,GAAE,OAAc,GACvB,eAAe,CAAC,iBAAiB,CAAC,EAAE,CAoEtC;AAED,wBAAgB,QAAQ,CACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,UAAQ,GACb,SAAS,CAIX"}
|
package/dist/test/text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/test/text.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 { NonCollabClient, UniversalSequenceNumber } from \"../constants.js\";\nimport { MergeTree } from \"../mergeTree.js\";\nimport { Marker } from \"../mergeTreeNodes.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { reservedTileLabelsKey } from \"../referencePositions.js\";\nimport {\n\toverwriteInfo,\n\ttype IHasInsertionInfo,\n\ttype SegmentWithInfo,\n} from \"../segmentInfos.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nconst defaultInsertionInfo: IHasInsertionInfo = {\n\tinsert: {\n\t\ttype: \"insert\",\n\t\tclientId: NonCollabClient,\n\t\tseq: UniversalSequenceNumber,\n\t},\n};\n\nexport function loadSegments(\n\tcontent: string,\n\tsegLimit: number,\n\tmarkers: boolean = false,\n\twithProps: boolean = true,\n): SegmentWithInfo<IHasInsertionInfo>[] {\n\tconst BOMFreeContent = content.replace(/^\\uFEFF/, \"\");\n\n\tconst paragraphs = BOMFreeContent.split(/\\r?\\n/);\n\tfor (let i = 0, len = paragraphs.length; i < len; i++) {\n\t\tparagraphs[i] = paragraphs[i]\n\t\t\t.replace(/\\r?\\n/g, \" \")\n\t\t\t.replace(/\\u201C|\\u201D/g, '\"')\n\t\t\t.replace(/\\u2019/g, \"'\");\n\t\tif (!markers && i !== paragraphs.length - 1) {\n\t\t\tparagraphs[i] += \"\\n\";\n\t\t}\n\t}\n\n\tconst segments: SegmentWithInfo<IHasInsertionInfo>[] = [];\n\tfor (const paragraph of paragraphs) {\n\t\tlet pgMarker: Marker | undefined;\n\t\tif (markers) {\n\t\t\tpgMarker = Marker.make(ReferenceType.Tile, { [reservedTileLabelsKey]: [\"pg\"] });\n\t\t}\n\t\tif (withProps) {\n\t\t\tif (paragraph.includes(\"Chapter\") || paragraph.includes(\"PRIDE AND PREJ\")) {\n\t\t\t\tif (pgMarker) {\n\t\t\t\t\tpgMarker.properties = { header: 2 };\n\t\t\t\t\tsegments.push(overwriteInfo(new TextSegment(paragraph), defaultInsertionInfo));\n\t\t\t\t} else {\n\t\t\t\t\tsegments.push(\n\t\t\t\t\t\toverwriteInfo(\n\t\t\t\t\t\t\tTextSegment.make(paragraph, { fontSize: \"140%\", lineHeight: \"150%\" }),\n\t\t\t\t\t\t\tdefaultInsertionInfo,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst emphStrings = paragraph.split(\"_\");\n\t\t\t\tfor (let i = 0, len = emphStrings.length; i < len; i++) {\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tif (i & 1) {\n\t\t\t\t\t\tif (emphStrings[i].length > 0) {\n\t\t\t\t\t\t\tsegments.push(\n\t\t\t\t\t\t\t\toverwriteInfo(\n\t\t\t\t\t\t\t\t\tTextSegment.make(emphStrings[i], { fontStyle: \"italic\" }),\n\t\t\t\t\t\t\t\t\tdefaultInsertionInfo,\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} else {\n\t\t\t\t\t\tif (emphStrings[i].length > 0) {\n\t\t\t\t\t\t\tsegments.push(\n\t\t\t\t\t\t\t\toverwriteInfo(new TextSegment(emphStrings[i]), defaultInsertionInfo),\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} else {\n\t\t\tsegments.push(overwriteInfo(new TextSegment(paragraph), defaultInsertionInfo));\n\t\t}\n\t\tif (pgMarker) {\n\t\t\tsegments.push(overwriteInfo(pgMarker, defaultInsertionInfo));\n\t\t}\n\t}\n\n\tif (segLimit > 0) {\n\t\tsegments.length = segLimit;\n\t}\n\n\treturn segments;\n}\n\nexport function loadText(\n\tcontent: string,\n\tmergeTree: MergeTree,\n\tsegLimit: number,\n\tmarkers = false,\n): MergeTree {\n\tconst segments = loadSegments(content, segLimit, markers);\n\tmergeTree.reloadFromSegments(segments);\n\treturn mergeTree;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/test/text.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 { NonCollabClient, UniversalSequenceNumber } from \"../constants.js\";\nimport type { MergeTree } from \"../mergeTree.js\";\nimport { Marker } from \"../mergeTreeNodes.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { reservedTileLabelsKey } from \"../referencePositions.js\";\nimport {\n\toverwriteInfo,\n\ttype IHasInsertionInfo,\n\ttype SegmentWithInfo,\n} from \"../segmentInfos.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nconst defaultInsertionInfo: IHasInsertionInfo = {\n\tinsert: {\n\t\ttype: \"insert\",\n\t\tclientId: NonCollabClient,\n\t\tseq: UniversalSequenceNumber,\n\t},\n};\n\nexport function loadSegments(\n\tcontent: string,\n\tsegLimit: number,\n\tmarkers: boolean = false,\n\twithProps: boolean = true,\n): SegmentWithInfo<IHasInsertionInfo>[] {\n\tconst BOMFreeContent = content.replace(/^\\uFEFF/, \"\");\n\n\tconst paragraphs = BOMFreeContent.split(/\\r?\\n/);\n\tfor (let i = 0, len = paragraphs.length; i < len; i++) {\n\t\tparagraphs[i] = paragraphs[i]\n\t\t\t.replace(/\\r?\\n/g, \" \")\n\t\t\t.replace(/\\u201C|\\u201D/g, '\"')\n\t\t\t.replace(/\\u2019/g, \"'\");\n\t\tif (!markers && i !== paragraphs.length - 1) {\n\t\t\tparagraphs[i] += \"\\n\";\n\t\t}\n\t}\n\n\tconst segments: SegmentWithInfo<IHasInsertionInfo>[] = [];\n\tfor (const paragraph of paragraphs) {\n\t\tlet pgMarker: Marker | undefined;\n\t\tif (markers) {\n\t\t\tpgMarker = Marker.make(ReferenceType.Tile, { [reservedTileLabelsKey]: [\"pg\"] });\n\t\t}\n\t\tif (withProps) {\n\t\t\tif (paragraph.includes(\"Chapter\") || paragraph.includes(\"PRIDE AND PREJ\")) {\n\t\t\t\tif (pgMarker) {\n\t\t\t\t\tpgMarker.properties = { header: 2 };\n\t\t\t\t\tsegments.push(overwriteInfo(new TextSegment(paragraph), defaultInsertionInfo));\n\t\t\t\t} else {\n\t\t\t\t\tsegments.push(\n\t\t\t\t\t\toverwriteInfo(\n\t\t\t\t\t\t\tTextSegment.make(paragraph, { fontSize: \"140%\", lineHeight: \"150%\" }),\n\t\t\t\t\t\t\tdefaultInsertionInfo,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst emphStrings = paragraph.split(\"_\");\n\t\t\t\tfor (let i = 0, len = emphStrings.length; i < len; i++) {\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tif (i & 1) {\n\t\t\t\t\t\tif (emphStrings[i].length > 0) {\n\t\t\t\t\t\t\tsegments.push(\n\t\t\t\t\t\t\t\toverwriteInfo(\n\t\t\t\t\t\t\t\t\tTextSegment.make(emphStrings[i], { fontStyle: \"italic\" }),\n\t\t\t\t\t\t\t\t\tdefaultInsertionInfo,\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} else {\n\t\t\t\t\t\tif (emphStrings[i].length > 0) {\n\t\t\t\t\t\t\tsegments.push(\n\t\t\t\t\t\t\t\toverwriteInfo(new TextSegment(emphStrings[i]), defaultInsertionInfo),\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} else {\n\t\t\tsegments.push(overwriteInfo(new TextSegment(paragraph), defaultInsertionInfo));\n\t\t}\n\t\tif (pgMarker) {\n\t\t\tsegments.push(overwriteInfo(pgMarker, defaultInsertionInfo));\n\t\t}\n\t}\n\n\tif (segLimit > 0) {\n\t\tsegments.length = segLimit;\n\t}\n\n\treturn segments;\n}\n\nexport function loadText(\n\tcontent: string,\n\tmergeTree: MergeTree,\n\tsegLimit: number,\n\tmarkers = false,\n): MergeTree {\n\tconst segments = loadSegments(content, segLimit, markers);\n\tmergeTree.reloadFromSegments(segments);\n\treturn mergeTree;\n}\n"]}
|