@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,588 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { strict as assert } from 'assert';
|
|
6
|
-
import { expect } from 'chai';
|
|
7
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
8
|
-
import { validateAssertionError } from '@fluidframework/test-runtime-utils';
|
|
9
|
-
import { EditLog } from '../EditLog.js';
|
|
10
|
-
import { CachingLogViewer, CachingLogViewerDiagnosticEvents, } from '../LogViewer.js';
|
|
11
|
-
import { copyPropertyIfDefined, fail } from '../Common.js';
|
|
12
|
-
import { initialTree } from '../InitialTree.js';
|
|
13
|
-
import { ChangeInternal, ChangeTypeInternal, ConstraintEffect, EditStatus, StablePlaceInternal, } from '../persisted-types/index.js';
|
|
14
|
-
import { areRevisionViewsSemanticallyEqual, newEdit } from '../EditUtilities.js';
|
|
15
|
-
import { RevisionView } from '../RevisionView.js';
|
|
16
|
-
import { TransactionInternal } from '../TransactionInternal.js';
|
|
17
|
-
import { StableRange } from '../ChangeTypes.js';
|
|
18
|
-
import { expectDefined } from './utilities/TestCommon.js';
|
|
19
|
-
import { buildLeaf } from './utilities/TestNode.js';
|
|
20
|
-
import { refreshTestTree, testTraitLabel } from './utilities/TestUtilities.js';
|
|
21
|
-
/**
|
|
22
|
-
* Creates an {@link EditLog} and accompanying {@link RevisionView} with pre-existing edits.
|
|
23
|
-
*
|
|
24
|
-
* @remarks Intended to be used with {@link getSimpleLogBaseView}
|
|
25
|
-
* @param testTree - Test tree to work on
|
|
26
|
-
* @param numEdits - The number of edits to make to the base tree
|
|
27
|
-
*/
|
|
28
|
-
function getTestTreeLog(testTree) {
|
|
29
|
-
const log = new EditLog();
|
|
30
|
-
log.addSequencedEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeaf(testTree.left.identifier)], StablePlaceInternal.atStartOf(testTree.left.traitLocation))), { sequenceNumber: 1, referenceSequenceNumber: 0 });
|
|
31
|
-
log.addSequencedEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeaf(testTree.right.identifier)], StablePlaceInternal.atStartOf(testTree.right.traitLocation))), { sequenceNumber: 2, referenceSequenceNumber: 1 });
|
|
32
|
-
return log;
|
|
33
|
-
}
|
|
34
|
-
function getLogWithNumEdits(nodeIdContext, numEdits) {
|
|
35
|
-
const log = new EditLog();
|
|
36
|
-
for (let i = 0; i < numEdits; i++) {
|
|
37
|
-
log.addSequencedEdit(newEdit(ChangeInternal.insertTree([buildLeaf(nodeIdContext.generateNodeId())], StablePlaceInternal.atStartOf({
|
|
38
|
-
label: testTraitLabel,
|
|
39
|
-
parent: nodeIdContext.convertToNodeId(initialTree.identifier),
|
|
40
|
-
}))), {
|
|
41
|
-
sequenceNumber: i + 1,
|
|
42
|
-
referenceSequenceNumber: i,
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
return log;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Get a base view for a log created with {@link getTestTreeLog}.
|
|
49
|
-
* This can then be used to construct a {@link LogViewer} for that log.
|
|
50
|
-
*
|
|
51
|
-
* @param testTree - Test tree to work from
|
|
52
|
-
*/
|
|
53
|
-
function getSimpleLogBaseView(testTree) {
|
|
54
|
-
const node = { definition: testTree.definition, identifier: testTree.identifier, traits: {} };
|
|
55
|
-
copyPropertyIfDefined(testTree, node, 'payload');
|
|
56
|
-
return RevisionView.fromTree(node);
|
|
57
|
-
}
|
|
58
|
-
function getSimpleLogWithLocalEdits(testTree) {
|
|
59
|
-
const logWithLocalEdits = getTestTreeLog(testTree);
|
|
60
|
-
logWithLocalEdits.addLocalEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.left.traitLocation))));
|
|
61
|
-
logWithLocalEdits.addLocalEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.right.traitLocation))));
|
|
62
|
-
logWithLocalEdits.addLocalEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.left.traitLocation))));
|
|
63
|
-
return logWithLocalEdits;
|
|
64
|
-
}
|
|
65
|
-
function getViewsForLog(log, baseView) {
|
|
66
|
-
const views = [baseView];
|
|
67
|
-
for (let i = 0; i < log.length; i++) {
|
|
68
|
-
const edit = log.tryGetEditAtIndex(i) ?? fail('edit not found');
|
|
69
|
-
const result = TransactionInternal.factory(views[i]).applyChanges(edit.changes).close();
|
|
70
|
-
if (result.status === EditStatus.Applied) {
|
|
71
|
-
views.push(result.after);
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
expect.fail('edit failed to apply');
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return views;
|
|
78
|
-
}
|
|
79
|
-
function runLogViewerCorrectnessTests(viewerCreator) {
|
|
80
|
-
return describe('LogViewer', () => {
|
|
81
|
-
let simpleLog;
|
|
82
|
-
let simpleLogBaseView;
|
|
83
|
-
let simpleLogInitialView;
|
|
84
|
-
const testTree = refreshTestTree(undefined, (t) => {
|
|
85
|
-
simpleLogBaseView = getSimpleLogBaseView(t);
|
|
86
|
-
simpleLog = getTestTreeLog(t);
|
|
87
|
-
simpleLogInitialView = t.view;
|
|
88
|
-
});
|
|
89
|
-
it('generates initialTree by default for the 0th revision', () => {
|
|
90
|
-
const viewer = viewerCreator(new EditLog(), simpleLogBaseView);
|
|
91
|
-
const headView = viewer.getRevisionViewInMemory(0);
|
|
92
|
-
expect(headView.equals(expectDefined(RevisionView.fromTree(initialTree, testTree))));
|
|
93
|
-
});
|
|
94
|
-
it('can be constructed from a non-empty EditLog', () => {
|
|
95
|
-
const viewer = viewerCreator(simpleLog, simpleLogBaseView);
|
|
96
|
-
const headView = viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
97
|
-
expect(areRevisionViewsSemanticallyEqual(headView, testTree, simpleLogInitialView, testTree));
|
|
98
|
-
expect(headView.equals(simpleLogInitialView)).to.be.true;
|
|
99
|
-
});
|
|
100
|
-
it('can generate all revision views for an EditLog', () => {
|
|
101
|
-
const baseView = expectDefined(RevisionView.fromTree(initialTree, testTree));
|
|
102
|
-
const numNodes = 10;
|
|
103
|
-
const viewer = viewerCreator(getLogWithNumEdits(testTree, numNodes), baseView);
|
|
104
|
-
const initialRevision = viewer.getRevisionViewInMemory(0);
|
|
105
|
-
expect(initialRevision.equals(baseView)).to.be.true;
|
|
106
|
-
expect(initialRevision.size).to.equal(1);
|
|
107
|
-
const oneNodeView = viewer.getRevisionViewInMemory(1);
|
|
108
|
-
const testTrait = {
|
|
109
|
-
label: testTraitLabel,
|
|
110
|
-
parent: testTree.convertToNodeId(initialTree.identifier),
|
|
111
|
-
};
|
|
112
|
-
expect(oneNodeView.getTrait(testTrait).length).to.equal(1);
|
|
113
|
-
const twoNodeView = viewer.getRevisionViewInMemory(2);
|
|
114
|
-
expect(twoNodeView.getTrait(testTrait).length).to.equal(2);
|
|
115
|
-
const finalView = viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
116
|
-
expect(finalView.getTrait(testTrait).length).to.equal(numNodes);
|
|
117
|
-
});
|
|
118
|
-
it('produces correct revision views when the log is mutated', () => {
|
|
119
|
-
const mutableLog = new EditLog();
|
|
120
|
-
const viewer = viewerCreator(mutableLog, simpleLogBaseView);
|
|
121
|
-
const viewsForLog = getViewsForLog(simpleLog, simpleLogBaseView);
|
|
122
|
-
// This test takes an empty log (A) and a log with edits in it (B), and adds the edits from B to A.
|
|
123
|
-
// After each addition, the test code will iterate from [0, length_of_A] and get a view for each revision via LogViewer
|
|
124
|
-
// and assert that none of the views differ from those created via pure Transaction APIs.
|
|
125
|
-
for (let i = 0; i <= simpleLog.length; i++) {
|
|
126
|
-
for (let j = 0; j <= mutableLog.length; j++) {
|
|
127
|
-
const viewerView = viewer.getRevisionViewInMemory(j);
|
|
128
|
-
expect(viewerView.equals(viewsForLog[j])).to.be.true;
|
|
129
|
-
}
|
|
130
|
-
// Revisions are from [0, simpleLog.length], edits are at indices [0, simpleLog.length)
|
|
131
|
-
if (i < simpleLog.length) {
|
|
132
|
-
const edit = simpleLog.tryGetEditAtIndex(i) ?? fail('edit not found');
|
|
133
|
-
mutableLog.addSequencedEdit(edit, { sequenceNumber: i + 1, referenceSequenceNumber: i });
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
it('produces correct revision views when local edits are shifted in the log due to sequenced edits being added', () => {
|
|
138
|
-
function getViewsFromViewer(viewer, lastRevision) {
|
|
139
|
-
const views = [];
|
|
140
|
-
for (let i = 0; i <= lastRevision; i++) {
|
|
141
|
-
views.push(viewer.getRevisionViewInMemory(i));
|
|
142
|
-
}
|
|
143
|
-
return views;
|
|
144
|
-
}
|
|
145
|
-
function expectViewsAreEqual(log, viewer) {
|
|
146
|
-
const viewsForLog = getViewsForLog(log, simpleLogBaseView);
|
|
147
|
-
const viewsForViewer = getViewsFromViewer(viewer, log.length);
|
|
148
|
-
expect(viewsForLog.length).to.equal(viewsForViewer.length);
|
|
149
|
-
for (let i = 0; i < viewsForLog.length; i++) {
|
|
150
|
-
expect(viewsForLog[i].equals(viewsForViewer[i])).to.be.true;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
const logWithLocalEdits = getSimpleLogWithLocalEdits(testTree);
|
|
154
|
-
const viewer = viewerCreator(logWithLocalEdits, simpleLogBaseView);
|
|
155
|
-
expectViewsAreEqual(logWithLocalEdits, viewer);
|
|
156
|
-
let seqNumber = 1;
|
|
157
|
-
// Sequence the existing local edits and ensure viewer generates the correct views
|
|
158
|
-
while (logWithLocalEdits.numberOfLocalEdits > 0) {
|
|
159
|
-
// Add a remote sequenced edit
|
|
160
|
-
logWithLocalEdits.addSequencedEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atStartOf(testTree.right.traitLocation))), { sequenceNumber: seqNumber, referenceSequenceNumber: seqNumber - 1 });
|
|
161
|
-
++seqNumber;
|
|
162
|
-
expectViewsAreEqual(logWithLocalEdits, viewer);
|
|
163
|
-
// Sequence a local edit
|
|
164
|
-
logWithLocalEdits.addSequencedEdit(logWithLocalEdits.tryGetEditAtIndex(logWithLocalEdits.numberOfSequencedEdits) ??
|
|
165
|
-
fail('edit not found'), { sequenceNumber: seqNumber, referenceSequenceNumber: seqNumber - 1 });
|
|
166
|
-
++seqNumber;
|
|
167
|
-
expectViewsAreEqual(logWithLocalEdits, viewer);
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
describe('CachingLogViewer', () => {
|
|
173
|
-
// TODO: Dedupe? shared hook for getting all of this stuff?
|
|
174
|
-
let simpleLog;
|
|
175
|
-
let simpleLogBaseView;
|
|
176
|
-
let simpleLogInitialView;
|
|
177
|
-
// An arbitrary revision view which can be used to check to see if it gets used when provided as a cached value.
|
|
178
|
-
let arbitraryRevisionView;
|
|
179
|
-
const testTree = refreshTestTree(undefined, (t) => {
|
|
180
|
-
simpleLogBaseView = getSimpleLogBaseView(t);
|
|
181
|
-
simpleLog = getTestTreeLog(t);
|
|
182
|
-
simpleLogInitialView = t.view;
|
|
183
|
-
arbitraryRevisionView = RevisionView.fromTree(t.buildLeaf(t.generateNodeId()));
|
|
184
|
-
});
|
|
185
|
-
function getCachingLogViewerAssumeAppliedEdits(log, baseView, editStatusCallback, sequencedEditResultCallback, initialRevision) {
|
|
186
|
-
return new CachingLogViewer(log, baseView, initialRevision !== undefined
|
|
187
|
-
? [initialRevision[0], { view: initialRevision[1], status: EditStatus.Applied, steps: [] }]
|
|
188
|
-
: undefined, editStatusCallback, sequencedEditResultCallback, log.numberOfSequencedEdits);
|
|
189
|
-
}
|
|
190
|
-
runLogViewerCorrectnessTests(getCachingLogViewerAssumeAppliedEdits);
|
|
191
|
-
it('detects non-integer revisions when setting revision views', async () => {
|
|
192
|
-
assert.throws(() => {
|
|
193
|
-
return getCachingLogViewerAssumeAppliedEdits(simpleLog, simpleLogBaseView, undefined, undefined, [
|
|
194
|
-
2.4,
|
|
195
|
-
simpleLogInitialView,
|
|
196
|
-
]);
|
|
197
|
-
}, (e) => validateAssertionError(e, 'revision must be an integer'));
|
|
198
|
-
});
|
|
199
|
-
it('detects out-of-bounds revisions when setting revision views', async () => {
|
|
200
|
-
assert.throws(() => {
|
|
201
|
-
return getCachingLogViewerAssumeAppliedEdits(simpleLog, simpleLogBaseView, undefined, undefined, [
|
|
202
|
-
1000,
|
|
203
|
-
simpleLogInitialView,
|
|
204
|
-
]);
|
|
205
|
-
}, (e) => validateAssertionError(e, 'revision must correspond to the result of a SequencedEdit'));
|
|
206
|
-
});
|
|
207
|
-
it('can be created with an initial revision', async () => {
|
|
208
|
-
const views = getViewsForLog(simpleLog, simpleLogBaseView);
|
|
209
|
-
const initialRevision = 0;
|
|
210
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(simpleLog, simpleLogBaseView, undefined, undefined, [initialRevision, views[initialRevision]]);
|
|
211
|
-
expect(viewer.getRevisionViewInMemory(initialRevision).equals(views[initialRevision])).to.be.true;
|
|
212
|
-
});
|
|
213
|
-
function requestAllRevisionViews(viewer, log) {
|
|
214
|
-
for (let i = 0; i <= log.length; i++) {
|
|
215
|
-
viewer.getRevisionViewInMemory(i);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
it('caches revision views for sequenced edits', async () => {
|
|
219
|
-
let editsProcessed = 0;
|
|
220
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(simpleLog, simpleLogBaseView, () => editsProcessed++);
|
|
221
|
-
assert(simpleLog.length < CachingLogViewer.sequencedCacheSizeMax);
|
|
222
|
-
requestAllRevisionViews(viewer, simpleLog);
|
|
223
|
-
expect(editsProcessed).to.equal(simpleLog.length);
|
|
224
|
-
// Ask for every view; no edit application should occur, since the views will be cached.
|
|
225
|
-
for (let i = 0; i <= simpleLog.length; i++) {
|
|
226
|
-
viewer.getRevisionViewInMemory(i);
|
|
227
|
-
}
|
|
228
|
-
expect(editsProcessed).to.equal(simpleLog.length);
|
|
229
|
-
});
|
|
230
|
-
it('caches edit results for sequenced edits', async () => {
|
|
231
|
-
// Add an invalid edit
|
|
232
|
-
simpleLog.addSequencedEdit(newEdit([
|
|
233
|
-
{
|
|
234
|
-
type: ChangeTypeInternal.Constraint,
|
|
235
|
-
toConstrain: StableRange.only(testTree.left),
|
|
236
|
-
effect: ConstraintEffect.InvalidAndDiscard,
|
|
237
|
-
length: 0,
|
|
238
|
-
},
|
|
239
|
-
]), { sequenceNumber: 3, referenceSequenceNumber: 2, minimumSequenceNumber: 2 });
|
|
240
|
-
let editsProcessed = 0;
|
|
241
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(simpleLog, simpleLogBaseView, () => editsProcessed++);
|
|
242
|
-
assert(simpleLog.length < CachingLogViewer.sequencedCacheSizeMax);
|
|
243
|
-
requestAllRevisionViews(viewer, simpleLog);
|
|
244
|
-
expect(editsProcessed).to.equal(simpleLog.length);
|
|
245
|
-
expect(viewer.getEditResultInMemory(0).status).equals(undefined);
|
|
246
|
-
expect(viewer.getEditResultInMemory(1).status).equals(EditStatus.Applied);
|
|
247
|
-
expect(viewer.getEditResultInMemory(2).status).equals(EditStatus.Applied);
|
|
248
|
-
expect(viewer.getEditResultInMemory(3).status).equals(EditStatus.Invalid);
|
|
249
|
-
});
|
|
250
|
-
it('caches the highest revision', async () => {
|
|
251
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(simpleLog, simpleLogBaseView);
|
|
252
|
-
expect(viewer.highestRevisionCached()).to.be.false;
|
|
253
|
-
requestAllRevisionViews(viewer, simpleLog);
|
|
254
|
-
expect(viewer.highestRevisionCached()).to.be.true;
|
|
255
|
-
simpleLog.addLocalEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.right.traitLocation))));
|
|
256
|
-
simpleLog.addSequencedEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.right.traitLocation))), {
|
|
257
|
-
sequenceNumber: 3,
|
|
258
|
-
referenceSequenceNumber: 2,
|
|
259
|
-
minimumSequenceNumber: 2,
|
|
260
|
-
});
|
|
261
|
-
expect(viewer.highestRevisionCached()).to.be.false;
|
|
262
|
-
});
|
|
263
|
-
it('evicts least recently set cached revision views for sequenced edits', async () => {
|
|
264
|
-
let editsProcessed = 0;
|
|
265
|
-
const log = getLogWithNumEdits(testTree, CachingLogViewer.sequencedCacheSizeMax * 2);
|
|
266
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log, expectDefined(RevisionView.fromTree(initialTree, testTree)), () => editsProcessed++);
|
|
267
|
-
viewer.setMinimumSequenceNumber(log.length + 1); // simulate all edits being subject to eviction
|
|
268
|
-
requestAllRevisionViews(viewer, log);
|
|
269
|
-
expect(editsProcessed).to.equal(log.length);
|
|
270
|
-
editsProcessed = 0;
|
|
271
|
-
for (let i = CachingLogViewer.sequencedCacheSizeMax + 1; i <= log.length; i++) {
|
|
272
|
-
viewer.getRevisionViewInMemory(i);
|
|
273
|
-
}
|
|
274
|
-
expect(editsProcessed).to.equal(0);
|
|
275
|
-
viewer.getRevisionViewInMemory(CachingLogViewer.sequencedCacheSizeMax);
|
|
276
|
-
expect(editsProcessed).to.equal(CachingLogViewer.sequencedCacheSizeMax);
|
|
277
|
-
});
|
|
278
|
-
it('never evicts the revision view for the most recent sequenced edit', async () => {
|
|
279
|
-
let editsProcessed = 0;
|
|
280
|
-
const log = getLogWithNumEdits(testTree, CachingLogViewer.sequencedCacheSizeMax * 2);
|
|
281
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log, expectDefined(RevisionView.fromTree(initialTree, testTree)), () => editsProcessed++);
|
|
282
|
-
// Simulate all clients being caught up.
|
|
283
|
-
viewer.setMinimumSequenceNumber(log.numberOfSequencedEdits);
|
|
284
|
-
requestAllRevisionViews(viewer, log);
|
|
285
|
-
expect(editsProcessed).to.equal(log.length);
|
|
286
|
-
editsProcessed = 0;
|
|
287
|
-
for (let i = 0; i <= CachingLogViewer.sequencedCacheSizeMax; i++) {
|
|
288
|
-
viewer.getRevisionViewInMemory(i);
|
|
289
|
-
}
|
|
290
|
-
expect(editsProcessed).to.equal(CachingLogViewer.sequencedCacheSizeMax);
|
|
291
|
-
editsProcessed = 0;
|
|
292
|
-
viewer.getRevisionViewInMemory(log.numberOfSequencedEdits);
|
|
293
|
-
expect(editsProcessed).to.equal(0);
|
|
294
|
-
});
|
|
295
|
-
it('caches revision views for local revisions', async () => {
|
|
296
|
-
const logWithLocalEdits = getSimpleLogWithLocalEdits(testTree);
|
|
297
|
-
let editsProcessed = 0;
|
|
298
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(logWithLocalEdits, simpleLogBaseView, () => editsProcessed++);
|
|
299
|
-
assert(logWithLocalEdits.length < CachingLogViewer.sequencedCacheSizeMax);
|
|
300
|
-
requestAllRevisionViews(viewer, logWithLocalEdits);
|
|
301
|
-
expect(editsProcessed).to.equal(logWithLocalEdits.length);
|
|
302
|
-
// Local edits should now be cached until next remote sequenced edit arrives
|
|
303
|
-
editsProcessed = 0;
|
|
304
|
-
for (let i = logWithLocalEdits.numberOfSequencedEdits + 1; i <= logWithLocalEdits.length; i++) {
|
|
305
|
-
viewer.getRevisionViewInMemory(i);
|
|
306
|
-
expect(editsProcessed).to.equal(0);
|
|
307
|
-
}
|
|
308
|
-
// Add a new local edit, and request the latest view.
|
|
309
|
-
// This should apply only a single edit, as the most recent HEAD should be cached.
|
|
310
|
-
editsProcessed = 0;
|
|
311
|
-
logWithLocalEdits.addLocalEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.right.traitLocation))));
|
|
312
|
-
requestAllRevisionViews(viewer, logWithLocalEdits);
|
|
313
|
-
expect(editsProcessed).to.equal(1);
|
|
314
|
-
editsProcessed = 0;
|
|
315
|
-
let seqNumber = 1;
|
|
316
|
-
while (logWithLocalEdits.numberOfLocalEdits > 0) {
|
|
317
|
-
logWithLocalEdits.addSequencedEdit(logWithLocalEdits.tryGetEditAtIndex(logWithLocalEdits.numberOfSequencedEdits) ?? fail('edit not found'), { sequenceNumber: seqNumber, referenceSequenceNumber: seqNumber - 1 });
|
|
318
|
-
++seqNumber;
|
|
319
|
-
viewer.getRevisionViewInMemory(logWithLocalEdits.numberOfSequencedEdits); // get the latest (just added) sequenced edit
|
|
320
|
-
viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY); // get the last view, which is a local revision
|
|
321
|
-
expect(editsProcessed).to.equal(0);
|
|
322
|
-
}
|
|
323
|
-
});
|
|
324
|
-
it('invalidates cached revision views for local revisions when remote edits are received', () => {
|
|
325
|
-
const logWithLocalEdits = getSimpleLogWithLocalEdits(testTree);
|
|
326
|
-
let editsProcessed = 0;
|
|
327
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(logWithLocalEdits, simpleLogBaseView, () => editsProcessed++);
|
|
328
|
-
// Request twice, should only process edits once
|
|
329
|
-
viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
330
|
-
viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
331
|
-
expect(editsProcessed).to.equal(logWithLocalEdits.length);
|
|
332
|
-
// Remote edit arrives
|
|
333
|
-
editsProcessed = 0;
|
|
334
|
-
logWithLocalEdits.addSequencedEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.right.traitLocation))), { sequenceNumber: 3, referenceSequenceNumber: 2, minimumSequenceNumber: 2 });
|
|
335
|
-
viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
336
|
-
expect(editsProcessed).to.equal(logWithLocalEdits.numberOfLocalEdits + 1);
|
|
337
|
-
});
|
|
338
|
-
it('uses known editing result', () => {
|
|
339
|
-
const log = new EditLog();
|
|
340
|
-
const editsProcessed = [];
|
|
341
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log, simpleLogBaseView, (_, _2, wasCached) => editsProcessed.push(wasCached));
|
|
342
|
-
const before = viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
343
|
-
const edit = newEdit([]);
|
|
344
|
-
log.addLocalEdit(edit);
|
|
345
|
-
viewer.setKnownEditingResult(edit, {
|
|
346
|
-
status: EditStatus.Applied,
|
|
347
|
-
changes: edit.changes,
|
|
348
|
-
before,
|
|
349
|
-
after: arbitraryRevisionView,
|
|
350
|
-
steps: [],
|
|
351
|
-
});
|
|
352
|
-
const after = viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
353
|
-
expect(editsProcessed).deep.equal([true]);
|
|
354
|
-
expect(after).equal(arbitraryRevisionView);
|
|
355
|
-
});
|
|
356
|
-
it('ignores known editing if for wrong before revision view', () => {
|
|
357
|
-
const log = new EditLog();
|
|
358
|
-
const editsProcessed = [];
|
|
359
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log, simpleLogBaseView, (_, _2, wasCached) => editsProcessed.push(wasCached));
|
|
360
|
-
const edit = newEdit([]);
|
|
361
|
-
log.addLocalEdit(edit);
|
|
362
|
-
viewer.setKnownEditingResult(edit, {
|
|
363
|
-
status: EditStatus.Applied,
|
|
364
|
-
changes: edit.changes,
|
|
365
|
-
before: arbitraryRevisionView,
|
|
366
|
-
after: arbitraryRevisionView,
|
|
367
|
-
steps: [],
|
|
368
|
-
});
|
|
369
|
-
const after = viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
370
|
-
expect(editsProcessed).deep.equal([false]);
|
|
371
|
-
expect(after).not.equal(arbitraryRevisionView);
|
|
372
|
-
});
|
|
373
|
-
it('ignores known editing if for wrong edit', () => {
|
|
374
|
-
const log = new EditLog();
|
|
375
|
-
const editsProcessed = [];
|
|
376
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log, simpleLogBaseView, (_, _2, wasCached) => editsProcessed.push(wasCached));
|
|
377
|
-
const before = viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
378
|
-
const edit = newEdit([]);
|
|
379
|
-
log.addLocalEdit(edit);
|
|
380
|
-
viewer.setKnownEditingResult(newEdit([]), {
|
|
381
|
-
status: EditStatus.Applied,
|
|
382
|
-
changes: edit.changes,
|
|
383
|
-
before,
|
|
384
|
-
after: arbitraryRevisionView,
|
|
385
|
-
steps: [],
|
|
386
|
-
});
|
|
387
|
-
const after = viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
388
|
-
expect(editsProcessed).deep.equal([false]);
|
|
389
|
-
expect(after).not.equal(arbitraryRevisionView);
|
|
390
|
-
});
|
|
391
|
-
it('uses known editing result with multiple edits', () => {
|
|
392
|
-
const log = new EditLog();
|
|
393
|
-
const editsProcessed = [];
|
|
394
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log, simpleLogBaseView, (_, _2, wasCached) => editsProcessed.push(wasCached));
|
|
395
|
-
const edit1 = newEdit([]);
|
|
396
|
-
const edit2 = newEdit([]);
|
|
397
|
-
const edit3 = newEdit([]);
|
|
398
|
-
log.addLocalEdit(edit1);
|
|
399
|
-
const before = viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
400
|
-
expect(editsProcessed).deep.equal([false]);
|
|
401
|
-
log.addLocalEdit(edit2);
|
|
402
|
-
viewer.setKnownEditingResult(edit2, {
|
|
403
|
-
status: EditStatus.Applied,
|
|
404
|
-
changes: edit2.changes,
|
|
405
|
-
before,
|
|
406
|
-
after: arbitraryRevisionView,
|
|
407
|
-
steps: [],
|
|
408
|
-
});
|
|
409
|
-
const after = viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
410
|
-
expect(editsProcessed).deep.equal([false, true]);
|
|
411
|
-
expect(after).equal(arbitraryRevisionView);
|
|
412
|
-
log.addLocalEdit(edit3);
|
|
413
|
-
viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
414
|
-
expect(editsProcessed).deep.equal([false, true, false]);
|
|
415
|
-
});
|
|
416
|
-
it('caches the oldest in memory revision when edits are evicted', async () => {
|
|
417
|
-
let retainedRevision = 0;
|
|
418
|
-
const targetEditLogSize = 10;
|
|
419
|
-
const log = new EditLog(undefined, undefined, undefined, targetEditLogSize, targetEditLogSize * 2);
|
|
420
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log, simpleLogBaseView);
|
|
421
|
-
viewer.on(CachingLogViewerDiagnosticEvents.RevisionRetained, (revision) => {
|
|
422
|
-
retainedRevision = revision;
|
|
423
|
-
});
|
|
424
|
-
// Add enough edits to the log to start evicting
|
|
425
|
-
for (let i = 0; i < targetEditLogSize; i++) {
|
|
426
|
-
const edit = newEdit([]);
|
|
427
|
-
log.addSequencedEdit(edit, { sequenceNumber: i, referenceSequenceNumber: i - 1 });
|
|
428
|
-
expect(log.getIndexOfId(edit.id)).equals(i);
|
|
429
|
-
}
|
|
430
|
-
expect(log.length)
|
|
431
|
-
.equals(log.numberOfSequencedEdits)
|
|
432
|
-
.and.equals(targetEditLogSize, 'Only sequenced edits should be present.');
|
|
433
|
-
// Add more edits so that the oldest get evicted
|
|
434
|
-
for (let i = 0; i < targetEditLogSize; i++) {
|
|
435
|
-
const edit = newEdit([]);
|
|
436
|
-
const sequenceNumber = targetEditLogSize + i;
|
|
437
|
-
log.addSequencedEdit(edit, {
|
|
438
|
-
sequenceNumber,
|
|
439
|
-
referenceSequenceNumber: sequenceNumber - 1,
|
|
440
|
-
minimumSequenceNumber: sequenceNumber - 1,
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
|
-
// Check to see that the revision was retained
|
|
444
|
-
expect(retainedRevision).to.equal(targetEditLogSize);
|
|
445
|
-
// Make sure retrieving the latest revision is possible after edit eviction
|
|
446
|
-
viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
447
|
-
});
|
|
448
|
-
describe('Callbacks', () => {
|
|
449
|
-
function getViewer() {
|
|
450
|
-
const log = getTestTreeLog(testTree);
|
|
451
|
-
const events = [];
|
|
452
|
-
const viewer = new CachingLogViewer(log, simpleLogBaseView, undefined, undefined, (args) => events.push(args));
|
|
453
|
-
return { log, viewer, events };
|
|
454
|
-
}
|
|
455
|
-
function addInvalidEdit(log) {
|
|
456
|
-
// Add a local edit that will be invalid (inserts a node at a location that doesn't exist)
|
|
457
|
-
const edit = newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], expectDefined(StablePlaceInternal.atEndOf({
|
|
458
|
-
label: testTraitLabel,
|
|
459
|
-
parent: testTree.generateNodeId(),
|
|
460
|
-
}))));
|
|
461
|
-
log.addLocalEdit(edit);
|
|
462
|
-
return edit;
|
|
463
|
-
}
|
|
464
|
-
it('processSequencedEditResult is called when a sequenced edit is applied', async () => {
|
|
465
|
-
const { log, events, viewer } = getViewer();
|
|
466
|
-
viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
467
|
-
events.splice(0);
|
|
468
|
-
// Non-sequenced edit should not trigger a call
|
|
469
|
-
const invalidEdit = addInvalidEdit(log);
|
|
470
|
-
viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
471
|
-
expect(events.length).equals(0);
|
|
472
|
-
log.addSequencedEdit(invalidEdit, { sequenceNumber: 3, referenceSequenceNumber: 2 });
|
|
473
|
-
viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
474
|
-
expect(events.length).equals(1);
|
|
475
|
-
expect(events[0].edit.id).equals(invalidEdit.id);
|
|
476
|
-
expect(events[0].wasLocal).equals(true);
|
|
477
|
-
expect(events[0].result.status).equals(EditStatus.Invalid);
|
|
478
|
-
expect(events[0].reconciliationPath.length).equals(0);
|
|
479
|
-
const validEdit1 = newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atStartOf(testTree.left.traitLocation)));
|
|
480
|
-
log.addSequencedEdit(validEdit1, { sequenceNumber: 3, referenceSequenceNumber: 2 });
|
|
481
|
-
viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
482
|
-
expect(events.length).equals(2);
|
|
483
|
-
expect(events[1].edit.id).equals(validEdit1.id);
|
|
484
|
-
expect(events[1].wasLocal).equals(false);
|
|
485
|
-
expect(events[1].result.status).equals(EditStatus.Applied);
|
|
486
|
-
expect(events[1].reconciliationPath.length).equals(0);
|
|
487
|
-
const validEdit2 = newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atStartOf(testTree.left.traitLocation)));
|
|
488
|
-
log.addSequencedEdit(validEdit2, { sequenceNumber: 4, referenceSequenceNumber: 2 });
|
|
489
|
-
viewer.getRevisionViewInMemory(Number.POSITIVE_INFINITY);
|
|
490
|
-
expect(events.length).equals(3);
|
|
491
|
-
expect(events[2].edit.id).equals(validEdit2.id);
|
|
492
|
-
expect(events[2].wasLocal).equals(false);
|
|
493
|
-
expect(events[2].result.status).equals(EditStatus.Applied);
|
|
494
|
-
expect(events[2].reconciliationPath.length).equals(1);
|
|
495
|
-
});
|
|
496
|
-
});
|
|
497
|
-
describe('Sequencing', () => {
|
|
498
|
-
function addFakeEdit(logViewer, sequenceNumber, referenceSequenceNumber) {
|
|
499
|
-
const id = String(sequenceNumber ?? uuidv4());
|
|
500
|
-
const edit = { changes: [ChangeInternal.setPayload(simpleLogBaseView.root, id)], id };
|
|
501
|
-
logViewer.log.addSequencedEdit(edit, {
|
|
502
|
-
sequenceNumber,
|
|
503
|
-
referenceSequenceNumber: referenceSequenceNumber ?? sequenceNumber - 1,
|
|
504
|
-
});
|
|
505
|
-
return edit;
|
|
506
|
-
}
|
|
507
|
-
function minimalLogViewer() {
|
|
508
|
-
return new CachingLogViewer(new EditLog(), simpleLogBaseView);
|
|
509
|
-
}
|
|
510
|
-
it('tracks the earliest sequenced edit in the session', () => {
|
|
511
|
-
const logViewer = minimalLogViewer();
|
|
512
|
-
expect(logViewer.earliestSequencedEditInMemory()).undefined;
|
|
513
|
-
// Non-sequenced edit
|
|
514
|
-
logViewer.log.addLocalEdit({ id: uuidv4(), changes: [] });
|
|
515
|
-
expect(logViewer.earliestSequencedEditInMemory()).undefined;
|
|
516
|
-
// First sequenced edit
|
|
517
|
-
const edit = addFakeEdit(logViewer, 123);
|
|
518
|
-
const expected = { edit, sequenceNumber: 123 };
|
|
519
|
-
expect(logViewer.earliestSequencedEditInMemory()).deep.equals(expected);
|
|
520
|
-
// Non-sequenced edit
|
|
521
|
-
logViewer.log.addLocalEdit({ id: uuidv4(), changes: [] });
|
|
522
|
-
expect(logViewer.earliestSequencedEditInMemory()).deep.equals(expected);
|
|
523
|
-
// Second sequenced edit
|
|
524
|
-
addFakeEdit(logViewer, 456);
|
|
525
|
-
expect(logViewer.earliestSequencedEditInMemory()).deep.equals(expected);
|
|
526
|
-
});
|
|
527
|
-
it('can provide edit results for sequenced edits', () => {
|
|
528
|
-
const logViewer = minimalLogViewer();
|
|
529
|
-
expect(logViewer.getEditResultFromSequenceNumber(42)).undefined;
|
|
530
|
-
// Non-sequenced edit
|
|
531
|
-
logViewer.log.addLocalEdit({ id: uuidv4(), changes: [] });
|
|
532
|
-
expect(logViewer.getEditResultFromSequenceNumber(42)).undefined;
|
|
533
|
-
// First sequenced edit
|
|
534
|
-
const edit1 = addFakeEdit(logViewer, 123);
|
|
535
|
-
expect(logViewer.getEditResultFromSequenceNumber(42)).undefined;
|
|
536
|
-
const expected1 = {
|
|
537
|
-
id: edit1.id,
|
|
538
|
-
};
|
|
539
|
-
expect(logViewer.getEditResultFromSequenceNumber(123)).contains(expected1);
|
|
540
|
-
// Check that when no such sequence number exists, the closest earlier edit is returned
|
|
541
|
-
expect(logViewer.getEditResultFromSequenceNumber(124)).contains(expected1);
|
|
542
|
-
// Second sequenced edit
|
|
543
|
-
// Note that this edit is given a greater sequence number than simply incrementing after edit 1.
|
|
544
|
-
// This is deliberately done to simulate scenarios where a given DDS may not be sent all sequenced ops (because an other DDS
|
|
545
|
-
// might be receiving them).
|
|
546
|
-
const edit2 = addFakeEdit(logViewer, 456);
|
|
547
|
-
expect(logViewer.getEditResultFromSequenceNumber(123)).contains(expected1);
|
|
548
|
-
// Check that when no such sequence number exists, the closest earlier edit is returned
|
|
549
|
-
expect(logViewer.getEditResultFromSequenceNumber(124)).contains(expected1);
|
|
550
|
-
const expected2 = {
|
|
551
|
-
id: edit2.id,
|
|
552
|
-
};
|
|
553
|
-
expect(logViewer.getEditResultFromSequenceNumber(456)).contains(expected2);
|
|
554
|
-
// Check that when no such sequence number exists, the closest earlier edit is returned
|
|
555
|
-
expect(logViewer.getEditResultFromSequenceNumber(457)).contains(expected2);
|
|
556
|
-
});
|
|
557
|
-
it('can provide the reconciliation path for an edit', () => {
|
|
558
|
-
const logViewer = minimalLogViewer();
|
|
559
|
-
function expectReconciliationPath(edit, path) {
|
|
560
|
-
const actual = logViewer.reconciliationPathFromEdit(edit.id);
|
|
561
|
-
expect(actual.length).equals(path.length);
|
|
562
|
-
for (let i = 0; i < path.length; ++i) {
|
|
563
|
-
expect(actual[i].length).equals(1);
|
|
564
|
-
const change = actual[i][0].resolvedChange;
|
|
565
|
-
expect(change.payload).equals(path[i].id);
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
// Non-sequenced edit
|
|
569
|
-
const nonSeqEdit = { id: uuidv4(), changes: [] };
|
|
570
|
-
logViewer.log.addLocalEdit(nonSeqEdit);
|
|
571
|
-
expectReconciliationPath(nonSeqEdit, []);
|
|
572
|
-
const edit1 = addFakeEdit(logViewer, 1001);
|
|
573
|
-
expectReconciliationPath(edit1, []);
|
|
574
|
-
// Note that this edit is given a greater sequence number than simply incrementing after edit 1.
|
|
575
|
-
// This is deliberately done to simulate scenarios where a given DDS may not be sent all sequenced ops (because an other DDS
|
|
576
|
-
// might be receiving them).
|
|
577
|
-
const edit2 = addFakeEdit(logViewer, 2001, 1001);
|
|
578
|
-
expectReconciliationPath(edit2, []);
|
|
579
|
-
const edit3 = addFakeEdit(logViewer, 3001, 2000);
|
|
580
|
-
expectReconciliationPath(edit3, [edit2]);
|
|
581
|
-
const edit4 = addFakeEdit(logViewer, 4001, 2500);
|
|
582
|
-
expectReconciliationPath(edit4, [edit3]);
|
|
583
|
-
const edit5 = addFakeEdit(logViewer, 5001, 500);
|
|
584
|
-
expectReconciliationPath(edit5, [edit1, edit2, edit3, edit4]);
|
|
585
|
-
});
|
|
586
|
-
});
|
|
587
|
-
});
|
|
588
|
-
//# sourceMappingURL=LogViewer.tests.js.map
|