@fluid-experimental/tree 2.0.0-rc.1.0.3 → 2.0.0-rc.2.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/{.eslintrc.js → .eslintrc.cjs} +1 -1
- package/{.mocharc.js → .mocharc.cjs} +1 -1
- package/.vscode/settings.json +1 -1
- package/CHANGELOG.md +4 -0
- package/api-report/experimental-tree.api.md +4 -15
- package/dist/ChangeCompression.d.ts +5 -5
- package/dist/ChangeCompression.d.ts.map +1 -1
- package/dist/ChangeCompression.js +24 -24
- package/dist/ChangeCompression.js.map +1 -1
- package/dist/ChangeTypes.d.ts +3 -3
- package/dist/ChangeTypes.d.ts.map +1 -1
- package/dist/ChangeTypes.js +9 -9
- package/dist/ChangeTypes.js.map +1 -1
- package/dist/Checkout.d.ts +7 -7
- package/dist/Checkout.d.ts.map +1 -1
- package/dist/Checkout.js +27 -27
- package/dist/Checkout.js.map +1 -1
- package/dist/Common.d.ts +2 -2
- package/dist/Common.d.ts.map +1 -1
- package/dist/Common.js.map +1 -1
- package/dist/EagerCheckout.d.ts +3 -3
- package/dist/EagerCheckout.d.ts.map +1 -1
- package/dist/EagerCheckout.js +2 -2
- package/dist/EagerCheckout.js.map +1 -1
- package/dist/EditLog.d.ts +4 -6
- 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 +6 -6
- package/dist/EditUtilities.d.ts.map +1 -1
- package/dist/EditUtilities.js +28 -28
- package/dist/EditUtilities.js.map +1 -1
- package/dist/Forest.d.ts +2 -2
- package/dist/Forest.d.ts.map +1 -1
- package/dist/Forest.js +13 -13
- package/dist/Forest.js.map +1 -1
- package/dist/HistoryEditFactory.d.ts +3 -3
- package/dist/HistoryEditFactory.d.ts.map +1 -1
- package/dist/HistoryEditFactory.js +36 -36
- package/dist/HistoryEditFactory.js.map +1 -1
- package/dist/IdConversion.d.ts +3 -3
- package/dist/IdConversion.d.ts.map +1 -1
- package/dist/IdConversion.js +23 -23
- package/dist/IdConversion.js.map +1 -1
- package/dist/InitialTree.d.ts +1 -1
- package/dist/InitialTree.d.ts.map +1 -1
- package/dist/InitialTree.js +2 -2
- package/dist/InitialTree.js.map +1 -1
- package/dist/LazyCheckout.d.ts +5 -5
- package/dist/LazyCheckout.d.ts.map +1 -1
- package/dist/LazyCheckout.js +2 -2
- package/dist/LazyCheckout.js.map +1 -1
- package/dist/LogViewer.d.ts +7 -7
- package/dist/LogViewer.d.ts.map +1 -1
- package/dist/LogViewer.js +25 -25
- package/dist/LogViewer.js.map +1 -1
- package/dist/MergeHealth.d.ts +1 -1
- package/dist/MergeHealth.d.ts.map +1 -1
- package/dist/MergeHealth.js +32 -32
- package/dist/MergeHealth.js.map +1 -1
- package/dist/NodeIdUtilities.d.ts +3 -3
- package/dist/NodeIdUtilities.d.ts.map +1 -1
- package/dist/NodeIdUtilities.js +4 -4
- package/dist/NodeIdUtilities.js.map +1 -1
- package/dist/PayloadUtilities.d.ts +1 -1
- package/dist/PayloadUtilities.d.ts.map +1 -1
- package/dist/PayloadUtilities.js.map +1 -1
- package/dist/ReconciliationPath.d.ts +3 -3
- package/dist/ReconciliationPath.d.ts.map +1 -1
- package/dist/ReconciliationPath.js.map +1 -1
- package/dist/RevisionValueCache.js +5 -5
- package/dist/RevisionValueCache.js.map +1 -1
- package/dist/RevisionView.d.ts +5 -5
- package/dist/RevisionView.d.ts.map +1 -1
- package/dist/RevisionView.js +11 -11
- package/dist/RevisionView.js.map +1 -1
- package/dist/SerializationUtilities.d.ts +4 -4
- package/dist/SerializationUtilities.d.ts.map +1 -1
- package/dist/SerializationUtilities.js +5 -5
- package/dist/SerializationUtilities.js.map +1 -1
- package/dist/SharedTree.d.ts +15 -18
- package/dist/SharedTree.d.ts.map +1 -1
- package/dist/SharedTree.js +154 -166
- package/dist/SharedTree.js.map +1 -1
- package/dist/SharedTreeEncoder.d.ts +8 -8
- package/dist/SharedTreeEncoder.d.ts.map +1 -1
- package/dist/SharedTreeEncoder.js +67 -67
- package/dist/SharedTreeEncoder.js.map +1 -1
- package/dist/StringInterner.d.ts +1 -1
- package/dist/StringInterner.d.ts.map +1 -1
- package/dist/StringInterner.js +2 -2
- package/dist/StringInterner.js.map +1 -1
- package/dist/Summary.d.ts +4 -4
- 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 +3 -3
- package/dist/SummaryBackCompatibility.d.ts.map +1 -1
- package/dist/SummaryBackCompatibility.js +13 -13
- package/dist/SummaryBackCompatibility.js.map +1 -1
- package/dist/SummaryTestUtilities.d.ts +2 -2
- package/dist/SummaryTestUtilities.d.ts.map +1 -1
- package/dist/SummaryTestUtilities.js.map +1 -1
- package/dist/Transaction.d.ts +4 -4
- package/dist/Transaction.d.ts.map +1 -1
- package/dist/Transaction.js +10 -10
- package/dist/Transaction.js.map +1 -1
- package/dist/TransactionInternal.d.ts +7 -7
- package/dist/TransactionInternal.d.ts.map +1 -1
- package/dist/TransactionInternal.js +87 -87
- package/dist/TransactionInternal.js.map +1 -1
- package/dist/TreeCompressor.d.ts +4 -4
- package/dist/TreeCompressor.d.ts.map +1 -1
- package/dist/TreeCompressor.js +6 -6
- package/dist/TreeCompressor.js.map +1 -1
- package/dist/TreeNodeHandle.d.ts +3 -3
- package/dist/TreeNodeHandle.d.ts.map +1 -1
- package/dist/TreeNodeHandle.js +5 -5
- package/dist/TreeNodeHandle.js.map +1 -1
- package/dist/TreeView.d.ts +3 -3
- package/dist/TreeView.d.ts.map +1 -1
- package/dist/TreeView.js +10 -10
- package/dist/TreeView.js.map +1 -1
- package/dist/TreeViewUtilities.d.ts +2 -2
- package/dist/TreeViewUtilities.d.ts.map +1 -1
- package/dist/TreeViewUtilities.js +3 -3
- package/dist/TreeViewUtilities.js.map +1 -1
- package/dist/UndoRedoHandler.d.ts +2 -2
- package/dist/UndoRedoHandler.d.ts.map +1 -1
- package/dist/UndoRedoHandler.js +5 -5
- package/dist/UndoRedoHandler.js.map +1 -1
- package/dist/UuidUtilities.d.ts +1 -1
- package/dist/UuidUtilities.d.ts.map +1 -1
- package/dist/UuidUtilities.js +3 -3
- package/dist/UuidUtilities.js.map +1 -1
- package/dist/id-compressor/AppendOnlySortedMap.js +4 -4
- package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -1
- package/dist/id-compressor/IdCompressor.d.ts +2 -2
- package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
- package/dist/id-compressor/IdCompressor.js +78 -78
- package/dist/id-compressor/IdCompressor.js.map +1 -1
- package/dist/id-compressor/IdRange.d.ts +1 -1
- package/dist/id-compressor/IdRange.d.ts.map +1 -1
- package/dist/id-compressor/IdRange.js.map +1 -1
- package/dist/id-compressor/NumericUuid.d.ts +1 -1
- package/dist/id-compressor/NumericUuid.d.ts.map +1 -1
- package/dist/id-compressor/NumericUuid.js +6 -6
- package/dist/id-compressor/NumericUuid.js.map +1 -1
- package/dist/id-compressor/SessionIdNormalizer.d.ts +2 -2
- package/dist/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
- package/dist/id-compressor/SessionIdNormalizer.js +14 -14
- package/dist/id-compressor/SessionIdNormalizer.js.map +1 -1
- package/dist/id-compressor/index.d.ts +4 -4
- package/dist/id-compressor/index.d.ts.map +1 -1
- package/dist/id-compressor/index.js +11 -11
- package/dist/id-compressor/index.js.map +1 -1
- package/dist/id-compressor/persisted-types/0.0.1.d.ts +1 -1
- package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
- package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -1
- package/dist/id-compressor/persisted-types/index.d.ts +1 -1
- package/dist/id-compressor/persisted-types/index.d.ts.map +1 -1
- package/dist/id-compressor/persisted-types/index.js.map +1 -1
- package/dist/index.d.ts +29 -29
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +73 -73
- package/dist/index.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 +5 -8
- package/dist/migration-shim/migrationDeltaHandler.js.map +1 -1
- package/dist/migration-shim/migrationShim.d.ts +1 -1
- package/dist/migration-shim/migrationShim.d.ts.map +1 -1
- package/dist/migration-shim/migrationShim.js +1 -1
- package/dist/migration-shim/migrationShim.js.map +1 -1
- package/dist/migration-shim/migrationShimFactory.d.ts +1 -1
- package/dist/migration-shim/migrationShimFactory.d.ts.map +1 -1
- package/dist/migration-shim/migrationShimFactory.js.map +1 -1
- package/dist/migration-shim/sharedTreeDeltaHandler.d.ts +1 -1
- package/dist/migration-shim/sharedTreeDeltaHandler.d.ts.map +1 -1
- package/dist/migration-shim/sharedTreeDeltaHandler.js +2 -5
- package/dist/migration-shim/sharedTreeDeltaHandler.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/package.json +3 -0
- 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 +4 -4
- package/dist/persisted-types/0.1.1.d.ts.map +1 -1
- package/dist/persisted-types/0.1.1.js +13 -13
- package/dist/persisted-types/0.1.1.js.map +1 -1
- package/dist/persisted-types/index.d.ts +2 -2
- package/dist/persisted-types/index.d.ts.map +1 -1
- package/dist/persisted-types/index.js +13 -13
- package/dist/persisted-types/index.js.map +1 -1
- package/dist/tree-alpha.d.ts +5 -8
- package/dist/tree-beta.d.ts +5 -1
- package/dist/tree-public.d.ts +5 -1
- package/dist/tree-untrimmed.d.ts +5 -8
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/ChangeCompression.d.ts +5 -5
- package/lib/ChangeCompression.d.ts.map +1 -1
- package/lib/ChangeCompression.js +3 -3
- package/lib/ChangeCompression.js.map +1 -1
- package/lib/ChangeTypes.d.ts +3 -3
- package/lib/ChangeTypes.d.ts.map +1 -1
- package/lib/ChangeTypes.js +3 -3
- package/lib/ChangeTypes.js.map +1 -1
- package/lib/Checkout.d.ts +7 -7
- package/lib/Checkout.d.ts.map +1 -1
- package/lib/Checkout.js +6 -6
- package/lib/Checkout.js.map +1 -1
- package/lib/Common.d.ts +2 -2
- package/lib/Common.d.ts.map +1 -1
- package/lib/Common.js.map +1 -1
- package/lib/EagerCheckout.d.ts +3 -3
- package/lib/EagerCheckout.d.ts.map +1 -1
- package/lib/EagerCheckout.js +1 -1
- package/lib/EagerCheckout.js.map +1 -1
- package/lib/EditLog.d.ts +4 -6
- package/lib/EditLog.d.ts.map +1 -1
- package/lib/EditLog.js +1 -1
- package/lib/EditLog.js.map +1 -1
- package/lib/EditUtilities.d.ts +6 -6
- package/lib/EditUtilities.d.ts.map +1 -1
- package/lib/EditUtilities.js +7 -7
- package/lib/EditUtilities.js.map +1 -1
- package/lib/Forest.d.ts +2 -2
- 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 +3 -3
- package/lib/HistoryEditFactory.d.ts.map +1 -1
- package/lib/HistoryEditFactory.js +7 -7
- package/lib/HistoryEditFactory.js.map +1 -1
- package/lib/IdConversion.d.ts +3 -3
- package/lib/IdConversion.d.ts.map +1 -1
- package/lib/IdConversion.js +4 -4
- package/lib/IdConversion.js.map +1 -1
- package/lib/InitialTree.d.ts +1 -1
- package/lib/InitialTree.d.ts.map +1 -1
- package/lib/InitialTree.js +1 -1
- package/lib/InitialTree.js.map +1 -1
- package/lib/LazyCheckout.d.ts +5 -5
- package/lib/LazyCheckout.d.ts.map +1 -1
- package/lib/LazyCheckout.js +1 -1
- package/lib/LazyCheckout.js.map +1 -1
- package/lib/LogViewer.d.ts +7 -7
- package/lib/LogViewer.d.ts.map +1 -1
- package/lib/LogViewer.js +4 -4
- package/lib/LogViewer.js.map +1 -1
- package/lib/MergeHealth.d.ts +1 -1
- package/lib/MergeHealth.d.ts.map +1 -1
- package/lib/MergeHealth.js +5 -5
- package/lib/MergeHealth.js.map +1 -1
- package/lib/NodeIdUtilities.d.ts +3 -3
- package/lib/NodeIdUtilities.d.ts.map +1 -1
- package/lib/NodeIdUtilities.js +2 -2
- package/lib/NodeIdUtilities.js.map +1 -1
- package/lib/PayloadUtilities.d.ts +1 -1
- package/lib/PayloadUtilities.d.ts.map +1 -1
- package/lib/PayloadUtilities.js.map +1 -1
- package/lib/ReconciliationPath.d.ts +3 -3
- package/lib/ReconciliationPath.d.ts.map +1 -1
- package/lib/ReconciliationPath.js.map +1 -1
- package/lib/RevisionValueCache.js +1 -1
- package/lib/RevisionValueCache.js.map +1 -1
- package/lib/RevisionView.d.ts +5 -5
- package/lib/RevisionView.d.ts.map +1 -1
- package/lib/RevisionView.js +3 -3
- package/lib/RevisionView.js.map +1 -1
- package/lib/SerializationUtilities.d.ts +4 -4
- package/lib/SerializationUtilities.d.ts.map +1 -1
- package/lib/SerializationUtilities.js +1 -1
- package/lib/SerializationUtilities.js.map +1 -1
- package/lib/SharedTree.d.ts +15 -18
- package/lib/SharedTree.d.ts.map +1 -1
- package/lib/SharedTree.js +28 -40
- package/lib/SharedTree.js.map +1 -1
- package/lib/SharedTreeEncoder.d.ts +8 -8
- package/lib/SharedTreeEncoder.d.ts.map +1 -1
- package/lib/SharedTreeEncoder.js +12 -12
- package/lib/SharedTreeEncoder.js.map +1 -1
- package/lib/StringInterner.d.ts +1 -1
- package/lib/StringInterner.d.ts.map +1 -1
- package/lib/StringInterner.js +1 -1
- package/lib/StringInterner.js.map +1 -1
- package/lib/Summary.d.ts +4 -4
- 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 +3 -3
- package/lib/SummaryBackCompatibility.d.ts.map +1 -1
- package/lib/SummaryBackCompatibility.js +3 -3
- package/lib/SummaryBackCompatibility.js.map +1 -1
- package/lib/SummaryTestUtilities.d.ts +2 -2
- package/lib/SummaryTestUtilities.d.ts.map +1 -1
- package/lib/SummaryTestUtilities.js.map +1 -1
- package/lib/Transaction.d.ts +4 -4
- package/lib/Transaction.d.ts.map +1 -1
- package/lib/Transaction.js +5 -5
- package/lib/Transaction.js.map +1 -1
- package/lib/TransactionInternal.d.ts +7 -7
- package/lib/TransactionInternal.d.ts.map +1 -1
- package/lib/TransactionInternal.js +5 -5
- package/lib/TransactionInternal.js.map +1 -1
- package/lib/TreeCompressor.d.ts +4 -4
- 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 +3 -3
- package/lib/TreeNodeHandle.d.ts.map +1 -1
- package/lib/TreeNodeHandle.js +1 -1
- package/lib/TreeNodeHandle.js.map +1 -1
- package/lib/TreeView.d.ts +3 -3
- package/lib/TreeView.d.ts.map +1 -1
- package/lib/TreeView.js +3 -3
- package/lib/TreeView.js.map +1 -1
- package/lib/TreeViewUtilities.d.ts +2 -2
- package/lib/TreeViewUtilities.d.ts.map +1 -1
- package/lib/TreeViewUtilities.js +1 -1
- package/lib/TreeViewUtilities.js.map +1 -1
- package/lib/UndoRedoHandler.d.ts +2 -2
- package/lib/UndoRedoHandler.d.ts.map +1 -1
- package/lib/UndoRedoHandler.js +2 -2
- package/lib/UndoRedoHandler.js.map +1 -1
- package/lib/UuidUtilities.d.ts +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.js +1 -1
- package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -1
- package/lib/id-compressor/IdCompressor.d.ts +2 -2
- package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
- package/lib/id-compressor/IdCompressor.js +6 -6
- package/lib/id-compressor/IdCompressor.js.map +1 -1
- package/lib/id-compressor/IdRange.d.ts +1 -1
- package/lib/id-compressor/IdRange.d.ts.map +1 -1
- package/lib/id-compressor/IdRange.js.map +1 -1
- package/lib/id-compressor/NumericUuid.d.ts +1 -1
- package/lib/id-compressor/NumericUuid.d.ts.map +1 -1
- package/lib/id-compressor/NumericUuid.js +2 -2
- package/lib/id-compressor/NumericUuid.js.map +1 -1
- package/lib/id-compressor/SessionIdNormalizer.d.ts +2 -2
- package/lib/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
- package/lib/id-compressor/SessionIdNormalizer.js +2 -2
- package/lib/id-compressor/SessionIdNormalizer.js.map +1 -1
- package/lib/id-compressor/index.d.ts +4 -4
- package/lib/id-compressor/index.d.ts.map +1 -1
- package/lib/id-compressor/index.js +3 -3
- package/lib/id-compressor/index.js.map +1 -1
- package/lib/id-compressor/persisted-types/0.0.1.d.ts +1 -1
- package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
- package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -1
- package/lib/id-compressor/persisted-types/index.d.ts +1 -1
- package/lib/id-compressor/persisted-types/index.d.ts.map +1 -1
- package/lib/id-compressor/persisted-types/index.js.map +1 -1
- package/lib/index.d.ts +29 -29
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +22 -22
- package/lib/index.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 +5 -8
- package/lib/migration-shim/migrationDeltaHandler.js.map +1 -1
- package/lib/migration-shim/migrationShim.d.ts +1 -1
- package/lib/migration-shim/migrationShim.d.ts.map +1 -1
- package/lib/migration-shim/migrationShim.js +1 -1
- package/lib/migration-shim/migrationShim.js.map +1 -1
- package/lib/migration-shim/migrationShimFactory.d.ts +1 -1
- package/lib/migration-shim/migrationShimFactory.d.ts.map +1 -1
- package/lib/migration-shim/migrationShimFactory.js.map +1 -1
- package/lib/migration-shim/sharedTreeDeltaHandler.d.ts +1 -1
- package/lib/migration-shim/sharedTreeDeltaHandler.d.ts.map +1 -1
- package/lib/migration-shim/sharedTreeDeltaHandler.js +2 -5
- package/lib/migration-shim/sharedTreeDeltaHandler.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/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 +4 -4
- package/lib/persisted-types/0.1.1.d.ts.map +1 -1
- package/lib/persisted-types/0.1.1.js +2 -2
- package/lib/persisted-types/0.1.1.js.map +1 -1
- package/lib/persisted-types/index.d.ts +2 -2
- package/lib/persisted-types/index.d.ts.map +1 -1
- package/lib/persisted-types/index.js +2 -2
- package/lib/persisted-types/index.js.map +1 -1
- package/lib/test/AppendOnlySortedMap.perf.tests.js +2 -2
- package/lib/test/AppendOnlySortedMap.perf.tests.js.map +1 -1
- package/lib/test/AppendOnlySortedMap.tests.js +2 -2
- package/lib/test/AppendOnlySortedMap.tests.js.map +1 -1
- package/lib/test/ChangeCompression.tests.js +9 -9
- package/lib/test/ChangeCompression.tests.js.map +1 -1
- package/lib/test/Checkout.tests.d.ts +1 -1
- package/lib/test/Checkout.tests.d.ts.map +1 -1
- package/lib/test/Checkout.tests.js +2 -2
- package/lib/test/Checkout.tests.js.map +1 -1
- package/lib/test/Common.tests.js +1 -1
- package/lib/test/Common.tests.js.map +1 -1
- package/lib/test/EagerCheckout.tests.js +4 -4
- package/lib/test/EagerCheckout.tests.js.map +1 -1
- package/lib/test/Edit.tests.js +2 -2
- package/lib/test/Edit.tests.js.map +1 -1
- package/lib/test/EditLog.perf.tests.js +4 -4
- package/lib/test/EditLog.perf.tests.js.map +1 -1
- package/lib/test/EditLog.tests.js +3 -3
- package/lib/test/EditLog.tests.js.map +1 -1
- package/lib/test/EditUtilities.tests.js +6 -6
- package/lib/test/EditUtilities.tests.js.map +1 -1
- package/lib/test/Forest.perf.tests.js +4 -4
- package/lib/test/Forest.perf.tests.js.map +1 -1
- package/lib/test/Forest.tests.js +2 -2
- package/lib/test/Forest.tests.js.map +1 -1
- package/lib/test/GenericTransaction.tests.js +3 -3
- package/lib/test/GenericTransaction.tests.js.map +1 -1
- package/lib/test/HistoryEditFactory.tests.js +4 -4
- package/lib/test/HistoryEditFactory.tests.js.map +1 -1
- package/lib/test/IdCompressor.perf.tests.js +4 -4
- package/lib/test/IdCompressor.perf.tests.js.map +1 -1
- package/lib/test/IdCompressor.tests.js +7 -7
- package/lib/test/IdCompressor.tests.js.map +1 -1
- package/lib/test/IdConversion.tests.js +3 -3
- package/lib/test/IdConversion.tests.js.map +1 -1
- package/lib/test/LazyCheckout.tests.js +4 -4
- package/lib/test/LazyCheckout.tests.js.map +1 -1
- package/lib/test/LogViewer.tests.js +12 -12
- package/lib/test/LogViewer.tests.js.map +1 -1
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +6 -6
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +1 -1
- package/lib/test/NumericUuid.perf.tests.js +3 -3
- package/lib/test/NumericUuid.perf.tests.js.map +1 -1
- package/lib/test/NumericUuid.tests.js +4 -4
- package/lib/test/NumericUuid.tests.js.map +1 -1
- package/lib/test/RevisionValueCache.tests.js +2 -2
- package/lib/test/RevisionValueCache.tests.js.map +1 -1
- package/lib/test/RevisionView.tests.js +6 -6
- package/lib/test/RevisionView.tests.js.map +1 -1
- package/lib/test/SessionIdNormalizer.tests.js +3 -3
- package/lib/test/SessionIdNormalizer.tests.js.map +1 -1
- package/lib/test/SharedTree.fuzz.tests.js +1 -1
- package/lib/test/SharedTree.fuzz.tests.js.map +1 -1
- package/lib/test/SharedTree.perf.tests.js +2 -2
- package/lib/test/SharedTree.perf.tests.js.map +1 -1
- package/lib/test/SharedTree.tests.js +7 -7
- package/lib/test/SharedTree.tests.js.map +1 -1
- package/lib/test/StringInterner.tests.js +1 -1
- package/lib/test/StringInterner.tests.js.map +1 -1
- package/lib/test/Summary.tests.d.ts +2 -2
- package/lib/test/Summary.tests.d.ts.map +1 -1
- package/lib/test/Summary.tests.js +14 -14
- package/lib/test/Summary.tests.js.map +1 -1
- package/lib/test/Transaction.tests.js +5 -5
- package/lib/test/Transaction.tests.js.map +1 -1
- package/lib/test/TransactionInternal.tests.js +7 -7
- package/lib/test/TransactionInternal.tests.js.map +1 -1
- package/lib/test/TreeCompression.tests.js +8 -8
- package/lib/test/TreeCompression.tests.js.map +1 -1
- package/lib/test/TreeView.tests.js +3 -3
- package/lib/test/TreeView.tests.js.map +1 -1
- package/lib/test/UndoRedoHandler.tests.js +2 -2
- package/lib/test/UndoRedoHandler.tests.js.map +1 -1
- package/lib/test/fuzz/Generators.d.ts +1 -1
- package/lib/test/fuzz/Generators.d.ts.map +1 -1
- package/lib/test/fuzz/Generators.js +4 -4
- package/lib/test/fuzz/Generators.js.map +1 -1
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +1 -1
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -1
- package/lib/test/fuzz/SharedTreeFuzzTests.js +5 -5
- package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -1
- package/lib/test/fuzz/Types.d.ts +6 -6
- package/lib/test/fuzz/Types.d.ts.map +1 -1
- package/lib/test/fuzz/Types.js.map +1 -1
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts +6 -6
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +1 -1
- package/lib/test/utilities/IdCompressorTestUtilities.js +6 -6
- package/lib/test/utilities/IdCompressorTestUtilities.js.map +1 -1
- package/lib/test/utilities/MockTransaction.d.ts +4 -4
- package/lib/test/utilities/MockTransaction.d.ts.map +1 -1
- package/lib/test/utilities/MockTransaction.js +3 -3
- package/lib/test/utilities/MockTransaction.js.map +1 -1
- package/lib/test/utilities/PendingLocalStateTests.d.ts +1 -1
- package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -1
- package/lib/test/utilities/PendingLocalStateTests.js +5 -5
- package/lib/test/utilities/PendingLocalStateTests.js.map +1 -1
- package/lib/test/utilities/SharedTreeTests.d.ts +2 -2
- package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeTests.js +22 -22
- package/lib/test/utilities/SharedTreeTests.js.map +1 -1
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts +1 -1
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeVersioningTests.js +10 -10
- package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -1
- package/lib/test/utilities/SummaryLoadPerfTests.js +6 -6
- package/lib/test/utilities/SummaryLoadPerfTests.js.map +1 -1
- package/lib/test/utilities/SummarySizeTests.d.ts +1 -1
- package/lib/test/utilities/SummarySizeTests.d.ts.map +1 -1
- package/lib/test/utilities/SummarySizeTests.js +5 -5
- package/lib/test/utilities/SummarySizeTests.js.map +1 -1
- package/lib/test/utilities/TestNode.d.ts +6 -6
- package/lib/test/utilities/TestNode.d.ts.map +1 -1
- package/lib/test/utilities/TestNode.js +5 -5
- package/lib/test/utilities/TestNode.js.map +1 -1
- package/lib/test/utilities/TestUtilities.d.ts +12 -12
- package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
- package/lib/test/utilities/TestUtilities.js +18 -19
- package/lib/test/utilities/TestUtilities.js.map +1 -1
- package/lib/test/utilities/UndoRedoTests.d.ts +2 -2
- package/lib/test/utilities/UndoRedoTests.d.ts.map +1 -1
- package/lib/test/utilities/UndoRedoTests.js +7 -7
- package/lib/test/utilities/UndoRedoTests.js.map +1 -1
- package/package.json +57 -31
- package/src/ChangeCompression.ts +7 -7
- package/src/ChangeTypes.ts +5 -5
- package/src/Checkout.ts +13 -13
- package/src/Common.ts +2 -2
- package/src/EagerCheckout.ts +3 -3
- package/src/EditLog.ts +6 -7
- package/src/EditUtilities.ts +10 -10
- package/src/Forest.ts +4 -4
- package/src/HistoryEditFactory.ts +11 -11
- package/src/IdConversion.ts +4 -4
- package/src/InitialTree.ts +3 -3
- package/src/LazyCheckout.ts +5 -5
- package/src/LogViewer.ts +8 -8
- package/src/MergeHealth.ts +6 -6
- package/src/NodeIdUtilities.ts +4 -4
- package/src/PayloadUtilities.ts +1 -1
- package/src/ReconciliationPath.ts +3 -3
- package/src/RevisionValueCache.ts +1 -1
- package/src/RevisionView.ts +7 -7
- package/src/SerializationUtilities.ts +5 -5
- package/src/SharedTree.ts +34 -54
- package/src/SharedTreeEncoder.ts +15 -15
- package/src/StringInterner.ts +2 -2
- package/src/Summary.ts +5 -5
- package/src/SummaryBackCompatibility.ts +10 -5
- package/src/SummaryTestUtilities.ts +3 -3
- package/src/Transaction.ts +8 -8
- package/src/TransactionInternal.ts +8 -8
- package/src/TreeCompressor.ts +6 -6
- package/src/TreeNodeHandle.ts +4 -4
- package/src/TreeView.ts +4 -4
- package/src/TreeViewUtilities.ts +3 -3
- package/src/UndoRedoHandler.ts +4 -4
- package/src/UuidUtilities.ts +2 -2
- package/src/id-compressor/AppendOnlySortedMap.ts +1 -1
- package/src/id-compressor/IdCompressor.ts +8 -8
- package/src/id-compressor/IdRange.ts +1 -1
- package/src/id-compressor/NumericUuid.ts +3 -3
- package/src/id-compressor/SessionIdNormalizer.ts +4 -4
- package/src/id-compressor/index.ts +4 -4
- package/src/id-compressor/persisted-types/0.0.1.ts +1 -1
- package/src/id-compressor/persisted-types/index.ts +1 -1
- package/src/index.ts +29 -29
- package/src/migration-shim/migrationDeltaHandler.ts +9 -10
- package/src/migration-shim/migrationShim.ts +7 -5
- package/src/migration-shim/migrationShimFactory.ts +4 -1
- package/src/migration-shim/sharedTreeDeltaHandler.ts +7 -6
- package/src/migration-shim/types.ts +1 -1
- package/src/persisted-types/0.0.2.ts +1 -1
- package/src/persisted-types/0.1.1.ts +4 -4
- package/src/persisted-types/index.ts +2 -2
- package/tsconfig.esnext.json +1 -2
- package/tsconfig.json +3 -0
- package/lib/test/Attach.tests.d.ts +0 -6
- package/lib/test/Attach.tests.d.ts.map +0 -1
- package/lib/test/Attach.tests.js +0 -52
- package/lib/test/Attach.tests.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditLog.tests.js","sourceRoot":"","sources":["../../src/test/EditLog.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 { validateAssertionError } from '@fluidframework/test-runtime-utils';\nimport { EditLog, separateEditAndId } from '../EditLog';\nimport { EditId } from '../Identifiers';\nimport { assertNotUndefined } from '../Common';\nimport { Edit } from '../persisted-types';\nimport { newEdit } from '../EditUtilities';\n\ntype DummyChange = never;\n\ndescribe('EditLog', () => {\n\tconst edit0 = newEdit([]);\n\tconst edit1 = newEdit([]);\n\tconst { id: id0, editWithoutId: editWithoutId0 } = separateEditAndId(edit0);\n\tconst { id: id1, editWithoutId: editWithoutId1 } = separateEditAndId(edit1);\n\n\tit('can be constructed from sequenced edits', () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Newly initialized log should not have local edits.');\n\t\texpect(log.numberOfSequencedEdits).to.equal(\n\t\t\teditChunks[0].chunk.length,\n\t\t\t'Log should have as many sequenced edits as it was initialized with.'\n\t\t);\n\t\texpect(log.length).to.equal(\n\t\t\teditChunks[0].chunk.length,\n\t\t\t\"Log's total length should match its sequenced edits on construction\"\n\t\t);\n\n\t\texpect(log.getIdAtIndex(0)).to.equal(id0, 'Log should have edits in order of construction.');\n\t\texpect(log.getIdAtIndex(1)).to.equal(id1, 'Log should have edits in order of construction.');\n\t});\n\n\tit('can get the index from an edit id of sequenced edits', () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\n\t\texpect(log.getIndexOfId(id0)).to.equal(0);\n\t\texpect(log.getIndexOfId(id1)).to.equal(1);\n\t});\n\n\tit('can get the index from an edit id of a local edit', () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0] }];\n\t\tconst editIds = [id0];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\t\tlog.addLocalEdit(edit1);\n\n\t\texpect(log.getIndexOfId(id0)).to.equal(0);\n\t\texpect(log.getIndexOfId(id1)).to.equal(1);\n\t});\n\n\tdescribe('tryGetIndexOfId', () => {\n\t\tit('can get the index from an existing edit', () => {\n\t\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0] }];\n\t\t\tconst editIds = [id0];\n\t\t\tconst log = new EditLog({ editChunks, editIds });\n\t\t\texpect(log.tryGetIndexOfId(id0)).to.equal(0);\n\t\t});\n\n\t\tit('returns undefined when queried with a nonexistent edit', () => {\n\t\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0] }];\n\t\t\tconst editIds = ['f9379af1-6f1a-4f71-8f8c-859359621404' as EditId];\n\t\t\tconst log = new EditLog({ editChunks, editIds });\n\t\t\texpect(log.tryGetIndexOfId('aa203fc3-bc28-437d-b01c-f9398dc859ef' as EditId)).to.equal(undefined);\n\t\t});\n\t});\n\n\tit('can get an edit from an index', async () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\n\t\texpect(log.tryGetEditAtIndex(0)?.id).to.equal(id0);\n\t\texpect(log.tryGetEditAtIndex(1)?.id).to.equal(id1);\n\t});\n\n\tit('can get an edit from an edit id', async () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\n\t\tconst editFromId0 = log.tryGetEditFromId(id0);\n\t\tconst editFromId1 = log.tryGetEditFromId(id1);\n\n\t\texpect(editFromId0).to.not.be.undefined;\n\t\texpect(editFromId1).to.not.be.undefined;\n\t\texpect(assertNotUndefined(editFromId0).id).to.equal(edit0.id);\n\t\texpect(assertNotUndefined(editFromId1).id).to.equal(edit1.id);\n\t});\n\n\tit('can be iterated', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit1);\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\n\t\t// Sequenced edits should be iterated before local edits\n\t\tconst expectedEditIdStack = [id1, id0];\n\n\t\tlog.editIds.forEach((editId) => {\n\t\t\texpect(editId).to.equal(expectedEditIdStack.pop());\n\t\t});\n\n\t\texpect(expectedEditIdStack.length).to.equal(0);\n\t});\n\n\tit('can add sequenced edits', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(log.numberOfSequencedEdits).to.equal(1);\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Log should have only sequenced edits.');\n\n\t\tlog.addSequencedEdit(edit1, { sequenceNumber: 2, referenceSequenceNumber: 1 });\n\t\texpect(log.numberOfSequencedEdits).to.equal(2);\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Log should have only sequenced edits.');\n\t\texpect(log.length).to.equal(2);\n\t});\n\n\tit('can add local edits', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit0);\n\t\texpect(log.numberOfLocalEdits).to.equal(1);\n\t\texpect(log.numberOfSequencedEdits).to.equal(0, 'Log should have only local edits.');\n\n\t\tlog.addLocalEdit(edit1);\n\t\texpect(log.numberOfLocalEdits).to.equal(2);\n\t\texpect(log.numberOfSequencedEdits).to.equal(0, 'Log should have only local edits.');\n\t\texpect(log.length).to.equal(2);\n\t});\n\n\tit('tracks the min sequence index of sequenced edits', () => {\n\t\tconst log = new EditLog();\n\n\t\texpect(log.minSequenceNumber).equals(0);\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(log.minSequenceNumber).equals(0);\n\t\tlog.addSequencedEdit(edit1, { sequenceNumber: 43, referenceSequenceNumber: 42, minimumSequenceNumber: 42 });\n\t\texpect(log.minSequenceNumber).equals(42);\n\t\tassert.throws(\n\t\t\t() =>\n\t\t\t\tlog.addSequencedEdit('fake-edit' as unknown as Edit<unknown>, {\n\t\t\t\t\tsequenceNumber: 44,\n\t\t\t\t\treferenceSequenceNumber: 43,\n\t\t\t\t}),\n\t\t\t(e: Error) => validateAssertionError(e, /min number/)\n\t\t);\n\t});\n\n\tit('detects causal ordering violations', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit0);\n\t\tlog.addLocalEdit(edit1);\n\t\tassert.throws(\n\t\t\t() => log.addSequencedEdit(edit1, { sequenceNumber: 1, referenceSequenceNumber: 0 }),\n\t\t\t(e: Error) => validateAssertionError(e, /ordering/)\n\t\t);\n\t});\n\n\tit('can sequence a local edit', async () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit0);\n\t\texpect(log.numberOfLocalEdits).to.equal(1);\n\t\tlet editFromId0 = log.tryGetEditFromId(id0);\n\t\texpect(editFromId0).to.not.be.undefined;\n\t\texpect(assertNotUndefined(editFromId0).id).equals(edit0.id, 'Log should contain local edit.');\n\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(log.length).to.equal(1);\n\t\texpect(log.numberOfSequencedEdits).to.equal(1);\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Log should have only sequenced edits.');\n\t\teditFromId0 = log.tryGetEditFromId(id0);\n\t\texpect(editFromId0).to.not.be.undefined;\n\t\texpect(assertNotUndefined(editFromId0).id).equals(edit0.id, 'Log should contain sequenced edit.');\n\t});\n\n\tit('Throws on duplicate sequenced edits', async () => {\n\t\tconst log = new EditLog();\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\tassert.throws(\n\t\t\t() => log.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 }),\n\t\t\t(e: Error) => validateAssertionError(e, /Duplicate/)\n\t\t);\n\t});\n\n\tit('can sequence multiple local edits', async () => {\n\t\tconst log = new EditLog();\n\t\tconst ids: EditId[] = [];\n\n\t\tconst numEdits = 10;\n\t\tfor (let i = 0; i < numEdits; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addLocalEdit(edit);\n\t\t\tids.push(edit.id);\n\t\t\texpect(log.getIndexOfId(edit.id)).equals(i, 'Local edits should be appended to the end of the log.');\n\t\t}\n\t\texpect(log.length).equals(log.numberOfLocalEdits).and.equals(numEdits, 'Only local edits should be present.');\n\n\t\tlog.sequenceLocalEdits();\n\n\t\texpect(log.editIds).to.deep.equal(ids, 'Sequencing a local edit should not change its index.');\n\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(numEdits, 'Only sequenced edits should be present.');\n\t});\n\n\tit('can correctly compare equality to other edit logs', () => {\n\t\tconst edit0Copy: Edit<DummyChange> = { ...edit0 };\n\t\tconst edit1Copy: Edit<DummyChange> = { ...edit1 };\n\t\tconst { editWithoutId: editWithoutId0Copy } = separateEditAndId(edit0Copy);\n\t\tconst { editWithoutId: editWithoutId1Copy } = separateEditAndId(edit1Copy);\n\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editChunksCopy = [{ startRevision: 0, chunk: [editWithoutId0Copy, editWithoutId1Copy] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log0 = new EditLog({ editChunks, editIds });\n\t\tconst log1 = new EditLog({ editChunks: editChunksCopy, editIds });\n\n\t\texpect(log0.equals(log1)).to.be.true;\n\n\t\tconst log2 = new EditLog<DummyChange>({\n\t\t\teditChunks: [{ startRevision: 0, chunk: [editWithoutId0] }],\n\t\t\teditIds: [id0],\n\t\t});\n\t\tlog2.addLocalEdit(edit1Copy);\n\n\t\texpect(log0.equals(log2)).to.be.true;\n\n\t\tconst differentLog = new EditLog({\n\t\t\teditChunks: [{ startRevision: 0, chunk: [editWithoutId0] }],\n\t\t\teditIds: [id0],\n\t\t});\n\n\t\texpect(log0.equals(differentLog)).to.be.false;\n\t});\n\n\tit('can configure a maximum size and evict edits once it grows larger than that size', () => {\n\t\tconst targetEditLogSize = 10;\n\t\tconst log = new EditLog(undefined, undefined, undefined, targetEditLogSize, targetEditLogSize * 2);\n\t\tconst ids: EditId[] = [];\n\n\t\tlet editsEvicted = 0;\n\n\t\tlog.registerEditEvictionHandler((editsToEvict) => {\n\t\t\teditsEvicted += editsToEvict;\n\t\t});\n\n\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\tsequenceNumber: i,\n\t\t\t\treferenceSequenceNumber: i - 1,\n\t\t\t});\n\t\t\tids.push(edit.id);\n\t\t\texpect(log.getIndexOfId(edit.id)).equals(i);\n\t\t}\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(targetEditLogSize, 'Only sequenced edits should be present.');\n\n\t\tconst newIds: EditId[] = [];\n\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tconst sequenceNumber = targetEditLogSize + i;\n\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\tsequenceNumber,\n\t\t\t\treferenceSequenceNumber: sequenceNumber - 1,\n\t\t\t\tminimumSequenceNumber: sequenceNumber - 1,\n\t\t\t});\n\t\t\tnewIds.push(edit.id);\n\t\t}\n\n\t\texpect(log.editIds).to.deep.equal(newIds, 'Edit IDs should have been evicted.');\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(targetEditLogSize, 'Edits should have been evicted');\n\t\texpect(editsEvicted).to.equal(targetEditLogSize);\n\n\t\t// Check that indices are the same after eviction\n\t\texpect(log.tryGetEditAtIndex(15)?.id).to.equal(ids.concat(newIds)[15]);\n\t});\n\n\tit('can handle sparse sequence numbers', () => {\n\t\tconst targetEditLogSize = 10;\n\t\tconst log = new EditLog(undefined, undefined, undefined, targetEditLogSize, targetEditLogSize * 2);\n\t\tconst sequenceNumberInterval = 3;\n\n\t\tlet editsEvicted = 0;\n\n\t\tlog.registerEditEvictionHandler((editsToEvict) => {\n\t\t\teditsEvicted += editsToEvict;\n\t\t});\n\n\t\tlet sequenceNumber = 0;\n\n\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\tsequenceNumber,\n\t\t\t\treferenceSequenceNumber: sequenceNumber - 1,\n\t\t\t});\n\t\t\tsequenceNumber += sequenceNumberInterval;\n\t\t\texpect(log.getIndexOfId(edit.id)).equals(i);\n\t\t}\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(targetEditLogSize, 'Only sequenced edits should be present.');\n\n\t\tconst extraEditsToKeep = 3;\n\t\tconst collaborationWindowSize = targetEditLogSize + extraEditsToKeep;\n\t\tconst minimumSequenceNumber = sequenceNumber - extraEditsToKeep * sequenceNumberInterval;\n\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\tsequenceNumber,\n\t\t\t\treferenceSequenceNumber: sequenceNumber - 1,\n\t\t\t\tminimumSequenceNumber,\n\t\t\t});\n\t\t\tsequenceNumber += sequenceNumberInterval;\n\t\t}\n\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(collaborationWindowSize, 'Edits should have been evicted');\n\t\texpect(editsEvicted).to.equal(targetEditLogSize * 2 - collaborationWindowSize);\n\t});\n\n\tit(\"can handle sparse sequence numbers with a minimum sequence number that's not in memory\", () => {\n\t\tconst targetEditLogSize = 10;\n\t\tconst log = new EditLog(undefined, undefined, undefined, targetEditLogSize, targetEditLogSize * 2);\n\t\tconst sequenceNumberInterval = 3;\n\n\t\tlet editsEvicted = 0;\n\n\t\tlog.registerEditEvictionHandler((editsToEvict) => {\n\t\t\teditsEvicted += editsToEvict;\n\t\t});\n\n\t\tlet sequenceNumber = 0;\n\n\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\tsequenceNumber,\n\t\t\t\treferenceSequenceNumber: sequenceNumber - 1,\n\t\t\t});\n\t\t\tsequenceNumber += sequenceNumberInterval;\n\t\t\texpect(log.getIndexOfId(edit.id)).equals(i);\n\t\t}\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(targetEditLogSize, 'Only sequenced edits should be present.');\n\n\t\tconst extraEditsToKeep = 3;\n\t\tconst collaborationWindowSize = targetEditLogSize + extraEditsToKeep;\n\t\t// Adjusts the minimum sequence number to one that's not associated with any of the edits added\n\t\tconst minimumSequenceNumber = sequenceNumber - 1 - extraEditsToKeep * sequenceNumberInterval;\n\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\tsequenceNumber,\n\t\t\t\treferenceSequenceNumber: sequenceNumber - 1,\n\t\t\t\tminimumSequenceNumber,\n\t\t\t});\n\t\t\tsequenceNumber += sequenceNumberInterval;\n\t\t}\n\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(collaborationWindowSize, 'Edits should have been evicted');\n\t\texpect(editsEvicted).to.equal(targetEditLogSize * 2 - collaborationWindowSize);\n\t});\n\n\tdescribe('does not evict edits in the collaboration window', () => {\n\t\t[0, 2, 8, 23, 50, 68, 255].forEach((startSequenceNumber) => {\n\t\t\t[1, 7, 10, 13, 52].forEach((targetEditLogSize) => {\n\t\t\t\t[2, 15, 21, Math.floor(targetEditLogSize * 1.5), targetEditLogSize * 2].forEach(\n\t\t\t\t\t(collaborationWindowSize) => {\n\t\t\t\t\t\tit(`when accepting edits starting from sequence number ${startSequenceNumber} and targeting an edit log size of ${targetEditLogSize} and a collaboration window size of ${collaborationWindowSize}`, () => {\n\t\t\t\t\t\t\tconst log = new EditLog(\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\ttargetEditLogSize,\n\t\t\t\t\t\t\t\ttargetEditLogSize * 2\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tlet editsEvicted = 0;\n\n\t\t\t\t\t\t\tlog.registerEditEvictionHandler((editsToEvict) => {\n\t\t\t\t\t\t\t\teditsEvicted += editsToEvict;\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tlet sequenceNumber = startSequenceNumber;\n\n\t\t\t\t\t\t\tconst addEditsTillEviction = (minimumSequenceNumber?: number) => {\n\t\t\t\t\t\t\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\t\t\t\t\t\t\tconst edit = newEdit([]);\n\t\t\t\t\t\t\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\t\t\t\t\t\t\tsequenceNumber,\n\t\t\t\t\t\t\t\t\t\treferenceSequenceNumber: sequenceNumber - 1,\n\t\t\t\t\t\t\t\t\t\tminimumSequenceNumber,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tsequenceNumber += 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Add enough edits to hit the target size\n\t\t\t\t\t\t\taddEditsTillEviction();\n\t\t\t\t\t\t\texpect(log.length)\n\t\t\t\t\t\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t\t\t\t\t\t.and.equals(targetEditLogSize, 'Only sequenced edits should be present.');\n\n\t\t\t\t\t\t\t// Add another set of edits to trigger eviction while setting the collaboration window size\n\t\t\t\t\t\t\tconst minimumSequenceNumber = Math.max(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tstartSequenceNumber + targetEditLogSize * 2 - collaborationWindowSize\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\taddEditsTillEviction(minimumSequenceNumber);\n\n\t\t\t\t\t\t\tconst expectedEditLogSize =\n\t\t\t\t\t\t\t\t// If the target edit log size is larger than the collaboration window size, we can evict everything we want to\n\t\t\t\t\t\t\t\ttargetEditLogSize > collaborationWindowSize\n\t\t\t\t\t\t\t\t\t? targetEditLogSize\n\t\t\t\t\t\t\t\t\t: Math.min(targetEditLogSize * 2, collaborationWindowSize);\n\t\t\t\t\t\t\texpect(log.length)\n\t\t\t\t\t\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t\t\t\t\t\t.and.equals(\n\t\t\t\t\t\t\t\t\texpectedEditLogSize,\n\t\t\t\t\t\t\t\t\t'Only edits outside the collab window should have been evicted'\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\texpect(editsEvicted).to.equal(targetEditLogSize * 2 - expectedEditLogSize);\n\n\t\t\t\t\t\t\t// Trigger a second eviction to ensure that eviction works after an eviction has already occurred\n\t\t\t\t\t\t\tconst secondMinimumSequenceNumber = Math.max(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tstartSequenceNumber + targetEditLogSize * 3 - collaborationWindowSize\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\taddEditsTillEviction(secondMinimumSequenceNumber);\n\n\t\t\t\t\t\t\tconst secondExpectedEditLogSize =\n\t\t\t\t\t\t\t\t// If the target edit log size is larger than the collaboration window size, we can evict everything we want to\n\t\t\t\t\t\t\t\ttargetEditLogSize > collaborationWindowSize\n\t\t\t\t\t\t\t\t\t? targetEditLogSize\n\t\t\t\t\t\t\t\t\t: Math.min(targetEditLogSize * 3, collaborationWindowSize);\n\t\t\t\t\t\t\texpect(log.length)\n\t\t\t\t\t\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t\t\t\t\t\t.and.equals(\n\t\t\t\t\t\t\t\t\tsecondExpectedEditLogSize,\n\t\t\t\t\t\t\t\t\t'Only edits outside the collab window should have been evicted'\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\texpect(editsEvicted).to.equal(targetEditLogSize * 3 - secondExpectedEditLogSize);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"EditLog.tests.js","sourceRoot":"","sources":["../../src/test/EditLog.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 { validateAssertionError } from '@fluidframework/test-runtime-utils';\nimport { EditLog, separateEditAndId } from '../EditLog.js';\nimport { EditId } from '../Identifiers.js';\nimport { assertNotUndefined } from '../Common.js';\nimport { Edit } from '../persisted-types/index.js';\nimport { newEdit } from '../EditUtilities.js';\n\ntype DummyChange = never;\n\ndescribe('EditLog', () => {\n\tconst edit0 = newEdit([]);\n\tconst edit1 = newEdit([]);\n\tconst { id: id0, editWithoutId: editWithoutId0 } = separateEditAndId(edit0);\n\tconst { id: id1, editWithoutId: editWithoutId1 } = separateEditAndId(edit1);\n\n\tit('can be constructed from sequenced edits', () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Newly initialized log should not have local edits.');\n\t\texpect(log.numberOfSequencedEdits).to.equal(\n\t\t\teditChunks[0].chunk.length,\n\t\t\t'Log should have as many sequenced edits as it was initialized with.'\n\t\t);\n\t\texpect(log.length).to.equal(\n\t\t\teditChunks[0].chunk.length,\n\t\t\t\"Log's total length should match its sequenced edits on construction\"\n\t\t);\n\n\t\texpect(log.getIdAtIndex(0)).to.equal(id0, 'Log should have edits in order of construction.');\n\t\texpect(log.getIdAtIndex(1)).to.equal(id1, 'Log should have edits in order of construction.');\n\t});\n\n\tit('can get the index from an edit id of sequenced edits', () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\n\t\texpect(log.getIndexOfId(id0)).to.equal(0);\n\t\texpect(log.getIndexOfId(id1)).to.equal(1);\n\t});\n\n\tit('can get the index from an edit id of a local edit', () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0] }];\n\t\tconst editIds = [id0];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\t\tlog.addLocalEdit(edit1);\n\n\t\texpect(log.getIndexOfId(id0)).to.equal(0);\n\t\texpect(log.getIndexOfId(id1)).to.equal(1);\n\t});\n\n\tdescribe('tryGetIndexOfId', () => {\n\t\tit('can get the index from an existing edit', () => {\n\t\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0] }];\n\t\t\tconst editIds = [id0];\n\t\t\tconst log = new EditLog({ editChunks, editIds });\n\t\t\texpect(log.tryGetIndexOfId(id0)).to.equal(0);\n\t\t});\n\n\t\tit('returns undefined when queried with a nonexistent edit', () => {\n\t\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0] }];\n\t\t\tconst editIds = ['f9379af1-6f1a-4f71-8f8c-859359621404' as EditId];\n\t\t\tconst log = new EditLog({ editChunks, editIds });\n\t\t\texpect(log.tryGetIndexOfId('aa203fc3-bc28-437d-b01c-f9398dc859ef' as EditId)).to.equal(undefined);\n\t\t});\n\t});\n\n\tit('can get an edit from an index', async () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\n\t\texpect(log.tryGetEditAtIndex(0)?.id).to.equal(id0);\n\t\texpect(log.tryGetEditAtIndex(1)?.id).to.equal(id1);\n\t});\n\n\tit('can get an edit from an edit id', async () => {\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log = new EditLog({ editChunks, editIds });\n\n\t\tconst editFromId0 = log.tryGetEditFromId(id0);\n\t\tconst editFromId1 = log.tryGetEditFromId(id1);\n\n\t\texpect(editFromId0).to.not.be.undefined;\n\t\texpect(editFromId1).to.not.be.undefined;\n\t\texpect(assertNotUndefined(editFromId0).id).to.equal(edit0.id);\n\t\texpect(assertNotUndefined(editFromId1).id).to.equal(edit1.id);\n\t});\n\n\tit('can be iterated', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit1);\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\n\t\t// Sequenced edits should be iterated before local edits\n\t\tconst expectedEditIdStack = [id1, id0];\n\n\t\tlog.editIds.forEach((editId) => {\n\t\t\texpect(editId).to.equal(expectedEditIdStack.pop());\n\t\t});\n\n\t\texpect(expectedEditIdStack.length).to.equal(0);\n\t});\n\n\tit('can add sequenced edits', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(log.numberOfSequencedEdits).to.equal(1);\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Log should have only sequenced edits.');\n\n\t\tlog.addSequencedEdit(edit1, { sequenceNumber: 2, referenceSequenceNumber: 1 });\n\t\texpect(log.numberOfSequencedEdits).to.equal(2);\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Log should have only sequenced edits.');\n\t\texpect(log.length).to.equal(2);\n\t});\n\n\tit('can add local edits', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit0);\n\t\texpect(log.numberOfLocalEdits).to.equal(1);\n\t\texpect(log.numberOfSequencedEdits).to.equal(0, 'Log should have only local edits.');\n\n\t\tlog.addLocalEdit(edit1);\n\t\texpect(log.numberOfLocalEdits).to.equal(2);\n\t\texpect(log.numberOfSequencedEdits).to.equal(0, 'Log should have only local edits.');\n\t\texpect(log.length).to.equal(2);\n\t});\n\n\tit('tracks the min sequence index of sequenced edits', () => {\n\t\tconst log = new EditLog();\n\n\t\texpect(log.minSequenceNumber).equals(0);\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(log.minSequenceNumber).equals(0);\n\t\tlog.addSequencedEdit(edit1, { sequenceNumber: 43, referenceSequenceNumber: 42, minimumSequenceNumber: 42 });\n\t\texpect(log.minSequenceNumber).equals(42);\n\t\tassert.throws(\n\t\t\t() =>\n\t\t\t\tlog.addSequencedEdit('fake-edit' as unknown as Edit<unknown>, {\n\t\t\t\t\tsequenceNumber: 44,\n\t\t\t\t\treferenceSequenceNumber: 43,\n\t\t\t\t}),\n\t\t\t(e: Error) => validateAssertionError(e, /min number/)\n\t\t);\n\t});\n\n\tit('detects causal ordering violations', () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit0);\n\t\tlog.addLocalEdit(edit1);\n\t\tassert.throws(\n\t\t\t() => log.addSequencedEdit(edit1, { sequenceNumber: 1, referenceSequenceNumber: 0 }),\n\t\t\t(e: Error) => validateAssertionError(e, /ordering/)\n\t\t);\n\t});\n\n\tit('can sequence a local edit', async () => {\n\t\tconst log = new EditLog();\n\n\t\tlog.addLocalEdit(edit0);\n\t\texpect(log.numberOfLocalEdits).to.equal(1);\n\t\tlet editFromId0 = log.tryGetEditFromId(id0);\n\t\texpect(editFromId0).to.not.be.undefined;\n\t\texpect(assertNotUndefined(editFromId0).id).equals(edit0.id, 'Log should contain local edit.');\n\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\texpect(log.length).to.equal(1);\n\t\texpect(log.numberOfSequencedEdits).to.equal(1);\n\t\texpect(log.numberOfLocalEdits).to.equal(0, 'Log should have only sequenced edits.');\n\t\teditFromId0 = log.tryGetEditFromId(id0);\n\t\texpect(editFromId0).to.not.be.undefined;\n\t\texpect(assertNotUndefined(editFromId0).id).equals(edit0.id, 'Log should contain sequenced edit.');\n\t});\n\n\tit('Throws on duplicate sequenced edits', async () => {\n\t\tconst log = new EditLog();\n\t\tlog.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\tassert.throws(\n\t\t\t() => log.addSequencedEdit(edit0, { sequenceNumber: 1, referenceSequenceNumber: 0 }),\n\t\t\t(e: Error) => validateAssertionError(e, /Duplicate/)\n\t\t);\n\t});\n\n\tit('can sequence multiple local edits', async () => {\n\t\tconst log = new EditLog();\n\t\tconst ids: EditId[] = [];\n\n\t\tconst numEdits = 10;\n\t\tfor (let i = 0; i < numEdits; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addLocalEdit(edit);\n\t\t\tids.push(edit.id);\n\t\t\texpect(log.getIndexOfId(edit.id)).equals(i, 'Local edits should be appended to the end of the log.');\n\t\t}\n\t\texpect(log.length).equals(log.numberOfLocalEdits).and.equals(numEdits, 'Only local edits should be present.');\n\n\t\tlog.sequenceLocalEdits();\n\n\t\texpect(log.editIds).to.deep.equal(ids, 'Sequencing a local edit should not change its index.');\n\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(numEdits, 'Only sequenced edits should be present.');\n\t});\n\n\tit('can correctly compare equality to other edit logs', () => {\n\t\tconst edit0Copy: Edit<DummyChange> = { ...edit0 };\n\t\tconst edit1Copy: Edit<DummyChange> = { ...edit1 };\n\t\tconst { editWithoutId: editWithoutId0Copy } = separateEditAndId(edit0Copy);\n\t\tconst { editWithoutId: editWithoutId1Copy } = separateEditAndId(edit1Copy);\n\n\t\tconst editChunks = [{ startRevision: 0, chunk: [editWithoutId0, editWithoutId1] }];\n\t\tconst editChunksCopy = [{ startRevision: 0, chunk: [editWithoutId0Copy, editWithoutId1Copy] }];\n\t\tconst editIds = [id0, id1];\n\n\t\tconst log0 = new EditLog({ editChunks, editIds });\n\t\tconst log1 = new EditLog({ editChunks: editChunksCopy, editIds });\n\n\t\texpect(log0.equals(log1)).to.be.true;\n\n\t\tconst log2 = new EditLog<DummyChange>({\n\t\t\teditChunks: [{ startRevision: 0, chunk: [editWithoutId0] }],\n\t\t\teditIds: [id0],\n\t\t});\n\t\tlog2.addLocalEdit(edit1Copy);\n\n\t\texpect(log0.equals(log2)).to.be.true;\n\n\t\tconst differentLog = new EditLog({\n\t\t\teditChunks: [{ startRevision: 0, chunk: [editWithoutId0] }],\n\t\t\teditIds: [id0],\n\t\t});\n\n\t\texpect(log0.equals(differentLog)).to.be.false;\n\t});\n\n\tit('can configure a maximum size and evict edits once it grows larger than that size', () => {\n\t\tconst targetEditLogSize = 10;\n\t\tconst log = new EditLog(undefined, undefined, undefined, targetEditLogSize, targetEditLogSize * 2);\n\t\tconst ids: EditId[] = [];\n\n\t\tlet editsEvicted = 0;\n\n\t\tlog.registerEditEvictionHandler((editsToEvict) => {\n\t\t\teditsEvicted += editsToEvict;\n\t\t});\n\n\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\tsequenceNumber: i,\n\t\t\t\treferenceSequenceNumber: i - 1,\n\t\t\t});\n\t\t\tids.push(edit.id);\n\t\t\texpect(log.getIndexOfId(edit.id)).equals(i);\n\t\t}\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(targetEditLogSize, 'Only sequenced edits should be present.');\n\n\t\tconst newIds: EditId[] = [];\n\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tconst sequenceNumber = targetEditLogSize + i;\n\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\tsequenceNumber,\n\t\t\t\treferenceSequenceNumber: sequenceNumber - 1,\n\t\t\t\tminimumSequenceNumber: sequenceNumber - 1,\n\t\t\t});\n\t\t\tnewIds.push(edit.id);\n\t\t}\n\n\t\texpect(log.editIds).to.deep.equal(newIds, 'Edit IDs should have been evicted.');\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(targetEditLogSize, 'Edits should have been evicted');\n\t\texpect(editsEvicted).to.equal(targetEditLogSize);\n\n\t\t// Check that indices are the same after eviction\n\t\texpect(log.tryGetEditAtIndex(15)?.id).to.equal(ids.concat(newIds)[15]);\n\t});\n\n\tit('can handle sparse sequence numbers', () => {\n\t\tconst targetEditLogSize = 10;\n\t\tconst log = new EditLog(undefined, undefined, undefined, targetEditLogSize, targetEditLogSize * 2);\n\t\tconst sequenceNumberInterval = 3;\n\n\t\tlet editsEvicted = 0;\n\n\t\tlog.registerEditEvictionHandler((editsToEvict) => {\n\t\t\teditsEvicted += editsToEvict;\n\t\t});\n\n\t\tlet sequenceNumber = 0;\n\n\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\tsequenceNumber,\n\t\t\t\treferenceSequenceNumber: sequenceNumber - 1,\n\t\t\t});\n\t\t\tsequenceNumber += sequenceNumberInterval;\n\t\t\texpect(log.getIndexOfId(edit.id)).equals(i);\n\t\t}\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(targetEditLogSize, 'Only sequenced edits should be present.');\n\n\t\tconst extraEditsToKeep = 3;\n\t\tconst collaborationWindowSize = targetEditLogSize + extraEditsToKeep;\n\t\tconst minimumSequenceNumber = sequenceNumber - extraEditsToKeep * sequenceNumberInterval;\n\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\tsequenceNumber,\n\t\t\t\treferenceSequenceNumber: sequenceNumber - 1,\n\t\t\t\tminimumSequenceNumber,\n\t\t\t});\n\t\t\tsequenceNumber += sequenceNumberInterval;\n\t\t}\n\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(collaborationWindowSize, 'Edits should have been evicted');\n\t\texpect(editsEvicted).to.equal(targetEditLogSize * 2 - collaborationWindowSize);\n\t});\n\n\tit(\"can handle sparse sequence numbers with a minimum sequence number that's not in memory\", () => {\n\t\tconst targetEditLogSize = 10;\n\t\tconst log = new EditLog(undefined, undefined, undefined, targetEditLogSize, targetEditLogSize * 2);\n\t\tconst sequenceNumberInterval = 3;\n\n\t\tlet editsEvicted = 0;\n\n\t\tlog.registerEditEvictionHandler((editsToEvict) => {\n\t\t\teditsEvicted += editsToEvict;\n\t\t});\n\n\t\tlet sequenceNumber = 0;\n\n\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\tsequenceNumber,\n\t\t\t\treferenceSequenceNumber: sequenceNumber - 1,\n\t\t\t});\n\t\t\tsequenceNumber += sequenceNumberInterval;\n\t\t\texpect(log.getIndexOfId(edit.id)).equals(i);\n\t\t}\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(targetEditLogSize, 'Only sequenced edits should be present.');\n\n\t\tconst extraEditsToKeep = 3;\n\t\tconst collaborationWindowSize = targetEditLogSize + extraEditsToKeep;\n\t\t// Adjusts the minimum sequence number to one that's not associated with any of the edits added\n\t\tconst minimumSequenceNumber = sequenceNumber - 1 - extraEditsToKeep * sequenceNumberInterval;\n\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\tconst edit = newEdit([]);\n\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\tsequenceNumber,\n\t\t\t\treferenceSequenceNumber: sequenceNumber - 1,\n\t\t\t\tminimumSequenceNumber,\n\t\t\t});\n\t\t\tsequenceNumber += sequenceNumberInterval;\n\t\t}\n\n\t\texpect(log.length)\n\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t.and.equals(collaborationWindowSize, 'Edits should have been evicted');\n\t\texpect(editsEvicted).to.equal(targetEditLogSize * 2 - collaborationWindowSize);\n\t});\n\n\tdescribe('does not evict edits in the collaboration window', () => {\n\t\t[0, 2, 8, 23, 50, 68, 255].forEach((startSequenceNumber) => {\n\t\t\t[1, 7, 10, 13, 52].forEach((targetEditLogSize) => {\n\t\t\t\t[2, 15, 21, Math.floor(targetEditLogSize * 1.5), targetEditLogSize * 2].forEach(\n\t\t\t\t\t(collaborationWindowSize) => {\n\t\t\t\t\t\tit(`when accepting edits starting from sequence number ${startSequenceNumber} and targeting an edit log size of ${targetEditLogSize} and a collaboration window size of ${collaborationWindowSize}`, () => {\n\t\t\t\t\t\t\tconst log = new EditLog(\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\ttargetEditLogSize,\n\t\t\t\t\t\t\t\ttargetEditLogSize * 2\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tlet editsEvicted = 0;\n\n\t\t\t\t\t\t\tlog.registerEditEvictionHandler((editsToEvict) => {\n\t\t\t\t\t\t\t\teditsEvicted += editsToEvict;\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tlet sequenceNumber = startSequenceNumber;\n\n\t\t\t\t\t\t\tconst addEditsTillEviction = (minimumSequenceNumber?: number) => {\n\t\t\t\t\t\t\t\tfor (let i = 0; i < targetEditLogSize; i++) {\n\t\t\t\t\t\t\t\t\tconst edit = newEdit([]);\n\t\t\t\t\t\t\t\t\tlog.addSequencedEdit(edit, {\n\t\t\t\t\t\t\t\t\t\tsequenceNumber,\n\t\t\t\t\t\t\t\t\t\treferenceSequenceNumber: sequenceNumber - 1,\n\t\t\t\t\t\t\t\t\t\tminimumSequenceNumber,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tsequenceNumber += 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Add enough edits to hit the target size\n\t\t\t\t\t\t\taddEditsTillEviction();\n\t\t\t\t\t\t\texpect(log.length)\n\t\t\t\t\t\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t\t\t\t\t\t.and.equals(targetEditLogSize, 'Only sequenced edits should be present.');\n\n\t\t\t\t\t\t\t// Add another set of edits to trigger eviction while setting the collaboration window size\n\t\t\t\t\t\t\tconst minimumSequenceNumber = Math.max(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tstartSequenceNumber + targetEditLogSize * 2 - collaborationWindowSize\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\taddEditsTillEviction(minimumSequenceNumber);\n\n\t\t\t\t\t\t\tconst expectedEditLogSize =\n\t\t\t\t\t\t\t\t// If the target edit log size is larger than the collaboration window size, we can evict everything we want to\n\t\t\t\t\t\t\t\ttargetEditLogSize > collaborationWindowSize\n\t\t\t\t\t\t\t\t\t? targetEditLogSize\n\t\t\t\t\t\t\t\t\t: Math.min(targetEditLogSize * 2, collaborationWindowSize);\n\t\t\t\t\t\t\texpect(log.length)\n\t\t\t\t\t\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t\t\t\t\t\t.and.equals(\n\t\t\t\t\t\t\t\t\texpectedEditLogSize,\n\t\t\t\t\t\t\t\t\t'Only edits outside the collab window should have been evicted'\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\texpect(editsEvicted).to.equal(targetEditLogSize * 2 - expectedEditLogSize);\n\n\t\t\t\t\t\t\t// Trigger a second eviction to ensure that eviction works after an eviction has already occurred\n\t\t\t\t\t\t\tconst secondMinimumSequenceNumber = Math.max(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tstartSequenceNumber + targetEditLogSize * 3 - collaborationWindowSize\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\taddEditsTillEviction(secondMinimumSequenceNumber);\n\n\t\t\t\t\t\t\tconst secondExpectedEditLogSize =\n\t\t\t\t\t\t\t\t// If the target edit log size is larger than the collaboration window size, we can evict everything we want to\n\t\t\t\t\t\t\t\ttargetEditLogSize > collaborationWindowSize\n\t\t\t\t\t\t\t\t\t? targetEditLogSize\n\t\t\t\t\t\t\t\t\t: Math.min(targetEditLogSize * 3, collaborationWindowSize);\n\t\t\t\t\t\t\texpect(log.length)\n\t\t\t\t\t\t\t\t.equals(log.numberOfSequencedEdits)\n\t\t\t\t\t\t\t\t.and.equals(\n\t\t\t\t\t\t\t\t\tsecondExpectedEditLogSize,\n\t\t\t\t\t\t\t\t\t'Only edits outside the collab window should have been evicted'\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\texpect(editsEvicted).to.equal(targetEditLogSize * 3 - secondExpectedEditLogSize);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
|
|
@@ -6,12 +6,12 @@ import { expect } from 'chai';
|
|
|
6
6
|
import { assert } from '@fluidframework/core-utils';
|
|
7
7
|
import { MockFluidDataStoreRuntime } from '@fluidframework/test-runtime-utils';
|
|
8
8
|
import { FluidSerializer } from '@fluidframework/shared-object-base';
|
|
9
|
-
import { getChangeNodeFromView } from '../SerializationUtilities';
|
|
10
|
-
import { noop } from '../Common';
|
|
11
|
-
import { convertTreeNodes, deepCompareNodes, internalizeBuildNode, PlaceValidationResult, RangeValidationResultKind, validateStablePlace, validateStableRange, walkTree, } from '../EditUtilities';
|
|
12
|
-
import { Side } from '../persisted-types';
|
|
13
|
-
import { comparePayloads } from '../PayloadUtilities';
|
|
14
|
-
import { refreshTestTree } from './utilities/TestUtilities';
|
|
9
|
+
import { getChangeNodeFromView } from '../SerializationUtilities.js';
|
|
10
|
+
import { noop } from '../Common.js';
|
|
11
|
+
import { convertTreeNodes, deepCompareNodes, internalizeBuildNode, PlaceValidationResult, RangeValidationResultKind, validateStablePlace, validateStableRange, walkTree, } from '../EditUtilities.js';
|
|
12
|
+
import { Side } from '../persisted-types/index.js';
|
|
13
|
+
import { comparePayloads } from '../PayloadUtilities.js';
|
|
14
|
+
import { refreshTestTree } from './utilities/TestUtilities.js';
|
|
15
15
|
describe('EditUtilities', () => {
|
|
16
16
|
const testTree = refreshTestTree(undefined, undefined, /* expensiveValidation: */ true);
|
|
17
17
|
describe('validateStablePlace', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditUtilities.tests.js","sourceRoot":"","sources":["../../src/test/EditUtilities.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 { expect } from 'chai';\nimport { assert } from '@fluidframework/core-utils';\nimport { IFluidHandle } from '@fluidframework/core-interfaces';\nimport { MockFluidDataStoreRuntime } from '@fluidframework/test-runtime-utils';\nimport { FluidSerializer } from '@fluidframework/shared-object-base';\nimport { Definition, NodeId } from '../Identifiers';\nimport { getChangeNodeFromView } from '../SerializationUtilities';\nimport { noop } from '../Common';\nimport {\n\tconvertTreeNodes,\n\tdeepCompareNodes,\n\tinternalizeBuildNode,\n\tPlaceValidationResult,\n\tRangeValidationResultKind,\n\tvalidateStablePlace,\n\tvalidateStableRange,\n\twalkTree,\n} from '../EditUtilities';\nimport { BuildNodeInternal, ChangeNode, Payload, Side, TreeNode } from '../persisted-types';\nimport { BuildNode, BuildTreeNode } from '../ChangeTypes';\nimport { comparePayloads } from '../PayloadUtilities';\nimport { refreshTestTree } from './utilities/TestUtilities';\n\ndescribe('EditUtilities', () => {\n\tconst testTree = refreshTestTree(undefined, undefined, /* expensiveValidation: */ true);\n\n\tdescribe('validateStablePlace', () => {\n\t\tit('accepts valid places', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStablePlace(testTree.view, {\n\t\t\t\t\treferenceSibling: testTree.left.identifier,\n\t\t\t\t\tside: Side.Before,\n\t\t\t\t})\n\t\t\t).deep.equals({\n\t\t\t\tresult: PlaceValidationResult.Valid,\n\t\t\t\treferenceSibling: testTree.left.identifier,\n\t\t\t\tside: Side.Before,\n\t\t\t});\n\t\t});\n\n\t\tit('detects malformed places', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStablePlace(testTree.view, {\n\t\t\t\t\treferenceTrait: testTree.left.traitLocation,\n\t\t\t\t\treferenceSibling: testTree.left.identifier,\n\t\t\t\t\tside: Side.Before,\n\t\t\t\t})\n\t\t\t).deep.equals({ result: PlaceValidationResult.Malformed });\n\t\t});\n\n\t\tit('detects missing siblings', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStablePlace(testTree.view, {\n\t\t\t\t\treferenceSibling: testTree.generateNodeId(),\n\t\t\t\t\tside: Side.Before,\n\t\t\t\t})\n\t\t\t).deep.equals({ result: PlaceValidationResult.MissingSibling });\n\t\t});\n\n\t\tit('detects missing parents', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStablePlace(testTree.view, {\n\t\t\t\t\treferenceTrait: {\n\t\t\t\t\t\tparent: testTree.generateNodeId(),\n\t\t\t\t\t\tlabel: testTree.left.traitLabel,\n\t\t\t\t\t},\n\t\t\t\t\tside: Side.Before,\n\t\t\t\t})\n\t\t\t).deep.equals({ result: PlaceValidationResult.MissingParent });\n\t\t});\n\n\t\tit('detects root places', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStablePlace(testTree.view, {\n\t\t\t\t\treferenceSibling: testTree.identifier,\n\t\t\t\t\tside: Side.Before,\n\t\t\t\t})\n\t\t\t).deep.equals({ result: PlaceValidationResult.SiblingIsRootOrDetached });\n\t\t});\n\t});\n\n\tdescribe('validateStableRange', () => {\n\t\tit('accepts valid ranges', () => {\n\t\t\tconst validatedRange = validateStableRange(testTree.view, {\n\t\t\t\tstart: { referenceSibling: testTree.left.identifier, side: Side.Before },\n\t\t\t\tend: { referenceSibling: testTree.left.identifier, side: Side.After },\n\t\t\t});\n\t\t\texpect(validatedRange.result).to.equal(RangeValidationResultKind.Valid);\n\t\t\tif (validatedRange.result === RangeValidationResultKind.Valid) {\n\t\t\t\texpect(validatedRange.start.referenceSibling).to.equal(testTree.left.identifier);\n\t\t\t\texpect(validatedRange.start.referenceTrait).to.be.undefined;\n\t\t\t\texpect(validatedRange.start.side).to.equal(Side.Before);\n\t\t\t\texpect(validatedRange.end.referenceSibling).to.equal(testTree.left.identifier);\n\t\t\t\texpect(validatedRange.end.referenceTrait).to.be.undefined;\n\t\t\t\texpect(validatedRange.end.side).to.equal(Side.After);\n\t\t\t} else {\n\t\t\t\texpect.fail();\n\t\t\t}\n\t\t});\n\n\t\tit('detects inverted ranges', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStableRange(testTree.view, {\n\t\t\t\t\tstart: { referenceSibling: testTree.left.identifier, side: Side.After },\n\t\t\t\t\tend: { referenceSibling: testTree.left.identifier, side: Side.Before },\n\t\t\t\t})\n\t\t\t).deep.equals({ result: RangeValidationResultKind.Inverted });\n\t\t});\n\n\t\tit('detects when place are in different traits', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStableRange(testTree.view, {\n\t\t\t\t\tstart: { referenceSibling: testTree.left.identifier, side: Side.Before },\n\t\t\t\t\tend: { referenceSibling: testTree.right.identifier, side: Side.After },\n\t\t\t\t})\n\t\t\t).deep.equals({ result: RangeValidationResultKind.PlacesInDifferentTraits });\n\t\t});\n\n\t\tit('detects malformed places', () => {\n\t\t\tconst start = {\n\t\t\t\treferenceTrait: testTree.left.traitLocation,\n\t\t\t\treferenceSibling: testTree.left.identifier,\n\t\t\t\tside: Side.Before,\n\t\t\t};\n\t\t\texpect(\n\t\t\t\tvalidateStableRange(testTree.view, {\n\t\t\t\t\t// trait and sibling should be mutually exclusive\n\t\t\t\t\tstart,\n\t\t\t\t\tend: { referenceSibling: testTree.left.identifier, side: Side.After },\n\t\t\t\t})\n\t\t\t).deep.equals({\n\t\t\t\tresult: {\n\t\t\t\t\tkind: RangeValidationResultKind.BadPlace,\n\t\t\t\t\tplace: start,\n\t\t\t\t\tplaceFailure: PlaceValidationResult.Malformed,\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\n\t\tit('detects invalid places', () => {\n\t\t\tconst start = {\n\t\t\t\treferenceSibling: testTree.generateNodeId(),\n\t\t\t\tside: Side.Before,\n\t\t\t};\n\t\t\texpect(\n\t\t\t\tvalidateStableRange(testTree.view, {\n\t\t\t\t\tstart,\n\t\t\t\t\tend: { referenceSibling: testTree.right.identifier, side: Side.After },\n\t\t\t\t})\n\t\t\t).deep.equals({\n\t\t\t\tresult: {\n\t\t\t\t\tkind: RangeValidationResultKind.BadPlace,\n\t\t\t\t\tplace: start,\n\t\t\t\t\tplaceFailure: PlaceValidationResult.MissingSibling,\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('Tree node conversion', () => {\n\t\tit('can clone a tree', () => {\n\t\t\tconst clone = convertTreeNodes<ChangeNode, ChangeNode>(getChangeNodeFromView(testTree.view), (node) => ({\n\t\t\t\t...node,\n\t\t\t}));\n\t\t\texpect(testTree).to.not.equal(clone);\n\t\t\texpect(deepCompareNodes(testTree, clone)).to.be.true;\n\t\t});\n\n\t\tit('can clone a leaf', () => {\n\t\t\tlet converted = false;\n\t\t\texpect(\n\t\t\t\tconvertTreeNodes(\n\t\t\t\t\t42,\n\t\t\t\t\t(n) => {\n\t\t\t\t\t\tconverted = true;\n\t\t\t\t\t\treturn n;\n\t\t\t\t\t},\n\t\t\t\t\tisNumber\n\t\t\t\t)\n\t\t\t).to.equal(42);\n\t\t\texpect(converted).to.be.false;\n\t\t});\n\n\t\tit('can clone a tree with a leaf', () => {\n\t\t\tconst leafTrait = 'main';\n\t\t\tconst leafId = testTree.generateNodeId();\n\t\t\tconst tree = {\n\t\t\t\t...testTree.buildLeaf(testTree.generateNodeId()),\n\t\t\t\tpayload: 'payload',\n\t\t\t\ttraits: { [leafTrait]: [testTree.buildLeaf(leafId)] },\n\t\t\t};\n\t\t\tconst clone = convertTreeNodes<ChangeNode, ChangeNode>(tree, (node) => ({ ...node }));\n\t\t\tassert(typeof clone !== 'number', 0x660 /* */);\n\t\t\texpect(clone.definition).to.equal(tree.definition);\n\t\t\texpect(clone.identifier).to.equal(tree.identifier);\n\t\t\texpect(clone.payload).to.equal(tree.payload);\n\t\t\texpect(clone.traits[leafTrait][0].identifier).to.equal(leafId);\n\t\t});\n\n\t\tit('correctly invokes the convert function', () => {\n\t\t\tconst node = { ...testTree.buildLeaf(testTree.generateNodeId()), payload: 'payload' };\n\t\t\tlet converted = false;\n\t\t\tconvertTreeNodes(\n\t\t\t\tnode,\n\t\t\t\t(n) => {\n\t\t\t\t\tconverted = true;\n\t\t\t\t\texpect(node.definition).to.equal(node.definition);\n\t\t\t\t\texpect(node.identifier).to.equal(node.identifier);\n\t\t\t\t\texpect(node.payload).to.equal(node.payload);\n\t\t\t\t\treturn n;\n\t\t\t\t},\n\t\t\t\tisNumber\n\t\t\t);\n\t\t\texpect(converted).to.be.true;\n\t\t});\n\n\t\tit('can convert a node', () => {\n\t\t\tconst node = { ...testTree.buildLeaf(testTree.generateNodeId()), payload: 'payload' };\n\t\t\tconst id = testTree.generateNodeId();\n\t\t\tconst converted = convertTreeNodes(\n\t\t\t\tnode,\n\t\t\t\t(_) => ({ definition: '_def' as Definition, identifier: id, payload: 'payload2' }),\n\t\t\t\tisNumber\n\t\t\t);\n\t\t\texpect(converted).to.deep.equal({ definition: '_def', identifier: id, payload: 'payload2', traits: {} });\n\t\t});\n\n\t\tit('creates empty trait objects for the root', () => {\n\t\t\tconst node: BuildTreeNode = { ...testTree.buildLeaf(testTree.generateNodeId()) };\n\t\t\tconst converted = convertTreeNodes<BuildTreeNode, TreeNode<BuildNodeInternal, NodeId>, number>(\n\t\t\t\tnode,\n\t\t\t\t(n) => internalizeBuildNode(n, testTree),\n\t\t\t\tisNumber\n\t\t\t);\n\t\t\tassert(typeof converted !== 'number', 0x661 /* unexpected detached ID */);\n\t\t\texpect(converted.traits).to.not.be.undefined;\n\t\t});\n\n\t\tit('creates empty trait objects for children', () => {\n\t\t\tconst node: BuildNode = { ...testTree.buildLeaf(), traits: { main: { ...testTree.buildLeaf() } } };\n\t\t\tconst converted = convertTreeNodes<BuildTreeNode, TreeNode<BuildNodeInternal, NodeId>, number>(\n\t\t\t\tnode,\n\t\t\t\t(n) => internalizeBuildNode(n, testTree),\n\t\t\t\tisNumber\n\t\t\t);\n\t\t\tassert(typeof converted !== 'number', 0x662 /* unexpected detached ID */);\n\t\t\texpect(converted.traits).to.not.be.undefined;\n\t\t});\n\n\t\tit('can convert a tree with children', () => {\n\t\t\tconst childA = { ...testTree.buildLeaf(testTree.generateNodeId()), payload: 'a' };\n\t\t\tconst childB = { ...testTree.buildLeaf(testTree.generateNodeId()), payload: 'b' };\n\t\t\tconst node = { ...testTree.buildLeaf(testTree.generateNodeId()), traits: { main: [childA, childB] } };\n\t\t\tconst converted = convertTreeNodes<ChangeNode, ChangeNode>(node, (node) => {\n\t\t\t\tif (node.identifier === childB.identifier) {\n\t\t\t\t\treturn { definition: node.definition, identifier: node.identifier, payload: 'c' };\n\t\t\t\t}\n\t\t\t\treturn node;\n\t\t\t});\n\t\t\texpect(converted).to.deep.equal({\n\t\t\t\tdefinition: node.definition,\n\t\t\t\tidentifier: node.identifier,\n\t\t\t\ttraits: {\n\t\t\t\t\tmain: [\n\t\t\t\t\t\t{ definition: childA.definition, identifier: childA.identifier, payload: 'a', traits: {} },\n\t\t\t\t\t\t{ definition: childB.definition, identifier: childB.identifier, payload: 'c', traits: {} },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\n\t\tit('can convert a tree with a grandchild', () => {\n\t\t\tconst grandchild = { ...testTree.buildLeaf(testTree.generateNodeId()), payload: 'g' };\n\t\t\tconst child = { ...testTree.buildLeaf(testTree.generateNodeId()), traits: { main: [grandchild] } };\n\t\t\tconst parent = { ...testTree.buildLeaf(testTree.generateNodeId()), traits: { main: [child] } };\n\t\t\tconst converted = convertTreeNodes<ChangeNode, ChangeNode>(parent, (node) => {\n\t\t\t\tif (node.identifier === grandchild.identifier) {\n\t\t\t\t\treturn { definition: node.definition, identifier: node.identifier, payload: 'h' };\n\t\t\t\t}\n\t\t\t\treturn node;\n\t\t\t});\n\t\t\texpect(converted).to.deep.equal({\n\t\t\t\tdefinition: parent.definition,\n\t\t\t\tidentifier: parent.identifier,\n\t\t\t\ttraits: {\n\t\t\t\t\tmain: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdefinition: child.definition,\n\t\t\t\t\t\t\tidentifier: child.identifier,\n\t\t\t\t\t\t\ttraits: {\n\t\t\t\t\t\t\t\tmain: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tdefinition: grandchild.definition,\n\t\t\t\t\t\t\t\t\t\tidentifier: grandchild.identifier,\n\t\t\t\t\t\t\t\t\t\tpayload: 'h',\n\t\t\t\t\t\t\t\t\t\ttraits: {},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\n\t\tit('walks trees in a consistent order', () => {\n\t\t\t// Construct two trees that are the same but have their traits defined in different orders\n\t\t\tconst buildTreeA: BuildTreeNode = {\n\t\t\t\tdefinition: 'parent',\n\t\t\t\ttraits: {\n\t\t\t\t\tleft: {\n\t\t\t\t\t\tdefinition: 'left child',\n\t\t\t\t\t\ttraits: {\n\t\t\t\t\t\t\tleft: {\n\t\t\t\t\t\t\t\tdefinition: 'left grandchild under left',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tright: {\n\t\t\t\t\t\t\t\tdefinition: 'right grandchild under left',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmain: [\n\t\t\t\t\t\t\t\t{ definition: 'grandchild A under left main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild B under left main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild C under left main' },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tright: {\n\t\t\t\t\t\tdefinition: 'right child',\n\t\t\t\t\t\ttraits: {\n\t\t\t\t\t\t\tleft: {\n\t\t\t\t\t\t\t\tdefinition: 'left grandchild under right',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tright: {\n\t\t\t\t\t\t\t\tdefinition: 'right grandchild under right',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmain: [\n\t\t\t\t\t\t\t\t{ definition: 'grandchild A under right main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild B under right main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild C under right main' },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tmain: [\n\t\t\t\t\t\t{ definition: 'child A under main' },\n\t\t\t\t\t\t{ definition: 'child B under main' },\n\t\t\t\t\t\t{ definition: 'child C under main' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst buildTreeB: BuildTreeNode = {\n\t\t\t\tdefinition: 'parent',\n\t\t\t\ttraits: {\n\t\t\t\t\tright: {\n\t\t\t\t\t\tdefinition: 'right child',\n\t\t\t\t\t\ttraits: {\n\t\t\t\t\t\t\tleft: {\n\t\t\t\t\t\t\t\tdefinition: 'left grandchild under right',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmain: [\n\t\t\t\t\t\t\t\t{ definition: 'grandchild A under right main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild B under right main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild C under right main' },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tright: {\n\t\t\t\t\t\t\t\tdefinition: 'right grandchild under right',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tmain: [\n\t\t\t\t\t\t{ definition: 'child A under main' },\n\t\t\t\t\t\t{ definition: 'child B under main' },\n\t\t\t\t\t\t{ definition: 'child C under main' },\n\t\t\t\t\t],\n\t\t\t\t\tleft: {\n\t\t\t\t\t\tdefinition: 'left child',\n\t\t\t\t\t\ttraits: {\n\t\t\t\t\t\t\tmain: [\n\t\t\t\t\t\t\t\t{ definition: 'grandchild A under left main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild B under left main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild C under left main' },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tright: {\n\t\t\t\t\t\t\t\tdefinition: 'right grandchild under left',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tleft: {\n\t\t\t\t\t\t\t\tdefinition: 'left grandchild under left',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\n\t\t\t// Record the order in which the tree walk visits each node in each tree\n\t\t\tconst definitionsA: string[] = [];\n\t\t\twalkTree<BuildTreeNode, number>(\n\t\t\t\tbuildTreeA,\n\t\t\t\t(n) => definitionsA.push(n.definition),\n\t\t\t\t(x): x is number => typeof x === 'number'\n\t\t\t);\n\n\t\t\tconst definitionsB: string[] = [];\n\t\t\twalkTree<BuildTreeNode, number>(\n\t\t\t\tbuildTreeB,\n\t\t\t\t(n) => definitionsB.push(n.definition),\n\t\t\t\t(x): x is number => typeof x === 'number'\n\t\t\t);\n\n\t\t\t// The orders should be the same, even though the trees had their traits defined in different orders\n\t\t\texpect(definitionsA).to.deep.equal(definitionsB);\n\t\t});\n\t});\n\n\tdescribe('Build tree internalization', () => {\n\t\tit('does not copy extraneous properties from input tree', () => {\n\t\t\tconst node: BuildTreeNode = {\n\t\t\t\t...testTree.buildLeaf(testTree.generateNodeId()),\n\t\t\t\ttraits: { main: [testTree.buildLeaf(testTree.generateNodeId())] },\n\t\t\t};\n\t\t\t(node as unknown as { extra: string }).extra = 'This is extra data that should not be copied';\n\t\t\tconst converted = convertTreeNodes<BuildTreeNode, TreeNode<BuildNodeInternal, NodeId>, number>(\n\t\t\t\tnode,\n\t\t\t\t(node) => internalizeBuildNode(node, testTree),\n\t\t\t\tisNumber\n\t\t\t);\n\t\t\texpect(converted).to.deep.equal({\n\t\t\t\tdefinition: node.definition,\n\t\t\t\tidentifier: node.identifier,\n\t\t\t\ttraits: node.traits,\n\t\t\t});\n\t\t});\n\n\t\tit('does not copy extraneous properties from converter', () => {\n\t\t\tconst node = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\texpect(Object.prototype.hasOwnProperty.call(node, 'payload')).to.be.false;\n\t\t\tconst converted = convertTreeNodes(node, (node) => internalizeBuildNode(node, testTree), isNumber);\n\t\t\texpect(Object.prototype.hasOwnProperty.call(converted, 'payload')).to.be.false;\n\t\t});\n\t});\n\n\tfunction isNumber(node: number | unknown): node is number {\n\t\treturn typeof node === 'number';\n\t}\n\n\tdescribe('comparePayloads', () => {\n\t\tconst serializer: FluidSerializer = new FluidSerializer(\n\t\t\tnew MockFluidDataStoreRuntime().IFluidHandleContext,\n\t\t\t() => {}\n\t\t);\n\t\tconst binder: IFluidHandle = { bind: noop } as unknown as IFluidHandle;\n\n\t\tenum Equality {\n\t\t\tEqual,\n\t\t\tUnequal,\n\t\t\tUnspecified,\n\t\t}\n\n\t\tfunction checkEquality(equal: boolean, equality: Equality): void {\n\t\t\tif (equality !== Equality.Unspecified) {\n\t\t\t\texpect(equal).equals(equality === Equality.Equal);\n\t\t\t}\n\t\t}\n\n\t\tfunction check(\n\t\t\ta: Payload,\n\t\t\tb: Payload,\n\t\t\tflags: { initial: Equality; serialized: Equality; deserialized: Equality; roundtrip: Equality }\n\t\t): void {\n\t\t\t// Check reflexive\n\t\t\texpect(comparePayloads(a, a)).equal(true);\n\t\t\texpect(comparePayloads(b, b)).equal(true);\n\n\t\t\tcheckEquality(comparePayloads(a, b), flags.initial);\n\t\t\t// Check commutative\n\t\t\tcheckEquality(comparePayloads(b, a), flags.initial);\n\n\t\t\tconst [aString, aDeserialized] = checkSerialization(a, flags.roundtrip);\n\t\t\tconst [bString, bDeserialized] = checkSerialization(b, flags.roundtrip);\n\n\t\t\tcheckEquality(aString === bString, flags.serialized);\n\t\t\tcheckEquality(comparePayloads(aDeserialized, bDeserialized), flags.deserialized);\n\t\t\t// Check commutative\n\t\t\tcheckEquality(comparePayloads(bDeserialized, aDeserialized), flags.deserialized);\n\t\t}\n\n\t\tfunction checkSerialization(a: Payload, roundtrip: Equality): [string, Payload] {\n\t\t\tconst aString = serializer.stringify(a, binder);\n\t\t\tconst a2: Payload = serializer.parse(aString);\n\t\t\tconst aString2 = serializer.stringify(a2, binder);\n\t\t\texpect(aString2).equal(aString);\n\t\t\tcheckEquality(comparePayloads(a, a2), roundtrip);\n\n\t\t\t// Check second round trip, should always be equal\n\t\t\tconst a3: Payload = serializer.parse(aString2);\n\t\t\texpect(comparePayloads(a3, a2)).true;\n\n\t\t\treturn [aString, a2];\n\t\t}\n\n\t\tconst allEqual = {\n\t\t\tinitial: Equality.Equal,\n\t\t\tserialized: Equality.Equal,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\t// For when the inputs are logically equal, but may serialize differently due to field ordering.\n\t\tconst allEqualUnstable = {\n\t\t\tinitial: Equality.Equal,\n\t\t\tserialized: Equality.Unspecified,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\tconst allUnequal = {\n\t\t\tinitial: Equality.Unequal,\n\t\t\tserialized: Equality.Unequal,\n\t\t\tdeserialized: Equality.Unequal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\tit('compares numbers correctly', () => {\n\t\t\tcheck(0, 0, allEqual);\n\t\t\tcheck(1, 1, allEqual);\n\t\t\tcheck(0, 1, allUnequal);\n\t\t\tcheck(-1, 1, allUnequal);\n\t\t\tcheck(5.2, 5.200000001, allUnequal);\n\t\t});\n\n\t\tit('compares strings', () => {\n\t\t\tcheck('', '', allEqual);\n\t\t\tcheck(' ', '', allUnequal);\n\t\t\tcheck('1', '+1', allUnequal);\n\t\t\t// This character makes sure multi-byte utf-8 and multi-word utf-16 at least somewhat work\n\t\t\t// Cases like unicode normalization are not covered here here. Normalization or not will be considered ok.\n\t\t\tcheck('𤭢', '𤭢', allEqual);\n\t\t\tcheck('𤭢', '', allUnequal);\n\t\t\tcheck('several characters', 'several characters', allEqual);\n\t\t\tcheck('several characters', 'several_characters', allUnequal);\n\t\t});\n\n\t\tit('compares arrays', () => {\n\t\t\tcheck([], [], allEqual);\n\t\t\tcheck([1], [1], allEqual);\n\t\t\tcheck([[1]], [[1]], allEqual);\n\t\t\tcheck([[1]], [[2]], allUnequal);\n\t\t\tcheck([], [1], allUnequal);\n\t\t\tcheck([1, 2], [2, 1], allUnequal);\n\t\t});\n\n\t\tit('compares objects', () => {\n\t\t\tcheck({ 1: 'x' }, { 1: 'x' }, allEqual);\n\t\t\tcheck({ x: 'x' }, { y: 'x' }, allUnequal);\n\t\t\tcheck({ x: 'x' }, { x: {} }, allUnequal);\n\t\t\tcheck({ x: {} }, { x: {} }, allEqual);\n\t\t\tcheck({ x: [1, 2, 3, 5] }, { x: [1, 2, 3, 4] }, allUnequal);\n\t\t\tcheck({ 1: 'x' }, {}, allUnequal);\n\t\t\tcheck({ x: 'x' }, { x: 'x', y: 'x' }, allUnequal);\n\t\t\tcheck({ field: 'a' }, { field: 'b' }, allUnequal);\n\n\t\t\t// Fluid Serialization arbitrarily orders fields.\n\t\t\t// Thus any object with more than one field may have non-deterministic serialization.\n\t\t\t// However objects have field order, and we need to check comparePayloads is not impacted by it.\n\t\t\tcheck({ y: 'a', x: 'b' }, { x: 'b', y: 'a' }, allEqualUnstable);\n\t\t});\n\n\t\tit('compares mixed types', () => {\n\t\t\tcheck({ 0: 1 }, [1], allUnequal);\n\t\t\t// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface)\n\t\t\tcheck(null, 'null', allUnequal);\n\t\t\tcheck(null, 'null', allUnequal);\n\t\t\tcheck(1, '1', allUnequal);\n\t\t\tcheck(null, 0, allUnequal);\n\t\t\tcheck('', 0, allUnequal);\n\t\t});\n\n\t\tconst sameAfter = {\n\t\t\tinitial: Equality.Unspecified,\n\t\t\tserialized: Equality.Unspecified,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Unspecified,\n\t\t};\n\t\tconst differentAfter = {\n\t\t\tinitial: Equality.Unequal,\n\t\t\tserialized: Equality.Unequal,\n\t\t\tdeserialized: Equality.Unequal,\n\t\t\troundtrip: Equality.Unspecified,\n\t\t};\n\n\t\tit('lossy cases', () => {\n\t\t\t// Undefined fields are omitted in json, and thus lost on the round trip.\n\t\t\tcheck({ x: undefined }, { y: undefined }, sameAfter);\n\t\t\tcheck({ x: undefined }, {}, sameAfter);\n\n\t\t\t// NaN and Infinity become null\n\t\t\tcheck(NaN, NaN, sameAfter);\n\t\t\tcheck(NaN, 7, differentAfter);\n\t\t\tcheck(Infinity, Infinity, sameAfter);\n\t\t\tcheck(-Infinity, Infinity, sameAfter);\n\t\t\tcheck(NaN, 'NaN', differentAfter);\n\n\t\t\t// json loses -0 on round trip\n\t\t\tcheck(-0, -0, sameAfter);\n\t\t});\n\n\t\tit('compares handles', () => {\n\t\t\t// This is used instead of MockHandle so equal handles compare deeply equal.\n\t\t\tfunction makeMockHandle(data: string): IFluidHandle {\n\t\t\t\t// `/` prefix is needed to prevent serializing from modifying handle.\n\t\t\t\tconst handleObject = { absolutePath: `/${data}`, IFluidHandle: undefined as unknown };\n\t\t\t\thandleObject.IFluidHandle = handleObject;\n\t\t\t\treturn handleObject as IFluidHandle;\n\t\t\t}\n\t\t\t// Theoretically handles serialize as objects with 2 fields and thus serialization is allowed to be non-deterministic\n\t\t\t// so use allEqualUnstable not allEqual.\n\t\t\tcheck(makeMockHandle('x'), makeMockHandle('x'), allEqualUnstable);\n\t\t\tcheck(makeMockHandle('x'), makeMockHandle('y'), allUnequal);\n\t\t\tcheck({ x: makeMockHandle('x') }, makeMockHandle('x'), allUnequal);\n\t\t});\n\n\t\t// These are cases that are allowed by the type system and produce unexpected results due to Json serialization.\n\t\t// Clear documentation and/or adjustments to equality, type checking or serialization would help with these cases.\n\t\tit.skip('strange cases', () => {\n\t\t\t// Top level undefined fails in JSON.parse.\n\t\t\t// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface.)\n\t\t\tcheck(undefined, null, sameAfter);\n\t\t});\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"EditUtilities.tests.js","sourceRoot":"","sources":["../../src/test/EditUtilities.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 { expect } from 'chai';\nimport { assert } from '@fluidframework/core-utils';\nimport { IFluidHandle } from '@fluidframework/core-interfaces';\nimport { MockFluidDataStoreRuntime } from '@fluidframework/test-runtime-utils';\nimport { FluidSerializer } from '@fluidframework/shared-object-base';\nimport { Definition, NodeId } from '../Identifiers.js';\nimport { getChangeNodeFromView } from '../SerializationUtilities.js';\nimport { noop } from '../Common.js';\nimport {\n\tconvertTreeNodes,\n\tdeepCompareNodes,\n\tinternalizeBuildNode,\n\tPlaceValidationResult,\n\tRangeValidationResultKind,\n\tvalidateStablePlace,\n\tvalidateStableRange,\n\twalkTree,\n} from '../EditUtilities.js';\nimport { BuildNodeInternal, ChangeNode, Payload, Side, TreeNode } from '../persisted-types/index.js';\nimport { BuildNode, BuildTreeNode } from '../ChangeTypes.js';\nimport { comparePayloads } from '../PayloadUtilities.js';\nimport { refreshTestTree } from './utilities/TestUtilities.js';\n\ndescribe('EditUtilities', () => {\n\tconst testTree = refreshTestTree(undefined, undefined, /* expensiveValidation: */ true);\n\n\tdescribe('validateStablePlace', () => {\n\t\tit('accepts valid places', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStablePlace(testTree.view, {\n\t\t\t\t\treferenceSibling: testTree.left.identifier,\n\t\t\t\t\tside: Side.Before,\n\t\t\t\t})\n\t\t\t).deep.equals({\n\t\t\t\tresult: PlaceValidationResult.Valid,\n\t\t\t\treferenceSibling: testTree.left.identifier,\n\t\t\t\tside: Side.Before,\n\t\t\t});\n\t\t});\n\n\t\tit('detects malformed places', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStablePlace(testTree.view, {\n\t\t\t\t\treferenceTrait: testTree.left.traitLocation,\n\t\t\t\t\treferenceSibling: testTree.left.identifier,\n\t\t\t\t\tside: Side.Before,\n\t\t\t\t})\n\t\t\t).deep.equals({ result: PlaceValidationResult.Malformed });\n\t\t});\n\n\t\tit('detects missing siblings', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStablePlace(testTree.view, {\n\t\t\t\t\treferenceSibling: testTree.generateNodeId(),\n\t\t\t\t\tside: Side.Before,\n\t\t\t\t})\n\t\t\t).deep.equals({ result: PlaceValidationResult.MissingSibling });\n\t\t});\n\n\t\tit('detects missing parents', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStablePlace(testTree.view, {\n\t\t\t\t\treferenceTrait: {\n\t\t\t\t\t\tparent: testTree.generateNodeId(),\n\t\t\t\t\t\tlabel: testTree.left.traitLabel,\n\t\t\t\t\t},\n\t\t\t\t\tside: Side.Before,\n\t\t\t\t})\n\t\t\t).deep.equals({ result: PlaceValidationResult.MissingParent });\n\t\t});\n\n\t\tit('detects root places', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStablePlace(testTree.view, {\n\t\t\t\t\treferenceSibling: testTree.identifier,\n\t\t\t\t\tside: Side.Before,\n\t\t\t\t})\n\t\t\t).deep.equals({ result: PlaceValidationResult.SiblingIsRootOrDetached });\n\t\t});\n\t});\n\n\tdescribe('validateStableRange', () => {\n\t\tit('accepts valid ranges', () => {\n\t\t\tconst validatedRange = validateStableRange(testTree.view, {\n\t\t\t\tstart: { referenceSibling: testTree.left.identifier, side: Side.Before },\n\t\t\t\tend: { referenceSibling: testTree.left.identifier, side: Side.After },\n\t\t\t});\n\t\t\texpect(validatedRange.result).to.equal(RangeValidationResultKind.Valid);\n\t\t\tif (validatedRange.result === RangeValidationResultKind.Valid) {\n\t\t\t\texpect(validatedRange.start.referenceSibling).to.equal(testTree.left.identifier);\n\t\t\t\texpect(validatedRange.start.referenceTrait).to.be.undefined;\n\t\t\t\texpect(validatedRange.start.side).to.equal(Side.Before);\n\t\t\t\texpect(validatedRange.end.referenceSibling).to.equal(testTree.left.identifier);\n\t\t\t\texpect(validatedRange.end.referenceTrait).to.be.undefined;\n\t\t\t\texpect(validatedRange.end.side).to.equal(Side.After);\n\t\t\t} else {\n\t\t\t\texpect.fail();\n\t\t\t}\n\t\t});\n\n\t\tit('detects inverted ranges', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStableRange(testTree.view, {\n\t\t\t\t\tstart: { referenceSibling: testTree.left.identifier, side: Side.After },\n\t\t\t\t\tend: { referenceSibling: testTree.left.identifier, side: Side.Before },\n\t\t\t\t})\n\t\t\t).deep.equals({ result: RangeValidationResultKind.Inverted });\n\t\t});\n\n\t\tit('detects when place are in different traits', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStableRange(testTree.view, {\n\t\t\t\t\tstart: { referenceSibling: testTree.left.identifier, side: Side.Before },\n\t\t\t\t\tend: { referenceSibling: testTree.right.identifier, side: Side.After },\n\t\t\t\t})\n\t\t\t).deep.equals({ result: RangeValidationResultKind.PlacesInDifferentTraits });\n\t\t});\n\n\t\tit('detects malformed places', () => {\n\t\t\tconst start = {\n\t\t\t\treferenceTrait: testTree.left.traitLocation,\n\t\t\t\treferenceSibling: testTree.left.identifier,\n\t\t\t\tside: Side.Before,\n\t\t\t};\n\t\t\texpect(\n\t\t\t\tvalidateStableRange(testTree.view, {\n\t\t\t\t\t// trait and sibling should be mutually exclusive\n\t\t\t\t\tstart,\n\t\t\t\t\tend: { referenceSibling: testTree.left.identifier, side: Side.After },\n\t\t\t\t})\n\t\t\t).deep.equals({\n\t\t\t\tresult: {\n\t\t\t\t\tkind: RangeValidationResultKind.BadPlace,\n\t\t\t\t\tplace: start,\n\t\t\t\t\tplaceFailure: PlaceValidationResult.Malformed,\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\n\t\tit('detects invalid places', () => {\n\t\t\tconst start = {\n\t\t\t\treferenceSibling: testTree.generateNodeId(),\n\t\t\t\tside: Side.Before,\n\t\t\t};\n\t\t\texpect(\n\t\t\t\tvalidateStableRange(testTree.view, {\n\t\t\t\t\tstart,\n\t\t\t\t\tend: { referenceSibling: testTree.right.identifier, side: Side.After },\n\t\t\t\t})\n\t\t\t).deep.equals({\n\t\t\t\tresult: {\n\t\t\t\t\tkind: RangeValidationResultKind.BadPlace,\n\t\t\t\t\tplace: start,\n\t\t\t\t\tplaceFailure: PlaceValidationResult.MissingSibling,\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('Tree node conversion', () => {\n\t\tit('can clone a tree', () => {\n\t\t\tconst clone = convertTreeNodes<ChangeNode, ChangeNode>(getChangeNodeFromView(testTree.view), (node) => ({\n\t\t\t\t...node,\n\t\t\t}));\n\t\t\texpect(testTree).to.not.equal(clone);\n\t\t\texpect(deepCompareNodes(testTree, clone)).to.be.true;\n\t\t});\n\n\t\tit('can clone a leaf', () => {\n\t\t\tlet converted = false;\n\t\t\texpect(\n\t\t\t\tconvertTreeNodes(\n\t\t\t\t\t42,\n\t\t\t\t\t(n) => {\n\t\t\t\t\t\tconverted = true;\n\t\t\t\t\t\treturn n;\n\t\t\t\t\t},\n\t\t\t\t\tisNumber\n\t\t\t\t)\n\t\t\t).to.equal(42);\n\t\t\texpect(converted).to.be.false;\n\t\t});\n\n\t\tit('can clone a tree with a leaf', () => {\n\t\t\tconst leafTrait = 'main';\n\t\t\tconst leafId = testTree.generateNodeId();\n\t\t\tconst tree = {\n\t\t\t\t...testTree.buildLeaf(testTree.generateNodeId()),\n\t\t\t\tpayload: 'payload',\n\t\t\t\ttraits: { [leafTrait]: [testTree.buildLeaf(leafId)] },\n\t\t\t};\n\t\t\tconst clone = convertTreeNodes<ChangeNode, ChangeNode>(tree, (node) => ({ ...node }));\n\t\t\tassert(typeof clone !== 'number', 0x660 /* */);\n\t\t\texpect(clone.definition).to.equal(tree.definition);\n\t\t\texpect(clone.identifier).to.equal(tree.identifier);\n\t\t\texpect(clone.payload).to.equal(tree.payload);\n\t\t\texpect(clone.traits[leafTrait][0].identifier).to.equal(leafId);\n\t\t});\n\n\t\tit('correctly invokes the convert function', () => {\n\t\t\tconst node = { ...testTree.buildLeaf(testTree.generateNodeId()), payload: 'payload' };\n\t\t\tlet converted = false;\n\t\t\tconvertTreeNodes(\n\t\t\t\tnode,\n\t\t\t\t(n) => {\n\t\t\t\t\tconverted = true;\n\t\t\t\t\texpect(node.definition).to.equal(node.definition);\n\t\t\t\t\texpect(node.identifier).to.equal(node.identifier);\n\t\t\t\t\texpect(node.payload).to.equal(node.payload);\n\t\t\t\t\treturn n;\n\t\t\t\t},\n\t\t\t\tisNumber\n\t\t\t);\n\t\t\texpect(converted).to.be.true;\n\t\t});\n\n\t\tit('can convert a node', () => {\n\t\t\tconst node = { ...testTree.buildLeaf(testTree.generateNodeId()), payload: 'payload' };\n\t\t\tconst id = testTree.generateNodeId();\n\t\t\tconst converted = convertTreeNodes(\n\t\t\t\tnode,\n\t\t\t\t(_) => ({ definition: '_def' as Definition, identifier: id, payload: 'payload2' }),\n\t\t\t\tisNumber\n\t\t\t);\n\t\t\texpect(converted).to.deep.equal({ definition: '_def', identifier: id, payload: 'payload2', traits: {} });\n\t\t});\n\n\t\tit('creates empty trait objects for the root', () => {\n\t\t\tconst node: BuildTreeNode = { ...testTree.buildLeaf(testTree.generateNodeId()) };\n\t\t\tconst converted = convertTreeNodes<BuildTreeNode, TreeNode<BuildNodeInternal, NodeId>, number>(\n\t\t\t\tnode,\n\t\t\t\t(n) => internalizeBuildNode(n, testTree),\n\t\t\t\tisNumber\n\t\t\t);\n\t\t\tassert(typeof converted !== 'number', 0x661 /* unexpected detached ID */);\n\t\t\texpect(converted.traits).to.not.be.undefined;\n\t\t});\n\n\t\tit('creates empty trait objects for children', () => {\n\t\t\tconst node: BuildNode = { ...testTree.buildLeaf(), traits: { main: { ...testTree.buildLeaf() } } };\n\t\t\tconst converted = convertTreeNodes<BuildTreeNode, TreeNode<BuildNodeInternal, NodeId>, number>(\n\t\t\t\tnode,\n\t\t\t\t(n) => internalizeBuildNode(n, testTree),\n\t\t\t\tisNumber\n\t\t\t);\n\t\t\tassert(typeof converted !== 'number', 0x662 /* unexpected detached ID */);\n\t\t\texpect(converted.traits).to.not.be.undefined;\n\t\t});\n\n\t\tit('can convert a tree with children', () => {\n\t\t\tconst childA = { ...testTree.buildLeaf(testTree.generateNodeId()), payload: 'a' };\n\t\t\tconst childB = { ...testTree.buildLeaf(testTree.generateNodeId()), payload: 'b' };\n\t\t\tconst node = { ...testTree.buildLeaf(testTree.generateNodeId()), traits: { main: [childA, childB] } };\n\t\t\tconst converted = convertTreeNodes<ChangeNode, ChangeNode>(node, (node) => {\n\t\t\t\tif (node.identifier === childB.identifier) {\n\t\t\t\t\treturn { definition: node.definition, identifier: node.identifier, payload: 'c' };\n\t\t\t\t}\n\t\t\t\treturn node;\n\t\t\t});\n\t\t\texpect(converted).to.deep.equal({\n\t\t\t\tdefinition: node.definition,\n\t\t\t\tidentifier: node.identifier,\n\t\t\t\ttraits: {\n\t\t\t\t\tmain: [\n\t\t\t\t\t\t{ definition: childA.definition, identifier: childA.identifier, payload: 'a', traits: {} },\n\t\t\t\t\t\t{ definition: childB.definition, identifier: childB.identifier, payload: 'c', traits: {} },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\n\t\tit('can convert a tree with a grandchild', () => {\n\t\t\tconst grandchild = { ...testTree.buildLeaf(testTree.generateNodeId()), payload: 'g' };\n\t\t\tconst child = { ...testTree.buildLeaf(testTree.generateNodeId()), traits: { main: [grandchild] } };\n\t\t\tconst parent = { ...testTree.buildLeaf(testTree.generateNodeId()), traits: { main: [child] } };\n\t\t\tconst converted = convertTreeNodes<ChangeNode, ChangeNode>(parent, (node) => {\n\t\t\t\tif (node.identifier === grandchild.identifier) {\n\t\t\t\t\treturn { definition: node.definition, identifier: node.identifier, payload: 'h' };\n\t\t\t\t}\n\t\t\t\treturn node;\n\t\t\t});\n\t\t\texpect(converted).to.deep.equal({\n\t\t\t\tdefinition: parent.definition,\n\t\t\t\tidentifier: parent.identifier,\n\t\t\t\ttraits: {\n\t\t\t\t\tmain: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdefinition: child.definition,\n\t\t\t\t\t\t\tidentifier: child.identifier,\n\t\t\t\t\t\t\ttraits: {\n\t\t\t\t\t\t\t\tmain: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tdefinition: grandchild.definition,\n\t\t\t\t\t\t\t\t\t\tidentifier: grandchild.identifier,\n\t\t\t\t\t\t\t\t\t\tpayload: 'h',\n\t\t\t\t\t\t\t\t\t\ttraits: {},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\n\t\tit('walks trees in a consistent order', () => {\n\t\t\t// Construct two trees that are the same but have their traits defined in different orders\n\t\t\tconst buildTreeA: BuildTreeNode = {\n\t\t\t\tdefinition: 'parent',\n\t\t\t\ttraits: {\n\t\t\t\t\tleft: {\n\t\t\t\t\t\tdefinition: 'left child',\n\t\t\t\t\t\ttraits: {\n\t\t\t\t\t\t\tleft: {\n\t\t\t\t\t\t\t\tdefinition: 'left grandchild under left',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tright: {\n\t\t\t\t\t\t\t\tdefinition: 'right grandchild under left',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmain: [\n\t\t\t\t\t\t\t\t{ definition: 'grandchild A under left main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild B under left main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild C under left main' },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tright: {\n\t\t\t\t\t\tdefinition: 'right child',\n\t\t\t\t\t\ttraits: {\n\t\t\t\t\t\t\tleft: {\n\t\t\t\t\t\t\t\tdefinition: 'left grandchild under right',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tright: {\n\t\t\t\t\t\t\t\tdefinition: 'right grandchild under right',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmain: [\n\t\t\t\t\t\t\t\t{ definition: 'grandchild A under right main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild B under right main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild C under right main' },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tmain: [\n\t\t\t\t\t\t{ definition: 'child A under main' },\n\t\t\t\t\t\t{ definition: 'child B under main' },\n\t\t\t\t\t\t{ definition: 'child C under main' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst buildTreeB: BuildTreeNode = {\n\t\t\t\tdefinition: 'parent',\n\t\t\t\ttraits: {\n\t\t\t\t\tright: {\n\t\t\t\t\t\tdefinition: 'right child',\n\t\t\t\t\t\ttraits: {\n\t\t\t\t\t\t\tleft: {\n\t\t\t\t\t\t\t\tdefinition: 'left grandchild under right',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmain: [\n\t\t\t\t\t\t\t\t{ definition: 'grandchild A under right main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild B under right main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild C under right main' },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tright: {\n\t\t\t\t\t\t\t\tdefinition: 'right grandchild under right',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tmain: [\n\t\t\t\t\t\t{ definition: 'child A under main' },\n\t\t\t\t\t\t{ definition: 'child B under main' },\n\t\t\t\t\t\t{ definition: 'child C under main' },\n\t\t\t\t\t],\n\t\t\t\t\tleft: {\n\t\t\t\t\t\tdefinition: 'left child',\n\t\t\t\t\t\ttraits: {\n\t\t\t\t\t\t\tmain: [\n\t\t\t\t\t\t\t\t{ definition: 'grandchild A under left main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild B under left main' },\n\t\t\t\t\t\t\t\t{ definition: 'grandchild C under left main' },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tright: {\n\t\t\t\t\t\t\t\tdefinition: 'right grandchild under left',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tleft: {\n\t\t\t\t\t\t\t\tdefinition: 'left grandchild under left',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\n\t\t\t// Record the order in which the tree walk visits each node in each tree\n\t\t\tconst definitionsA: string[] = [];\n\t\t\twalkTree<BuildTreeNode, number>(\n\t\t\t\tbuildTreeA,\n\t\t\t\t(n) => definitionsA.push(n.definition),\n\t\t\t\t(x): x is number => typeof x === 'number'\n\t\t\t);\n\n\t\t\tconst definitionsB: string[] = [];\n\t\t\twalkTree<BuildTreeNode, number>(\n\t\t\t\tbuildTreeB,\n\t\t\t\t(n) => definitionsB.push(n.definition),\n\t\t\t\t(x): x is number => typeof x === 'number'\n\t\t\t);\n\n\t\t\t// The orders should be the same, even though the trees had their traits defined in different orders\n\t\t\texpect(definitionsA).to.deep.equal(definitionsB);\n\t\t});\n\t});\n\n\tdescribe('Build tree internalization', () => {\n\t\tit('does not copy extraneous properties from input tree', () => {\n\t\t\tconst node: BuildTreeNode = {\n\t\t\t\t...testTree.buildLeaf(testTree.generateNodeId()),\n\t\t\t\ttraits: { main: [testTree.buildLeaf(testTree.generateNodeId())] },\n\t\t\t};\n\t\t\t(node as unknown as { extra: string }).extra = 'This is extra data that should not be copied';\n\t\t\tconst converted = convertTreeNodes<BuildTreeNode, TreeNode<BuildNodeInternal, NodeId>, number>(\n\t\t\t\tnode,\n\t\t\t\t(node) => internalizeBuildNode(node, testTree),\n\t\t\t\tisNumber\n\t\t\t);\n\t\t\texpect(converted).to.deep.equal({\n\t\t\t\tdefinition: node.definition,\n\t\t\t\tidentifier: node.identifier,\n\t\t\t\ttraits: node.traits,\n\t\t\t});\n\t\t});\n\n\t\tit('does not copy extraneous properties from converter', () => {\n\t\t\tconst node = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\texpect(Object.prototype.hasOwnProperty.call(node, 'payload')).to.be.false;\n\t\t\tconst converted = convertTreeNodes(node, (node) => internalizeBuildNode(node, testTree), isNumber);\n\t\t\texpect(Object.prototype.hasOwnProperty.call(converted, 'payload')).to.be.false;\n\t\t});\n\t});\n\n\tfunction isNumber(node: number | unknown): node is number {\n\t\treturn typeof node === 'number';\n\t}\n\n\tdescribe('comparePayloads', () => {\n\t\tconst serializer: FluidSerializer = new FluidSerializer(\n\t\t\tnew MockFluidDataStoreRuntime().IFluidHandleContext,\n\t\t\t() => {}\n\t\t);\n\t\tconst binder: IFluidHandle = { bind: noop } as unknown as IFluidHandle;\n\n\t\tenum Equality {\n\t\t\tEqual,\n\t\t\tUnequal,\n\t\t\tUnspecified,\n\t\t}\n\n\t\tfunction checkEquality(equal: boolean, equality: Equality): void {\n\t\t\tif (equality !== Equality.Unspecified) {\n\t\t\t\texpect(equal).equals(equality === Equality.Equal);\n\t\t\t}\n\t\t}\n\n\t\tfunction check(\n\t\t\ta: Payload,\n\t\t\tb: Payload,\n\t\t\tflags: { initial: Equality; serialized: Equality; deserialized: Equality; roundtrip: Equality }\n\t\t): void {\n\t\t\t// Check reflexive\n\t\t\texpect(comparePayloads(a, a)).equal(true);\n\t\t\texpect(comparePayloads(b, b)).equal(true);\n\n\t\t\tcheckEquality(comparePayloads(a, b), flags.initial);\n\t\t\t// Check commutative\n\t\t\tcheckEquality(comparePayloads(b, a), flags.initial);\n\n\t\t\tconst [aString, aDeserialized] = checkSerialization(a, flags.roundtrip);\n\t\t\tconst [bString, bDeserialized] = checkSerialization(b, flags.roundtrip);\n\n\t\t\tcheckEquality(aString === bString, flags.serialized);\n\t\t\tcheckEquality(comparePayloads(aDeserialized, bDeserialized), flags.deserialized);\n\t\t\t// Check commutative\n\t\t\tcheckEquality(comparePayloads(bDeserialized, aDeserialized), flags.deserialized);\n\t\t}\n\n\t\tfunction checkSerialization(a: Payload, roundtrip: Equality): [string, Payload] {\n\t\t\tconst aString = serializer.stringify(a, binder);\n\t\t\tconst a2: Payload = serializer.parse(aString);\n\t\t\tconst aString2 = serializer.stringify(a2, binder);\n\t\t\texpect(aString2).equal(aString);\n\t\t\tcheckEquality(comparePayloads(a, a2), roundtrip);\n\n\t\t\t// Check second round trip, should always be equal\n\t\t\tconst a3: Payload = serializer.parse(aString2);\n\t\t\texpect(comparePayloads(a3, a2)).true;\n\n\t\t\treturn [aString, a2];\n\t\t}\n\n\t\tconst allEqual = {\n\t\t\tinitial: Equality.Equal,\n\t\t\tserialized: Equality.Equal,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\t// For when the inputs are logically equal, but may serialize differently due to field ordering.\n\t\tconst allEqualUnstable = {\n\t\t\tinitial: Equality.Equal,\n\t\t\tserialized: Equality.Unspecified,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\tconst allUnequal = {\n\t\t\tinitial: Equality.Unequal,\n\t\t\tserialized: Equality.Unequal,\n\t\t\tdeserialized: Equality.Unequal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\tit('compares numbers correctly', () => {\n\t\t\tcheck(0, 0, allEqual);\n\t\t\tcheck(1, 1, allEqual);\n\t\t\tcheck(0, 1, allUnequal);\n\t\t\tcheck(-1, 1, allUnequal);\n\t\t\tcheck(5.2, 5.200000001, allUnequal);\n\t\t});\n\n\t\tit('compares strings', () => {\n\t\t\tcheck('', '', allEqual);\n\t\t\tcheck(' ', '', allUnequal);\n\t\t\tcheck('1', '+1', allUnequal);\n\t\t\t// This character makes sure multi-byte utf-8 and multi-word utf-16 at least somewhat work\n\t\t\t// Cases like unicode normalization are not covered here here. Normalization or not will be considered ok.\n\t\t\tcheck('𤭢', '𤭢', allEqual);\n\t\t\tcheck('𤭢', '', allUnequal);\n\t\t\tcheck('several characters', 'several characters', allEqual);\n\t\t\tcheck('several characters', 'several_characters', allUnequal);\n\t\t});\n\n\t\tit('compares arrays', () => {\n\t\t\tcheck([], [], allEqual);\n\t\t\tcheck([1], [1], allEqual);\n\t\t\tcheck([[1]], [[1]], allEqual);\n\t\t\tcheck([[1]], [[2]], allUnequal);\n\t\t\tcheck([], [1], allUnequal);\n\t\t\tcheck([1, 2], [2, 1], allUnequal);\n\t\t});\n\n\t\tit('compares objects', () => {\n\t\t\tcheck({ 1: 'x' }, { 1: 'x' }, allEqual);\n\t\t\tcheck({ x: 'x' }, { y: 'x' }, allUnequal);\n\t\t\tcheck({ x: 'x' }, { x: {} }, allUnequal);\n\t\t\tcheck({ x: {} }, { x: {} }, allEqual);\n\t\t\tcheck({ x: [1, 2, 3, 5] }, { x: [1, 2, 3, 4] }, allUnequal);\n\t\t\tcheck({ 1: 'x' }, {}, allUnequal);\n\t\t\tcheck({ x: 'x' }, { x: 'x', y: 'x' }, allUnequal);\n\t\t\tcheck({ field: 'a' }, { field: 'b' }, allUnequal);\n\n\t\t\t// Fluid Serialization arbitrarily orders fields.\n\t\t\t// Thus any object with more than one field may have non-deterministic serialization.\n\t\t\t// However objects have field order, and we need to check comparePayloads is not impacted by it.\n\t\t\tcheck({ y: 'a', x: 'b' }, { x: 'b', y: 'a' }, allEqualUnstable);\n\t\t});\n\n\t\tit('compares mixed types', () => {\n\t\t\tcheck({ 0: 1 }, [1], allUnequal);\n\t\t\t// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface)\n\t\t\tcheck(null, 'null', allUnequal);\n\t\t\tcheck(null, 'null', allUnequal);\n\t\t\tcheck(1, '1', allUnequal);\n\t\t\tcheck(null, 0, allUnequal);\n\t\t\tcheck('', 0, allUnequal);\n\t\t});\n\n\t\tconst sameAfter = {\n\t\t\tinitial: Equality.Unspecified,\n\t\t\tserialized: Equality.Unspecified,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Unspecified,\n\t\t};\n\t\tconst differentAfter = {\n\t\t\tinitial: Equality.Unequal,\n\t\t\tserialized: Equality.Unequal,\n\t\t\tdeserialized: Equality.Unequal,\n\t\t\troundtrip: Equality.Unspecified,\n\t\t};\n\n\t\tit('lossy cases', () => {\n\t\t\t// Undefined fields are omitted in json, and thus lost on the round trip.\n\t\t\tcheck({ x: undefined }, { y: undefined }, sameAfter);\n\t\t\tcheck({ x: undefined }, {}, sameAfter);\n\n\t\t\t// NaN and Infinity become null\n\t\t\tcheck(NaN, NaN, sameAfter);\n\t\t\tcheck(NaN, 7, differentAfter);\n\t\t\tcheck(Infinity, Infinity, sameAfter);\n\t\t\tcheck(-Infinity, Infinity, sameAfter);\n\t\t\tcheck(NaN, 'NaN', differentAfter);\n\n\t\t\t// json loses -0 on round trip\n\t\t\tcheck(-0, -0, sameAfter);\n\t\t});\n\n\t\tit('compares handles', () => {\n\t\t\t// This is used instead of MockHandle so equal handles compare deeply equal.\n\t\t\tfunction makeMockHandle(data: string): IFluidHandle {\n\t\t\t\t// `/` prefix is needed to prevent serializing from modifying handle.\n\t\t\t\tconst handleObject = { absolutePath: `/${data}`, IFluidHandle: undefined as unknown };\n\t\t\t\thandleObject.IFluidHandle = handleObject;\n\t\t\t\treturn handleObject as IFluidHandle;\n\t\t\t}\n\t\t\t// Theoretically handles serialize as objects with 2 fields and thus serialization is allowed to be non-deterministic\n\t\t\t// so use allEqualUnstable not allEqual.\n\t\t\tcheck(makeMockHandle('x'), makeMockHandle('x'), allEqualUnstable);\n\t\t\tcheck(makeMockHandle('x'), makeMockHandle('y'), allUnequal);\n\t\t\tcheck({ x: makeMockHandle('x') }, makeMockHandle('x'), allUnequal);\n\t\t});\n\n\t\t// These are cases that are allowed by the type system and produce unexpected results due to Json serialization.\n\t\t// Clear documentation and/or adjustments to equality, type checking or serialization would help with these cases.\n\t\tit.skip('strange cases', () => {\n\t\t\t// Top level undefined fails in JSON.parse.\n\t\t\t// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface.)\n\t\t\tcheck(undefined, null, sameAfter);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
import { strict as assert } from 'assert';
|
|
6
6
|
import { benchmark, BenchmarkType, isInPerformanceTestingMode } from '@fluid-tools/benchmark';
|
|
7
7
|
import { v4 } from 'uuid';
|
|
8
|
-
import { Forest } from '../Forest';
|
|
9
|
-
import { RevisionView } from '../RevisionView';
|
|
10
|
-
import { Side } from '../persisted-types';
|
|
11
|
-
import { refreshTestTree } from './utilities/TestUtilities';
|
|
8
|
+
import { Forest } from '../Forest.js';
|
|
9
|
+
import { RevisionView } from '../RevisionView.js';
|
|
10
|
+
import { Side } from '../persisted-types/index.js';
|
|
11
|
+
import { refreshTestTree } from './utilities/TestUtilities.js';
|
|
12
12
|
describe('Forest Perf', () => {
|
|
13
13
|
const testTree = refreshTestTree();
|
|
14
14
|
// Larger sizes can slow down correctness test runs, or even time out, so only run smaller sizes as correctness tests.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Forest.perf.tests.js","sourceRoot":"","sources":["../../src/test/Forest.perf.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAG1B,OAAO,EAAE,MAAM,EAAc,MAAM,
|
|
1
|
+
{"version":3,"file":"Forest.perf.tests.js","sourceRoot":"","sources":["../../src/test/Forest.perf.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAG1B,OAAO,EAAE,MAAM,EAAc,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAc,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC5B,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,sHAAsH;IACtH,MAAM,KAAK,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAK,EAAE,KAAM,EAAE,MAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAK,CAAC,CAAC;IAExF,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE;QAC1B,kFAAkF;QAClF,MAAM,IAAI,GAAG,KAAK,KAAK,KAAM,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC;QAEtF,SAAS,CAAC;YACT,IAAI;YACJ,KAAK,EAAE,GAAG,KAAK,6BAA6B;YAC5C,WAAW,EAAE,GAAG,EAAE;gBACjB,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;SACD,CAAC,CAAC;QAEH,IAAI,KAA+B,CAAC;QACpC,IAAI,MAA0B,CAAC;QAC/B,SAAS,CAAC;YACT,IAAI;YACJ,KAAK,EAAE,QAAQ,KAAK,gBAAgB;YACpC,MAAM,EAAE,GAAG,EAAE;gBACZ,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACpD,CAAC;YACD,WAAW,EAAE,GAAG,EAAE;gBACjB,oEAAoE;gBACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAM,EAAE,MAAO,CAAC,CAAC;gBACpC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;YACzB,CAAC;YACD,KAAK,EAAE,GAAG,EAAE;gBACX,KAAK,GAAG,SAAS,CAAC;gBAClB,MAAM,GAAG,SAAS,CAAC;YACpB,CAAC;SACD,CAAC,CAAC;QAEH,IAAI,MAA0B,CAAC;QAC/B,IAAI,KAAmB,CAAC;QACxB,SAAS,CAAC;YACT,IAAI;YACJ,KAAK,EAAE,UAAU,KAAK,oBAAoB;YAC1C,MAAM,EAAE,GAAG,EAAE;gBACZ,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC7B,KAAK,GAAG,EAAE,CAAC;gBACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;oBAC/B,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;iBACzC;YACF,CAAC;YACD,WAAW,EAAE,GAAG,EAAE;gBACjB,oEAAoE;gBACpE,MAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;YACD,KAAK,EAAE,GAAG,EAAE;gBACX,MAAM,GAAG,SAAS,CAAC;YACpB,CAAC;SACD,CAAC,CAAC;QAEH,IAAI,WAA+B,CAAC;QACpC,KAAK,MAAM,UAAU,IAAI,KAAK,EAAE;YAC/B,SAAS,CAAC;gBACT,IAAI;gBACJ,KAAK,EAAE,+BAA+B,KAAK,8BAA8B,UAAU,QAAQ;gBAC3F,MAAM,EAAE,GAAG,EAAE;oBACZ,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC7B,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAClC,KAAK,GAAG,EAAE,CAAC;oBACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;wBAC/B,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;qBACzC;oBACD,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAE3B,MAAM,UAAU,GAAiB,EAAE,CAAC;oBACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;wBACpC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;qBAC9C;oBACD,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC3C,CAAC;gBACD,WAAW,EAAE,GAAG,EAAE;oBACjB,oEAAoE;oBACpE,MAAO,CAAC,KAAK,CAAC,WAAY,CAAC,CAAC;gBAC7B,CAAC;gBACD,KAAK,EAAE,GAAG,EAAE;oBACX,MAAM,GAAG,SAAS,CAAC;oBACnB,WAAW,GAAG,SAAS,CAAC;gBACzB,CAAC;aACD,CAAC,CAAC;SACH;KACD;AACF,CAAC,CAAC,CAAC;AAEH,SAAS,IAAI,CAAC,CAAe,EAAE,EAAU;IACxC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE;QAC7C,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE;YACtB,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;SACxB;KACD;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,QAAkB,EAAE,IAAY;IACxD,SAAS,KAAK;QACb,OAAO,QAAQ,CAAC,cAAc,EAAE,CAAC;IAClC,CAAC;IAED,SAAS,QAAQ;QAChB,OAAO,EAAE,EAAgB,CAAC;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;IACvB,MAAM,IAAI,GAAe,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAC5F,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,IAAI,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAEzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,GAAG,GAAe,EAAE,EAAgB,CAAC;QAC3C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QAEnB,MAAM,OAAO,GAAiB;YAC7B,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,GAAG;YACf,MAAM,EAAE,IAAI,GAAG,EAAiC;SAChD,CAAC;QAEF,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACb;IACD,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAkB;IAC7C,OAAO,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AAChF,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from 'assert';\nimport { benchmark, BenchmarkType, isInPerformanceTestingMode } from '@fluid-tools/benchmark';\nimport { v4 } from 'uuid';\n\nimport { Definition, NodeId, TraitLabel } from '../Identifiers.js';\nimport { Forest, ForestNode } from '../Forest.js';\nimport { RevisionView } from '../RevisionView.js';\nimport { ChangeNode, Side } from '../persisted-types/index.js';\nimport { TreeViewNode } from '../TreeView.js';\nimport { TestTree } from './utilities/TestNode.js';\nimport { refreshTestTree } from './utilities/TestUtilities.js';\n\ndescribe('Forest Perf', () => {\n\tconst testTree = refreshTestTree();\n\t// Larger sizes can slow down correctness test runs, or even time out, so only run smaller sizes as correctness tests.\n\tconst sizes = isInPerformanceTestingMode ? [100, 1_000, 10_000, 100_000] : [100, 1_000];\n\n\tfor (const count of sizes) {\n\t\t// Pick a single representative size for the 'Measurement' suite to keep it small.\n\t\tconst type = count === 10_000 ? BenchmarkType.Measurement : BenchmarkType.Perspective;\n\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `${count} random inserts in TreeView`,\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tbuildRandomTree(testTree, count);\n\t\t\t},\n\t\t});\n\n\t\tlet built: RevisionView | undefined;\n\t\tlet rootId: NodeId | undefined;\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `walk ${count} node TreeView`,\n\t\t\tbefore: () => {\n\t\t\t\t[built, rootId] = buildRandomTree(testTree, count);\n\t\t\t},\n\t\t\tbenchmarkFn: () => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst nodes = walk(built!, rootId!);\n\t\t\t\tassert(nodes === count);\n\t\t\t},\n\t\t\tafter: () => {\n\t\t\t\tbuilt = undefined;\n\t\t\t\trootId = undefined;\n\t\t\t},\n\t\t});\n\n\t\tlet forest: Forest | undefined;\n\t\tlet nodes: ForestNode[];\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `insert ${count} nodes into Forest`,\n\t\t\tbefore: () => {\n\t\t\t\tforest = Forest.create(true);\n\t\t\t\tnodes = [];\n\t\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\t\tnodes.push(makeTestForestNode(testTree));\n\t\t\t\t}\n\t\t\t},\n\t\t\tbenchmarkFn: () => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tforest!.add(nodes);\n\t\t\t},\n\t\t\tafter: () => {\n\t\t\t\tforest = undefined;\n\t\t\t},\n\t\t});\n\n\t\tlet otherForest: Forest | undefined;\n\t\tfor (const otherCount of sizes) {\n\t\t\tbenchmark({\n\t\t\t\ttype,\n\t\t\t\ttitle: `invoke delta on Forest with ${count} nodes against Forest with ${otherCount} nodes`,\n\t\t\t\tbefore: () => {\n\t\t\t\t\tforest = Forest.create(true);\n\t\t\t\t\totherForest = Forest.create(true);\n\t\t\t\t\tnodes = [];\n\t\t\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\t\t\tnodes.push(makeTestForestNode(testTree));\n\t\t\t\t\t}\n\t\t\t\t\tforest = forest.add(nodes);\n\n\t\t\t\t\tconst otherNodes: ForestNode[] = [];\n\t\t\t\t\tfor (let i = 0; i < otherCount; i++) {\n\t\t\t\t\t\totherNodes.push(makeTestForestNode(testTree));\n\t\t\t\t\t}\n\t\t\t\t\totherForest = otherForest.add(otherNodes);\n\t\t\t\t},\n\t\t\t\tbenchmarkFn: () => {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tforest!.delta(otherForest!);\n\t\t\t\t},\n\t\t\t\tafter: () => {\n\t\t\t\t\tforest = undefined;\n\t\t\t\t\totherForest = undefined;\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n});\n\nfunction walk(s: RevisionView, id: NodeId): number {\n\tlet count = 1;\n\tconst n = s.getViewNode(id);\n\tfor (const [_label, v] of n.traits.entries()) {\n\t\tfor (const child of v) {\n\t\t\tcount += walk(s, child);\n\t\t}\n\t}\n\treturn count;\n}\n\nfunction buildRandomTree(testTree: TestTree, size: number): [RevisionView, NodeId] {\n\tfunction getId(): NodeId {\n\t\treturn testTree.generateNodeId();\n\t}\n\n\tfunction getLabel(): TraitLabel {\n\t\treturn v4() as TraitLabel;\n\t}\n\n\tconst rootId = getId();\n\tconst root: ChangeNode = { traits: {}, definition: v4() as Definition, identifier: rootId };\n\tconst ids = [rootId];\n\tlet f = RevisionView.fromTree(root).openForTransaction();\n\n\tfor (let i = 1; i < size; i++) {\n\t\tconst label = getLabel();\n\t\tconst def: Definition = v4() as Definition;\n\t\tconst id = getId();\n\n\t\tconst newNode: TreeViewNode = {\n\t\t\tidentifier: id,\n\t\t\tdefinition: def,\n\t\t\ttraits: new Map<TraitLabel, readonly NodeId[]>(),\n\t\t};\n\n\t\tf = f.addNodes([newNode]);\n\t\tconst parent = ids[Math.floor(Math.random() * ids.length)];\n\t\tf = f.attachRange([id], { trait: { parent, label }, side: Side.Before });\n\t\tids.push(id);\n\t}\n\treturn [f.close(), rootId];\n}\n\nfunction makeTestForestNode(testTree: TestTree): ForestNode {\n\treturn { ...testTree.buildLeaf(testTree.generateNodeId()), traits: new Map() };\n}\n"]}
|
package/lib/test/Forest.tests.js
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
import { strict as assert } from 'assert';
|
|
6
6
|
import { expect } from 'chai';
|
|
7
7
|
import { validateAssertionError } from '@fluidframework/test-runtime-utils';
|
|
8
|
-
import { compareForestNodes, Forest } from '../Forest';
|
|
9
|
-
import { refreshTestTree } from './utilities/TestUtilities';
|
|
8
|
+
import { compareForestNodes, Forest } from '../Forest.js';
|
|
9
|
+
import { refreshTestTree } from './utilities/TestUtilities.js';
|
|
10
10
|
const mainTraitLabel = 'main';
|
|
11
11
|
function makeForestNodeWithChildren(testTree, id, ...children) {
|
|
12
12
|
return {
|