@fluid-experimental/tree 2.0.0-rc.2.0.1 → 2.0.0-rc.3.0.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 +23 -0
- package/api-report/experimental-tree.api.md +2 -2
- package/dist/ChangeCompression.d.ts +2 -2
- package/dist/ChangeCompression.d.ts.map +1 -1
- package/dist/ChangeCompression.js +1 -1
- package/dist/ChangeCompression.js.map +1 -1
- package/dist/ChangeTypes.d.ts +1 -1
- package/dist/ChangeTypes.d.ts.map +1 -1
- package/dist/ChangeTypes.js +4 -4
- package/dist/ChangeTypes.js.map +1 -1
- package/dist/Checkout.d.ts +3 -3
- package/dist/Checkout.d.ts.map +1 -1
- package/dist/Checkout.js +17 -17
- package/dist/Checkout.js.map +1 -1
- package/dist/EditLog.d.ts +1 -1
- package/dist/EditLog.d.ts.map +1 -1
- package/dist/EditLog.js +9 -9
- package/dist/EditLog.js.map +1 -1
- package/dist/EditUtilities.d.ts +3 -3
- package/dist/EditUtilities.d.ts.map +1 -1
- package/dist/EditUtilities.js +6 -6
- package/dist/EditUtilities.js.map +1 -1
- package/dist/Forest.d.ts.map +1 -1
- package/dist/Forest.js +23 -23
- package/dist/Forest.js.map +1 -1
- package/dist/HistoryEditFactory.d.ts +1 -1
- package/dist/HistoryEditFactory.d.ts.map +1 -1
- package/dist/HistoryEditFactory.js +7 -7
- package/dist/HistoryEditFactory.js.map +1 -1
- package/dist/IdConversion.d.ts.map +1 -1
- package/dist/IdConversion.js.map +1 -1
- package/dist/LogViewer.d.ts +2 -2
- package/dist/LogViewer.d.ts.map +1 -1
- package/dist/LogViewer.js +7 -7
- package/dist/LogViewer.js.map +1 -1
- package/dist/MergeHealth.d.ts.map +1 -1
- package/dist/MergeHealth.js +1 -1
- package/dist/MergeHealth.js.map +1 -1
- package/dist/NodeIdUtilities.d.ts +1 -1
- package/dist/NodeIdUtilities.d.ts.map +1 -1
- package/dist/NodeIdUtilities.js +1 -1
- package/dist/NodeIdUtilities.js.map +1 -1
- package/dist/PayloadUtilities.d.ts.map +1 -1
- package/dist/PayloadUtilities.js +2 -2
- package/dist/PayloadUtilities.js.map +1 -1
- package/dist/ReconciliationPath.d.ts +1 -1
- package/dist/ReconciliationPath.d.ts.map +1 -1
- package/dist/ReconciliationPath.js.map +1 -1
- package/dist/RevisionValueCache.d.ts.map +1 -1
- package/dist/RevisionValueCache.js +2 -2
- package/dist/RevisionValueCache.js.map +1 -1
- package/dist/RevisionView.d.ts +2 -2
- package/dist/RevisionView.d.ts.map +1 -1
- package/dist/RevisionView.js.map +1 -1
- package/dist/SerializationUtilities.d.ts +1 -1
- package/dist/SerializationUtilities.d.ts.map +1 -1
- package/dist/SerializationUtilities.js.map +1 -1
- package/dist/SharedTree.d.ts +8 -7
- package/dist/SharedTree.d.ts.map +1 -1
- package/dist/SharedTree.js +78 -78
- package/dist/SharedTree.js.map +1 -1
- package/dist/SharedTreeEncoder.d.ts +1 -1
- package/dist/SharedTreeEncoder.d.ts.map +1 -1
- package/dist/SharedTreeEncoder.js +31 -31
- package/dist/SharedTreeEncoder.js.map +1 -1
- package/dist/Summary.d.ts +2 -2
- package/dist/Summary.d.ts.map +1 -1
- package/dist/Summary.js +2 -2
- package/dist/Summary.js.map +1 -1
- package/dist/SummaryBackCompatibility.d.ts.map +1 -1
- package/dist/SummaryBackCompatibility.js.map +1 -1
- package/dist/SummaryTestUtilities.d.ts +1 -1
- package/dist/SummaryTestUtilities.d.ts.map +1 -1
- package/dist/SummaryTestUtilities.js.map +1 -1
- package/dist/Transaction.d.ts +3 -3
- package/dist/Transaction.d.ts.map +1 -1
- package/dist/Transaction.js +3 -3
- package/dist/Transaction.js.map +1 -1
- package/dist/TransactionInternal.d.ts +3 -3
- package/dist/TransactionInternal.d.ts.map +1 -1
- package/dist/TransactionInternal.js +6 -6
- package/dist/TransactionInternal.js.map +1 -1
- package/dist/TreeCompressor.d.ts +5 -1
- package/dist/TreeCompressor.d.ts.map +1 -1
- package/dist/TreeCompressor.js +5 -5
- package/dist/TreeCompressor.js.map +1 -1
- package/dist/TreeNodeHandle.d.ts +1 -1
- package/dist/TreeNodeHandle.d.ts.map +1 -1
- package/dist/TreeNodeHandle.js.map +1 -1
- package/dist/TreeView.d.ts +1 -1
- package/dist/TreeView.d.ts.map +1 -1
- package/dist/TreeView.js +2 -3
- package/dist/TreeView.js.map +1 -1
- package/dist/UuidUtilities.d.ts.map +1 -1
- package/dist/UuidUtilities.js.map +1 -1
- package/dist/id-compressor/AppendOnlySortedMap.d.ts.map +1 -1
- package/dist/id-compressor/AppendOnlySortedMap.js +3 -3
- package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -1
- package/dist/id-compressor/IdCompressor.d.ts +1 -1
- package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
- package/dist/id-compressor/IdCompressor.js +25 -26
- package/dist/id-compressor/IdCompressor.js.map +1 -1
- package/dist/id-compressor/IdRange.d.ts.map +1 -1
- package/dist/id-compressor/IdRange.js +2 -2
- package/dist/id-compressor/IdRange.js.map +1 -1
- package/dist/id-compressor/NumericUuid.d.ts.map +1 -1
- package/dist/id-compressor/NumericUuid.js +2 -1
- package/dist/id-compressor/NumericUuid.js.map +1 -1
- package/dist/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
- package/dist/id-compressor/SessionIdNormalizer.js +8 -9
- package/dist/id-compressor/SessionIdNormalizer.js.map +1 -1
- package/dist/migration-shim/migrationDeltaHandler.d.ts +1 -1
- package/dist/migration-shim/migrationDeltaHandler.d.ts.map +1 -1
- package/dist/migration-shim/migrationDeltaHandler.js +11 -11
- package/dist/migration-shim/migrationDeltaHandler.js.map +1 -1
- package/dist/migration-shim/migrationShim.d.ts +8 -4
- package/dist/migration-shim/migrationShim.d.ts.map +1 -1
- package/dist/migration-shim/migrationShim.js +13 -13
- package/dist/migration-shim/migrationShim.js.map +1 -1
- package/dist/migration-shim/migrationShimFactory.d.ts +2 -2
- package/dist/migration-shim/migrationShimFactory.d.ts.map +1 -1
- package/dist/migration-shim/migrationShimFactory.js +2 -2
- package/dist/migration-shim/migrationShimFactory.js.map +1 -1
- package/dist/migration-shim/packageVersion.d.ts +0 -2
- package/dist/migration-shim/packageVersion.d.ts.map +1 -1
- package/dist/migration-shim/packageVersion.js +0 -2
- package/dist/migration-shim/packageVersion.js.map +1 -1
- package/dist/migration-shim/sharedTreeDeltaHandler.d.ts.map +1 -1
- package/dist/migration-shim/sharedTreeDeltaHandler.js +8 -8
- package/dist/migration-shim/sharedTreeDeltaHandler.js.map +1 -1
- package/dist/migration-shim/sharedTreeShim.d.ts +2 -2
- package/dist/migration-shim/sharedTreeShim.d.ts.map +1 -1
- package/dist/migration-shim/sharedTreeShim.js +8 -4
- package/dist/migration-shim/sharedTreeShim.js.map +1 -1
- package/dist/migration-shim/sharedTreeShimFactory.d.ts +1 -1
- package/dist/migration-shim/sharedTreeShimFactory.d.ts.map +1 -1
- package/dist/migration-shim/sharedTreeShimFactory.js +2 -2
- package/dist/migration-shim/sharedTreeShimFactory.js.map +1 -1
- package/dist/migration-shim/shimChannelServices.d.ts +1 -1
- package/dist/migration-shim/shimChannelServices.d.ts.map +1 -1
- package/dist/migration-shim/shimChannelServices.js.map +1 -1
- package/dist/migration-shim/shimDeltaConnection.d.ts +1 -1
- package/dist/migration-shim/shimDeltaConnection.d.ts.map +1 -1
- package/dist/migration-shim/shimDeltaConnection.js +2 -2
- package/dist/migration-shim/shimDeltaConnection.js.map +1 -1
- package/dist/migration-shim/shimHandle.d.ts.map +1 -1
- package/dist/migration-shim/shimHandle.js.map +1 -1
- package/dist/migration-shim/types.d.ts +1 -1
- package/dist/migration-shim/types.d.ts.map +1 -1
- package/dist/migration-shim/types.js.map +1 -1
- package/dist/migration-shim/utils.d.ts +1 -1
- package/dist/migration-shim/utils.d.ts.map +1 -1
- package/dist/migration-shim/utils.js.map +1 -1
- package/dist/persisted-types/0.0.2.d.ts +1 -1
- package/dist/persisted-types/0.0.2.d.ts.map +1 -1
- package/dist/persisted-types/0.0.2.js.map +1 -1
- package/dist/persisted-types/0.1.1.d.ts +1 -1
- package/dist/persisted-types/0.1.1.d.ts.map +1 -1
- package/dist/persisted-types/0.1.1.js +3 -3
- package/dist/persisted-types/0.1.1.js.map +1 -1
- package/lib/ChangeCompression.d.ts +2 -2
- package/lib/ChangeCompression.d.ts.map +1 -1
- package/lib/ChangeCompression.js +1 -1
- package/lib/ChangeCompression.js.map +1 -1
- package/lib/ChangeTypes.d.ts +1 -1
- package/lib/ChangeTypes.d.ts.map +1 -1
- package/lib/ChangeTypes.js +2 -2
- package/lib/ChangeTypes.js.map +1 -1
- package/lib/Checkout.d.ts +3 -3
- package/lib/Checkout.d.ts.map +1 -1
- package/lib/Checkout.js +4 -4
- package/lib/Checkout.js.map +1 -1
- package/lib/EditLog.d.ts +1 -1
- package/lib/EditLog.d.ts.map +1 -1
- package/lib/EditLog.js +2 -2
- package/lib/EditLog.js.map +1 -1
- package/lib/EditUtilities.d.ts +3 -3
- package/lib/EditUtilities.d.ts.map +1 -1
- package/lib/EditUtilities.js +5 -5
- package/lib/EditUtilities.js.map +1 -1
- package/lib/Forest.d.ts.map +1 -1
- package/lib/Forest.js +2 -2
- package/lib/Forest.js.map +1 -1
- package/lib/HistoryEditFactory.d.ts +1 -1
- package/lib/HistoryEditFactory.d.ts.map +1 -1
- package/lib/HistoryEditFactory.js +5 -5
- package/lib/HistoryEditFactory.js.map +1 -1
- package/lib/IdConversion.d.ts.map +1 -1
- package/lib/IdConversion.js.map +1 -1
- package/lib/LogViewer.d.ts +2 -2
- package/lib/LogViewer.d.ts.map +1 -1
- package/lib/LogViewer.js +3 -3
- package/lib/LogViewer.js.map +1 -1
- package/lib/MergeHealth.d.ts.map +1 -1
- package/lib/MergeHealth.js +1 -1
- package/lib/MergeHealth.js.map +1 -1
- package/lib/NodeIdUtilities.d.ts +1 -1
- package/lib/NodeIdUtilities.d.ts.map +1 -1
- package/lib/NodeIdUtilities.js +1 -1
- package/lib/NodeIdUtilities.js.map +1 -1
- package/lib/PayloadUtilities.d.ts.map +1 -1
- package/lib/PayloadUtilities.js +1 -1
- package/lib/PayloadUtilities.js.map +1 -1
- package/lib/ReconciliationPath.d.ts +1 -1
- package/lib/ReconciliationPath.d.ts.map +1 -1
- package/lib/ReconciliationPath.js.map +1 -1
- package/lib/RevisionValueCache.d.ts.map +1 -1
- package/lib/RevisionValueCache.js +2 -2
- package/lib/RevisionValueCache.js.map +1 -1
- package/lib/RevisionView.d.ts +2 -2
- package/lib/RevisionView.d.ts.map +1 -1
- package/lib/RevisionView.js.map +1 -1
- package/lib/SerializationUtilities.d.ts +1 -1
- package/lib/SerializationUtilities.d.ts.map +1 -1
- package/lib/SerializationUtilities.js.map +1 -1
- package/lib/SharedTree.d.ts +8 -7
- package/lib/SharedTree.d.ts.map +1 -1
- package/lib/SharedTree.js +13 -13
- package/lib/SharedTree.js.map +1 -1
- package/lib/SharedTreeEncoder.d.ts +1 -1
- package/lib/SharedTreeEncoder.d.ts.map +1 -1
- package/lib/SharedTreeEncoder.js +5 -5
- package/lib/SharedTreeEncoder.js.map +1 -1
- package/lib/Summary.d.ts +2 -2
- package/lib/Summary.d.ts.map +1 -1
- package/lib/Summary.js +1 -1
- package/lib/Summary.js.map +1 -1
- package/lib/SummaryBackCompatibility.d.ts.map +1 -1
- package/lib/SummaryBackCompatibility.js.map +1 -1
- package/lib/SummaryTestUtilities.d.ts +1 -1
- package/lib/SummaryTestUtilities.d.ts.map +1 -1
- package/lib/SummaryTestUtilities.js.map +1 -1
- package/lib/Transaction.d.ts +3 -3
- package/lib/Transaction.d.ts.map +1 -1
- package/lib/Transaction.js +3 -3
- package/lib/Transaction.js.map +1 -1
- package/lib/TransactionInternal.d.ts +3 -3
- package/lib/TransactionInternal.d.ts.map +1 -1
- package/lib/TransactionInternal.js +3 -3
- package/lib/TransactionInternal.js.map +1 -1
- package/lib/TreeCompressor.d.ts +5 -1
- package/lib/TreeCompressor.d.ts.map +1 -1
- package/lib/TreeCompressor.js +2 -2
- package/lib/TreeCompressor.js.map +1 -1
- package/lib/TreeNodeHandle.d.ts +1 -1
- package/lib/TreeNodeHandle.d.ts.map +1 -1
- package/lib/TreeNodeHandle.js.map +1 -1
- package/lib/TreeView.d.ts +1 -1
- package/lib/TreeView.d.ts.map +1 -1
- package/lib/TreeView.js +1 -2
- package/lib/TreeView.js.map +1 -1
- package/lib/UuidUtilities.d.ts.map +1 -1
- package/lib/UuidUtilities.js +1 -1
- package/lib/UuidUtilities.js.map +1 -1
- package/lib/id-compressor/AppendOnlySortedMap.d.ts.map +1 -1
- package/lib/id-compressor/AppendOnlySortedMap.js +1 -1
- package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -1
- package/lib/id-compressor/IdCompressor.d.ts +1 -1
- package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
- package/lib/id-compressor/IdCompressor.js +4 -5
- package/lib/id-compressor/IdCompressor.js.map +1 -1
- package/lib/id-compressor/IdRange.d.ts.map +1 -1
- package/lib/id-compressor/IdRange.js +1 -1
- package/lib/id-compressor/IdRange.js.map +1 -1
- package/lib/id-compressor/NumericUuid.d.ts.map +1 -1
- package/lib/id-compressor/NumericUuid.js +2 -1
- package/lib/id-compressor/NumericUuid.js.map +1 -1
- package/lib/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
- package/lib/id-compressor/SessionIdNormalizer.js +1 -2
- package/lib/id-compressor/SessionIdNormalizer.js.map +1 -1
- package/lib/migration-shim/migrationDeltaHandler.d.ts +1 -1
- package/lib/migration-shim/migrationDeltaHandler.d.ts.map +1 -1
- package/lib/migration-shim/migrationDeltaHandler.js +1 -1
- package/lib/migration-shim/migrationDeltaHandler.js.map +1 -1
- package/lib/migration-shim/migrationShim.d.ts +8 -4
- package/lib/migration-shim/migrationShim.d.ts.map +1 -1
- package/lib/migration-shim/migrationShim.js +3 -3
- package/lib/migration-shim/migrationShim.js.map +1 -1
- package/lib/migration-shim/migrationShimFactory.d.ts +2 -2
- package/lib/migration-shim/migrationShimFactory.d.ts.map +1 -1
- package/lib/migration-shim/migrationShimFactory.js +1 -1
- package/lib/migration-shim/migrationShimFactory.js.map +1 -1
- package/lib/migration-shim/packageVersion.d.ts +0 -2
- package/lib/migration-shim/packageVersion.d.ts.map +1 -1
- package/lib/migration-shim/packageVersion.js +0 -2
- package/lib/migration-shim/packageVersion.js.map +1 -1
- package/lib/migration-shim/sharedTreeDeltaHandler.d.ts.map +1 -1
- package/lib/migration-shim/sharedTreeDeltaHandler.js +1 -1
- package/lib/migration-shim/sharedTreeDeltaHandler.js.map +1 -1
- package/lib/migration-shim/sharedTreeShim.d.ts +2 -2
- package/lib/migration-shim/sharedTreeShim.d.ts.map +1 -1
- package/lib/migration-shim/sharedTreeShim.js +6 -2
- package/lib/migration-shim/sharedTreeShim.js.map +1 -1
- package/lib/migration-shim/sharedTreeShimFactory.d.ts +1 -1
- package/lib/migration-shim/sharedTreeShimFactory.d.ts.map +1 -1
- package/lib/migration-shim/sharedTreeShimFactory.js +1 -1
- package/lib/migration-shim/sharedTreeShimFactory.js.map +1 -1
- package/lib/migration-shim/shimChannelServices.d.ts +1 -1
- package/lib/migration-shim/shimChannelServices.d.ts.map +1 -1
- package/lib/migration-shim/shimChannelServices.js.map +1 -1
- package/lib/migration-shim/shimDeltaConnection.d.ts +1 -1
- package/lib/migration-shim/shimDeltaConnection.d.ts.map +1 -1
- package/lib/migration-shim/shimDeltaConnection.js +1 -1
- package/lib/migration-shim/shimDeltaConnection.js.map +1 -1
- package/lib/migration-shim/shimHandle.d.ts.map +1 -1
- package/lib/migration-shim/shimHandle.js.map +1 -1
- package/lib/migration-shim/types.d.ts +1 -1
- package/lib/migration-shim/types.d.ts.map +1 -1
- package/lib/migration-shim/types.js.map +1 -1
- package/lib/migration-shim/utils.d.ts +1 -1
- package/lib/migration-shim/utils.d.ts.map +1 -1
- package/lib/migration-shim/utils.js.map +1 -1
- package/lib/persisted-types/0.0.2.d.ts +1 -1
- package/lib/persisted-types/0.0.2.d.ts.map +1 -1
- package/lib/persisted-types/0.0.2.js.map +1 -1
- package/lib/persisted-types/0.1.1.d.ts +1 -1
- package/lib/persisted-types/0.1.1.d.ts.map +1 -1
- package/lib/persisted-types/0.1.1.js +1 -1
- package/lib/persisted-types/0.1.1.js.map +1 -1
- package/package.json +33 -32
- package/src/ChangeCompression.ts +8 -8
- package/src/ChangeTypes.ts +5 -4
- package/src/Checkout.ts +9 -7
- package/src/EditLog.ts +4 -3
- package/src/EditUtilities.ts +9 -8
- package/src/Forest.ts +3 -2
- package/src/HistoryEditFactory.ts +12 -11
- package/src/IdConversion.ts +2 -2
- package/src/LogViewer.ts +5 -4
- package/src/MergeHealth.ts +2 -1
- package/src/NodeIdUtilities.ts +2 -2
- package/src/PayloadUtilities.ts +2 -1
- package/src/ReconciliationPath.ts +1 -1
- package/src/RevisionValueCache.ts +3 -2
- package/src/RevisionView.ts +3 -3
- package/src/SerializationUtilities.ts +1 -1
- package/src/SharedTree.ts +46 -49
- package/src/SharedTreeEncoder.ts +30 -29
- package/src/Summary.ts +5 -3
- package/src/SummaryBackCompatibility.ts +1 -0
- package/src/SummaryTestUtilities.ts +2 -1
- package/src/Transaction.ts +7 -6
- package/src/TransactionInternal.ts +17 -16
- package/src/TreeCompressor.ts +6 -4
- package/src/TreeNodeHandle.ts +2 -2
- package/src/TreeView.ts +3 -3
- package/src/UuidUtilities.ts +2 -1
- package/src/id-compressor/AppendOnlySortedMap.ts +2 -1
- package/src/id-compressor/IdCompressor.ts +18 -17
- package/src/id-compressor/IdRange.ts +2 -1
- package/src/id-compressor/NumericUuid.ts +1 -1
- package/src/id-compressor/SessionIdNormalizer.ts +3 -3
- package/src/migration-shim/migrationDeltaHandler.ts +3 -2
- package/src/migration-shim/migrationShim.ts +14 -10
- package/src/migration-shim/migrationShimFactory.ts +6 -4
- package/src/migration-shim/packageVersion.ts +0 -2
- package/src/migration-shim/sharedTreeDeltaHandler.ts +3 -2
- package/src/migration-shim/sharedTreeShim.ts +7 -5
- package/src/migration-shim/sharedTreeShimFactory.ts +3 -3
- package/src/migration-shim/shimChannelServices.ts +1 -1
- package/src/migration-shim/shimDeltaConnection.ts +3 -2
- package/src/migration-shim/shimHandle.ts +1 -0
- package/src/migration-shim/types.ts +3 -1
- package/src/migration-shim/utils.ts +2 -1
- package/src/persisted-types/0.0.2.ts +2 -2
- package/src/persisted-types/0.1.1.ts +10 -8
- package/dist/tree-alpha.d.ts +0 -2901
- package/dist/tree-beta.d.ts +0 -348
- package/dist/tree-public.d.ts +0 -348
- package/dist/tree-untrimmed.d.ts +0 -3820
- package/lib/test/AppendOnlySortedMap.perf.tests.d.ts +0 -6
- package/lib/test/AppendOnlySortedMap.perf.tests.d.ts.map +0 -1
- package/lib/test/AppendOnlySortedMap.perf.tests.js +0 -49
- package/lib/test/AppendOnlySortedMap.perf.tests.js.map +0 -1
- package/lib/test/AppendOnlySortedMap.tests.d.ts +0 -6
- package/lib/test/AppendOnlySortedMap.tests.d.ts.map +0 -1
- package/lib/test/AppendOnlySortedMap.tests.js +0 -213
- package/lib/test/AppendOnlySortedMap.tests.js.map +0 -1
- package/lib/test/ChangeCompression.tests.d.ts +0 -6
- package/lib/test/ChangeCompression.tests.d.ts.map +0 -1
- package/lib/test/ChangeCompression.tests.js +0 -154
- package/lib/test/ChangeCompression.tests.js.map +0 -1
- package/lib/test/Checkout.tests.d.ts +0 -10
- package/lib/test/Checkout.tests.d.ts.map +0 -1
- package/lib/test/Checkout.tests.js +0 -460
- package/lib/test/Checkout.tests.js.map +0 -1
- package/lib/test/Common.tests.d.ts +0 -6
- package/lib/test/Common.tests.d.ts.map +0 -1
- package/lib/test/Common.tests.js +0 -102
- package/lib/test/Common.tests.js.map +0 -1
- package/lib/test/EagerCheckout.tests.d.ts +0 -6
- package/lib/test/EagerCheckout.tests.d.ts.map +0 -1
- package/lib/test/EagerCheckout.tests.js +0 -20
- package/lib/test/EagerCheckout.tests.js.map +0 -1
- package/lib/test/Edit.tests.d.ts +0 -6
- package/lib/test/Edit.tests.d.ts.map +0 -1
- package/lib/test/Edit.tests.js +0 -60
- package/lib/test/Edit.tests.js.map +0 -1
- package/lib/test/EditLog.perf.tests.d.ts +0 -6
- package/lib/test/EditLog.perf.tests.d.ts.map +0 -1
- package/lib/test/EditLog.perf.tests.js +0 -41
- package/lib/test/EditLog.perf.tests.js.map +0 -1
- package/lib/test/EditLog.tests.d.ts +0 -6
- package/lib/test/EditLog.tests.d.ts.map +0 -1
- package/lib/test/EditLog.tests.js +0 -355
- package/lib/test/EditLog.tests.js.map +0 -1
- package/lib/test/EditUtilities.tests.d.ts +0 -6
- package/lib/test/EditUtilities.tests.d.ts.map +0 -1
- package/lib/test/EditUtilities.tests.js +0 -512
- package/lib/test/EditUtilities.tests.js.map +0 -1
- package/lib/test/Forest.perf.tests.d.ts +0 -6
- package/lib/test/Forest.perf.tests.d.ts.map +0 -1
- package/lib/test/Forest.perf.tests.js +0 -135
- package/lib/test/Forest.perf.tests.js.map +0 -1
- package/lib/test/Forest.tests.d.ts +0 -6
- package/lib/test/Forest.tests.d.ts.map +0 -1
- package/lib/test/Forest.tests.js +0 -213
- package/lib/test/Forest.tests.js.map +0 -1
- package/lib/test/GenericTransaction.tests.d.ts +0 -6
- package/lib/test/GenericTransaction.tests.d.ts.map +0 -1
- package/lib/test/GenericTransaction.tests.js +0 -31
- package/lib/test/GenericTransaction.tests.js.map +0 -1
- package/lib/test/HistoryEditFactory.tests.d.ts +0 -6
- package/lib/test/HistoryEditFactory.tests.d.ts.map +0 -1
- package/lib/test/HistoryEditFactory.tests.js +0 -170
- package/lib/test/HistoryEditFactory.tests.js.map +0 -1
- package/lib/test/IdCompressor.perf.tests.d.ts +0 -6
- package/lib/test/IdCompressor.perf.tests.d.ts.map +0 -1
- package/lib/test/IdCompressor.perf.tests.js +0 -290
- package/lib/test/IdCompressor.perf.tests.js.map +0 -1
- package/lib/test/IdCompressor.tests.d.ts +0 -6
- package/lib/test/IdCompressor.tests.d.ts.map +0 -1
- package/lib/test/IdCompressor.tests.js +0 -1542
- package/lib/test/IdCompressor.tests.js.map +0 -1
- package/lib/test/IdConversion.tests.d.ts +0 -6
- package/lib/test/IdConversion.tests.d.ts.map +0 -1
- package/lib/test/IdConversion.tests.js +0 -36
- package/lib/test/IdConversion.tests.js.map +0 -1
- package/lib/test/LazyCheckout.tests.d.ts +0 -6
- package/lib/test/LazyCheckout.tests.d.ts.map +0 -1
- package/lib/test/LazyCheckout.tests.js +0 -22
- package/lib/test/LazyCheckout.tests.js.map +0 -1
- package/lib/test/LogViewer.tests.d.ts +0 -6
- package/lib/test/LogViewer.tests.d.ts.map +0 -1
- package/lib/test/LogViewer.tests.js +0 -588
- package/lib/test/LogViewer.tests.js.map +0 -1
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.d.ts +0 -6
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.d.ts.map +0 -1
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +0 -351
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +0 -1
- package/lib/test/NumericUuid.perf.tests.d.ts +0 -6
- package/lib/test/NumericUuid.perf.tests.d.ts.map +0 -1
- package/lib/test/NumericUuid.perf.tests.js +0 -68
- package/lib/test/NumericUuid.perf.tests.js.map +0 -1
- package/lib/test/NumericUuid.tests.d.ts +0 -6
- package/lib/test/NumericUuid.tests.d.ts.map +0 -1
- package/lib/test/NumericUuid.tests.js +0 -192
- package/lib/test/NumericUuid.tests.js.map +0 -1
- package/lib/test/RevisionValueCache.tests.d.ts +0 -6
- package/lib/test/RevisionValueCache.tests.d.ts.map +0 -1
- package/lib/test/RevisionValueCache.tests.js +0 -106
- package/lib/test/RevisionValueCache.tests.js.map +0 -1
- package/lib/test/RevisionView.tests.d.ts +0 -6
- package/lib/test/RevisionView.tests.d.ts.map +0 -1
- package/lib/test/RevisionView.tests.js +0 -131
- package/lib/test/RevisionView.tests.js.map +0 -1
- package/lib/test/SessionIdNormalizer.tests.d.ts +0 -6
- package/lib/test/SessionIdNormalizer.tests.d.ts.map +0 -1
- package/lib/test/SessionIdNormalizer.tests.js +0 -377
- package/lib/test/SessionIdNormalizer.tests.js.map +0 -1
- package/lib/test/SharedTree.fuzz.tests.d.ts +0 -6
- package/lib/test/SharedTree.fuzz.tests.d.ts.map +0 -1
- package/lib/test/SharedTree.fuzz.tests.js +0 -9
- package/lib/test/SharedTree.fuzz.tests.js.map +0 -1
- package/lib/test/SharedTree.perf.tests.d.ts +0 -6
- package/lib/test/SharedTree.perf.tests.d.ts.map +0 -1
- package/lib/test/SharedTree.perf.tests.js +0 -39
- package/lib/test/SharedTree.perf.tests.js.map +0 -1
- package/lib/test/SharedTree.tests.d.ts +0 -6
- package/lib/test/SharedTree.tests.d.ts.map +0 -1
- package/lib/test/SharedTree.tests.js +0 -22
- package/lib/test/SharedTree.tests.js.map +0 -1
- package/lib/test/StringInterner.tests.d.ts +0 -6
- package/lib/test/StringInterner.tests.d.ts.map +0 -1
- package/lib/test/StringInterner.tests.js +0 -73
- package/lib/test/StringInterner.tests.js.map +0 -1
- package/lib/test/Summary.tests.d.ts +0 -7
- package/lib/test/Summary.tests.d.ts.map +0 -1
- package/lib/test/Summary.tests.js +0 -386
- package/lib/test/Summary.tests.js.map +0 -1
- package/lib/test/Transaction.tests.d.ts +0 -6
- package/lib/test/Transaction.tests.d.ts.map +0 -1
- package/lib/test/Transaction.tests.js +0 -124
- package/lib/test/Transaction.tests.js.map +0 -1
- package/lib/test/TransactionInternal.tests.d.ts +0 -6
- package/lib/test/TransactionInternal.tests.d.ts.map +0 -1
- package/lib/test/TransactionInternal.tests.js +0 -576
- package/lib/test/TransactionInternal.tests.js.map +0 -1
- package/lib/test/TreeCompression.tests.d.ts +0 -6
- package/lib/test/TreeCompression.tests.d.ts.map +0 -1
- package/lib/test/TreeCompression.tests.js +0 -291
- package/lib/test/TreeCompression.tests.js.map +0 -1
- package/lib/test/TreeView.tests.d.ts +0 -6
- package/lib/test/TreeView.tests.d.ts.map +0 -1
- package/lib/test/TreeView.tests.js +0 -178
- package/lib/test/TreeView.tests.js.map +0 -1
- package/lib/test/UndoRedoHandler.tests.d.ts +0 -6
- package/lib/test/UndoRedoHandler.tests.d.ts.map +0 -1
- package/lib/test/UndoRedoHandler.tests.js +0 -37
- package/lib/test/UndoRedoHandler.tests.js.map +0 -1
- package/lib/test/fuzz/Generators.d.ts +0 -8
- package/lib/test/fuzz/Generators.d.ts.map +0 -1
- package/lib/test/fuzz/Generators.js +0 -345
- package/lib/test/fuzz/Generators.js.map +0 -1
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +0 -23
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +0 -1
- package/lib/test/fuzz/SharedTreeFuzzTests.js +0 -241
- package/lib/test/fuzz/SharedTreeFuzzTests.js.map +0 -1
- package/lib/test/fuzz/Types.d.ts +0 -136
- package/lib/test/fuzz/Types.d.ts.map +0 -1
- package/lib/test/fuzz/Types.js +0 -6
- package/lib/test/fuzz/Types.js.map +0 -1
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts +0 -246
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +0 -1
- package/lib/test/utilities/IdCompressorTestUtilities.js +0 -608
- package/lib/test/utilities/IdCompressorTestUtilities.js.map +0 -1
- package/lib/test/utilities/MockTransaction.d.ts +0 -35
- package/lib/test/utilities/MockTransaction.d.ts.map +0 -1
- package/lib/test/utilities/MockTransaction.js +0 -51
- package/lib/test/utilities/MockTransaction.js.map +0 -1
- package/lib/test/utilities/PendingLocalStateTests.d.ts +0 -12
- package/lib/test/utilities/PendingLocalStateTests.d.ts.map +0 -1
- package/lib/test/utilities/PendingLocalStateTests.js +0 -223
- package/lib/test/utilities/PendingLocalStateTests.js.map +0 -1
- package/lib/test/utilities/SharedTreeTests.d.ts +0 -12
- package/lib/test/utilities/SharedTreeTests.d.ts.map +0 -1
- package/lib/test/utilities/SharedTreeTests.js +0 -949
- package/lib/test/utilities/SharedTreeTests.js.map +0 -1
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts +0 -11
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +0 -1
- package/lib/test/utilities/SharedTreeVersioningTests.js +0 -439
- package/lib/test/utilities/SharedTreeVersioningTests.js.map +0 -1
- package/lib/test/utilities/SummaryLoadPerfTests.d.ts +0 -10
- package/lib/test/utilities/SummaryLoadPerfTests.d.ts.map +0 -1
- package/lib/test/utilities/SummaryLoadPerfTests.js +0 -105
- package/lib/test/utilities/SummaryLoadPerfTests.js.map +0 -1
- package/lib/test/utilities/SummarySizeTests.d.ts +0 -11
- package/lib/test/utilities/SummarySizeTests.d.ts.map +0 -1
- package/lib/test/utilities/SummarySizeTests.js +0 -160
- package/lib/test/utilities/SummarySizeTests.js.map +0 -1
- package/lib/test/utilities/TestCommon.d.ts +0 -13
- package/lib/test/utilities/TestCommon.d.ts.map +0 -1
- package/lib/test/utilities/TestCommon.js +0 -19
- package/lib/test/utilities/TestCommon.js.map +0 -1
- package/lib/test/utilities/TestNode.d.ts +0 -140
- package/lib/test/utilities/TestNode.d.ts.map +0 -1
- package/lib/test/utilities/TestNode.js +0 -282
- package/lib/test/utilities/TestNode.js.map +0 -1
- package/lib/test/utilities/TestSerializer.d.ts +0 -24
- package/lib/test/utilities/TestSerializer.d.ts.map +0 -1
- package/lib/test/utilities/TestSerializer.js +0 -40
- package/lib/test/utilities/TestSerializer.js.map +0 -1
- package/lib/test/utilities/TestUtilities.d.ts +0 -212
- package/lib/test/utilities/TestUtilities.d.ts.map +0 -1
- package/lib/test/utilities/TestUtilities.js +0 -413
- package/lib/test/utilities/TestUtilities.js.map +0 -1
- package/lib/test/utilities/UndoRedoTests.d.ts +0 -32
- package/lib/test/utilities/UndoRedoTests.d.ts.map +0 -1
- package/lib/test/utilities/UndoRedoTests.js +0 -317
- package/lib/test/utilities/UndoRedoTests.js.map +0 -1
- /package/{dist → lib}/tsdoc-metadata.json +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IdCompressor.tests.js","sourceRoot":"","sources":["../../src/test/IdCompressor.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from 'assert';\nimport { expect } from 'chai';\nimport { v4, v5 } from 'uuid';\nimport { MockLogger } from '@fluidframework/telemetry-utils';\nimport { take } from '@fluid-private/stochastic-test-utils';\nimport { validateAssertionError } from '@fluidframework/test-runtime-utils';\nimport {\n\tIdCompressor,\n\tisFinalId,\n\tisLocalId,\n\thasOngoingSession,\n\tlegacySharedTreeInitialTreeId,\n} from '../id-compressor/IdCompressor.js';\nimport {\n\tLocalCompressedId,\n\tFinalCompressedId,\n\tSessionSpaceCompressedId,\n\tOpSpaceCompressedId,\n\tSessionId,\n\tStableId,\n} from '../Identifiers.js';\nimport { assertNotUndefined, fail } from '../Common.js';\nimport {\n\tcreateSessionId,\n\tincrementUuid,\n\tnumericUuidFromStableId,\n\tstableIdFromNumericUuid,\n} from '../id-compressor/NumericUuid.js';\nimport { getIds } from '../id-compressor/IdRange.js';\nimport type { IdCreationRange, UnackedLocalId } from '../id-compressor/index.js';\nimport { assertIsStableId, generateStableId, isStableId } from '../UuidUtilities.js';\nimport {\n\tcreateCompressor,\n\tperformFuzzActions,\n\tsessionIds,\n\tIdCompressorTestNetwork,\n\tClient,\n\tDestinationClient,\n\tMetaClient,\n\texpectSerializes,\n\troundtrip,\n\tsessionNumericUuids,\n\tmakeOpGenerator,\n\tattributionIds,\n\tgenerateCompressedIds,\n} from './utilities/IdCompressorTestUtilities.js';\nimport { expectDefined, expectAssert } from './utilities/TestCommon.js';\n\ndescribe('IdCompressor', () => {\n\tit('detects invalid cluster sizes', () => {\n\t\tconst compressor = createCompressor(Client.Client1, 1);\n\t\tassert.throws(\n\t\t\t() => (compressor.clusterCapacity = -1),\n\t\t\t(e: Error) => validateAssertionError(e, 'Clusters must have a positive capacity')\n\t\t);\n\t\tassert.throws(\n\t\t\t() => (compressor.clusterCapacity = 0),\n\t\t\t(e: Error) => validateAssertionError(e, 'Clusters must have a positive capacity')\n\t\t);\n\t\tassert.throws(\n\t\t\t() => (compressor.clusterCapacity = IdCompressor.maxClusterSize + 1),\n\t\t\t(e: Error) => validateAssertionError(e, 'Clusters must not exceed max cluster size')\n\t\t);\n\t});\n\n\tit('reports the proper session ID', () => {\n\t\tconst sessionId = createSessionId();\n\t\tconst compressor = new IdCompressor(sessionId, 0);\n\t\texpect(compressor.localSessionId).to.equal(sessionId);\n\t});\n\n\tit('accepts different numbers of reserved IDs', () => {\n\t\tfor (const reservedIdCount of [0, 1, 5]) {\n\t\t\tconst compressor = new IdCompressor(createSessionId(), reservedIdCount);\n\t\t\tif (reservedIdCount > 0) {\n\t\t\t\texpect(compressor.decompress(compressor.getReservedId(0))).to.equal(legacySharedTreeInitialTreeId);\n\t\t\t}\n\t\t}\n\t});\n\n\tdescribe('ID Generation', () => {\n\t\tit('can create a compressed ID with an override', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override = 'override';\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\texpect(compressor.decompress(id)).to.equal(override);\n\t\t});\n\n\t\tit('can create compressed IDs with v5 overrides', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst uuidA = v5('foo', '7834b437-6e8c-4936-a1a3-0130b1178f17');\n\t\t\tconst uuidB = uuidA.slice(0, uuidA.length - 1) + (uuidA.endsWith('a') ? 'b' : 'a');\n\t\t\tconst idA = compressor.generateCompressedId(uuidA);\n\t\t\tconst idB = compressor.generateCompressedId(uuidB);\n\t\t\texpect(compressor.decompress(idA)).to.equal(uuidA);\n\t\t\texpect(compressor.decompress(idB)).to.equal(uuidB);\n\t\t});\n\n\t\tit('can manually create a compressed ID', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\texpect(id).to.equal(compressor.recompress(uuid));\n\t\t});\n\n\t\tit('will not decompress IDs it did not compress', () => {\n\t\t\tconst errorMessage = 'Compressed ID was not generated by this compressor';\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tassert.throws(\n\t\t\t\t() => compressor.decompress(-1 as LocalCompressedId),\n\t\t\t\t(e: Error) => validateAssertionError(e, errorMessage)\n\t\t\t);\n\t\t\tassert.throws(\n\t\t\t\t() => compressor.decompress(compressor.reservedIdCount as FinalCompressedId),\n\t\t\t\t(e: Error) => validateAssertionError(e, errorMessage)\n\t\t\t);\n\t\t});\n\n\t\tit('will not re-compress uuids it did not originally compress', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\texpect(compressor.tryRecompress('5fff846a-efd4-42fb-8b78-b32ce2672f99')).to.be.undefined;\n\t\t});\n\n\t\tit('unifies duplicate overrides originating from the same compressor', () => {\n\t\t\tconst override = 'override';\n\t\t\tconst compressor = createCompressor(Client.Client1, 3);\n\n\t\t\t// Client1 compresses a uuid\n\t\t\tconst localId1 = compressor.generateCompressedId(override);\n\t\t\tconst localId2 = compressor.generateCompressedId(override);\n\t\t\texpect(localId1).to.equal(localId2, 'only one local ID should be allocated for the same override');\n\t\t\texpect(compressor.decompress(localId1)).to.equal(override, 'override incorrectly associated with local ID');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 3);\n\n\t\t\t// Client1 compresses a uuid\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor.decompress(localId2));\n\t\t\tconst localId3 = compressor.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId2, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that sort before the reserved session UUID', () => {\n\t\t\t// This is a regression test for an issue where passing a sequential UUID that sorted before the reserved UUID\n\t\t\t// as an override created duplicate overrides in the compressor.\n\t\t\tconst newSession = `0${legacySharedTreeInitialTreeId.slice(1)}` as SessionId;\n\t\t\tconst compressor = new IdCompressor(newSession, 1 /* just needs to be > 0 */);\n\n\t\t\t// Client1 compresses a uuid\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor.decompress(localId2));\n\t\t\tconst localId3 = compressor.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId2, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that sort after an existing override', () => {\n\t\t\t// This is a regression test for an issue where passing a sequential UUID that sorted after an existing override\n\t\t\t// as an override created duplicate overrides in the compressor.\n\t\t\tconst newSession = `b${v4().slice(1)}` as SessionId;\n\t\t\tconst compressor = new IdCompressor(newSession, 0);\n\n\t\t\t// Client1 compresses a uuid with some override that will sort before the session uuid\n\t\t\tcompressor.generateCompressedId(`a${v4().slice(1)}`);\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor.decompress(localId2));\n\t\t\tconst localId3 = compressor.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId2, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that sort after an existing cluster', () => {\n\t\t\t// This is a regression test for an issue where passing a sequential UUID that sorted after an existing cluster\n\t\t\t// as an override created duplicate overrides in the compressor.\n\t\t\tconst newSession1 = `c${v4().slice(1)}` as SessionId;\n\t\t\tconst newSession2 = `b${v4().slice(1)}` as SessionId;\n\t\t\tconst compressor1 = new IdCompressor(newSession1, 0);\n\t\t\tconst compressor2 = new IdCompressor(newSession2, 0);\n\t\t\tcompressor1.clusterCapacity = 5;\n\t\t\tcompressor2.clusterCapacity = 5;\n\n\t\t\tcompressor2.generateCompressedId(); // one ID, enough to make a cluster\n\t\t\tcompressor1.finalizeCreationRange(compressor2.takeNextCreationRange());\n\n\t\t\tconst localId = compressor1.generateCompressedId();\n\t\t\tconst stableId2 = assertIsStableId(compressor1.decompress(localId));\n\t\t\tconst localId3 = compressor1.generateCompressedId(stableId2);\n\t\t\texpect(localId3).to.equal(localId, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\n\t\tit('unifies unfinalized local overrides with final IDs from a remote session', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1, 3);\n\t\t\tconst compressor2 = createCompressor(Client.Client2, 3);\n\n\t\t\tconst override = 'override';\n\t\t\tconst local1 = compressor1.generateCompressedId(override);\n\t\t\tconst local2 = compressor2.generateCompressedId(override);\n\t\t\tconst creationRange = compressor2.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(creationRange);\n\t\t\tcompressor2.finalizeCreationRange(creationRange);\n\n\t\t\texpect(compressor1.decompress(local1)).to.equal(override);\n\t\t\tconst final1 = compressor1.normalizeToOpSpace(local1);\n\t\t\tconst final2 = compressor2.normalizeToOpSpace(local2);\n\t\t\texpect(isFinalId(final1)).to.be.true;\n\t\t\texpect(final1).to.equal(final2);\n\t\t});\n\n\t\tit('unifies overrides with sequential local IDs that have been finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst stableId = assertIsStableId(compressor.decompress(id));\n\t\t\tconst localId2 = compressor.generateCompressedId(stableId);\n\t\t\texpect(localId2).to.equal(id, 'only one local ID should be allocated for the same sequential uuid');\n\t\t});\n\t});\n\n\tdescribe('can enumerate all locally created IDs', () => {\n\t\tconst idCount = 10;\n\t\tit('created without finalization', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, idCount);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tids.push(compressor.generateCompressedId());\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\n\t\tit('created with finalization', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, idCount);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tif (i === Math.floor(idCount / 2)) {\n\t\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\t}\n\t\t\t\tids.push(compressor.generateCompressedId());\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\n\t\tit('created with expanded finalization', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, idCount);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < idCount * 4; i++) {\n\t\t\t\tif (i !== 0 && i % Math.floor(idCount / 3) === 0) {\n\t\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\t}\n\t\t\t\tids.push(compressor.generateCompressedId());\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\n\t\tit('created with overrides', () => {\n\t\t\tconst capacity = 100;\n\t\t\tconst compressor = createCompressor(Client.Client1, capacity);\n\t\t\tconst ids: SessionSpaceCompressedId[] = [];\n\t\t\tfor (let i = 0; i < capacity; i++) {\n\t\t\t\tif (i === 1) {\n\t\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\t}\n\t\t\t\tids.push(compressor.generateCompressedId(i % 3 === 0 ? undefined : `override${i}`));\n\t\t\t}\n\t\t\tconst returnedIds = [...compressor.getAllIdsFromLocalSession()];\n\t\t\texpect(returnedIds).to.deep.equal(ids);\n\t\t});\n\t});\n\n\tit('has default attribution ID', () => {\n\t\tconst compressor = createCompressor(Client.Client1);\n\t\texpectDefined(compressor.attributionId);\n\t});\n\n\tit('correctly uses explicit attribution ID', () => {\n\t\tconst attributionId = generateStableId();\n\t\tconst compressor = createCompressor(Client.Client1, 5, attributionId);\n\t\texpect(compressor.attributionId).to.equal(attributionId);\n\t\tconst range1 = compressor.takeNextCreationRange();\n\t\texpect(compressor.attributionId).to.equal(attributionId);\n\t\texpect(range1.attributionId).to.equal(attributionId);\n\t});\n\n\tit('only sends attribution ID until the first ID is allocated', () => {\n\t\tconst compressor = createCompressor(Client.Client1, 5, generateStableId());\n\t\tlet range = compressor.takeNextCreationRange();\n\t\texpectDefined(range.attributionId);\n\t\trange = compressor.takeNextCreationRange();\n\t\texpectDefined(range.attributionId);\n\t\tcompressor.generateCompressedId();\n\t\trange = compressor.takeNextCreationRange();\n\t\texpectDefined(range.attributionId);\n\t\trange = compressor.takeNextCreationRange();\n\t\texpect(range.attributionId).to.be.undefined;\n\t});\n\n\tit('does not send default attribution ID', () => {\n\t\tconst compressor = createCompressor(Client.Client1);\n\t\tconst range = compressor.takeNextCreationRange();\n\t\texpect(range.attributionId).to.be.undefined;\n\t});\n\n\tit('attributes correctly after unification', () => {\n\t\tconst compressor1 = createCompressor(Client.Client1, undefined, attributionIds.get(Client.Client1));\n\t\tconst compressor2 = createCompressor(Client.Client2, undefined, attributionIds.get(Client.Client2));\n\t\tconst id1 = compressor1.generateCompressedId('override');\n\t\tconst id2 = compressor2.generateCompressedId('override');\n\t\tconst range1 = compressor1.takeNextCreationRange();\n\t\tconst range2 = compressor2.takeNextCreationRange();\n\t\tcompressor1.finalizeCreationRange(range2); // 2 gets sequenced first\n\t\tcompressor2.finalizeCreationRange(range2);\n\t\tcompressor1.finalizeCreationRange(range1);\n\t\tcompressor2.finalizeCreationRange(range1);\n\t\texpect(compressor1.normalizeToOpSpace(id1)).to.equal(compressor2.normalizeToOpSpace(id2));\n\t\texpect(compressor1.attributeId(id1)).to.equal(attributionIds.get(Client.Client2));\n\t\texpect(compressor1.attributeId(compressor1.recompress(compressor2.decompress(id2)))).to.equal(\n\t\t\tattributionIds.get(Client.Client2)\n\t\t);\n\t\texpect(compressor2.attributeId(compressor2.recompress(compressor1.decompress(id1)))).to.equal(\n\t\t\tattributionIds.get(Client.Client2)\n\t\t);\n\t\texpect(compressor2.attributeId(id2)).to.equal(attributionIds.get(Client.Client2));\n\t});\n\n\tdescribe('can produce a creation range', () => {\n\t\tconst tests: {\n\t\t\ttitle: string;\n\t\t\toverrideIndices: number[];\n\t\t\tidCount: number;\n\t\t}[] = [\n\t\t\t{ title: 'that is empty', overrideIndices: [], idCount: 0 },\n\t\t\t{ title: 'with only sequential IDs', overrideIndices: [], idCount: 3 },\n\t\t\t{\n\t\t\t\ttitle: 'with an overriding ID',\n\t\t\t\toverrideIndices: [0],\n\t\t\t\tidCount: 1,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with a sequential ID before an overriding ID',\n\t\t\t\toverrideIndices: [1],\n\t\t\t\tidCount: 2,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with a sequential ID after an overriding ID',\n\t\t\t\toverrideIndices: [0],\n\t\t\t\tidCount: 2,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with an overriding ID between sequential IDs',\n\t\t\t\toverrideIndices: [1],\n\t\t\t\tidCount: 3,\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: 'with a sequential ID between override IDs',\n\t\t\t\toverrideIndices: [0, 2],\n\t\t\t\tidCount: 3,\n\t\t\t},\n\t\t];\n\n\t\ttests.forEach(({ title, overrideIndices, idCount }) => {\n\t\t\tit(title, () => {\n\t\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\t\tvalidateIdCreationRange(compressor, idCount, new Set(overrideIndices));\n\t\t\t});\n\n\t\t\ttests.forEach(({ title: title2, overrideIndices: overrideIndices2, idCount: idCount2 }) => {\n\t\t\t\tit(`${title2} after a range ${title}`, () => {\n\t\t\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\t\t\tconst lastTaken = validateIdCreationRange(compressor, idCount, new Set(overrideIndices));\n\t\t\t\t\tvalidateIdCreationRange(compressor, idCount2, new Set(overrideIndices2), lastTaken);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tfunction validateIdCreationRange(\n\t\t\tcompressor: IdCompressor,\n\t\t\tidCount: number,\n\t\t\toverrideIndices: Set<number>,\n\t\t\tlastTakenId = 0 as UnackedLocalId\n\t\t): UnackedLocalId {\n\t\t\tconst overrides: [SessionSpaceCompressedId, string?][] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst override = overrideIndices.has(i) ? v4() : undefined;\n\t\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\t\toverrides.push([id, override]);\n\t\t\t}\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\tlet newLastTakenId = lastTakenId;\n\t\t\tlet idsActual = getIds(range);\n\t\t\tif (overrides.length === 0) {\n\t\t\t\texpect(idsActual).to.be.undefined;\n\t\t\t} else {\n\t\t\t\tidsActual = expectDefined(idsActual);\n\t\t\t\texpect(overrides[0][0]).to.equal(idsActual.first);\n\t\t\t\texpect(overrides[overrides.length - 1][0]).to.equal(idsActual.last);\n\t\t\t\tfor (const [id, uuid] of Object.entries(overrideIndices)) {\n\t\t\t\t\texpect(overrides[id][1]).to.equal(uuid);\n\t\t\t\t}\n\t\t\t\tnewLastTakenId = idsActual.last;\n\t\t\t}\n\n\t\t\treturn newLastTakenId;\n\t\t}\n\t});\n\n\tdescribe('Finalizing', () => {\n\t\tit('can finalize multiple overrides into the same cluster using different ranges', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override1 = 'override1';\n\t\t\tconst override2 = 'override2';\n\t\t\tconst id1 = compressor.generateCompressedId(override1);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst range1 = compressor.takeNextCreationRange();\n\t\t\tconst id2 = compressor.generateCompressedId(override2);\n\t\t\tconst range2 = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(range1);\n\t\t\tcompressor.finalizeCreationRange(range2);\n\t\t\tconst finalId1 = compressor.normalizeToOpSpace(id1);\n\t\t\tconst finalId2 = compressor.normalizeToOpSpace(id2);\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\t\t\texpect(compressor.decompress(finalId1)).to.equal(override1);\n\t\t\texpect(compressor.decompress(finalId2)).to.equal(override2);\n\t\t});\n\n\t\tit('prevents attempts to finalize ranges twice', () => {\n\t\t\tconst rangeCompressor = createCompressor(Client.Client1);\n\t\t\tgenerateCompressedIds(rangeCompressor, 3);\n\t\t\tconst batchRange = rangeCompressor.takeNextCreationRange();\n\t\t\trangeCompressor.finalizeCreationRange(batchRange);\n\t\t\tassert.throws(\n\t\t\t\t() => rangeCompressor.finalizeCreationRange(batchRange),\n\t\t\t\t(e: Error) => validateAssertionError(e, 'Ranges finalized out of order.')\n\t\t\t);\n\n\t\t\t// Make a new compressor, as the first one will be left in a bad state\n\t\t\tconst explicitCompressor = createCompressor(Client.Client1);\n\t\t\texplicitCompressor.generateCompressedId();\n\t\t\texplicitCompressor.generateCompressedId('override');\n\t\t\tconst explicitRange = explicitCompressor.takeNextCreationRange();\n\t\t\texplicitCompressor.finalizeCreationRange(explicitRange);\n\t\t\tassert.throws(\n\t\t\t\t() => explicitCompressor.finalizeCreationRange(explicitRange),\n\t\t\t\t(e: Error) => validateAssertionError(e, 'Ranges finalized out of order.')\n\t\t\t);\n\t\t});\n\n\t\tit('prevents attempts to finalize ranges out of order', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.takeNextCreationRange();\n\t\t\tcompressor.generateCompressedId();\n\t\t\tconst secondRange = compressor.takeNextCreationRange();\n\t\t\tassert.throws(\n\t\t\t\t() => compressor.finalizeCreationRange(secondRange),\n\t\t\t\t(e: Error) => validateAssertionError(e, 'Ranges finalized out of order.')\n\t\t\t);\n\t\t});\n\n\t\tit('can finalize ranges into clusters of varying sizes', () => {\n\t\t\tfor (let i = 1; i < 5; i++) {\n\t\t\t\tfor (let j = 0; j <= i; j++) {\n\t\t\t\t\tconst compressor = createCompressor(Client.Client1, i);\n\t\t\t\t\tconst ids = new Set<SessionSpaceCompressedId>();\n\t\t\t\t\tfor (let k = 0; k <= j; k++) {\n\t\t\t\t\t\tids.add(compressor.generateCompressedId());\n\t\t\t\t\t}\n\t\t\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\t\t\tconst opIds = new Set<OpSpaceCompressedId>();\n\t\t\t\t\tids.forEach((id) => opIds.add(compressor.normalizeToOpSpace(id)));\n\t\t\t\t\texpect(ids.size).to.equal(opIds.size);\n\t\t\t\t\topIds.forEach((id) => expect(isFinalId(id)).to.be.true);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tit('prevents finalizing unacceptably enormous amounts of ID allocation', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1);\n\t\t\tconst integerLargerThanHalfMax = Math.round((Number.MAX_SAFE_INTEGER / 3) * 2);\n\t\t\tconst midPoint = -integerLargerThanHalfMax as UnackedLocalId;\n\t\t\tconst largeRange1: IdCreationRange = {\n\t\t\t\tsessionId: sessionIds.get(Client.Client2),\n\t\t\t\tids: { first: -1 as UnackedLocalId, last: midPoint },\n\t\t\t};\n\t\t\tcompressor1.finalizeCreationRange(largeRange1);\n\t\t\tconst largeRange2: IdCreationRange = {\n\t\t\t\tsessionId: sessionIds.get(Client.Client2),\n\t\t\t\tids: {\n\t\t\t\t\tfirst: (midPoint - 1) as UnackedLocalId,\n\t\t\t\t\tlast: (-Number.MAX_SAFE_INTEGER - 2) as UnackedLocalId,\n\t\t\t\t},\n\t\t\t};\n\t\t\tassert.throws(\n\t\t\t\t() => compressor1.finalizeCreationRange(largeRange2),\n\t\t\t\t(e: Error) =>\n\t\t\t\t\tvalidateAssertionError(\n\t\t\t\t\t\te,\n\t\t\t\t\t\t'The number of allocated final IDs must not exceed the JS maximum safe integer.'\n\t\t\t\t\t)\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe('Compression', () => {\n\t\tit('can re-compress a sequential uuid it generated', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\texpect(compressor.recompress(uuid)).to.equal(id);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.recompress(uuid)).to.equal(id);\n\t\t});\n\n\t\tit('can re-compress an override', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override = 'override';\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\texpect(compressor.recompress(override)).to.equal(id);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.recompress(override)).to.equal(id);\n\t\t});\n\n\t\tit('can re-compress overrides from a remote client it has finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst override = 'override';\n\t\t\tcompressor.generateCompressedId(override);\n\t\t\tconst uuid = compressor.decompress(id);\n\n\t\t\tconst compressor2 = createCompressor(Client.Client2);\n\t\t\tcompressor2.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId1 = compressor2.recompress(uuid);\n\t\t\tconst finalId2 = compressor2.recompress(override);\n\t\t\tif (finalId1 === undefined || finalId2 === undefined) {\n\t\t\t\texpect.fail();\n\t\t\t}\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\t\t});\n\n\t\tit('will not compress an override it never compressed or finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\t// Leading zeroes to exploit calls to getOrNextLower on uuid maps, as it will be before test session uuids\n\t\t\tconst override = 'override';\n\t\t\texpect(compressor.tryRecompress(override)).to.be.undefined;\n\t\t\texpect(compressor.tryRecompress(stableIdFromNumericUuid(sessionNumericUuids.get(Client.Client1), 1))).to.be\n\t\t\t\t.undefined;\n\t\t\tcompressor.generateCompressedId(override);\n\t\t\tgenerateCompressedIds(compressor, 2);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.tryRecompress(stableIdFromNumericUuid(sessionNumericUuids.get(Client.Client1), 4))).to.be\n\t\t\t\t.undefined;\n\t\t});\n\n\t\tit('can re-compress an eagerly generated final ID that is not finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId = compressor.generateCompressedId();\n\t\t\texpect(isFinalId(finalId)).to.be.true;\n\t\t\tconst stableId = stableIdFromNumericUuid(numericUuidFromStableId(sessionIds.get(Client.Client1)), 1);\n\t\t\texpect(compressor.recompress(stableId)).to.equal(finalId);\n\t\t});\n\t});\n\n\tdescribe('Decompression', () => {\n\t\tit('can decompress a local ID before and after finalizing', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst uuid = compressor.decompress(id);\n\t\t\texpect(isStableId(uuid)).to.be.true;\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\texpect(compressor.decompress(id)).to.equal(uuid);\n\t\t});\n\n\t\tit('can decompress reserved IDs', () => {\n\t\t\t// This is a glass box test in that it increments UUIDs\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\texpect(compressor.decompress(compressor.getReservedId(0))).to.equal(legacySharedTreeInitialTreeId);\n\t\t\tconst reservedSessionUuid = numericUuidFromStableId(\n\t\t\t\tassertIsStableId(compressor.decompress(compressor.getReservedId(1)))\n\t\t\t);\n\t\t\tfor (let i = 1; i < compressor.reservedIdCount; i++) {\n\t\t\t\tconst reservedId = compressor.getReservedId(i);\n\t\t\t\tconst stable = compressor.decompress(reservedId);\n\t\t\t\texpect(stable).to.equal(stableIdFromNumericUuid(incrementUuid(reservedSessionUuid, i - 1)));\n\t\t\t\tconst finalIdForReserved = compressor.recompress(stable);\n\t\t\t\texpect(isLocalId(finalIdForReserved)).to.be.false;\n\t\t\t\texpect(finalIdForReserved).to.equal(reservedId);\n\t\t\t}\n\t\t\tconst outOfBoundsError = 'Reserved Id index out of bounds';\n\t\t\tassert.throws(\n\t\t\t\t() => compressor.getReservedId(-1),\n\t\t\t\t(e: Error) => validateAssertionError(e, outOfBoundsError)\n\t\t\t);\n\t\t\tassert.throws(\n\t\t\t\t() => compressor.getReservedId(compressor.reservedIdCount),\n\t\t\t\t(e: Error) => validateAssertionError(e, outOfBoundsError)\n\t\t\t);\n\t\t});\n\n\t\tit('can decompress a final ID', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId = compressor.normalizeToOpSpace(id);\n\t\t\tif (isLocalId(finalId)) {\n\t\t\t\texpect.fail('Op space ID was finalized but is local');\n\t\t\t}\n\t\t\tconst uuid = compressor.decompress(finalId);\n\t\t\texpect(isStableId(uuid)).to.be.true;\n\t\t});\n\n\t\tit('can decompress a final ID with an override', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst override = 'override';\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(range);\n\t\t\tconst finalId = compressor.normalizeToOpSpace(id);\n\t\t\tif (isLocalId(finalId)) {\n\t\t\t\texpect.fail('Op space ID was finalized but is local');\n\t\t\t}\n\t\t\tconst uuid = compressor.decompress(finalId);\n\t\t\texpect(uuid).to.equal(override);\n\t\t});\n\n\t\tit('can decompress an override that is an UUID', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst uuid = 'd1302ab1-3c08-4e79-a49a-4c39ac369c16';\n\t\t\tconst id = compressor.generateCompressedId(uuid);\n\t\t\texpect(compressor.decompress(id)).to.equal(uuid);\n\t\t});\n\n\t\tit('properly sorts UUID-like overrides separately from true UUIDs', () => {\n\t\t\t// This is a glass box test that ensures overrides which would sort in between a cluster base UUID and an UUID higher up in the\n\t\t\t// same cluster are not accidentally retrieved during cluster ID lookup.\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst override = `${compressor.localSessionId}6`;\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.generateCompressedId(override);\n\t\t\tconst decompressedId = compressor.decompress(id);\n\t\t\texpect(compressor.recompress(decompressedId)).to.equal(id);\n\t\t});\n\n\t\tit('can decompress an override that starts with the reserved prefix character', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst override = `\\ue15e${compressor.localSessionId}`;\n\t\t\tconst id = compressor.generateCompressedId(override);\n\t\t\texpect(compressor.decompress(id)).to.equal(override);\n\t\t});\n\n\t\tit('can decompress an eagerly generated final ID that is not finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId = compressor.generateCompressedId();\n\t\t\texpect(isFinalId(finalId)).to.be.true;\n\t\t\texpect(compressor.decompress(finalId)).to.equal(\n\t\t\t\tstableIdFromNumericUuid(numericUuidFromStableId(sessionIds.get(Client.Client1)), 1)\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe('Normalization', () => {\n\t\tit('can normalize a local ID to op space before finalizing', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst normalized = compressor.normalizeToOpSpace(id);\n\t\t\texpect(isLocalId(id)).to.be.true;\n\t\t\texpect(id).to.equal(normalized);\n\t\t});\n\n\t\tit('can normalize a local ID to op space after finalizing', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst normalized = compressor.normalizeToOpSpace(id);\n\t\t\texpect(isFinalId(normalized)).to.be.true;\n\t\t\texpect(id).to.not.equal(normalized);\n\t\t});\n\n\t\tit('can normalize an eagerly generated final ID', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst eagerFinalId = compressor.generateCompressedId();\n\t\t\texpect(isFinalId(eagerFinalId)).to.be.true;\n\t\t\tconst opNormalized = compressor.normalizeToOpSpace(eagerFinalId);\n\t\t\texpect(eagerFinalId).to.equal(opNormalized);\n\t\t\tconst sessionNormalized = compressor.normalizeToSessionSpace(opNormalized, compressor.localSessionId);\n\t\t\texpect(sessionNormalized).to.equal(opNormalized);\n\t\t});\n\n\t\tit('cannot normalize a remote ID to session space if it has not been finalized', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1);\n\t\t\tconst compressor2 = createCompressor(Client.Client2);\n\t\t\tconst normalized = compressor1.normalizeToOpSpace(compressor1.generateCompressedId());\n\t\t\tassert.throws(\n\t\t\t\t() => compressor2.normalizeToSessionSpace(normalized, compressor1.localSessionId),\n\t\t\t\t(e: Error) => validateAssertionError(e, 'No IDs have ever been finalized by the supplied session.')\n\t\t\t);\n\t\t});\n\n\t\tit('can normalize local and final IDs from a remote session to session space', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1);\n\t\t\tconst compressor2 = createCompressor(Client.Client2);\n\t\t\tconst id = compressor1.generateCompressedId();\n\t\t\tconst normalizedLocal = compressor1.normalizeToOpSpace(id);\n\t\t\tconst range = compressor1.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(range);\n\t\t\tconst normalizedFinal = compressor1.normalizeToOpSpace(id);\n\t\t\tcompressor2.finalizeCreationRange(range);\n\t\t\texpect(isLocalId(normalizedLocal)).to.be.true;\n\t\t\texpect(isFinalId(normalizedFinal)).to.be.true;\n\t\t\texpect(compressor2.normalizeToSessionSpace(normalizedFinal, compressor1.localSessionId)).to.equal(\n\t\t\t\tnormalizedFinal\n\t\t\t);\n\t\t\texpect(compressor2.normalizeToSessionSpace(normalizedLocal, compressor1.localSessionId)).to.equal(\n\t\t\t\tnormalizedFinal\n\t\t\t);\n\t\t});\n\n\t\tit(\"can normalize a final ID created by the local session but sent in another client's op space\", () => {\n\t\t\t// Regression test for the situation in which a client creates a final ID and another client references\n\t\t\t// that final ID in a message back to the creating client. The creating client will normalize it and\n\t\t\t// pass the session ID of the remote (non-creating) client. This should be handled correctly.\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst compressor2 = createCompressor(Client.Client2, 5);\n\t\t\tconst id = compressor.generateCompressedId();\n\t\t\tconst creationRange = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(creationRange);\n\t\t\tcompressor2.finalizeCreationRange(creationRange);\n\t\t\tconst idInClient2OpSpace = compressor2.normalizeToOpSpace(\n\t\t\t\tcompressor2.normalizeToSessionSpace(compressor.normalizeToOpSpace(id), compressor.localSessionId)\n\t\t\t);\n\t\t\tconst normalizedToClient1SessionSpace = compressor.normalizeToSessionSpace(\n\t\t\t\tidInClient2OpSpace,\n\t\t\t\tcompressor2.localSessionId\n\t\t\t);\n\t\t\texpect(normalizedToClient1SessionSpace).to.equal(id);\n\t\t});\n\t});\n\n\tdescribe('Telemetry', () => {\n\t\tit('emits first cluster and new cluster telemetry events', () => {\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = createCompressor(Client.Client1, 5, undefined, mockLogger);\n\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(localId1)).to.be.true;\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\tmockLogger.assertMatch([\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:FirstCluster',\n\t\t\t\t\tsessionId: '88888888-8888-4888-b088-888888888888',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:NewCluster',\n\t\t\t\t\tsessionId: '88888888-8888-4888-b088-888888888888',\n\t\t\t\t\tclusterCapacity: 5,\n\t\t\t\t\tclusterCount: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:IdCompressorStatus',\n\t\t\t\t\tsessionId: '88888888-8888-4888-b088-888888888888',\n\t\t\t\t\teagerFinalIdCount: 0,\n\t\t\t\t\toverridesCount: 0,\n\t\t\t\t\tlocalIdCount: 1,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit('emits new cluster event on second cluster', () => {\n\t\t\t// Fill the first cluster\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = createCompressor(Client.Client1, 5, undefined, mockLogger);\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tcompressor.generateCompressedId();\n\t\t\t}\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(range);\n\n\t\t\t// Create another cluster with a different client so that expansion doesn't happen\n\t\t\tconst mockLogger2 = new MockLogger();\n\t\t\tconst compressor2 = createCompressor(Client.Client2, 5, undefined, mockLogger2);\n\t\t\tcompressor2.finalizeCreationRange(range);\n\t\t\tcompressor2.generateCompressedId();\n\t\t\tconst range2 = compressor2.takeNextCreationRange();\n\t\t\tcompressor2.finalizeCreationRange(range2);\n\t\t\tcompressor.finalizeCreationRange(range2);\n\t\t\t// Make sure we emitted the FirstCluster event\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:FirstCluster',\n\t\t\t\t},\n\t\t\t]);\n\t\t\tmockLogger.clear();\n\n\t\t\t// Trigger a new cluster creation and make sure FirstCluster isn't emitted\n\t\t\tcompressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:NewCluster',\n\t\t\t\t},\n\t\t\t]);\n\t\t\tmockLogger.assertMatchNone([\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:FirstCluster',\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit('correctly logs telemetry events for eager final id allocations', () => {\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = createCompressor(Client.Client1, 5, undefined, mockLogger);\n\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(localId1)).to.be.true;\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:IdCompressorStatus',\n\t\t\t\t\teagerFinalIdCount: 0,\n\t\t\t\t\tlocalIdCount: 1,\n\t\t\t\t\toverridesCount: 0,\n\t\t\t\t\tsessionId: '88888888-8888-4888-b088-888888888888',\n\t\t\t\t},\n\t\t\t]);\n\t\t\tmockLogger.clear();\n\t\t\tconst finalId1 = compressor.generateCompressedId();\n\t\t\tconst finalId2 = compressor.generateCompressedId();\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:IdCompressorStatus',\n\t\t\t\t\teagerFinalIdCount: 2,\n\t\t\t\t\tlocalIdCount: 0,\n\t\t\t\t\toverridesCount: 0,\n\t\t\t\t\tsessionId: '88888888-8888-4888-b088-888888888888',\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit('correctly logs telemetry events for expansion case', () => {\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = createCompressor(Client.Client1, 5, undefined, mockLogger);\n\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(localId1)).to.be.true;\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:IdCompressorStatus',\n\t\t\t\t\teagerFinalIdCount: 0,\n\t\t\t\t\tlocalIdCount: 1,\n\t\t\t\t\toverridesCount: 0,\n\t\t\t\t\tsessionId: '88888888-8888-4888-b088-888888888888',\n\t\t\t\t},\n\t\t\t]);\n\t\t\tmockLogger.clear();\n\n\t\t\tfor (let i = 0; i < 4; i++) {\n\t\t\t\tconst id = compressor.generateCompressedId();\n\t\t\t\texpect(isFinalId(id)).to.be.true;\n\t\t\t}\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:IdCompressorStatus',\n\t\t\t\t\teagerFinalIdCount: 4,\n\t\t\t\t\tlocalIdCount: 0,\n\t\t\t\t\toverridesCount: 0,\n\t\t\t\t\tsessionId: '88888888-8888-4888-b088-888888888888',\n\t\t\t\t},\n\t\t\t]);\n\t\t\tmockLogger.clear();\n\n\t\t\tconst expansionId1 = compressor.generateCompressedId();\n\t\t\tconst expansionId2 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(expansionId1)).to.be.true;\n\t\t\texpect(isLocalId(expansionId2)).to.be.true;\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatch([\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:ClusterExpansion',\n\t\t\t\t\tsessionId: '88888888-8888-4888-b088-888888888888',\n\t\t\t\t\tpreviousCapacity: 5,\n\t\t\t\t\tnewCapacity: 12,\n\t\t\t\t\toverflow: 2,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:IdCompressorStatus',\n\t\t\t\t\teagerFinalIdCount: 2,\n\t\t\t\t\tlocalIdCount: 0,\n\t\t\t\t\toverridesCount: 0,\n\t\t\t\t\tsessionId: '88888888-8888-4888-b088-888888888888',\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit('emits correct telemetry status with overrides', () => {\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = createCompressor(Client.Client1, 5, undefined, mockLogger);\n\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(localId1)).to.be.true;\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:IdCompressorStatus',\n\t\t\t\t\teagerFinalIdCount: 0,\n\t\t\t\t\tlocalIdCount: 1,\n\t\t\t\t\toverridesCount: 0,\n\t\t\t\t\tsessionId: '88888888-8888-4888-b088-888888888888',\n\t\t\t\t},\n\t\t\t]);\n\t\t\tmockLogger.clear();\n\n\t\t\tconst finalId2 = compressor.generateCompressedId();\n\t\t\tconst overrideId3 = compressor.generateCompressedId('override');\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\t\t\texpect(isLocalId(overrideId3)).to.be.true;\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:IdCompressorStatus',\n\t\t\t\t\teagerFinalIdCount: 1,\n\t\t\t\t\tlocalIdCount: 1,\n\t\t\t\t\toverridesCount: 1,\n\t\t\t\t\tsessionId: '88888888-8888-4888-b088-888888888888',\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit('emits telemetry when serialized', () => {\n\t\t\tconst mockLogger = new MockLogger();\n\t\t\tconst compressor = createCompressor(Client.Client1, 5, undefined, mockLogger);\n\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(localId1)).to.be.true;\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tcompressor.serialize(false);\n\n\t\t\tmockLogger.assertMatchAny([\n\t\t\t\t{\n\t\t\t\t\teventName: 'SharedTreeIdCompressor:SerializedIdCompressorSize',\n\t\t\t\t\tsize: 137,\n\t\t\t\t\tclusterCount: 1,\n\t\t\t\t\tsessionCount: 1,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\t});\n\n\tdescribe('Eager final ID allocation', () => {\n\t\tit('eagerly allocates final IDs when cluster creation has been finalized', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(localId1)).to.be.true;\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(localId2)).to.be.true;\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\t\t\tconst finalId3 = compressor.generateCompressedId();\n\t\t\texpect(isFinalId(finalId3)).to.be.true;\n\t\t\tconst finalId4 = compressor.generateCompressedId();\n\t\t\texpect(isFinalId(finalId4)).to.be.true;\n\t\t\tconst finalId5 = compressor.generateCompressedId();\n\t\t\texpect(isFinalId(finalId5)).to.be.true;\n\t\t\tconst localId6 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(localId6)).to.be.true;\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\tconst opSpaceId1 = compressor.normalizeToOpSpace(localId1);\n\t\t\tconst opSpaceId2 = compressor.normalizeToOpSpace(localId2);\n\t\t\tconst opSpaceId3 = compressor.normalizeToOpSpace(finalId3);\n\t\t\tconst opSpaceId4 = compressor.normalizeToOpSpace(finalId4);\n\t\t\tconst opSpaceId5 = compressor.normalizeToOpSpace(finalId5);\n\t\t\tconst opSpaceId6 = compressor.normalizeToOpSpace(localId6);\n\n\t\t\texpectAssert(isFinalId(opSpaceId1));\n\t\t\texpectAssert(isFinalId(opSpaceId2));\n\t\t\texpectAssert(isFinalId(opSpaceId3) && opSpaceId3 === finalId3);\n\t\t\texpectAssert(isFinalId(opSpaceId4) && opSpaceId4 === finalId4);\n\t\t\texpectAssert(isFinalId(opSpaceId5) && opSpaceId5 === finalId5);\n\t\t\texpectAssert(isFinalId(opSpaceId6));\n\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId1)).to.equal(localId1);\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId2)).to.equal(localId2);\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId3)).to.equal(finalId3);\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId4)).to.equal(finalId4);\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId5)).to.equal(finalId5);\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId6)).to.equal(localId6);\n\t\t});\n\n\t\tit('does not eagerly allocate final IDs for IDs with overrides', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\tconst override1 = compressor.generateCompressedId('override1');\n\t\t\texpect(isLocalId(override1)).to.be.true;\n\t\t\tconst finalId1 = compressor.generateCompressedId();\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\n\t\t\tgenerateCompressedIds(compressor, 5);\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\tconst override2 = compressor.generateCompressedId('override2');\n\t\t\texpect(isLocalId(override2)).to.be.true;\n\t\t\tconst finalId2 = compressor.generateCompressedId();\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\n\t\t\tcompressor.finalizeCreationRange(compressor.takeNextCreationRange());\n\n\t\t\tconst opSpaceId1 = compressor.normalizeToOpSpace(localId1);\n\t\t\tconst opSpaceId2 = compressor.normalizeToOpSpace(override1);\n\t\t\tconst opSpaceId3 = compressor.normalizeToOpSpace(finalId1);\n\t\t\tconst opSpaceId4 = compressor.normalizeToOpSpace(override2);\n\t\t\tconst opSpaceId5 = compressor.normalizeToOpSpace(finalId2);\n\n\t\t\texpectAssert(isFinalId(opSpaceId1));\n\t\t\texpectAssert(isFinalId(opSpaceId2));\n\t\t\texpectAssert(isFinalId(opSpaceId3) && opSpaceId3 === finalId1);\n\t\t\texpectAssert(isFinalId(opSpaceId4));\n\t\t\texpectAssert(isFinalId(opSpaceId5) && opSpaceId5 === finalId2);\n\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId1)).to.equal(localId1);\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId2)).to.equal(override1);\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId3)).to.equal(finalId1);\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId4)).to.equal(override2);\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId5)).to.equal(finalId2);\n\t\t});\n\n\t\tit('correctly normalizes eagerly allocated final IDs', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 5);\n\t\t\tconst localId1 = compressor.generateCompressedId();\n\t\t\tconst range1 = compressor.takeNextCreationRange();\n\t\t\tconst localId2 = compressor.generateCompressedId();\n\t\t\tconst range2 = compressor.takeNextCreationRange();\n\t\t\texpect(isLocalId(localId1)).to.be.true;\n\t\t\texpect(isLocalId(localId2)).to.be.true;\n\n\t\t\tcompressor.finalizeCreationRange(range1);\n\t\t\tcompressor.finalizeCreationRange(range2);\n\n\t\t\tconst opSpaceId1 = compressor.normalizeToOpSpace(localId1);\n\t\t\tconst opSpaceId2 = compressor.normalizeToOpSpace(localId2);\n\n\t\t\texpectAssert(isFinalId(opSpaceId1));\n\t\t\texpectAssert(isFinalId(opSpaceId2));\n\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId1)).to.equal(localId1);\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceId2)).to.equal(localId2);\n\t\t});\n\n\t\tit('generates correct eager finals when there are outstanding locals after cluster expansion', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 2);\n\n\t\t\t// Before cluster expansion\n\t\t\texpect(isLocalId(compressor.generateCompressedId())).to.be.true;\n\t\t\tconst rangeA = compressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(rangeA);\n\t\t\texpect(isFinalId(compressor.generateCompressedId())).to.be.true;\n\n\t\t\t// After cluster expansion\n\t\t\texpect(isLocalId(compressor.generateCompressedId())).to.be.true;\n\t\t\tconst rangeB = compressor.takeNextCreationRange();\n\t\t\tconst localId = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(localId)).to.be.true;\n\n\t\t\t// Take a range that won't be finalized in this test; the finalizing of range B should associate this range with finals\n\t\t\tconst rangeC = compressor.takeNextCreationRange();\n\n\t\t\tcompressor.finalizeCreationRange(rangeB);\n\t\t\tconst eagerId = compressor.generateCompressedId();\n\t\t\texpect(isFinalId(eagerId)).to.be.true;\n\n\t\t\texpect(compressor.recompress(compressor.decompress(localId))).to.equal(localId);\n\t\t\texpect(compressor.recompress(compressor.decompress(eagerId))).to.equal(eagerId);\n\n\t\t\tcompressor.finalizeCreationRange(rangeC);\n\n\t\t\texpect(compressor.recompress(compressor.decompress(localId))).to.equal(localId);\n\t\t\texpect(compressor.recompress(compressor.decompress(eagerId))).to.equal(eagerId);\n\t\t});\n\n\t\tit('generates unique eager finals when multiple outstanding creation ranges during finalizing', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1, 10 /* must be 10 for the test to make sense */);\n\n\t\t\t// Make a first outstanding range\n\t\t\tconst id1_1 = compressor.generateCompressedId();\n\t\t\tconst id1_2 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(id1_1)).to.be.true;\n\t\t\texpect(isLocalId(id1_2)).to.be.true;\n\t\t\tconst range1 = compressor.takeNextCreationRange();\n\n\t\t\t// Make a second outstanding range\n\t\t\tconst id2_1 = compressor.generateCompressedId();\n\t\t\tconst id2_2 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(id2_1)).to.be.true;\n\t\t\texpect(isLocalId(id2_2)).to.be.true;\n\t\t\tconst range2 = compressor.takeNextCreationRange();\n\n\t\t\t// Finalize just the first one, which should create finals that align with both outstanding ranges\n\t\t\tcompressor.finalizeCreationRange(range1);\n\n\t\t\t// Make a third range. This one should be composed of eager finals that align after the two ranges above.\n\t\t\tconst id3_1 = compressor.generateCompressedId();\n\t\t\tconst id3_2 = compressor.generateCompressedId();\n\t\t\texpect(isFinalId(id3_1)).to.be.true;\n\t\t\texpect(isFinalId(id3_2)).to.be.true;\n\t\t\tconst range3 = compressor.takeNextCreationRange();\n\n\t\t\t// Finalize both initial ranges.\n\t\t\tcompressor.finalizeCreationRange(range2);\n\t\t\tcompressor.finalizeCreationRange(range3);\n\n\t\t\t// Make some more eager finals that should be aligned correctly.\n\t\t\tconst id4_1 = compressor.generateCompressedId();\n\t\t\tconst id4_2 = compressor.generateCompressedId();\n\t\t\texpect(isFinalId(id4_1)).to.be.true;\n\t\t\texpect(isFinalId(id4_2)).to.be.true;\n\n\t\t\t// Assert everything is unique and consistent.\n\t\t\tconst ids = new Set<SessionSpaceCompressedId>();\n\t\t\tconst uuids = new Set<StableId | string>();\n\t\t\t[id1_1, id1_2, id2_1, id2_2, id3_1, id3_2, id4_1, id4_2].forEach((id) => {\n\t\t\t\tids.add(id);\n\t\t\t\tuuids.add(compressor.decompress(id));\n\t\t\t});\n\t\t\texpect(ids.size).to.equal(8);\n\t\t\texpect(uuids.size).to.equal(8);\n\t\t});\n\n\t\tit('generates unique eager finals when there are still outstanding locals after a cluster is expanded', () => {\n\t\t\t// const compressor = createCompressor(Client.Client1, 4 /* must be 4 for the test to make sense */);\n\n\t\t\tconst compressor = new IdCompressor(sessionIds.get(Client.Client1), 0);\n\t\t\tcompressor.clusterCapacity = 4;\n\n\t\t\t// Make locals to fill half the future cluster\n\t\t\tconst id1_1 = compressor.generateCompressedId();\n\t\t\tconst id1_2 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(id1_1)).to.be.true;\n\t\t\texpect(isLocalId(id1_2)).to.be.true;\n\t\t\tconst range1 = compressor.takeNextCreationRange();\n\n\t\t\t// Make locals to overflow the future cluster\n\t\t\tconst id2_1 = compressor.generateCompressedId();\n\t\t\tconst id2_2 = compressor.generateCompressedId();\n\t\t\tconst id2_3 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(id2_1)).to.be.true;\n\t\t\texpect(isLocalId(id2_2)).to.be.true;\n\t\t\texpect(isLocalId(id2_3)).to.be.true;\n\t\t\tconst range2 = compressor.takeNextCreationRange();\n\n\t\t\t// Finalize the first range. This should align the first four locals (i.e. all of range1, and 2/3 of range2)\n\t\t\tcompressor.finalizeCreationRange(range1);\n\n\t\t\t// Make a single range that should still be overflowing the initial cluster (i.e. be local)\n\t\t\tconst id3_1 = compressor.generateCompressedId();\n\t\t\texpect(isLocalId(id3_1)).to.be.true;\n\t\t\tconst range3 = compressor.takeNextCreationRange();\n\n\t\t\t// First finalize should expand the cluster and align all outstanding ranges.\n\t\t\tcompressor.finalizeCreationRange(range2);\n\n\t\t\t// All generated IDs should have aligned finals (even though range3 has not been finalized)\n\t\t\tconst allIds = [id1_1, id1_2, id2_1, id2_2, id2_3, id3_1];\n\t\t\tallIds.forEach((id) => expect(isFinalId(compressor.normalizeToOpSpace(id))).to.be.true);\n\n\t\t\tcompressor.finalizeCreationRange(range3);\n\n\t\t\t// Make one eager final\n\t\t\tconst id4_1 = compressor.generateCompressedId();\n\t\t\tallIds.push(id4_1);\n\t\t\texpect(isFinalId(id4_1)).to.be.true;\n\n\t\t\t// Assert everything is unique and consistent.\n\t\t\tconst ids = new Set<SessionSpaceCompressedId>();\n\t\t\tconst uuids = new Set<StableId | string>();\n\t\t\tallIds.forEach((id) => {\n\t\t\t\tids.add(id);\n\t\t\t\tuuids.add(compressor.decompress(id));\n\t\t\t});\n\t\t\texpect(ids.size).to.equal(7);\n\t\t\texpect(uuids.size).to.equal(7);\n\t\t});\n\t});\n\n\tdescribe('Serialization', () => {\n\t\tit('can serialize an empty compressor', () => {\n\t\t\tconst compressor = createCompressor(Client.Client1);\n\t\t\tconst [serializedNoSession, serializedWithSession] = expectSerializes(compressor);\n\t\t\texpect(serializedWithSession.clusters.length).to.equal(0, 'reserved cluster should not be serialized');\n\t\t\texpect(serializedNoSession.clusters.length).to.equal(0, 'reserved cluster should not be serialized');\n\t\t});\n\n\t\tit('correctly deserializes and resumes a session', () => {\n\t\t\tconst compressor1 = createCompressor(Client.Client1, undefined, attributionIds.get(Client.Client1));\n\t\t\tconst compressor2 = createCompressor(Client.Client2, undefined, attributionIds.get(Client.Client2));\n\t\t\tcompressor1.generateCompressedId();\n\t\t\tconst creationRange = compressor1.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(creationRange);\n\t\t\tcompressor2.finalizeCreationRange(creationRange);\n\t\t\tconst [_, serializedWithSession] = expectSerializes(compressor1);\n\t\t\tconst compressorResumed = IdCompressor.deserialize(serializedWithSession);\n\t\t\tcompressorResumed.generateCompressedId();\n\t\t\tconst range2 = compressorResumed.takeNextCreationRange();\n\t\t\tcompressor1.finalizeCreationRange(range2);\n\t\t\tcompressor2.finalizeCreationRange(range2);\n\t\t\texpect(\n\t\t\t\tIdCompressor.deserialize(compressor1.serialize(false), createSessionId()).equals(\n\t\t\t\t\tIdCompressor.deserialize(compressor2.serialize(false), createSessionId()),\n\t\t\t\t\tfalse // don't compare local state\n\t\t\t\t)\n\t\t\t).to.be.true;\n\t\t});\n\n\t\tit('can serialize local state with attribution but no IDs', () => {\n\t\t\t// This is a regression test for the scenario in which an ID compressor sends its first range, which\n\t\t\t// includes its attribution ID, but has made no IDs. An incorrect optimization when serializing had\n\t\t\t// omitted local state if no IDs had been allocated, but then also dropped the `sentAttribution` flag\n\t\t\tconst compressor = createCompressor(Client.Client1, undefined, attributionIds.get(Client.Client1));\n\t\t\tconst range = compressor.takeNextCreationRange();\n\t\t\texpect(range.ids).to.be.undefined;\n\t\t\texpect(range.attributionId).to.equal(attributionIds.get(Client.Client1));\n\t\t\texpectSerializes(compressor);\n\t\t});\n\t});\n\n\t// No validation, as these leave the network in a broken state\n\tdescribeNetworkNoValidation('detects UUID collision', (itNetwork) => {\n\t\titNetwork(\n\t\t\t'when a client requests an override that is an UUID reserved for later allocation by a cluster',\n\t\t\t2,\n\t\t\t(network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\t\tconst id = network.getIdLog(Client.Client2)[0].id;\n\t\t\t\tconst uuid = assertIsStableId(compressor2.decompress(id));\n\t\t\t\tconst nextUuid = stableIdFromNumericUuid(numericUuidFromStableId(uuid), 1);\n\t\t\t\t// TODO:#283: Re-assess test when full unification is implemented\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: nextUuid });\n\t\t\t}\n\t\t);\n\n\t\titNetwork(\n\t\t\t'when a new cluster is allocated whose base UUID collides with an existing override',\n\t\t\t2,\n\t\t\t(network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\t\tconst id = network.getIdLog(Client.Client1)[0].id;\n\t\t\t\tconst uuid = assertIsStableId(compressor1.decompress(id));\n\t\t\t\tconst nextUuid = stableIdFromNumericUuid(numericUuidFromStableId(uuid), 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: nextUuid });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1); // new cluster\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => network.deliverOperations(Client.Client1),\n\t\t\t\t\t(e: Error) =>\n\t\t\t\t\t\tvalidateAssertionError(e, `Override '${nextUuid}' collides with another allocated UUID.`)\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\n\t\titNetwork('detects colliding override UUIDs when expanding a cluster', 1, (network) => {\n\t\t\t// This is a glass box test in that it is testing cluster expansion\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\tconst id = network.getIdLog(Client.Client1)[0].id;\n\t\t\tconst uuid = assertIsStableId(compressor1.decompress(id));\n\t\t\tconst expansion = 3;\n\t\t\tconst nextUuid = stableIdFromNumericUuid(numericUuidFromStableId(uuid), expansion);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, expansion, { 0: nextUuid });\n\t\t\tassert.throws(\n\t\t\t\t() => network.deliverOperations(DestinationClient.All),\n\t\t\t\t(e: Error) => validateAssertionError(e, `Override '${nextUuid}' collides with another allocated UUID.`)\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribeNetwork('Networked', (itNetwork) => {\n\t\tdescribe('can attribute', () => {\n\t\t\titNetwork('local IDs before and after being finalized', (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tconst id = network.getIdLog(Client.Client1)[0].id;\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t});\n\n\t\t\titNetwork('final IDs from a remote session', (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst id = network.getSequencedIdLog(Client.Client1)[0].id;\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client2));\n\t\t\t});\n\n\t\t\titNetwork('final IDs from multiple remote sessions', 1, (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\t// Ensure multiple clusters are made by each client. Cluster size === 1.\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, compressor.clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, compressor.clusterCapacity);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst log = network.getSequencedIdLog(Client.Client1);\n\t\t\t\texpect(compressor.attributeId(log[0].id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t\texpect(compressor.attributeId(log[1].id)).to.equal(attributionIds.get(Client.Client2));\n\t\t\t\texpect(compressor.attributeId(log[2].id)).to.equal(attributionIds.get(Client.Client3));\n\t\t\t\texpect(compressor.attributeId(log[3].id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t\texpect(compressor.attributeId(log[4].id)).to.equal(attributionIds.get(Client.Client2));\n\t\t\t\texpect(compressor.attributeId(log[5].id)).to.equal(attributionIds.get(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('unified IDs', (network) => {\n\t\t\t\tconst override = 'override';\n\t\t\t\tconst allTargets = network.getTargetCompressors(DestinationClient.All);\n\t\t\t\tfor (const [client, compressor] of allTargets) {\n\t\t\t\t\tnetwork.allocateAndSendIds(client, 1, { 0: override });\n\t\t\t\t\tfor (const { id } of network.getIdLog(client)) {\n\t\t\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(client));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst firstTarget = allTargets[0][0];\n\t\t\t\tfor (const [client, compressor] of allTargets) {\n\t\t\t\t\tfor (const { id } of network.getIdLog(client)) {\n\t\t\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(firstTarget));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\titNetwork('eagerly generated final IDs that are not finalized', (network) => {\n\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tconst ids = network.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tconst id = compressor.normalizeToSessionSpace(ids[0], compressor.localSessionId);\n\t\t\t\texpect(compressor.attributeId(id)).to.equal(attributionIds.get(Client.Client1));\n\t\t\t});\n\t\t});\n\n\t\titNetwork('upholds the invariant that IDs always decompress to the same UUID', 2, (network) => {\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5, {\n\t\t\t\t1: 'override1',\n\t\t\t});\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5, {\n\t\t\t\t2: 'override2',\n\t\t\t});\n\t\t\tnetwork.allocateAndSendIds(Client.Client3, 5, {\n\t\t\t\t3: 'override3',\n\t\t\t});\n\n\t\t\tconst preAckLocals = new Map<Client, [SessionSpaceCompressedId, string][]>();\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tconst locals: [SessionSpaceCompressedId, string][] = [];\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\tlocals.push([idData.id, compressor.decompress(idData.id)]);\n\t\t\t\t}\n\t\t\t\tpreAckLocals.set(client, locals);\n\t\t\t}\n\n\t\t\t// Ack all IDs\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tconst preAckLocalIds = preAckLocals.get(client) ?? fail();\n\t\t\t\tlet i = 0;\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\tif (idData.originatingClient === client) {\n\t\t\t\t\t\texpect(isFinalId(idData.id)).to.be.false;\n\t\t\t\t\t\tconst currentUuid = compressor.decompress(idData.id);\n\t\t\t\t\t\texpect(currentUuid).to.equal(preAckLocalIds[i % preAckLocalIds.length][1]);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titNetwork('can normalize session space IDs to op space', 5, (network) => {\n\t\t\tconst clusterCapacity = 5;\n\t\t\tconst idCount = clusterCapacity * 2;\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 1);\n\t\t\t}\n\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\texpect(idData.originatingClient).to.equal(client);\n\t\t\t\t\texpect(isLocalId(compressor.normalizeToOpSpace(idData.id))).to.be.true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tfor (const [client, compressor] of network.getTargetCompressors(MetaClient.All)) {\n\t\t\t\tfor (const idData of network.getIdLog(client)) {\n\t\t\t\t\texpect(isFinalId(compressor.normalizeToOpSpace(idData.id))).to.be.true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\titNetwork('can normalize local op space IDs from a local session to session space IDs', (network) => {\n\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\tconst sessionSpaceIds = network.getIdLog(Client.Client1);\n\t\t\tconst opSpaceId = compressor.normalizeToOpSpace(sessionSpaceIds[0].id);\n\t\t\tconst sessionSpaceId = compressor.normalizeToSessionSpace(opSpaceId, compressor.localSessionId);\n\t\t\texpect(isFinalId(opSpaceId)).to.be.true;\n\t\t\texpect(isLocalId(sessionSpaceId)).to.be.true;\n\t\t});\n\n\t\titNetwork('can normalize local op space IDs from a remote session to session space IDs', (network) => {\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tconst opSpaceIds = network.allocateAndSendIds(Client.Client1, 1);\n\t\t\t// Mimic sending a reference to an ID that hasn't been acked yet, such as in a slow network\n\t\t\tconst id = opSpaceIds[0];\n\t\t\tconst getSessionNormalizedId = () => compressor2.normalizeToSessionSpace(id, compressor1.localSessionId);\n\t\t\tassert.throws(getSessionNormalizedId, (e: Error) =>\n\t\t\t\tvalidateAssertionError(e, 'No IDs have ever been finalized by the supplied session.')\n\t\t\t);\n\t\t\tnetwork.deliverOperations(Client.Client2);\n\t\t\texpect(isFinalId(getSessionNormalizedId())).to.be.true;\n\t\t});\n\n\t\titNetwork('unifies duplicate overrides', 3, (network) => {\n\t\t\tconst override = 'override';\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tconst compressor3 = network.getCompressor(Client.Client3);\n\t\t\tconst clusterCapacity = compressor1.clusterCapacity;\n\n\t\t\t// Ensure some clusters exist to avoid simple case of empty clusters\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity);\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterCapacity);\n\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterCapacity);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tconst range1 = network.allocateAndSendIds(Client.Client1, 1, { 0: override });\n\t\t\tconst overrides1 = expectDefined(getIds(range1)?.overrides);\n\t\t\tconst id1 = compressor1.normalizeToSessionSpace(overrides1[0][0], compressor1.localSessionId);\n\t\t\tconst opNormalizedLocal1 = compressor1.normalizeToOpSpace(id1);\n\t\t\texpect(isLocalId(opNormalizedLocal1)).to.be.true;\n\t\t\texpect(isFinalId(id1)).to.be.false;\n\n\t\t\tnetwork.deliverOperations(DestinationClient.Client1);\n\n\t\t\tconst finalId1 = compressor1.normalizeToOpSpace(id1);\n\t\t\texpect(isFinalId(finalId1)).to.be.true;\n\n\t\t\tconst range2 = network.allocateAndSendIds(Client.Client2, 2, { 1: override });\n\t\t\tconst overrides2 = expectDefined(getIds(range2)?.overrides);\n\t\t\tconst id2 = compressor2.normalizeToSessionSpace(overrides2[0][0], compressor2.localSessionId);\n\t\t\tconst opNormalizedLocal2 = compressor2.normalizeToOpSpace(id2);\n\t\t\texpect(isLocalId(opNormalizedLocal2)).to.be.true;\n\t\t\texpect(isFinalId(id2)).to.be.false;\n\n\t\t\tnetwork.allocateAndSendIds(Client.Client3, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\n\t\t\tconst finalId2 = compressor2.normalizeToOpSpace(id2);\n\t\t\texpect(isFinalId(finalId2)).to.be.true;\n\n\t\t\texpect(finalId1).to.equal(finalId2);\n\n\t\t\texpect(compressor1.normalizeToOpSpace(id1)).to.equal(finalId1);\n\t\t\texpect(compressor1.normalizeToSessionSpace(finalId1, compressor1.localSessionId)).to.equal(id1);\n\t\t\texpect(compressor1.normalizeToSessionSpace(opNormalizedLocal2, compressor2.localSessionId)).to.equal(id1);\n\t\t\texpect(compressor1.decompress(id1)).to.equal(override);\n\t\t\texpect(compressor1.decompress(finalId1)).to.equal(override);\n\t\t\texpect(compressor1.recompress(override)).to.equal(id1);\n\n\t\t\texpect(compressor2.normalizeToOpSpace(id2)).to.equal(finalId2);\n\t\t\texpect(compressor2.normalizeToSessionSpace(finalId1, compressor1.localSessionId)).to.equal(id2);\n\t\t\texpect(compressor2.normalizeToSessionSpace(opNormalizedLocal1, compressor1.localSessionId)).to.equal(id2);\n\t\t\texpect(compressor2.decompress(id2)).to.equal(override);\n\t\t\texpect(compressor2.decompress(finalId2)).to.equal(override);\n\t\t\texpect(compressor2.tryRecompress(override)).to.equal(id2);\n\n\t\t\texpect(compressor3.normalizeToSessionSpace(finalId1, compressor1.localSessionId)).to.equal(finalId1);\n\t\t\texpect(compressor3.normalizeToSessionSpace(opNormalizedLocal1, compressor1.localSessionId)).to.equal(\n\t\t\t\tfinalId1\n\t\t\t);\n\t\t\texpect(compressor3.normalizeToSessionSpace(opNormalizedLocal2, compressor2.localSessionId)).to.equal(\n\t\t\t\tfinalId1\n\t\t\t);\n\t\t\texpect(compressor3.decompress(finalId1)).to.equal(override);\n\t\t\texpect(compressor3.recompress(override)).to.equal(finalId1);\n\t\t});\n\n\t\titNetwork('maintains alignment after unifying duplicate overrides', 3, (network) => {\n\t\t\tconst override = 'override';\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: override });\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2, { 1: override });\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5);\n\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2, 1);\n\t\t});\n\n\t\tfunction expectSequencedLogsAlign(\n\t\t\tnetwork: IdCompressorTestNetwork,\n\t\t\tclient1: Client,\n\t\t\tclient2: Client,\n\t\t\tnumUnifications = 0\n\t\t): void {\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\tassert(client1 !== client2);\n\t\t\tconst log1 = network.getSequencedIdLog(client1);\n\t\t\tconst log2 = network.getSequencedIdLog(client2);\n\t\t\texpect(log1.length).to.equal(log2.length);\n\t\t\tconst compressor1 = network.getCompressor(client1);\n\t\t\tconst compressor2 = network.getCompressor(client2);\n\t\t\tconst ids = new Set<OpSpaceCompressedId>();\n\t\t\tconst uuidsOrOverrides = new Set<string>();\n\t\t\tfor (let i = 0; i < log1.length; i++) {\n\t\t\t\tconst data1 = log1[i];\n\t\t\t\tconst id1 = compressor1.normalizeToOpSpace(data1.id);\n\t\t\t\tconst id2 = compressor2.normalizeToOpSpace(log2[i].id);\n\t\t\t\texpect(isFinalId(id1)).to.be.true;\n\t\t\t\tids.add(id1);\n\t\t\t\texpect(id1).to.equal(id2);\n\t\t\t\tconst uuidOrOverride1 = compressor1.decompress(id1);\n\t\t\t\tuuidsOrOverrides.add(uuidOrOverride1);\n\t\t\t\tif (data1.expectedOverride === undefined) {\n\t\t\t\t\texpect(isStableId(uuidOrOverride1)).to.be.true;\n\t\t\t\t}\n\t\t\t\texpect(uuidOrOverride1).to.equal(compressor2.decompress(id2));\n\t\t\t}\n\t\t\tconst expectedSize = log1.length - numUnifications;\n\t\t\texpect(ids.size).to.equal(expectedSize);\n\t\t\texpect(uuidsOrOverrides.size).to.equal(expectedSize);\n\t\t}\n\n\t\titNetwork('produces ID spaces correctly', (network) => {\n\t\t\t// This test asserts that IDs returned from IDCompressor APIs are correctly encoded as either local or final.\n\t\t\t// This is a glass box test in that it assumes the negative/positive encoding of CompressedIds (negative = local, positive = final).\n\t\t\tconst compressor1 = network.getCompressor(Client.Client1);\n\n\t\t\t// Client 1 makes two IDs, two explicit (one with an override) and one sequential\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 3, {\n\t\t\t\t1: 'override1',\n\t\t\t});\n\n\t\t\tnetwork.getIdLog(Client.Client1).forEach((id) => expect(id.id).to.be.lessThan(0));\n\n\t\t\t// Client 1's IDs have not been acked so have no op space equivalent\n\t\t\tnetwork\n\t\t\t\t.getIdLog(Client.Client1)\n\t\t\t\t.forEach((idData) => expect(compressor1.normalizeToOpSpace(idData.id)).to.be.lessThan(0));\n\n\t\t\t// Client 1's IDs are acked\n\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\tnetwork.getIdLog(Client.Client1).forEach((id) => expect(id.id).to.be.lessThan(0));\n\n\t\t\t// Client 3 makes two IDs, two explicit (one with an override) and one sequential\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, {\n\t\t\t\t1: 'override2',\n\t\t\t});\n\n\t\t\tnetwork.getIdLog(Client.Client2).forEach((id) => expect(id.id).to.be.lessThan(0));\n\n\t\t\t// Client 1 receives Client 2's IDs\n\t\t\tnetwork.deliverOperations(Client.Client1);\n\n\t\t\tnetwork\n\t\t\t\t.getIdLog(Client.Client1)\n\t\t\t\t.slice(-3)\n\t\t\t\t.forEach((id) => expect(id.id).to.be.greaterThan(0));\n\n\t\t\t// All IDs have been acked or are from another client, and therefore have a final form in op space\n\t\t\tnetwork\n\t\t\t\t.getIdLog(Client.Client1)\n\t\t\t\t.forEach((idData) => expect(compressor1.normalizeToOpSpace(idData.id)).to.be.greaterThan(0));\n\n\t\t\t// Compression should preserve ID space correctness\n\t\t\tnetwork.getIdLog(Client.Client1).forEach((idData) => {\n\t\t\t\tconst roundtripped = compressor1.recompress(compressor1.decompress(idData.id));\n\t\t\t\texpect(Math.sign(roundtripped)).to.equal(Math.sign(idData.id));\n\t\t\t});\n\n\t\t\tnetwork.getIdLog(Client.Client1).forEach((idData) => {\n\t\t\t\tconst opNormalized = compressor1.normalizeToOpSpace(idData.id);\n\t\t\t\texpect(Math.sign(compressor1.normalizeToSessionSpace(opNormalized, idData.sessionId))).to.equal(\n\t\t\t\t\tMath.sign(idData.id)\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\titNetwork('produces consistent IDs with large fuzz input', (network) => {\n\t\t\tconst generator = take(2000, makeOpGenerator({ includeOverrides: true }));\n\t\t\tperformFuzzActions(generator, network, 1984, undefined, true, (network) => network.assertNetworkState());\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t});\n\n\t\titNetwork('can set the cluster size via constructor', 2, (network) => {\n\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tconst opSpaceIds = network.allocateAndSendIds(Client.Client2, 2);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t// Glass box test, as it knows the order of final IDs\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceIds[0], compressor2.localSessionId)).to.equal(\n\t\t\t\tcompressor.reservedIdCount + compressor.clusterCapacity\n\t\t\t);\n\t\t});\n\n\t\titNetwork('can set the cluster size via API', 2, (network) => {\n\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\tconst compressor2 = network.getCompressor(Client.Client2);\n\t\t\tconst initialClusterCapacity = compressor.clusterCapacity;\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, initialClusterCapacity);\n\t\t\tnetwork.allocateAndSendIds(Client.Client2, initialClusterCapacity);\n\t\t\tnetwork.enqueueCapacityChange(5);\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tconst opSpaceIds = network.allocateAndSendIds(Client.Client2, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t// Glass box test, as it knows the order of final IDs\n\t\t\texpect(compressor.normalizeToSessionSpace(opSpaceIds[0], compressor2.localSessionId)).to.equal(\n\t\t\t\tcompressor.reservedIdCount + initialClusterCapacity * 2 + compressor.clusterCapacity\n\t\t\t);\n\t\t});\n\n\t\titNetwork('does not decompress ids for empty parts of clusters', 2, (network) => {\n\t\t\t// This is a glass box test in that it creates a final ID outside of the ID compressor\n\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1);\n\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\tconst id = network.getSequencedIdLog(Client.Client2)[0].id;\n\t\t\texpect(isFinalId(id)).to.be.true;\n\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n\t\t\tconst emptyId = (id + 1) as FinalCompressedId;\n\t\t\tassert.throws(\n\t\t\t\t() => network.getCompressor(Client.Client2).decompress(emptyId),\n\t\t\t\t(e: Error) => validateAssertionError(e, 'Compressed ID was not generated by this compressor')\n\t\t\t);\n\t\t});\n\n\t\tdescribe('Finalizing', () => {\n\t\t\titNetwork('can finalize IDs from multiple clients', (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 3, {\n\t\t\t\t\t1: 'override1',\n\t\t\t\t});\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, {\n\t\t\t\t\t1: 'override2',\n\t\t\t\t});\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\n\t\t\t});\n\n\t\t\titNetwork('can finalize a range when the current cluster is full', 5, (network) => {\n\t\t\t\tconst clusterCapacity = network.getCompressor(Client.Client1).clusterCapacity;\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterCapacity);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity, {\n\t\t\t\t\t0: 'override1',\n\t\t\t\t\t1: 'override2',\n\t\t\t\t\t2: 'override3',\n\t\t\t\t});\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\n\t\t\t});\n\n\t\t\titNetwork('can finalize a range that spans multiple clusters', 5, (network) => {\n\t\t\t\tconst clusterCapacity = network.getCompressor(Client.Client1).clusterCapacity;\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity - 2, {\n\t\t\t\t\t0: 'override1',\n\t\t\t\t\t1: 'override2',\n\t\t\t\t});\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterCapacity, {\n\t\t\t\t\t0: 'override3',\n\t\t\t\t\t1: 'override4',\n\t\t\t\t\t2: 'override5',\n\t\t\t\t});\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('Serialization', () => {\n\t\t\titNetwork(\n\t\t\t\t'prevents attempts to resume a session from a serialized compressor with no session',\n\t\t\t\t(network) => {\n\t\t\t\t\tconst compressor = network.getCompressor(Client.Client1);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 1);\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 1);\n\t\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\t\tconst serializedWithoutLocalState = compressor.serialize(false);\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() => IdCompressor.deserialize(serializedWithoutLocalState, sessionIds.get(Client.Client2)),\n\t\t\t\t\t\t(e: Error) => validateAssertionError(e, 'Cannot resume existing session.')\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\titNetwork('round-trips local state', 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 3);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\t// Some un-acked locals at the end\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 4);\n\t\t\t\tconst [serializedNoSession, serializedWithSession] = expectSerializes(\n\t\t\t\t\tnetwork.getCompressor(Client.Client1)\n\t\t\t\t);\n\t\t\t\texpect(hasOngoingSession(serializedWithSession)).to.be.true;\n\t\t\t\texpect(hasOngoingSession(serializedNoSession)).to.be.false;\n\t\t\t});\n\n\t\t\titNetwork('can serialize a partially empty cluster', 5, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('can serialize a full cluster', 2, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('can serialize full clusters from different clients', 2, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('can serialize clusters of different sizes and clients', 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('can serialize clusters with overrides', 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2, {\n\t\t\t\t\t1: 'override',\n\t\t\t\t});\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, {\n\t\t\t\t\t0: 'override1',\n\t\t\t\t\t2: 'override2',\n\t\t\t\t});\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork(\n\t\t\t\t'packs IDs into a single cluster when a single client generates non-overridden ids',\n\t\t\t\t3,\n\t\t\t\t(network) => {\n\t\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 20);\n\t\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\t\tconst [serialized1WithNoSession, serialized1WithSession] = expectSerializes(\n\t\t\t\t\t\tnetwork.getCompressor(Client.Client1)\n\t\t\t\t\t);\n\t\t\t\t\texpect(serialized1WithNoSession.clusters.length).to.equal(1);\n\t\t\t\t\texpect(serialized1WithSession.clusters.length).to.equal(1);\n\t\t\t\t\tconst [serialized3WithNoSession, serialized3WithSession] = expectSerializes(\n\t\t\t\t\t\tnetwork.getCompressor(Client.Client3)\n\t\t\t\t\t);\n\t\t\t\t\texpect(serialized3WithNoSession.clusters.length).to.equal(1);\n\t\t\t\t\texpect(serialized3WithSession.clusters.length).to.equal(1);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\titNetwork('serializes correctly after unifying duplicate overrides', 3, (network) => {\n\t\t\t\tconst override = 'override';\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 1, { 0: override });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2, { 1: override });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 5);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 5);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client2));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('can resume a session and interact with multiple other clients', 3, (network) => {\n\t\t\t\tconst clusterSize = network.getCompressor(Client.Client1).clusterCapacity;\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, clusterSize);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, clusterSize);\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tnetwork.goOfflineThenResume(Client.Client1);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 2);\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client3, 2);\n\t\t\t\texpectSequencedLogsAlign(network, Client.Client1, Client.Client2);\n\t\t\t});\n\n\t\t\titNetwork('can serialize after a large fuzz input', 3, (network) => {\n\t\t\t\tconst generator = take(2000, makeOpGenerator({ includeOverrides: true }));\n\t\t\t\tperformFuzzActions(generator, network, Math.PI, undefined, true, (network) => {\n\t\t\t\t\t// Periodically check that everyone in the network has the same serialized state\n\t\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\t\tconst compressors = network.getTargetCompressors(DestinationClient.All);\n\t\t\t\t\tlet deserializedPrev = roundtrip(compressors[0][1], false)[1];\n\t\t\t\t\tfor (let i = 1; i < compressors.length; i++) {\n\t\t\t\t\t\tconst deserializedCur = roundtrip(compressors[i][1], false)[1];\n\t\t\t\t\t\texpect(deserializedPrev.equals(deserializedCur, false)).to.be.true;\n\t\t\t\t\t\tdeserializedPrev = deserializedCur;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client1));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client2));\n\t\t\t\texpectSerializes(network.getCompressor(Client.Client3));\n\t\t\t});\n\n\t\t\titNetwork('stores override indices relative to their clusters', 3, (network) => {\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client1, 3, { 0: 'cluster1' });\n\t\t\t\tnetwork.allocateAndSendIds(Client.Client2, 3, { 0: 'cluster2' });\n\t\t\t\tnetwork.deliverOperations(Client.Client1);\n\t\t\t\tconst serialized = network.getCompressor(Client.Client1).serialize(false);\n\t\t\t\texpect(serialized.clusters.length).to.equal(2);\n\t\t\t\texpect(serialized.clusters[0][2]?.[0][0]).to.equal(0);\n\t\t\t\texpect(serialized.clusters[1][2]?.[0][0]).to.equal(0);\n\t\t\t});\n\t\t});\n\t});\n});\n\ntype NetworkTestFunction = (title: string, test: (network: IdCompressorTestNetwork) => void) => void;\n\ntype NetworkTestFunctionWithCapacity = (\n\ttitle: string,\n\tinitialClusterCapacity: number,\n\ttest: (network: IdCompressorTestNetwork) => void\n) => void;\n\nfunction createNetworkTestFunction(validateAfter: boolean): NetworkTestFunction & NetworkTestFunctionWithCapacity {\n\treturn (\n\t\ttitle: string,\n\t\ttestOrCapacity: ((network: IdCompressorTestNetwork) => void) | number,\n\t\ttest?: (network: IdCompressorTestNetwork) => void\n\t) => {\n\t\tit(title, () => {\n\t\t\tconst hasCapacity = typeof testOrCapacity === 'number';\n\t\t\tconst capacity = hasCapacity ? testOrCapacity : undefined;\n\t\t\tconst network = new IdCompressorTestNetwork(capacity);\n\t\t\t(hasCapacity ? assertNotUndefined(test) : testOrCapacity)(network);\n\t\t\tif (validateAfter) {\n\t\t\t\tnetwork.deliverOperations(DestinationClient.All);\n\t\t\t\tnetwork.assertNetworkState();\n\t\t\t}\n\t\t}).timeout(10000);\n\t};\n}\n\nfunction describeNetwork(title: string, its: (itFunc: NetworkTestFunction & NetworkTestFunctionWithCapacity) => void) {\n\tdescribe(title, () => {\n\t\tits(createNetworkTestFunction(false));\n\t});\n\n\tdescribe(`${title} (with validation)`, () => {\n\t\tits(createNetworkTestFunction(true));\n\t});\n}\n\nfunction describeNetworkNoValidation(\n\ttitle: string,\n\tits: (itFunc: NetworkTestFunction & NetworkTestFunctionWithCapacity) => void\n) {\n\tdescribe(title, () => {\n\t\tits(createNetworkTestFunction(false));\n\t});\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IdConversion.tests.d.ts","sourceRoot":"","sources":["../../src/test/IdConversion.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { expect } from 'chai';
|
|
6
|
-
import { StablePlace, StableRange } from '../ChangeTypes.js';
|
|
7
|
-
import { convertStablePlaceIds, convertStableRangeIds, convertNodeDataIds } from '../IdConversion.js';
|
|
8
|
-
import { refreshTestTree, areNodesEquivalent } from './utilities/TestUtilities.js';
|
|
9
|
-
describe('0_0_2 type conversions', () => {
|
|
10
|
-
const testTree = refreshTestTree();
|
|
11
|
-
it('can convert stable places', () => {
|
|
12
|
-
const stablePlace = StablePlace.after(testTree.left);
|
|
13
|
-
const stablePlaceInternal_0_0_2 = convertStablePlaceIds(stablePlace, convertToStableId);
|
|
14
|
-
const stablePlaceConverted = convertStablePlaceIds(stablePlaceInternal_0_0_2, convertToNodeId);
|
|
15
|
-
expect(stablePlace).to.deep.equal(stablePlaceConverted);
|
|
16
|
-
});
|
|
17
|
-
it('can convert stable ranges', () => {
|
|
18
|
-
const stableRange = StableRange.only(testTree.left);
|
|
19
|
-
const stableRangeInternal_0_0_2 = convertStableRangeIds(stableRange, convertToStableId);
|
|
20
|
-
const stableRangeConverted = convertStableRangeIds(stableRangeInternal_0_0_2, convertToNodeId);
|
|
21
|
-
expect(stableRange).to.deep.equal(stableRangeConverted);
|
|
22
|
-
});
|
|
23
|
-
it('can convert node data', () => {
|
|
24
|
-
const nodeData = testTree;
|
|
25
|
-
const nodeData_0_0_2 = convertNodeDataIds(nodeData, convertToStableId);
|
|
26
|
-
const nodeDataConverted = convertNodeDataIds(nodeData_0_0_2, convertToNodeId);
|
|
27
|
-
expect(areNodesEquivalent(nodeData, nodeDataConverted)).to.be.true;
|
|
28
|
-
});
|
|
29
|
-
function convertToStableId(id) {
|
|
30
|
-
return testTree.convertToStableNodeId(id);
|
|
31
|
-
}
|
|
32
|
-
function convertToNodeId(id) {
|
|
33
|
-
return testTree.convertToNodeId(id);
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
//# sourceMappingURL=IdConversion.tests.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IdConversion.tests.js","sourceRoot":"","sources":["../../src/test/IdConversion.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEtG,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEnF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACvC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IAEnC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACpC,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,yBAAyB,GAAG,qBAAqB,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QACxF,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,yBAAyB,EAAE,eAAe,CAAC,CAAC;QAC/F,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACpC,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,yBAAyB,GAAG,qBAAqB,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QACxF,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,yBAAyB,EAAE,eAAe,CAAC,CAAC;QAC/F,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC;QAC1B,MAAM,cAAc,GAAG,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACvE,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QAC9E,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,SAAS,iBAAiB,CAAC,EAAU;QACpC,OAAO,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,SAAS,eAAe,CAAC,EAAgB;QACxC,OAAO,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;AACF,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { StablePlace, StableRange } from '../ChangeTypes.js';\nimport { convertStablePlaceIds, convertStableRangeIds, convertNodeDataIds } from '../IdConversion.js';\nimport { NodeId, StableNodeId } from '../Identifiers.js';\nimport { refreshTestTree, areNodesEquivalent } from './utilities/TestUtilities.js';\n\ndescribe('0_0_2 type conversions', () => {\n\tconst testTree = refreshTestTree();\n\n\tit('can convert stable places', () => {\n\t\tconst stablePlace = StablePlace.after(testTree.left);\n\t\tconst stablePlaceInternal_0_0_2 = convertStablePlaceIds(stablePlace, convertToStableId);\n\t\tconst stablePlaceConverted = convertStablePlaceIds(stablePlaceInternal_0_0_2, convertToNodeId);\n\t\texpect(stablePlace).to.deep.equal(stablePlaceConverted);\n\t});\n\n\tit('can convert stable ranges', () => {\n\t\tconst stableRange = StableRange.only(testTree.left);\n\t\tconst stableRangeInternal_0_0_2 = convertStableRangeIds(stableRange, convertToStableId);\n\t\tconst stableRangeConverted = convertStableRangeIds(stableRangeInternal_0_0_2, convertToNodeId);\n\t\texpect(stableRange).to.deep.equal(stableRangeConverted);\n\t});\n\n\tit('can convert node data', () => {\n\t\tconst nodeData = testTree;\n\t\tconst nodeData_0_0_2 = convertNodeDataIds(nodeData, convertToStableId);\n\t\tconst nodeDataConverted = convertNodeDataIds(nodeData_0_0_2, convertToNodeId);\n\t\texpect(areNodesEquivalent(nodeData, nodeDataConverted)).to.be.true;\n\t});\n\n\tfunction convertToStableId(id: NodeId): StableNodeId {\n\t\treturn testTree.convertToStableNodeId(id);\n\t}\n\n\tfunction convertToNodeId(id: StableNodeId): NodeId {\n\t\treturn testTree.convertToNodeId(id);\n\t}\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LazyCheckout.tests.d.ts","sourceRoot":"","sources":["../../src/test/LazyCheckout.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { expect } from 'chai';
|
|
6
|
-
import { Change, StableRange } from '../ChangeTypes.js';
|
|
7
|
-
import { LazyCheckout } from '../LazyCheckout.js';
|
|
8
|
-
import { checkoutTests } from './Checkout.tests.js';
|
|
9
|
-
import { setUpTestSharedTree, setUpTestTree } from './utilities/TestUtilities.js';
|
|
10
|
-
checkoutTests('LazyCheckout', async (tree) => Promise.resolve(new LazyCheckout(tree)), () => {
|
|
11
|
-
it('updates lazily', async () => {
|
|
12
|
-
const { tree } = setUpTestSharedTree();
|
|
13
|
-
const testTree = setUpTestTree(tree);
|
|
14
|
-
const checkout = new LazyCheckout(tree);
|
|
15
|
-
expect(tree.currentView.equals(checkout.currentView)).to.be.true;
|
|
16
|
-
tree.applyEdit(Change.delete(StableRange.only(testTree.left)));
|
|
17
|
-
expect(tree.currentView.equals(checkout.currentView)).to.be.false;
|
|
18
|
-
await checkout.waitForPendingUpdates();
|
|
19
|
-
expect(tree.currentView.equals(checkout.currentView)).to.be.true;
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
//# sourceMappingURL=LazyCheckout.tests.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LazyCheckout.tests.js","sourceRoot":"","sources":["../../src/test/LazyCheckout.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElF,aAAa,CACZ,cAAc,EACd,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,EACvD,GAAG,EAAE;IACJ,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,mBAAmB,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACjE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAClE,MAAM,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IAClE,CAAC,CAAC,CAAC;AACJ,CAAC,CACD,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { Change, StableRange } from '../ChangeTypes.js';\nimport { LazyCheckout } from '../LazyCheckout.js';\nimport { checkoutTests } from './Checkout.tests.js';\nimport { setUpTestSharedTree, setUpTestTree } from './utilities/TestUtilities.js';\n\ncheckoutTests(\n\t'LazyCheckout',\n\tasync (tree) => Promise.resolve(new LazyCheckout(tree)),\n\t() => {\n\t\tit('updates lazily', async () => {\n\t\t\tconst { tree } = setUpTestSharedTree();\n\t\t\tconst testTree = setUpTestTree(tree);\n\t\t\tconst checkout = new LazyCheckout(tree);\n\t\t\texpect(tree.currentView.equals(checkout.currentView)).to.be.true;\n\t\t\ttree.applyEdit(Change.delete(StableRange.only(testTree.left)));\n\t\t\texpect(tree.currentView.equals(checkout.currentView)).to.be.false;\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\texpect(tree.currentView.equals(checkout.currentView)).to.be.true;\n\t\t});\n\t}\n);\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LogViewer.tests.d.ts","sourceRoot":"","sources":["../../src/test/LogViewer.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|