@fluid-experimental/tree 0.58.2001 → 0.59.1000-61898
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/README.md +9 -9
- package/dist/ChangeCompression.d.ts +39 -0
- package/dist/ChangeCompression.d.ts.map +1 -0
- package/dist/ChangeCompression.js +117 -0
- package/dist/ChangeCompression.js.map +1 -0
- package/{lib/default-edits/PersistedTypes.d.ts → dist/ChangeTypes.d.ts} +58 -100
- package/dist/ChangeTypes.d.ts.map +1 -0
- package/dist/{default-edits/PersistedTypes.js → ChangeTypes.js} +21 -76
- package/dist/ChangeTypes.js.map +1 -0
- package/dist/Checkout.d.ts +39 -27
- package/dist/Checkout.d.ts.map +1 -1
- package/dist/Checkout.js +59 -31
- package/dist/Checkout.js.map +1 -1
- package/dist/Common.d.ts +175 -38
- package/dist/Common.d.ts.map +1 -1
- package/dist/Common.js +240 -103
- package/dist/Common.js.map +1 -1
- package/dist/EagerCheckout.d.ts +24 -0
- package/dist/EagerCheckout.d.ts.map +1 -0
- package/dist/{BasicCheckout.js → EagerCheckout.js} +9 -6
- package/dist/EagerCheckout.js.map +1 -0
- package/dist/EditLog.d.ts +77 -63
- package/dist/EditLog.d.ts.map +1 -1
- package/dist/EditLog.js +85 -48
- package/dist/EditLog.js.map +1 -1
- package/dist/EditUtilities.d.ts +168 -0
- package/dist/EditUtilities.d.ts.map +1 -0
- package/dist/EditUtilities.js +373 -0
- package/dist/EditUtilities.js.map +1 -0
- package/dist/EventTypes.d.ts +73 -0
- package/dist/EventTypes.d.ts.map +1 -0
- package/dist/EventTypes.js +78 -0
- package/dist/EventTypes.js.map +1 -0
- package/dist/Forest.d.ts +29 -7
- package/dist/Forest.d.ts.map +1 -1
- package/dist/Forest.js +60 -36
- package/dist/Forest.js.map +1 -1
- package/dist/HistoryEditFactory.d.ts +20 -0
- package/dist/HistoryEditFactory.d.ts.map +1 -0
- package/dist/HistoryEditFactory.js +226 -0
- package/dist/HistoryEditFactory.js.map +1 -0
- package/dist/IdConversion.d.ts +12 -0
- package/dist/IdConversion.d.ts.map +1 -0
- package/dist/IdConversion.js +98 -0
- package/dist/IdConversion.js.map +1 -0
- package/dist/Identifiers.d.ts +89 -2
- package/dist/Identifiers.d.ts.map +1 -1
- package/dist/Identifiers.js +10 -0
- package/dist/Identifiers.js.map +1 -1
- package/dist/InitialTree.d.ts +2 -2
- package/dist/InitialTree.d.ts.map +1 -1
- package/dist/InitialTree.js +2 -1
- package/dist/InitialTree.js.map +1 -1
- package/dist/LazyCheckout.d.ts +28 -0
- package/dist/LazyCheckout.d.ts.map +1 -0
- package/dist/LazyCheckout.js +44 -0
- package/dist/LazyCheckout.js.map +1 -0
- package/dist/LogViewer.d.ts +130 -85
- package/dist/LogViewer.d.ts.map +1 -1
- package/dist/LogViewer.js +110 -85
- package/dist/LogViewer.js.map +1 -1
- package/dist/MergeHealth.d.ts +221 -0
- package/dist/MergeHealth.d.ts.map +1 -0
- package/dist/MergeHealth.js +263 -0
- package/dist/MergeHealth.js.map +1 -0
- package/dist/NodeIdUtilities.d.ts +90 -0
- package/dist/NodeIdUtilities.d.ts.map +1 -0
- package/dist/NodeIdUtilities.js +60 -0
- package/dist/NodeIdUtilities.js.map +1 -0
- package/dist/PayloadUtilities.d.ts +42 -0
- package/dist/PayloadUtilities.d.ts.map +1 -0
- package/dist/PayloadUtilities.js +114 -0
- package/dist/PayloadUtilities.js.map +1 -0
- package/dist/ReconciliationPath.d.ts +18 -13
- package/dist/ReconciliationPath.d.ts.map +1 -1
- package/dist/ReconciliationPath.js.map +1 -1
- package/dist/RevisionValueCache.d.ts +11 -2
- package/dist/RevisionValueCache.d.ts.map +1 -1
- package/dist/RevisionValueCache.js +2 -3
- package/dist/RevisionValueCache.js.map +1 -1
- package/dist/RevisionView.d.ts +83 -0
- package/dist/RevisionView.d.ts.map +1 -0
- package/dist/RevisionView.js +182 -0
- package/dist/RevisionView.js.map +1 -0
- package/dist/SerializationUtilities.d.ts +36 -0
- package/dist/SerializationUtilities.d.ts.map +1 -0
- package/dist/SerializationUtilities.js +102 -0
- package/dist/SerializationUtilities.js.map +1 -0
- package/dist/SharedTree.d.ts +400 -0
- package/dist/SharedTree.d.ts.map +1 -0
- package/dist/SharedTree.js +1074 -0
- package/dist/SharedTree.js.map +1 -0
- package/dist/SharedTreeEncoder.d.ts +102 -0
- package/dist/SharedTreeEncoder.d.ts.map +1 -0
- package/dist/SharedTreeEncoder.js +313 -0
- package/dist/SharedTreeEncoder.js.map +1 -0
- package/dist/StringInterner.d.ts +46 -0
- package/dist/StringInterner.d.ts.map +1 -0
- package/dist/StringInterner.js +61 -0
- package/dist/StringInterner.js.map +1 -0
- package/dist/Summary.d.ts +40 -0
- package/dist/Summary.d.ts.map +1 -0
- package/dist/Summary.js +23 -0
- package/dist/Summary.js.map +1 -0
- package/dist/SummaryBackCompatibility.d.ts +22 -22
- package/dist/SummaryBackCompatibility.d.ts.map +1 -1
- package/dist/SummaryBackCompatibility.js +30 -33
- package/dist/SummaryBackCompatibility.js.map +1 -1
- package/dist/SummaryTestUtilities.d.ts +31 -0
- package/dist/SummaryTestUtilities.d.ts.map +1 -0
- package/dist/SummaryTestUtilities.js +37 -0
- package/dist/SummaryTestUtilities.js.map +1 -0
- package/dist/Transaction.d.ts +53 -0
- package/dist/Transaction.d.ts.map +1 -0
- package/dist/Transaction.js +76 -0
- package/dist/Transaction.js.map +1 -0
- package/dist/TransactionInternal.d.ts +543 -0
- package/dist/TransactionInternal.d.ts.map +1 -0
- package/dist/TransactionInternal.js +622 -0
- package/dist/TransactionInternal.js.map +1 -0
- package/dist/TreeCompressor.d.ts +36 -0
- package/dist/TreeCompressor.d.ts.map +1 -0
- package/dist/TreeCompressor.js +137 -0
- package/dist/TreeCompressor.js.map +1 -0
- package/dist/TreeNodeHandle.d.ts +12 -18
- package/dist/TreeNodeHandle.d.ts.map +1 -1
- package/dist/TreeNodeHandle.js +13 -23
- package/dist/TreeNodeHandle.js.map +1 -1
- package/dist/TreeView.d.ts +166 -0
- package/dist/TreeView.d.ts.map +1 -0
- package/dist/TreeView.js +218 -0
- package/dist/TreeView.js.map +1 -0
- package/dist/TreeViewUtilities.d.ts +21 -0
- package/dist/TreeViewUtilities.d.ts.map +1 -0
- package/dist/TreeViewUtilities.js +77 -0
- package/dist/TreeViewUtilities.js.map +1 -0
- package/dist/{default-edits/UndoRedoHandler.d.ts → UndoRedoHandler.d.ts} +2 -2
- package/dist/UndoRedoHandler.d.ts.map +1 -0
- package/dist/{default-edits/UndoRedoHandler.js → UndoRedoHandler.js} +5 -9
- package/dist/UndoRedoHandler.js.map +1 -0
- package/dist/id-compressor/AppendOnlySortedMap.d.ts +127 -0
- package/dist/id-compressor/AppendOnlySortedMap.d.ts.map +1 -0
- package/dist/id-compressor/AppendOnlySortedMap.js +283 -0
- package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -0
- package/dist/id-compressor/IdCompressor.d.ts +389 -0
- package/dist/id-compressor/IdCompressor.d.ts.map +1 -0
- package/dist/id-compressor/IdCompressor.js +1353 -0
- package/dist/id-compressor/IdCompressor.js.map +1 -0
- package/dist/id-compressor/IdRange.d.ts +11 -0
- package/dist/id-compressor/IdRange.d.ts.map +1 -0
- package/dist/id-compressor/IdRange.js +29 -0
- package/dist/id-compressor/IdRange.js.map +1 -0
- package/dist/id-compressor/NumericUuid.d.ts +63 -0
- package/dist/id-compressor/NumericUuid.d.ts.map +1 -0
- package/dist/id-compressor/NumericUuid.js +377 -0
- package/dist/id-compressor/NumericUuid.js.map +1 -0
- package/dist/id-compressor/index.d.ts +12 -0
- package/dist/id-compressor/index.d.ts.map +1 -0
- package/dist/id-compressor/index.js +26 -0
- package/dist/id-compressor/index.js.map +1 -0
- package/dist/id-compressor/persisted-types/0.0.1.d.ts +156 -0
- package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -0
- package/dist/id-compressor/persisted-types/0.0.1.js +7 -0
- package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -0
- package/dist/id-compressor/persisted-types/index.d.ts +6 -0
- package/dist/id-compressor/persisted-types/index.d.ts.map +1 -0
- package/dist/id-compressor/persisted-types/index.js +18 -0
- package/dist/id-compressor/persisted-types/index.js.map +1 -0
- package/dist/index.d.ts +29 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -35
- package/dist/index.js.map +1 -1
- package/dist/persisted-types/0.0.2.d.ts +385 -0
- package/dist/persisted-types/0.0.2.d.ts.map +1 -0
- package/dist/persisted-types/0.0.2.js +113 -0
- package/dist/persisted-types/0.0.2.js.map +1 -0
- package/dist/persisted-types/0.1.1.d.ts +314 -0
- package/dist/persisted-types/0.1.1.d.ts.map +1 -0
- package/dist/persisted-types/0.1.1.js +153 -0
- package/dist/persisted-types/0.1.1.js.map +1 -0
- package/dist/persisted-types/index.d.ts +7 -0
- package/dist/persisted-types/index.d.ts.map +1 -0
- package/dist/persisted-types/index.js +20 -0
- package/dist/persisted-types/index.js.map +1 -0
- package/docs/0-1-1-Compression.md +228 -0
- package/docs/Breaking-Change-Migration.md +52 -0
- package/docs/Compression.md +2 -2
- package/docs/Telemetry.md +43 -0
- package/lib/ChangeCompression.d.ts +39 -0
- package/lib/ChangeCompression.d.ts.map +1 -0
- package/lib/ChangeCompression.js +111 -0
- package/lib/ChangeCompression.js.map +1 -0
- package/{dist/default-edits/PersistedTypes.d.ts → lib/ChangeTypes.d.ts} +58 -100
- package/lib/ChangeTypes.d.ts.map +1 -0
- package/lib/{default-edits/PersistedTypes.js → ChangeTypes.js} +15 -68
- package/lib/ChangeTypes.js.map +1 -0
- package/lib/Checkout.d.ts +39 -27
- package/lib/Checkout.d.ts.map +1 -1
- package/lib/Checkout.js +51 -23
- package/lib/Checkout.js.map +1 -1
- package/lib/Common.d.ts +175 -38
- package/lib/Common.d.ts.map +1 -1
- package/lib/Common.js +226 -101
- package/lib/Common.js.map +1 -1
- package/lib/EagerCheckout.d.ts +24 -0
- package/lib/EagerCheckout.d.ts.map +1 -0
- package/lib/{BasicCheckout.js → EagerCheckout.js} +7 -4
- package/lib/EagerCheckout.js.map +1 -0
- package/lib/EditLog.d.ts +77 -63
- package/lib/EditLog.d.ts.map +1 -1
- package/lib/EditLog.js +83 -47
- package/lib/EditLog.js.map +1 -1
- package/lib/EditUtilities.d.ts +168 -0
- package/lib/EditUtilities.d.ts.map +1 -0
- package/lib/EditUtilities.js +353 -0
- package/lib/EditUtilities.js.map +1 -0
- package/lib/EventTypes.d.ts +73 -0
- package/lib/EventTypes.d.ts.map +1 -0
- package/lib/EventTypes.js +75 -0
- package/lib/EventTypes.js.map +1 -0
- package/lib/Forest.d.ts +29 -7
- package/lib/Forest.d.ts.map +1 -1
- package/lib/Forest.js +58 -35
- package/lib/Forest.js.map +1 -1
- package/lib/HistoryEditFactory.d.ts +20 -0
- package/lib/HistoryEditFactory.d.ts.map +1 -0
- package/lib/{default-edits/HistoryEditFactory.js → HistoryEditFactory.js} +78 -39
- package/lib/HistoryEditFactory.js.map +1 -0
- package/lib/IdConversion.d.ts +12 -0
- package/lib/IdConversion.d.ts.map +1 -0
- package/lib/IdConversion.js +91 -0
- package/lib/IdConversion.js.map +1 -0
- package/lib/Identifiers.d.ts +89 -2
- package/lib/Identifiers.d.ts.map +1 -1
- package/lib/Identifiers.js +8 -1
- package/lib/Identifiers.js.map +1 -1
- package/lib/InitialTree.d.ts +2 -2
- package/lib/InitialTree.d.ts.map +1 -1
- package/lib/InitialTree.js +2 -1
- package/lib/InitialTree.js.map +1 -1
- package/lib/LazyCheckout.d.ts +28 -0
- package/lib/LazyCheckout.d.ts.map +1 -0
- package/lib/LazyCheckout.js +40 -0
- package/lib/LazyCheckout.js.map +1 -0
- package/lib/LogViewer.d.ts +130 -85
- package/lib/LogViewer.d.ts.map +1 -1
- package/lib/LogViewer.js +102 -77
- package/lib/LogViewer.js.map +1 -1
- package/lib/MergeHealth.d.ts +221 -0
- package/lib/MergeHealth.d.ts.map +1 -0
- package/lib/MergeHealth.js +258 -0
- package/lib/MergeHealth.js.map +1 -0
- package/lib/NodeIdUtilities.d.ts +90 -0
- package/lib/NodeIdUtilities.d.ts.map +1 -0
- package/lib/NodeIdUtilities.js +53 -0
- package/lib/NodeIdUtilities.js.map +1 -0
- package/lib/PayloadUtilities.d.ts +42 -0
- package/lib/PayloadUtilities.d.ts.map +1 -0
- package/lib/PayloadUtilities.js +110 -0
- package/lib/PayloadUtilities.js.map +1 -0
- package/lib/ReconciliationPath.d.ts +18 -13
- package/lib/ReconciliationPath.d.ts.map +1 -1
- package/lib/ReconciliationPath.js.map +1 -1
- package/lib/RevisionValueCache.d.ts +11 -2
- package/lib/RevisionValueCache.d.ts.map +1 -1
- package/lib/RevisionValueCache.js +2 -3
- package/lib/RevisionValueCache.js.map +1 -1
- package/lib/RevisionView.d.ts +83 -0
- package/lib/RevisionView.d.ts.map +1 -0
- package/lib/RevisionView.js +175 -0
- package/lib/RevisionView.js.map +1 -0
- package/lib/SerializationUtilities.d.ts +36 -0
- package/lib/SerializationUtilities.d.ts.map +1 -0
- package/lib/SerializationUtilities.js +95 -0
- package/lib/SerializationUtilities.js.map +1 -0
- package/lib/SharedTree.d.ts +400 -0
- package/lib/SharedTree.d.ts.map +1 -0
- package/lib/SharedTree.js +1069 -0
- package/lib/SharedTree.js.map +1 -0
- package/lib/SharedTreeEncoder.d.ts +102 -0
- package/lib/SharedTreeEncoder.d.ts.map +1 -0
- package/lib/SharedTreeEncoder.js +308 -0
- package/lib/SharedTreeEncoder.js.map +1 -0
- package/lib/StringInterner.d.ts +46 -0
- package/lib/StringInterner.d.ts.map +1 -0
- package/lib/StringInterner.js +57 -0
- package/lib/StringInterner.js.map +1 -0
- package/lib/Summary.d.ts +40 -0
- package/lib/Summary.d.ts.map +1 -0
- package/lib/Summary.js +19 -0
- package/lib/Summary.js.map +1 -0
- package/lib/SummaryBackCompatibility.d.ts +22 -22
- package/lib/SummaryBackCompatibility.d.ts.map +1 -1
- package/lib/SummaryBackCompatibility.js +29 -32
- package/lib/SummaryBackCompatibility.js.map +1 -1
- package/lib/SummaryTestUtilities.d.ts +31 -0
- package/lib/SummaryTestUtilities.d.ts.map +1 -0
- package/lib/SummaryTestUtilities.js +32 -0
- package/lib/SummaryTestUtilities.js.map +1 -0
- package/lib/Transaction.d.ts +53 -0
- package/lib/Transaction.d.ts.map +1 -0
- package/lib/Transaction.js +72 -0
- package/lib/Transaction.js.map +1 -0
- package/lib/TransactionInternal.d.ts +543 -0
- package/lib/TransactionInternal.d.ts.map +1 -0
- package/lib/TransactionInternal.js +618 -0
- package/lib/TransactionInternal.js.map +1 -0
- package/lib/TreeCompressor.d.ts +36 -0
- package/lib/TreeCompressor.d.ts.map +1 -0
- package/lib/TreeCompressor.js +133 -0
- package/lib/TreeCompressor.js.map +1 -0
- package/lib/TreeNodeHandle.d.ts +12 -18
- package/lib/TreeNodeHandle.d.ts.map +1 -1
- package/lib/TreeNodeHandle.js +14 -24
- package/lib/TreeNodeHandle.js.map +1 -1
- package/lib/TreeView.d.ts +166 -0
- package/lib/TreeView.d.ts.map +1 -0
- package/lib/TreeView.js +214 -0
- package/lib/TreeView.js.map +1 -0
- package/lib/TreeViewUtilities.d.ts +21 -0
- package/lib/TreeViewUtilities.d.ts.map +1 -0
- package/lib/TreeViewUtilities.js +71 -0
- package/lib/TreeViewUtilities.js.map +1 -0
- package/lib/{default-edits/UndoRedoHandler.d.ts → UndoRedoHandler.d.ts} +2 -2
- package/lib/UndoRedoHandler.d.ts.map +1 -0
- package/lib/{default-edits/UndoRedoHandler.js → UndoRedoHandler.js} +3 -7
- package/lib/UndoRedoHandler.js.map +1 -0
- package/lib/id-compressor/AppendOnlySortedMap.d.ts +127 -0
- package/lib/id-compressor/AppendOnlySortedMap.d.ts.map +1 -0
- package/lib/id-compressor/AppendOnlySortedMap.js +278 -0
- package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -0
- package/lib/id-compressor/IdCompressor.d.ts +389 -0
- package/lib/id-compressor/IdCompressor.d.ts.map +1 -0
- package/lib/id-compressor/IdCompressor.js +1343 -0
- package/lib/id-compressor/IdCompressor.js.map +1 -0
- package/lib/id-compressor/IdRange.d.ts +11 -0
- package/lib/id-compressor/IdRange.d.ts.map +1 -0
- package/lib/id-compressor/IdRange.js +25 -0
- package/lib/id-compressor/IdRange.js.map +1 -0
- package/lib/id-compressor/NumericUuid.d.ts +63 -0
- package/lib/id-compressor/NumericUuid.d.ts.map +1 -0
- package/lib/id-compressor/NumericUuid.js +365 -0
- package/lib/id-compressor/NumericUuid.js.map +1 -0
- package/lib/id-compressor/index.d.ts +12 -0
- package/lib/id-compressor/index.d.ts.map +1 -0
- package/lib/id-compressor/index.js +12 -0
- package/lib/id-compressor/index.js.map +1 -0
- package/lib/id-compressor/persisted-types/0.0.1.d.ts +156 -0
- package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -0
- package/lib/{test/Snapshot.tests.d.ts → id-compressor/persisted-types/0.0.1.js} +1 -1
- package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -0
- package/lib/id-compressor/persisted-types/index.d.ts +6 -0
- package/lib/id-compressor/persisted-types/index.d.ts.map +1 -0
- package/lib/id-compressor/persisted-types/index.js +6 -0
- package/lib/id-compressor/persisted-types/index.js.map +1 -0
- package/lib/index.d.ts +29 -9
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +23 -6
- package/lib/index.js.map +1 -1
- package/lib/persisted-types/0.0.2.d.ts +385 -0
- package/lib/persisted-types/0.0.2.d.ts.map +1 -0
- package/lib/persisted-types/0.0.2.js +110 -0
- package/lib/persisted-types/0.0.2.js.map +1 -0
- package/lib/persisted-types/0.1.1.d.ts +314 -0
- package/lib/persisted-types/0.1.1.d.ts.map +1 -0
- package/lib/persisted-types/0.1.1.js +150 -0
- package/lib/persisted-types/0.1.1.js.map +1 -0
- package/lib/persisted-types/index.d.ts +7 -0
- package/lib/persisted-types/index.d.ts.map +1 -0
- package/lib/persisted-types/index.js +8 -0
- package/lib/persisted-types/index.js.map +1 -0
- package/lib/test/AppendOnlySortedMap.tests.d.ts +6 -0
- package/lib/test/AppendOnlySortedMap.tests.d.ts.map +1 -0
- package/lib/test/AppendOnlySortedMap.tests.js +169 -0
- package/lib/test/AppendOnlySortedMap.tests.js.map +1 -0
- package/lib/test/{SnapshotUtilities.tests.d.ts → ChangeCompression.tests.d.ts} +1 -1
- package/lib/test/ChangeCompression.tests.d.ts.map +1 -0
- package/lib/test/ChangeCompression.tests.js +145 -0
- package/lib/test/ChangeCompression.tests.js.map +1 -0
- package/lib/test/Checkout.tests.d.ts +2 -3
- package/lib/test/Checkout.tests.d.ts.map +1 -1
- package/lib/test/Checkout.tests.js +126 -69
- package/lib/test/Checkout.tests.js.map +1 -1
- package/lib/test/Common.tests.js +60 -2
- package/lib/test/Common.tests.js.map +1 -1
- package/lib/test/{BasicCheckout.tests.d.ts → EagerCheckout.tests.d.ts} +1 -1
- package/lib/test/EagerCheckout.tests.d.ts.map +1 -0
- package/lib/test/EagerCheckout.tests.js +20 -0
- package/lib/test/EagerCheckout.tests.js.map +1 -0
- package/lib/test/Edit.tests.js +22 -14
- package/lib/test/Edit.tests.js.map +1 -1
- package/lib/test/{Anchors.glassBox.tests.d.ts → EditLog.perf.tests.d.ts} +1 -1
- package/lib/test/EditLog.perf.tests.d.ts.map +1 -0
- package/lib/test/EditLog.perf.tests.js +30 -0
- package/lib/test/EditLog.perf.tests.js.map +1 -0
- package/lib/test/EditLog.tests.js +10 -6
- package/lib/test/EditLog.tests.js.map +1 -1
- package/lib/test/EditUtilities.tests.d.ts +6 -0
- package/lib/test/EditUtilities.tests.d.ts.map +1 -0
- package/lib/test/EditUtilities.tests.js +503 -0
- package/lib/test/EditUtilities.tests.js.map +1 -0
- package/lib/test/Forest.perf.tests.d.ts +6 -0
- package/lib/test/Forest.perf.tests.d.ts.map +1 -0
- package/lib/test/Forest.perf.tests.js +133 -0
- package/lib/test/Forest.perf.tests.js.map +1 -0
- package/lib/test/Forest.tests.js +54 -27
- package/lib/test/Forest.tests.js.map +1 -1
- package/lib/test/GenericTransaction.tests.js +12 -3
- package/lib/test/GenericTransaction.tests.js.map +1 -1
- package/lib/test/HistoryEditFactory.tests.d.ts +6 -0
- package/lib/test/HistoryEditFactory.tests.d.ts.map +1 -0
- package/lib/test/HistoryEditFactory.tests.js +90 -0
- package/lib/test/HistoryEditFactory.tests.js.map +1 -0
- package/lib/test/IdCompressor.perf.tests.d.ts +6 -0
- package/lib/test/IdCompressor.perf.tests.d.ts.map +1 -0
- package/lib/test/IdCompressor.perf.tests.js +304 -0
- package/lib/test/IdCompressor.perf.tests.js.map +1 -0
- package/lib/test/IdCompressor.tests.d.ts +6 -0
- package/lib/test/IdCompressor.tests.d.ts.map +1 -0
- package/lib/test/IdCompressor.tests.js +1075 -0
- package/lib/test/IdCompressor.tests.js.map +1 -0
- package/lib/test/IdConversion.tests.d.ts +6 -0
- package/lib/test/IdConversion.tests.d.ts.map +1 -0
- package/lib/test/IdConversion.tests.js +36 -0
- package/lib/test/IdConversion.tests.js.map +1 -0
- package/lib/test/LazyCheckout.tests.d.ts +6 -0
- package/lib/test/LazyCheckout.tests.d.ts.map +1 -0
- package/lib/test/LazyCheckout.tests.js +22 -0
- package/lib/test/LazyCheckout.tests.js.map +1 -0
- package/lib/test/LogViewer.tests.js +269 -187
- package/lib/test/LogViewer.tests.js.map +1 -1
- package/lib/test/{SharedTreeWithAnchors.tests.d.ts → MergeHealthTelemetryHeartbeat.tests.d.ts} +1 -1
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.d.ts.map +1 -0
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +342 -0
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +1 -0
- package/lib/test/NumericUuid.perf.tests.d.ts +6 -0
- package/lib/test/NumericUuid.perf.tests.d.ts.map +1 -0
- package/lib/test/NumericUuid.perf.tests.js +68 -0
- package/lib/test/NumericUuid.perf.tests.js.map +1 -0
- package/lib/test/NumericUuid.tests.d.ts +6 -0
- package/lib/test/NumericUuid.tests.d.ts.map +1 -0
- package/lib/test/NumericUuid.tests.js +191 -0
- package/lib/test/NumericUuid.tests.js.map +1 -0
- package/lib/test/RevisionView.tests.d.ts +6 -0
- package/lib/test/RevisionView.tests.d.ts.map +1 -0
- package/lib/test/RevisionView.tests.js +133 -0
- package/lib/test/RevisionView.tests.js.map +1 -0
- package/lib/test/SharedTree.perf.tests.d.ts +6 -0
- package/lib/test/SharedTree.perf.tests.d.ts.map +1 -0
- package/lib/test/SharedTree.perf.tests.js +39 -0
- package/lib/test/SharedTree.perf.tests.js.map +1 -0
- package/lib/test/SharedTree.tests.js +15 -3
- package/lib/test/SharedTree.tests.js.map +1 -1
- package/lib/test/StringInterner.tests.d.ts +6 -0
- package/lib/test/StringInterner.tests.d.ts.map +1 -0
- package/lib/test/StringInterner.tests.js +71 -0
- package/lib/test/StringInterner.tests.js.map +1 -0
- package/lib/test/Summary.tests.d.ts +8 -0
- package/lib/test/Summary.tests.d.ts.map +1 -0
- package/lib/test/Summary.tests.js +407 -0
- package/lib/test/Summary.tests.js.map +1 -0
- package/lib/test/Transaction.tests.js +76 -330
- package/lib/test/Transaction.tests.js.map +1 -1
- package/lib/test/TransactionInternal.tests.d.ts +6 -0
- package/lib/test/TransactionInternal.tests.d.ts.map +1 -0
- package/lib/test/TransactionInternal.tests.js +568 -0
- package/lib/test/TransactionInternal.tests.js.map +1 -0
- package/lib/test/TreeCompression.tests.d.ts +6 -0
- package/lib/test/TreeCompression.tests.d.ts.map +1 -0
- package/lib/test/TreeCompression.tests.js +292 -0
- package/lib/test/TreeCompression.tests.js.map +1 -0
- package/lib/test/TreeView.tests.d.ts +6 -0
- package/lib/test/TreeView.tests.d.ts.map +1 -0
- package/lib/test/TreeView.tests.js +176 -0
- package/lib/test/TreeView.tests.js.map +1 -0
- package/lib/test/UndoRedoHandler.tests.js +2 -2
- package/lib/test/UndoRedoHandler.tests.js.map +1 -1
- package/lib/test/Virtualization.tests.js +147 -62
- package/lib/test/Virtualization.tests.js.map +1 -1
- package/lib/test/fuzz/Generators.d.ts +19 -0
- package/lib/test/fuzz/Generators.d.ts.map +1 -0
- package/lib/test/fuzz/Generators.js +420 -0
- package/lib/test/fuzz/Generators.js.map +1 -0
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +20 -0
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -0
- package/lib/test/fuzz/SharedTreeFuzzTests.js +217 -0
- package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -0
- package/lib/test/fuzz/Types.d.ts +133 -0
- package/lib/test/fuzz/Types.d.ts.map +1 -0
- package/lib/test/{GenericTransactionWithAnchors.tests.d.ts → fuzz/Types.js} +2 -2
- package/lib/test/fuzz/Types.js.map +1 -0
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts +180 -0
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +1 -0
- package/lib/test/utilities/IdCompressorTestUtilities.js +528 -0
- package/lib/test/utilities/IdCompressorTestUtilities.js.map +1 -0
- package/lib/test/utilities/MockTransaction.d.ts +26 -7
- package/lib/test/utilities/MockTransaction.d.ts.map +1 -1
- package/lib/test/utilities/MockTransaction.js +40 -11
- package/lib/test/utilities/MockTransaction.js.map +1 -1
- package/lib/test/utilities/PendingLocalStateTests.d.ts +12 -0
- package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -0
- package/lib/test/utilities/PendingLocalStateTests.js +105 -0
- package/lib/test/utilities/PendingLocalStateTests.js.map +1 -0
- package/lib/test/utilities/SharedTreeTests.d.ts +3 -4
- package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeTests.js +696 -439
- package/lib/test/utilities/SharedTreeTests.js.map +1 -1
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts +11 -0
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -0
- package/lib/test/utilities/SharedTreeVersioningTests.js +370 -0
- package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -0
- package/lib/test/utilities/SummaryLoadPerfTests.d.ts +10 -0
- package/lib/test/utilities/SummaryLoadPerfTests.d.ts.map +1 -0
- package/lib/test/utilities/SummaryLoadPerfTests.js +102 -0
- package/lib/test/utilities/SummaryLoadPerfTests.js.map +1 -0
- package/lib/test/utilities/SummarySizeTests.d.ts +11 -0
- package/lib/test/utilities/SummarySizeTests.d.ts.map +1 -0
- package/lib/test/utilities/SummarySizeTests.js +158 -0
- package/lib/test/utilities/SummarySizeTests.js.map +1 -0
- package/lib/test/utilities/TestCommon.d.ts +9 -0
- package/lib/test/utilities/TestCommon.d.ts.map +1 -0
- package/lib/test/utilities/TestCommon.js +13 -0
- package/lib/test/utilities/TestCommon.js.map +1 -0
- package/lib/test/utilities/TestNode.d.ts +140 -0
- package/lib/test/utilities/TestNode.d.ts.map +1 -0
- package/lib/test/utilities/TestNode.js +292 -0
- package/lib/test/utilities/TestNode.js.map +1 -0
- package/lib/test/utilities/TestUtilities.d.ts +84 -70
- package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
- package/lib/test/utilities/TestUtilities.js +218 -143
- package/lib/test/utilities/TestUtilities.js.map +1 -1
- package/lib/test/utilities/UndoRedoTests.d.ts +4 -5
- package/lib/test/utilities/UndoRedoTests.d.ts.map +1 -1
- package/lib/test/utilities/UndoRedoTests.js +138 -149
- package/lib/test/utilities/UndoRedoTests.js.map +1 -1
- package/package.json +22 -17
- package/src/ChangeCompression.ts +159 -0
- package/src/{default-edits/PersistedTypes.ts → ChangeTypes.ts} +62 -120
- package/src/Checkout.ts +81 -52
- package/src/Common.ts +317 -117
- package/src/EagerCheckout.ts +38 -0
- package/src/EditLog.ts +153 -100
- package/src/EditUtilities.ts +559 -0
- package/src/EventTypes.ts +74 -0
- package/src/Forest.ts +81 -73
- package/src/{default-edits/HistoryEditFactory.ts → HistoryEditFactory.ts} +103 -53
- package/src/IdConversion.ts +125 -0
- package/src/Identifiers.ts +101 -1
- package/src/InitialTree.ts +5 -4
- package/src/LazyCheckout.ts +51 -0
- package/src/LogViewer.ts +242 -166
- package/src/MergeHealth.ts +447 -0
- package/src/NodeIdUtilities.ts +141 -0
- package/src/PayloadUtilities.ts +124 -0
- package/src/ReconciliationPath.ts +18 -13
- package/src/RevisionValueCache.ts +14 -5
- package/src/RevisionView.ts +252 -0
- package/src/SerializationUtilities.ts +130 -0
- package/src/SharedTree.ts +1458 -0
- package/src/SharedTreeEncoder.ts +493 -0
- package/src/StringInterner.ts +72 -0
- package/src/Summary.ts +48 -0
- package/src/SummaryBackCompatibility.ts +47 -57
- package/src/SummaryTestUtilities.ts +54 -0
- package/src/Transaction.ts +94 -0
- package/src/TransactionInternal.ts +1088 -0
- package/src/TreeCompressor.ts +213 -0
- package/src/TreeNodeHandle.ts +19 -32
- package/src/TreeView.ts +322 -0
- package/src/TreeViewUtilities.ts +77 -0
- package/src/{default-edits/UndoRedoHandler.ts → UndoRedoHandler.ts} +8 -13
- package/src/id-compressor/AppendOnlySortedMap.ts +325 -0
- package/src/id-compressor/IdCompressor.md +3 -0
- package/src/id-compressor/IdCompressor.ts +1848 -0
- package/src/id-compressor/IdRange.ts +33 -0
- package/src/id-compressor/NumericUuid.ts +414 -0
- package/src/id-compressor/index.ts +13 -0
- package/src/id-compressor/persisted-types/0.0.1.ts +179 -0
- package/src/id-compressor/persisted-types/README.md +3 -0
- package/src/id-compressor/persisted-types/index.ts +6 -0
- package/src/index.ts +119 -59
- package/src/persisted-types/0.0.2.ts +442 -0
- package/src/persisted-types/0.1.1.ts +476 -0
- package/src/persisted-types/README.md +22 -0
- package/src/persisted-types/index.ts +9 -0
- package/.mocharc.js +0 -41
- package/api/tree.api.md +0 -729
- package/dist/BasicCheckout.d.ts +0 -23
- package/dist/BasicCheckout.d.ts.map +0 -1
- package/dist/BasicCheckout.js.map +0 -1
- package/dist/Snapshot.d.ts +0 -198
- package/dist/Snapshot.d.ts.map +0 -1
- package/dist/Snapshot.js +0 -267
- package/dist/Snapshot.js.map +0 -1
- package/dist/SnapshotUtilities.d.ts +0 -29
- package/dist/SnapshotUtilities.d.ts.map +0 -1
- package/dist/SnapshotUtilities.js +0 -73
- package/dist/SnapshotUtilities.js.map +0 -1
- package/dist/anchored-edits/AnchorResolution.d.ts +0 -144
- package/dist/anchored-edits/AnchorResolution.d.ts.map +0 -1
- package/dist/anchored-edits/AnchorResolution.js +0 -162
- package/dist/anchored-edits/AnchorResolution.js.map +0 -1
- package/dist/anchored-edits/Factory.d.ts +0 -56
- package/dist/anchored-edits/Factory.d.ts.map +0 -1
- package/dist/anchored-edits/Factory.js +0 -79
- package/dist/anchored-edits/Factory.js.map +0 -1
- package/dist/anchored-edits/PersistedTypes.d.ts +0 -245
- package/dist/anchored-edits/PersistedTypes.d.ts.map +0 -1
- package/dist/anchored-edits/PersistedTypes.js +0 -131
- package/dist/anchored-edits/PersistedTypes.js.map +0 -1
- package/dist/anchored-edits/SharedTreeWithAnchors.d.ts +0 -120
- package/dist/anchored-edits/SharedTreeWithAnchors.d.ts.map +0 -1
- package/dist/anchored-edits/SharedTreeWithAnchors.js +0 -115
- package/dist/anchored-edits/SharedTreeWithAnchors.js.map +0 -1
- package/dist/anchored-edits/TransactionWithAnchors.d.ts +0 -28
- package/dist/anchored-edits/TransactionWithAnchors.d.ts.map +0 -1
- package/dist/anchored-edits/TransactionWithAnchors.js +0 -36
- package/dist/anchored-edits/TransactionWithAnchors.js.map +0 -1
- package/dist/anchored-edits/index.d.ts +0 -10
- package/dist/anchored-edits/index.d.ts.map +0 -1
- package/dist/anchored-edits/index.js +0 -34
- package/dist/anchored-edits/index.js.map +0 -1
- package/dist/default-edits/EditUtilities.d.ts +0 -57
- package/dist/default-edits/EditUtilities.d.ts.map +0 -1
- package/dist/default-edits/EditUtilities.js +0 -192
- package/dist/default-edits/EditUtilities.js.map +0 -1
- package/dist/default-edits/Factory.d.ts +0 -56
- package/dist/default-edits/Factory.d.ts.map +0 -1
- package/dist/default-edits/Factory.js +0 -79
- package/dist/default-edits/Factory.js.map +0 -1
- package/dist/default-edits/HistoryEditFactory.d.ts +0 -19
- package/dist/default-edits/HistoryEditFactory.d.ts.map +0 -1
- package/dist/default-edits/HistoryEditFactory.js +0 -187
- package/dist/default-edits/HistoryEditFactory.js.map +0 -1
- package/dist/default-edits/PersistedTypes.d.ts.map +0 -1
- package/dist/default-edits/PersistedTypes.js.map +0 -1
- package/dist/default-edits/SharedTree.d.ts +0 -111
- package/dist/default-edits/SharedTree.d.ts.map +0 -1
- package/dist/default-edits/SharedTree.js +0 -124
- package/dist/default-edits/SharedTree.js.map +0 -1
- package/dist/default-edits/Summary.d.ts +0 -15
- package/dist/default-edits/Summary.d.ts.map +0 -1
- package/dist/default-edits/Summary.js +0 -35
- package/dist/default-edits/Summary.js.map +0 -1
- package/dist/default-edits/Transaction.d.ts +0 -41
- package/dist/default-edits/Transaction.d.ts.map +0 -1
- package/dist/default-edits/Transaction.js +0 -225
- package/dist/default-edits/Transaction.js.map +0 -1
- package/dist/default-edits/UndoRedoHandler.d.ts.map +0 -1
- package/dist/default-edits/UndoRedoHandler.js.map +0 -1
- package/dist/default-edits/index.d.ts +0 -13
- package/dist/default-edits/index.d.ts.map +0 -1
- package/dist/default-edits/index.js +0 -41
- package/dist/default-edits/index.js.map +0 -1
- package/dist/generic/GenericEditUtilities.d.ts +0 -26
- package/dist/generic/GenericEditUtilities.d.ts.map +0 -1
- package/dist/generic/GenericEditUtilities.js +0 -45
- package/dist/generic/GenericEditUtilities.js.map +0 -1
- package/dist/generic/GenericSharedTree.d.ts +0 -221
- package/dist/generic/GenericSharedTree.d.ts.map +0 -1
- package/dist/generic/GenericSharedTree.js +0 -447
- package/dist/generic/GenericSharedTree.js.map +0 -1
- package/dist/generic/GenericTransaction.d.ts +0 -87
- package/dist/generic/GenericTransaction.d.ts.map +0 -1
- package/dist/generic/GenericTransaction.js +0 -144
- package/dist/generic/GenericTransaction.js.map +0 -1
- package/dist/generic/PersistedTypes.d.ts +0 -194
- package/dist/generic/PersistedTypes.d.ts.map +0 -1
- package/dist/generic/PersistedTypes.js +0 -42
- package/dist/generic/PersistedTypes.js.map +0 -1
- package/dist/generic/Summary.d.ts +0 -63
- package/dist/generic/Summary.d.ts.map +0 -1
- package/dist/generic/Summary.js +0 -64
- package/dist/generic/Summary.js.map +0 -1
- package/dist/generic/index.d.ts +0 -10
- package/dist/generic/index.d.ts.map +0 -1
- package/dist/generic/index.js +0 -26
- package/dist/generic/index.js.map +0 -1
- package/lib/BasicCheckout.d.ts +0 -23
- package/lib/BasicCheckout.d.ts.map +0 -1
- package/lib/BasicCheckout.js.map +0 -1
- package/lib/Snapshot.d.ts +0 -198
- package/lib/Snapshot.d.ts.map +0 -1
- package/lib/Snapshot.js +0 -263
- package/lib/Snapshot.js.map +0 -1
- package/lib/SnapshotUtilities.d.ts +0 -29
- package/lib/SnapshotUtilities.d.ts.map +0 -1
- package/lib/SnapshotUtilities.js +0 -67
- package/lib/SnapshotUtilities.js.map +0 -1
- package/lib/anchored-edits/AnchorResolution.d.ts +0 -144
- package/lib/anchored-edits/AnchorResolution.d.ts.map +0 -1
- package/lib/anchored-edits/AnchorResolution.js +0 -152
- package/lib/anchored-edits/AnchorResolution.js.map +0 -1
- package/lib/anchored-edits/Factory.d.ts +0 -56
- package/lib/anchored-edits/Factory.d.ts.map +0 -1
- package/lib/anchored-edits/Factory.js +0 -74
- package/lib/anchored-edits/Factory.js.map +0 -1
- package/lib/anchored-edits/PersistedTypes.d.ts +0 -245
- package/lib/anchored-edits/PersistedTypes.d.ts.map +0 -1
- package/lib/anchored-edits/PersistedTypes.js +0 -128
- package/lib/anchored-edits/PersistedTypes.js.map +0 -1
- package/lib/anchored-edits/SharedTreeWithAnchors.d.ts +0 -120
- package/lib/anchored-edits/SharedTreeWithAnchors.d.ts.map +0 -1
- package/lib/anchored-edits/SharedTreeWithAnchors.js +0 -110
- package/lib/anchored-edits/SharedTreeWithAnchors.js.map +0 -1
- package/lib/anchored-edits/TransactionWithAnchors.d.ts +0 -28
- package/lib/anchored-edits/TransactionWithAnchors.d.ts.map +0 -1
- package/lib/anchored-edits/TransactionWithAnchors.js +0 -32
- package/lib/anchored-edits/TransactionWithAnchors.js.map +0 -1
- package/lib/anchored-edits/index.d.ts +0 -10
- package/lib/anchored-edits/index.d.ts.map +0 -1
- package/lib/anchored-edits/index.js +0 -11
- package/lib/anchored-edits/index.js.map +0 -1
- package/lib/default-edits/EditUtilities.d.ts +0 -57
- package/lib/default-edits/EditUtilities.d.ts.map +0 -1
- package/lib/default-edits/EditUtilities.js +0 -181
- package/lib/default-edits/EditUtilities.js.map +0 -1
- package/lib/default-edits/Factory.d.ts +0 -56
- package/lib/default-edits/Factory.d.ts.map +0 -1
- package/lib/default-edits/Factory.js +0 -74
- package/lib/default-edits/Factory.js.map +0 -1
- package/lib/default-edits/HistoryEditFactory.d.ts +0 -19
- package/lib/default-edits/HistoryEditFactory.d.ts.map +0 -1
- package/lib/default-edits/HistoryEditFactory.js.map +0 -1
- package/lib/default-edits/PersistedTypes.d.ts.map +0 -1
- package/lib/default-edits/PersistedTypes.js.map +0 -1
- package/lib/default-edits/SharedTree.d.ts +0 -111
- package/lib/default-edits/SharedTree.d.ts.map +0 -1
- package/lib/default-edits/SharedTree.js +0 -100
- package/lib/default-edits/SharedTree.js.map +0 -1
- package/lib/default-edits/Summary.d.ts +0 -15
- package/lib/default-edits/Summary.d.ts.map +0 -1
- package/lib/default-edits/Summary.js +0 -31
- package/lib/default-edits/Summary.js.map +0 -1
- package/lib/default-edits/Transaction.d.ts +0 -41
- package/lib/default-edits/Transaction.d.ts.map +0 -1
- package/lib/default-edits/Transaction.js +0 -221
- package/lib/default-edits/Transaction.js.map +0 -1
- package/lib/default-edits/UndoRedoHandler.d.ts.map +0 -1
- package/lib/default-edits/UndoRedoHandler.js.map +0 -1
- package/lib/default-edits/index.d.ts +0 -13
- package/lib/default-edits/index.d.ts.map +0 -1
- package/lib/default-edits/index.js +0 -14
- package/lib/default-edits/index.js.map +0 -1
- package/lib/generic/GenericEditUtilities.d.ts +0 -26
- package/lib/generic/GenericEditUtilities.d.ts.map +0 -1
- package/lib/generic/GenericEditUtilities.js +0 -38
- package/lib/generic/GenericEditUtilities.js.map +0 -1
- package/lib/generic/GenericSharedTree.d.ts +0 -221
- package/lib/generic/GenericSharedTree.d.ts.map +0 -1
- package/lib/generic/GenericSharedTree.js +0 -443
- package/lib/generic/GenericSharedTree.js.map +0 -1
- package/lib/generic/GenericTransaction.d.ts +0 -87
- package/lib/generic/GenericTransaction.d.ts.map +0 -1
- package/lib/generic/GenericTransaction.js +0 -140
- package/lib/generic/GenericTransaction.js.map +0 -1
- package/lib/generic/PersistedTypes.d.ts +0 -194
- package/lib/generic/PersistedTypes.d.ts.map +0 -1
- package/lib/generic/PersistedTypes.js +0 -39
- package/lib/generic/PersistedTypes.js.map +0 -1
- package/lib/generic/Summary.d.ts +0 -63
- package/lib/generic/Summary.d.ts.map +0 -1
- package/lib/generic/Summary.js +0 -58
- package/lib/generic/Summary.js.map +0 -1
- package/lib/generic/index.d.ts +0 -10
- package/lib/generic/index.d.ts.map +0 -1
- package/lib/generic/index.js +0 -11
- package/lib/generic/index.js.map +0 -1
- package/lib/test/Anchors.glassBox.tests.d.ts.map +0 -1
- package/lib/test/Anchors.glassBox.tests.js +0 -410
- package/lib/test/Anchors.glassBox.tests.js.map +0 -1
- package/lib/test/BasicCheckout.tests.d.ts.map +0 -1
- package/lib/test/BasicCheckout.tests.js +0 -8
- package/lib/test/BasicCheckout.tests.js.map +0 -1
- package/lib/test/GenericTransactionWithAnchors.tests.d.ts.map +0 -1
- package/lib/test/GenericTransactionWithAnchors.tests.js +0 -25
- package/lib/test/GenericTransactionWithAnchors.tests.js.map +0 -1
- package/lib/test/SharedTreeWithAnchors.tests.d.ts.map +0 -1
- package/lib/test/SharedTreeWithAnchors.tests.js +0 -420
- package/lib/test/SharedTreeWithAnchors.tests.js.map +0 -1
- package/lib/test/Snapshot.tests.d.ts.map +0 -1
- package/lib/test/Snapshot.tests.js +0 -96
- package/lib/test/Snapshot.tests.js.map +0 -1
- package/lib/test/SnapshotUtilities.tests.d.ts.map +0 -1
- package/lib/test/SnapshotUtilities.tests.js +0 -168
- package/lib/test/SnapshotUtilities.tests.js.map +0 -1
- package/lib/test/undoRedoStackManager.d.ts +0 -26
- package/lib/test/undoRedoStackManager.d.ts.map +0 -1
- package/lib/test/undoRedoStackManager.js +0 -176
- package/lib/test/undoRedoStackManager.js.map +0 -1
- package/lib/test/utilities/SummaryFormatCompatibilityTests.d.ts +0 -13
- package/lib/test/utilities/SummaryFormatCompatibilityTests.d.ts.map +0 -1
- package/lib/test/utilities/SummaryFormatCompatibilityTests.js +0 -154
- package/lib/test/utilities/SummaryFormatCompatibilityTests.js.map +0 -1
- package/src/BasicCheckout.ts +0 -34
- package/src/Snapshot.ts +0 -363
- package/src/SnapshotUtilities.ts +0 -88
- package/src/anchored-edits/AnchorResolution.ts +0 -442
- package/src/anchored-edits/Factory.ts +0 -94
- package/src/anchored-edits/PersistedTypes.ts +0 -310
- package/src/anchored-edits/SharedTreeWithAnchors.ts +0 -200
- package/src/anchored-edits/TransactionWithAnchors.ts +0 -39
- package/src/anchored-edits/index.ts +0 -21
- package/src/default-edits/EditUtilities.ts +0 -220
- package/src/default-edits/Factory.ts +0 -94
- package/src/default-edits/SharedTree.ts +0 -174
- package/src/default-edits/Summary.ts +0 -44
- package/src/default-edits/Transaction.ts +0 -262
- package/src/default-edits/index.ts +0 -29
- package/src/generic/GenericEditUtilities.ts +0 -46
- package/src/generic/GenericSharedTree.ts +0 -593
- package/src/generic/GenericTransaction.ts +0 -194
- package/src/generic/PersistedTypes.ts +0 -221
- package/src/generic/Summary.ts +0 -113
- package/src/generic/index.ts +0 -41
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SharedTreeTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeTests.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 { assert, expect } from 'chai';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ITelemetryBaseEvent } from '@fluidframework/common-definitions';\nimport { delay } from '@fluidframework/common-utils';\nimport { MockFluidDataStoreRuntime } from '@fluidframework/test-runtime-utils';\nimport { assertArrayOfOne, assertNotUndefined, isSharedTreeEvent } from '../../Common';\nimport { Definition, DetachedSequenceId, EditId, NodeId, TraitLabel } from '../../Identifiers';\nimport {\n\tBuildNode,\n\tChangeNode,\n\tSharedTreeOpType,\n\tSharedTreeEvent,\n\tfullHistorySummarizer,\n\tserialize,\n\tnewEdit,\n\tEditStatus,\n} from '../../generic';\nimport { Change, ChangeType, Delete, Insert, StablePlace, StableRange, SharedTree } from '../../default-edits';\nimport { CachingLogViewer } from '../../LogViewer';\nimport { EditLog } from '../../EditLog';\nimport { Snapshot } from '../../Snapshot';\nimport { initialTree } from '../../InitialTree';\nimport { TreeNodeHandle } from '../../TreeNodeHandle';\nimport { deserialize, SharedTreeSummary_0_0_2 } from '../../SummaryBackCompatibility';\nimport { SharedTreeWithAnchors } from '../../anchored-edits';\nimport {\n\tmakeEmptyNode,\n\ttestTrait,\n\tleft,\n\tright,\n\tleftTraitLabel,\n\tleftTraitLocation,\n\trightTraitLocation,\n\tsimpleTestTree,\n\tareNodesEquivalent,\n\trightTraitLabel,\n\tassertNoDelta,\n\tdeepCompareNodes,\n\tinitialSnapshot,\n\tSharedTreeTestingComponents,\n\tSharedTreeTestingOptions,\n} from './TestUtilities';\nimport { runSharedTreeUndoRedoTestSuite } from './UndoRedoTests';\nimport { TestFluidHandle, TestFluidSerializer } from './TestSerializer';\n\nconst revert = (tree: SharedTree, editId: EditId) => {\n\tconst editIndex = tree.edits.getIndexOfId(editId);\n\treturn tree.editor.revert(\n\t\ttree.edits.getEditInSessionAtIndex(editIndex),\n\t\ttree.logViewer.getSnapshotInSession(editIndex)\n\t);\n};\n\n// Options for the undo/redo test suite. The undo and redo functions are the same.\nconst undoRedoOptions = {\n\ttitle: 'Revert',\n\tundo: revert,\n\tredo: revert,\n};\n\n/**\n * Runs a test suite for operations on `SharedTree`.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSharedTreeOperationsTests<TSharedTree extends SharedTree | SharedTreeWithAnchors>(\n\ttitle: string,\n\tsetUpTestSharedTree: (options?: SharedTreeTestingOptions) => SharedTreeTestingComponents<TSharedTree>\n) {\n\tdescribe(title, () => {\n\t\tconst testSerializer = new TestFluidSerializer();\n\n\t\tdescribe('SharedTree before initialization', () => {\n\t\t\tit('can create a new SharedTree', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree();\n\t\t\t\texpect(tree).to.not.be.undefined;\n\t\t\t});\n\n\t\t\tit('valid without initial tree', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree();\n\t\t\t\texpect(tree.currentView.getTrait(testTrait)).deep.equals(\n\t\t\t\t\t[],\n\t\t\t\t\t'Root should exist, and child traits should be valid but empty.'\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('SharedTree in local state', () => {\n\t\t\tit('does not emit change events for each change in a batch of changes', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\t\t\t\tlet changeCount = 0;\n\t\t\t\ttree.on(SharedTreeEvent.EditCommitted, () => {\n\t\t\t\t\tconst leftTrait = tree.currentView.getTrait(leftTraitLocation);\n\t\t\t\t\tconst rightTrait = tree.currentView.getTrait(rightTraitLocation);\n\n\t\t\t\t\texpect(leftTrait.length).to.equal(0); // \"left\" child is deleted...\n\t\t\t\t\texpect(rightTrait.length).to.equal(2); // ...and added to \"right\" trait\n\n\t\t\t\t\tchangeCount += 1;\n\t\t\t\t});\n\n\t\t\t\ttree.editor.move(left, StablePlace.after(right));\n\t\t\t\texpect(changeCount).equals(1);\n\t\t\t});\n\n\t\t\tit('can insert a wrapped tree', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\n\t\t\t\tconst childNode = makeEmptyNode();\n\t\t\t\tconst childId = 0 as DetachedSequenceId;\n\t\t\t\tconst childrenTraitLabel = 'children' as TraitLabel;\n\t\t\t\tconst parentNode: BuildNode = {\n\t\t\t\t\tidentifier: uuidv4() as NodeId,\n\t\t\t\t\tdefinition: 'node' as Definition,\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\t[childrenTraitLabel]: [childId],\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst parentId = 1 as DetachedSequenceId;\n\n\t\t\t\tconst buildChild = Change.build([childNode], childId);\n\t\t\t\tconst buildParent = Change.build([parentNode], parentId);\n\t\t\t\tconst insertParent = Change.insert(parentId, StablePlace.before(left));\n\n\t\t\t\ttree.applyEdit(buildChild, buildParent, insertParent);\n\n\t\t\t\tconst leftTrait = tree.currentView.getTrait(leftTraitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(2);\n\t\t\t\texpect(leftTrait[0]).to.equal(parentNode.identifier);\n\t\t\t\tconst childrenTrait = tree.currentView.getTrait({\n\t\t\t\t\tparent: parentNode.identifier,\n\t\t\t\t\tlabel: childrenTraitLabel,\n\t\t\t\t});\n\t\t\t\texpect(childrenTrait.length).to.equal(1);\n\t\t\t\texpect(childrenTrait[0]).to.equal(childNode.identifier);\n\t\t\t});\n\n\t\t\tit('prevents multiparenting detached trees', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree, allowMalformed: true });\n\n\t\t\t\tconst childNode = makeEmptyNode();\n\t\t\t\tconst childId = 0 as DetachedSequenceId;\n\t\t\t\tconst childrenTraitLabel = 'children' as TraitLabel;\n\t\t\t\tconst parentNode: BuildNode = {\n\t\t\t\t\tidentifier: uuidv4() as NodeId,\n\t\t\t\t\tdefinition: 'node' as Definition,\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\t[childrenTraitLabel]: [childId],\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst parentId = 1 as DetachedSequenceId;\n\t\t\t\tconst parentNode2: BuildNode = {\n\t\t\t\t\tidentifier: uuidv4() as NodeId,\n\t\t\t\t\tdefinition: 'node' as Definition,\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\t[childrenTraitLabel]: [childId],\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst parentId2 = 2 as DetachedSequenceId;\n\n\t\t\t\tconst buildChild = Change.build([childNode], childId);\n\t\t\t\tconst buildParent = Change.build([parentNode], parentId);\n\t\t\t\tconst buildParent2 = Change.build([parentNode2], parentId2);\n\n\t\t\t\tassertNoDelta(tree, () => {\n\t\t\t\t\t// we don't expect this edit application to change anything\n\t\t\t\t\ttree.applyEdit(buildChild, buildParent, buildParent2);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// TODO:#58052: Make this test pass.\n\t\t\tit.skip('prevents setting the value of a node in a detached subtree', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree, allowInvalid: true });\n\t\t\t\tconst detachedNode = makeEmptyNode();\n\t\t\t\tconst detachedSequenceId = 0 as DetachedSequenceId;\n\t\t\t\tconst editId = tree.applyEdit(\n\t\t\t\t\tChange.build([detachedNode], detachedSequenceId),\n\t\t\t\t\tChange.setPayload(detachedNode.identifier, 42),\n\t\t\t\t\tChange.insert(detachedSequenceId, StablePlace.before(left))\n\t\t\t\t);\n\t\t\t\tconst logViewer = tree.logViewer as CachingLogViewer<Change>;\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(editId)).status).equals(\n\t\t\t\t\tEditStatus.Invalid\n\t\t\t\t);\n\t\t\t\ttree.currentView.assertConsistent();\n\t\t\t});\n\n\t\t\t// TODO:#58052: Make this test pass.\n\t\t\tit.skip('prevents inserting a node in a detached subtree through a local edit', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree, allowInvalid: true });\n\t\t\t\tconst detachedNewNode = makeEmptyNode();\n\t\t\t\tconst detachedNewNodeSequenceId = 0 as DetachedSequenceId;\n\t\t\t\tconst detachedRightNodeSequenceId = 1 as DetachedSequenceId;\n\t\t\t\tconst editId = tree.applyEdit(\n\t\t\t\t\tChange.build([detachedNewNode], detachedNewNodeSequenceId),\n\t\t\t\t\tChange.detach(StableRange.only(right), detachedRightNodeSequenceId),\n\t\t\t\t\t// This change attempts to insert a node under a detached node\n\t\t\t\t\tChange.insert(\n\t\t\t\t\t\tdetachedNewNodeSequenceId,\n\t\t\t\t\t\tStablePlace.atStartOf({ parent: right.identifier, label: 'foo' as TraitLabel })\n\t\t\t\t\t),\n\t\t\t\t\tChange.insert(detachedRightNodeSequenceId, StablePlace.before(left))\n\t\t\t\t);\n\t\t\t\tconst logViewer = tree.logViewer as CachingLogViewer<Change>;\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(editId)).status).equals(\n\t\t\t\t\tEditStatus.Invalid\n\t\t\t\t);\n\t\t\t\ttree.currentView.assertConsistent();\n\t\t\t});\n\n\t\t\tit('prevents deletion of the root', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree, allowInvalid: true });\n\t\t\t\texpect(tree.currentView.hasNode(initialSnapshot.root));\n\t\t\t\tassertNoDelta(tree, () => {\n\t\t\t\t\t// Try to delete the root\n\t\t\t\t\ttree.processLocalEdit(newEdit([Delete.create(StableRange.only(initialSnapshot.root))]));\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('can apply multiple local edits without ack from server', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\n\t\t\t\tconst newNode = makeEmptyNode();\n\n\t\t\t\ttree.editor.insert(newNode, StablePlace.after(left));\n\t\t\t\ttree.editor.move(newNode, StablePlace.before(left));\n\n\t\t\t\tconst leftTrait = tree.currentView.getTrait(leftTraitLocation);\n\t\t\t\texpect(leftTrait.length).equals(2);\n\t\t\t\texpect(leftTrait[0]).equals(newNode.identifier);\n\t\t\t});\n\n\t\t\tit('is not equal to a tree with different initial views', () => {\n\t\t\t\tconst secondSimpleTestTree: ChangeNode = {\n\t\t\t\t\t...simpleTestTree,\n\t\t\t\t\tidentifier: uuidv4() as NodeId,\n\t\t\t\t};\n\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ initialTree: secondSimpleTestTree });\n\n\t\t\t\texpect(tree.equals(secondTree)).to.be.false;\n\t\t\t});\n\n\t\t\tit('is not equal to a tree with the same view but different edit lists', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\t\t\t\t// The edits that create the initial tree have different identities.\n\t\t\t\texpect(tree.equals(secondTree)).to.be.false;\n\t\t\t});\n\n\t\t\tit('tolerates invalid inserts', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree, allowInvalid: true });\n\n\t\t\t\tconst firstNode = makeEmptyNode();\n\t\t\t\tconst secondNode = makeEmptyNode();\n\n\t\t\t\ttree.editor.insert(firstNode, StablePlace.after(left));\n\t\t\t\ttree.editor.delete(firstNode);\n\n\t\t\t\t// Trying to insert next to the deleted node should drop, confirm that it doesn't\n\t\t\t\t// change the snapshot\n\t\t\t\tassertNoDelta(tree, () => {\n\t\t\t\t\ttree.processLocalEdit(newEdit(Insert.create([secondNode], StablePlace.after(firstNode))));\n\t\t\t\t});\n\n\t\t\t\tconst leftTrait = tree.currentView.getTrait(leftTraitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(1);\n\t\t\t});\n\n\t\t\tit('tolerates invalid detaches', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree, allowInvalid: true });\n\n\t\t\t\tconst firstNode = makeEmptyNode();\n\t\t\t\tconst secondNode = makeEmptyNode();\n\t\t\t\tconst thirdNode = makeEmptyNode();\n\n\t\t\t\ttree.editor.insert([firstNode, secondNode, thirdNode], StablePlace.after(left));\n\t\t\t\ttree.editor.delete(secondNode);\n\n\t\t\t\tassertNoDelta(tree, () => {\n\t\t\t\t\t// Trying to delete from before firstNode to after secondNode should drop\n\t\t\t\t\ttree.processLocalEdit(\n\t\t\t\t\t\tnewEdit([\n\t\t\t\t\t\t\tDelete.create(\n\t\t\t\t\t\t\t\tStableRange.from(StablePlace.before(firstNode)).to(StablePlace.after(secondNode))\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t])\n\t\t\t\t\t);\n\n\t\t\t\t\t// Trying to delete from after thirdNode to before firstNode should drop\n\t\t\t\t\ttree.processLocalEdit(\n\t\t\t\t\t\tnewEdit([\n\t\t\t\t\t\t\tDelete.create(\n\t\t\t\t\t\t\t\tStableRange.from(StablePlace.after(thirdNode)).to(StablePlace.before(firstNode))\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\n\t\t\t\t// Expect that firstNode did not get deleted\n\t\t\t\tconst leftTrait = tree.currentView.getTrait(leftTraitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(3);\n\t\t\t});\n\n\t\t\tit('tolerates malformed inserts', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree, allowMalformed: true });\n\n\t\t\t\tassertNoDelta(tree, () => {\n\t\t\t\t\ttree.processLocalEdit(newEdit([Change.build([], 0 as DetachedSequenceId)]));\n\t\t\t\t});\n\t\t\t});\n\n\t\t\trunSharedTreeUndoRedoTestSuite({ localMode: true, ...undoRedoOptions });\n\t\t});\n\n\t\tdescribe('SharedTree in connected state with a remote SharedTree', () => {\n\t\t\tconst treeOptions = { initialTree: simpleTestTree, localMode: false };\n\t\t\tconst secondTreeOptions = {\n\t\t\t\tid: 'secondTestSharedTree',\n\t\t\t\tlocalMode: false,\n\t\t\t};\n\n\t\t\tit('should apply remote changes and converge', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\t\t// Sync initial tree\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Both trees should contain 'left'\n\t\t\t\texpect(tree.currentView.getSnapshotNode(left.identifier)).to.not.be.undefined;\n\t\t\t\texpect(secondTree.currentView.getSnapshotNode(left.identifier)).to.not.be.undefined;\n\n\t\t\t\tsecondTree.editor.delete(left);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst rootA = tree.currentView.getSnapshotNode(simpleTestTree.identifier);\n\t\t\t\texpect(rootA.traits.get(leftTraitLabel)).to.be.undefined;\n\n\t\t\t\tconst rootB = secondTree.currentView.getSnapshotNode(simpleTestTree.identifier);\n\t\t\t\texpect(rootB.traits.get(leftTraitLabel)).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('should apply local edits after all sequenced edits', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\t\t// Sync initial tree\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst newNode = makeEmptyNode();\n\n\t\t\t\ttree.editor.insert(newNode, StablePlace.after(left));\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Concurrently perform edit that will be sequenced before the move below.\n\t\t\t\t// If local edits are sorted incorrectly (before sequenced edits), this will cause evaluation of a state in which the local\n\t\t\t\t// move is evaluated before all other edits. Since it is causally dependant on the initial insert edit, it would fail.\n\t\t\t\tsecondTree.editor.delete(right);\n\n\t\t\t\t// Attempt to move the new node.\n\t\t\t\ttree.editor.move(newNode, StablePlace.before(left));\n\n\t\t\t\t// Deliver the remote edit. The move should be applied after all sequenced edits and succeed.\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t});\n\n\t\t\tit('converges in the face of concurrent changes', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\t\t// Sync initial tree\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// First client deletes a trait containing a node in the initial tree\n\t\t\t\ttree.editor.delete(left);\n\n\t\t\t\t// Second client concurrently adds a new node to that trait\n\t\t\t\tconst newNode = makeEmptyNode();\n\t\t\t\tsecondTree.editor.insert(newNode, StablePlace.atEndOf(leftTraitLocation));\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Second client's change gets sequenced after the deletion, so the trait\n\t\t\t\t// should exist and contain the new node on both clients after messages are delivered.\n\t\t\t\tconst leftTrait = tree.currentView.getTrait(leftTraitLocation);\n\t\t\t\tconst secondLeftTrait = secondTree.currentView.getTrait(leftTraitLocation);\n\t\t\t\texpect(leftTrait.length).equals(1);\n\t\t\t\texpect(leftTrait[0]).equals(newNode.identifier);\n\t\t\t\texpect(leftTrait).deep.equals(secondLeftTrait);\n\t\t\t});\n\n\t\t\tit('is equal to a tree with the same state', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t\tsecondTree.editor.delete(left);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t});\n\n\t\t\t// TODO:#58052: Make this test pass.\n\t\t\tit.skip('prevents inserting a node in a detached subtree as the result of merged edits', () => {\n\t\t\t\tconst rootId = 'root' as NodeId;\n\t\t\t\tconst parent1Id = 'parent1' as NodeId;\n\t\t\t\tconst parent2Id = 'parent2' as NodeId;\n\t\t\t\tconst childId = 'child' as NodeId;\n\t\t\t\tconst childTraitUnderParent2 = { parent: parent2Id, label: 'child' as TraitLabel };\n\t\t\t\tconst badTraitUnderChild = { parent: childId, label: 'whatever' as TraitLabel };\n\t\t\t\tconst initialTree = {\n\t\t\t\t\t...makeEmptyNode(rootId),\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\tparents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t...makeEmptyNode(parent1Id),\n\t\t\t\t\t\t\t\ttraits: { child: [makeEmptyNode(childId)] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmakeEmptyNode(parent2Id),\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst { tree: tree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...treeOptions,\n\t\t\t\t\tinitialTree,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: tree2 } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Move the child under parent2\n\t\t\t\t// This first edit should succeed locally and globally\n\t\t\t\tconst edit1Id = tree1.editor.move(childId, StablePlace.atStartOf(childTraitUnderParent2));\n\n\t\t\t\t// Concurrently move parent2 under child\n\t\t\t\t// This first edit should succeed locally but fail globally\n\t\t\t\tconst edit2Id = tree2.editor.move(parent2Id, StablePlace.atStartOf(badTraitUnderChild));\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst logViewer = tree1.logViewer as CachingLogViewer<Change>;\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(edit1Id)).status).equals(\n\t\t\t\t\tEditStatus.Applied\n\t\t\t\t);\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(edit2Id)).status).equals(\n\t\t\t\t\tEditStatus.Invalid\n\t\t\t\t);\n\t\t\t\ttree1.currentView.assertConsistent();\n\t\t\t});\n\n\t\t\tit('tolerates invalid inserts', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, allowInvalid: true });\n\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst firstNode = makeEmptyNode();\n\t\t\t\tconst firstEditId = secondTree.editor.insert(firstNode, StablePlace.after(left));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Concurrently edit, creating invalid insert.\n\t\t\t\t// Create delete. This will apply.\n\t\t\t\tconst secondEditId = tree.editor.delete(firstNode);\n\n\t\t\t\tlet thirdEditId;\n\t\t\t\tassertNoDelta(tree, () => {\n\t\t\t\t\t// concurrently insert next to the deleted node: this will become invalid.\n\t\t\t\t\tconst secondNode = makeEmptyNode();\n\t\t\t\t\tthirdEditId = secondTree.editor.insert(secondNode, StablePlace.after(firstNode));\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t});\n\n\t\t\t\tconst leftTrait = secondTree.currentView.getTrait(leftTraitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(1);\n\n\t\t\t\tconst editIds = tree.edits.editIds;\n\n\t\t\t\t// Edit 0 creates initial tree\n\t\t\t\texpect(editIds[1]).is.equal(firstEditId);\n\t\t\t\texpect(editIds[2]).is.equal(secondEditId);\n\t\t\t\texpect(editIds[3]).is.equal(thirdEditId);\n\t\t\t});\n\n\t\t\tit('tolerates invalid detaches', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, allowInvalid: true });\n\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t});\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst firstNode = makeEmptyNode();\n\t\t\t\tconst secondNode = makeEmptyNode();\n\t\t\t\tconst thirdNode = makeEmptyNode();\n\t\t\t\tconst firstEditId = secondTree.editor.insert(\n\t\t\t\t\t[firstNode, secondNode, thirdNode],\n\t\t\t\t\tStablePlace.after(left)\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Concurrently edit, creating invalid insert.\n\t\t\t\t// Create delete. This will apply.\n\t\t\t\tconst secondEditId = tree.editor.delete(secondNode);\n\n\t\t\t\tlet thirdEditId;\n\t\t\t\tassertNoDelta(tree, () => {\n\t\t\t\t\t// concurrently delete from before firstNode to after secondNode: this should become invalid\n\t\t\t\t\tthirdEditId = secondTree.editor.delete(\n\t\t\t\t\t\tStableRange.from(StablePlace.before(firstNode)).to(StablePlace.after(secondNode))\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Expect that firstNode did not get deleted\n\t\t\t\tconst leftTrait = tree.currentView.getTrait(leftTraitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(3);\n\n\t\t\t\tconst editIds = tree.edits.editIds;\n\t\t\t\t// Edit 0 creates initial tree\n\t\t\t\texpect(editIds[1]).to.equal(firstEditId);\n\t\t\t\texpect(editIds[2]).to.equal(secondEditId);\n\t\t\t\texpect(editIds[3]).to.equal(thirdEditId);\n\t\t\t});\n\n\t\t\tit('tolerates malformed inserts', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, allowMalformed: true });\n\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t});\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tlet edit;\n\t\t\t\tassertNoDelta(tree, () => {\n\t\t\t\t\tconst build = Change.build([], 0 as DetachedSequenceId);\n\t\t\t\t\tedit = newEdit([build]);\n\t\t\t\t\tsecondTree.processLocalEdit(edit);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t});\n\n\t\t\t\t// Edit 0 creates initial tree\n\t\t\t\texpect(tree.edits.getIdAtIndex(1)).to.equal(edit.id);\n\t\t\t});\n\n\t\t\trunSharedTreeUndoRedoTestSuite({ localMode: false, ...undoRedoOptions });\n\n\t\t\t// This is a regression test for documents corrupted by the following github issue:\n\t\t\t// https://github.com/microsoft/FluidFramework/issues/4399\n\t\t\tit('tolerates duplicate edits in trailing operations', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions });\n\t\t\t\tconst remoteRuntime = containerRuntimeFactory.createContainerRuntime(new MockFluidDataStoreRuntime());\n\t\t\t\tconst defaultEdits = tree.edits.length;\n\t\t\t\tconst edit = newEdit([]);\n\t\t\t\tfor (let submissions = 0; submissions < 2; submissions++) {\n\t\t\t\t\tremoteRuntime.submit({ type: SharedTreeOpType.Edit, edit }, /* localOpMetadata */ undefined);\n\t\t\t\t}\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(tree.edits.length).to.equal(defaultEdits + 1);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('SharedTree summarizing', () => {\n\t\t\tconst treeOptions = { initialTree: simpleTestTree, localMode: false };\n\t\t\tconst newNode = makeEmptyNode();\n\t\t\tconst testHandle = new TestFluidHandle();\n\n\t\t\tit('returns false when given bad json input', () => {\n\t\t\t\tassert.typeOf(deserialize('', testSerializer), 'string');\n\t\t\t\tassert.typeOf(deserialize('~ malformed JSON ~', testSerializer), 'string');\n\t\t\t\tassert.typeOf(deserialize('{ unrecognizedKey: 42 }', testSerializer), 'string');\n\t\t\t});\n\n\t\t\tit('correctly handles snapshots of default trees', () => {\n\t\t\t\tconst { tree: uninitializedTree } = setUpTestSharedTree();\n\n\t\t\t\t// Serialize the state of one uninitialized tree into a second tree\n\t\t\t\tconst serialized = serialize(uninitializedTree.saveSummary(), testSerializer, testHandle);\n\t\t\t\tconst parsedTree = deserialize(serialized, testSerializer) as SharedTreeSummary_0_0_2<unknown>;\n\t\t\t\texpect(parsedTree.sequencedEdits).deep.equal([]);\n\t\t\t\texpect(deepCompareNodes(parsedTree.currentTree, initialTree)).to.be.true;\n\t\t\t});\n\n\t\t\t[true, false].forEach((hasLocalEdits) => {\n\t\t\t\tit(`produces correct snapshot for a tree with ${hasLocalEdits ? 'local' : 'acked'} edits`, () => {\n\t\t\t\t\t// The initial tree results in an edit.\n\t\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t\tinitialTree: treeOptions.initialTree,\n\t\t\t\t\t\tlocalMode: hasLocalEdits,\n\t\t\t\t\t});\n\n\t\t\t\t\ttree.editor.insert(newNode, StablePlace.before(left));\n\t\t\t\t\tif (!hasLocalEdits) {\n\t\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t}\n\n\t\t\t\t\tconst serialized = serialize(tree.saveSummary(), testSerializer, testHandle);\n\t\t\t\t\tconst treeContent = JSON.parse(serialized);\n\t\t\t\t\tconst parsedTree = treeContent as SharedTreeSummary_0_0_2<Change>;\n\n\t\t\t\t\texpect(parsedTree.currentTree).to.not.be.undefined;\n\t\t\t\t\tconst testRoot = assertArrayOfOne(parsedTree.currentTree.traits[testTrait.label]);\n\t\t\t\t\texpect(testRoot).to.not.be.undefined;\n\t\t\t\t\texpect(testRoot.traits.left).to.not.be.undefined;\n\t\t\t\t\texpect(testRoot.traits.right).to.not.be.undefined;\n\t\t\t\t\texpect(testRoot.traits.left.length).to.equal(2);\n\n\t\t\t\t\texpect(parsedTree.sequencedEdits).to.not.be.undefined;\n\t\t\t\t\tconst sequencedEdits = assertNotUndefined(parsedTree.sequencedEdits);\n\n\t\t\t\t\t// Expect there to be a change in the edit history in addition to the one from setUpTestSharedTree\n\t\t\t\t\texpect(sequencedEdits.length).to.equal(2);\n\t\t\t\t\t// The first operation to be sequenced is the tree init\n\t\t\t\t\texpect(sequencedEdits[1].changes.length).to.equal(2);\n\t\t\t\t\texpect(sequencedEdits[1].changes[0].type).to.equal(ChangeType.Build);\n\t\t\t\t\texpect(sequencedEdits[1].changes[1].type).to.equal(ChangeType.Insert);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('can be used to initialize a tree', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree();\n\n\t\t\t\ttree.editor.insert(newNode, StablePlace.before(left));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tsecondTree.loadSummary(tree.saveSummary());\n\n\t\t\t\t// Trees should have equal state since we deserialized the first tree's state into the second tree\n\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t});\n\n\t\t\tit('can be used to initialize a tree with an empty edit list', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree();\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// The second tree is not caught up to the first tree yet\n\t\t\t\texpect(tree.equals(secondTree)).to.be.false;\n\n\t\t\t\tsecondTree.loadSummary(tree.saveSummary());\n\n\t\t\t\t// Trees should have equal state since we deserialized the first tree's state into the second tree\n\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t});\n\n\t\t\tit('asserts when loading a summary with duplicated edits', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...treeOptions,\n\t\t\t\t\tsummarizeHistory: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree();\n\n\t\t\t\ttree.editor.insert(newNode, StablePlace.before(left));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst summary = tree.saveSummary() as ReturnType<typeof fullHistorySummarizer>;\n\t\t\t\tconst sequencedEdits = assertNotUndefined(summary.sequencedEdits).slice();\n\t\t\t\tsequencedEdits.push(sequencedEdits[0]);\n\t\t\t\tconst corruptedSummary = {\n\t\t\t\t\t...summary,\n\t\t\t\t\tsequencedEdits,\n\t\t\t\t};\n\t\t\t\texpect(() => secondTree.loadSummary(corruptedSummary))\n\t\t\t\t\t.to.throw(Error)\n\t\t\t\t\t.that.has.property('message')\n\t\t\t\t\t.which.matches(/Duplicate/);\n\t\t\t});\n\n\t\t\tit('can be used without history preservation', async () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({\n\t\t\t\t\tinitialTree: simpleTestTree,\n\t\t\t\t\tlocalMode: true,\n\t\t\t\t\tsummarizeHistory: false,\n\t\t\t\t});\n\n\t\t\t\tconst editID = tree.editor.insert(newNode, StablePlace.before(left));\n\t\t\t\tconst view = tree.currentView;\n\t\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t\ttree.loadSummary(summary);\n\n\t\t\t\t// The current state of the tree should be identical to the one contained in the old summary.\n\t\t\t\texpect(tree.currentView.equals(view)).to.be.true;\n\n\t\t\t\t// The history should have been dropped by the default handling behavior.\n\t\t\t\t// It will contain a single entry setting the tree to equal the head revision.\n\t\t\t\texpect(tree.edits.length).to.equal(1);\n\t\t\t\texpect(await tree.edits.tryGetEdit(editID)).to.be.undefined;\n\t\t\t});\n\n\t\t\t// TODO:#49901: Enable these tests once we write edit chunk handles to summaries\n\t\t\tit.skip('does not swallow errors in asynchronous blob uploading', async () => {\n\t\t\t\tconst errorMessage = 'Simulated exception in uploadBlob';\n\t\t\t\tconst { tree, componentRuntime, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t\tcomponentRuntime.uploadBlob = async () => {\n\t\t\t\t\tthrow new Error(errorMessage);\n\t\t\t\t};\n\n\t\t\t\tlet treeErrorEventWasInvoked = false;\n\t\t\t\ttree.on('error', (error: unknown) => {\n\t\t\t\t\ttreeErrorEventWasInvoked = true;\n\t\t\t\t\texpect(error).to.have.property('message').which.equals(errorMessage);\n\t\t\t\t});\n\n\t\t\t\t// Generate enough edits to cause a chunk upload.\n\t\t\t\tfor (let i = 0; i < (tree.edits as EditLog<Change>).editsPerChunk / 2 + 1; i++) {\n\t\t\t\t\tconst insertee = makeEmptyNode();\n\t\t\t\t\ttree.editor.insert(insertee, StablePlace.before(left));\n\t\t\t\t\ttree.editor.delete(StableRange.only(insertee));\n\t\t\t\t}\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\ttree.saveSummary();\n\n\t\t\t\t// Just waiting for the ChunksEmitted event here isn't sufficient, as the SharedTree error\n\t\t\t\t// will propagate in a separate promise chain.\n\t\t\t\tawait delay(0);\n\t\t\t\texpect(treeErrorEventWasInvoked).to.equal(true, 'SharedTree error was never raised');\n\t\t\t});\n\t\t});\n\n\t\tdescribe('correctly diffs snapshots', () => {\n\t\t\tit('that are the same object', () => {\n\t\t\t\tconst id = uuidv4() as NodeId;\n\t\t\t\tconst snapshot = Snapshot.fromTree(makeEmptyNode(id));\n\t\t\t\texpect(snapshot.delta(snapshot)).deep.equals({\n\t\t\t\t\tchanged: [],\n\t\t\t\t\tadded: [],\n\t\t\t\t\tremoved: [],\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('that have the same tree', () => {\n\t\t\t\tconst node = makeEmptyNode();\n\t\t\t\tconst snapshotA = Snapshot.fromTree(node);\n\t\t\t\tconst snapshotB = Snapshot.fromTree(node);\n\t\t\t\texpect(snapshotA.delta(snapshotB)).deep.equals({\n\t\t\t\t\tchanged: [],\n\t\t\t\t\tadded: [],\n\t\t\t\t\tremoved: [],\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('with different root ids', () => {\n\t\t\t\tconst snapshotA = Snapshot.fromTree(makeEmptyNode());\n\t\t\t\tconst snapshotB = Snapshot.fromTree(makeEmptyNode());\n\t\t\t\texpect(() => snapshotA.delta(snapshotB)).to.throw(\n\t\t\t\t\t'Delta can only be calculated between snapshots that share a root'\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit('with different subtrees', () => {\n\t\t\t\tconst rootId = uuidv4() as NodeId;\n\t\t\t\tconst subtreeA = uuidv4() as NodeId;\n\t\t\t\tconst subtreeB = uuidv4() as NodeId;\n\t\t\t\tconst leafA = makeEmptyNode();\n\t\t\t\tconst leafB = makeEmptyNode();\n\t\t\t\tconst rootA: ChangeNode = {\n\t\t\t\t\tidentifier: rootId,\n\t\t\t\t\tdefinition: 'node' as Definition,\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tidentifier: subtreeA,\n\t\t\t\t\t\t\t\tdefinition: 'node' as Definition,\n\t\t\t\t\t\t\t\ttraits: { children: [leafA] },\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\tconst rootB: ChangeNode = {\n\t\t\t\t\tidentifier: rootId,\n\t\t\t\t\tdefinition: 'node' as Definition,\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tidentifier: subtreeB,\n\t\t\t\t\t\t\t\tdefinition: 'node' as Definition,\n\t\t\t\t\t\t\t\ttraits: { children: [leafB] },\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\n\t\t\t\tconst snapshotA = Snapshot.fromTree(rootA);\n\t\t\t\tconst snapshotB = Snapshot.fromTree(rootB);\n\t\t\t\tconst delta = snapshotA.delta(snapshotB);\n\t\t\t\texpect(delta.changed).deep.equals([rootId]);\n\t\t\t\texpect(delta.removed.length).equals(2);\n\t\t\t\texpect(delta.added.length).equals(2);\n\t\t\t\texpect(delta.removed).contains(subtreeA);\n\t\t\t\texpect(delta.removed).contains(leafA.identifier);\n\t\t\t\texpect(delta.added).contains(subtreeB);\n\t\t\t\texpect(delta.added).contains(leafB.identifier);\n\t\t\t});\n\n\t\t\tit('with different payloads', () => {\n\t\t\t\tconst rootId = uuidv4() as NodeId;\n\t\t\t\tconst nodeA: ChangeNode = {\n\t\t\t\t\tidentifier: rootId,\n\t\t\t\t\tdefinition: 'node' as Definition,\n\t\t\t\t\tpayload: 'test1',\n\t\t\t\t\ttraits: {},\n\t\t\t\t};\n\t\t\t\tconst nodeB: ChangeNode = {\n\t\t\t\t\tidentifier: rootId,\n\t\t\t\t\tdefinition: 'node' as Definition,\n\t\t\t\t\tpayload: 'test2',\n\t\t\t\t\ttraits: {},\n\t\t\t\t};\n\n\t\t\t\tconst snapshotA = Snapshot.fromTree(nodeA);\n\t\t\t\tconst snapshotB = Snapshot.fromTree(nodeB);\n\t\t\t\tconst delta = snapshotA.delta(snapshotB);\n\t\t\t\texpect(delta.changed).deep.equals([rootId]);\n\t\t\t\texpect(delta.removed).deep.equals([]);\n\t\t\t\texpect(delta.added).deep.equals([]);\n\t\t\t});\n\n\t\t\tit('after an insert', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\n\t\t\t\tconst snapshotA = tree.currentView;\n\t\t\t\tconst insertedNode = makeEmptyNode();\n\t\t\t\ttree.editor.insert(insertedNode, StablePlace.before(left));\n\t\t\t\tconst snapshotB = tree.currentView;\n\t\t\t\tconst delta = snapshotA.delta(snapshotB);\n\t\t\t\tassert(delta);\n\t\t\t\texpect(delta.changed).deep.equals([simpleTestTree.identifier]);\n\t\t\t\texpect(delta.removed).deep.equals([]);\n\t\t\t\texpect(delta.added).deep.equals([insertedNode.identifier]);\n\t\t\t});\n\n\t\t\tit('after a delete', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\n\t\t\t\tconst snapshotA = tree.currentView;\n\t\t\t\ttree.editor.delete(left);\n\t\t\t\tconst snapshotB = tree.currentView;\n\t\t\t\tconst delta = snapshotA.delta(snapshotB);\n\t\t\t\tassert(delta);\n\t\t\t\texpect(delta.changed).deep.equals([simpleTestTree.identifier]);\n\t\t\t\texpect(delta.removed).deep.equals([left.identifier]);\n\t\t\t\texpect(delta.added).deep.equals([]);\n\t\t\t});\n\n\t\t\tit('after a move', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\n\t\t\t\tconst snapshotA = tree.currentView;\n\t\t\t\ttree.editor.move(left, StablePlace.after(right));\n\t\t\t\tconst snapshotB = tree.currentView;\n\t\t\t\tconst delta = snapshotA.delta(snapshotB);\n\t\t\t\tassert(delta);\n\t\t\t\texpect(delta.changed).deep.equals([simpleTestTree.identifier]);\n\t\t\t\texpect(delta.removed).deep.equals([]);\n\t\t\t\texpect(delta.added).deep.equals([]);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('handles', () => {\n\t\t\tit('can reference a node', () => {\n\t\t\t\t// Test that a handle can wrap a node and retrieve that node's properties\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\t\t\t\tconst leftHandle = new TreeNodeHandle(tree.currentView, left.identifier);\n\t\t\t\texpect(areNodesEquivalent(left, leftHandle)).to.be.true;\n\t\t\t\texpect(areNodesEquivalent(right, leftHandle)).to.be.false;\n\t\t\t});\n\n\t\t\tit('can create handles from children', () => {\n\t\t\t\t// Test that when retrieving children via the \"traits\" property of a handle, the\n\t\t\t\t// children are also wrapped in handles\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\t\t\t\tconst rootHandle = new TreeNodeHandle(tree.currentView, simpleTestTree.identifier);\n\t\t\t\texpect(areNodesEquivalent(simpleTestTree, rootHandle)).to.be.true;\n\t\t\t\tconst leftHandle = rootHandle.traits.left[0];\n\t\t\t\texpect(areNodesEquivalent(left, leftHandle)).to.be.true;\n\t\t\t\texpect(leftHandle instanceof TreeNodeHandle).to.be.true;\n\t\t\t});\n\n\t\t\tit('do not update when the current view of the tree changes', () => {\n\t\t\t\t// Unlike CurrentTreeNodeHandles, SnapshotTreeNodeHandles should never change\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\t\t\t\tconst leftHandle = new TreeNodeHandle(tree.currentView, left.identifier);\n\t\t\t\texpect(leftHandle.traits.right).to.be.undefined;\n\t\t\t\t// Move \"right\" under \"left\"\n\t\t\t\ttree.editor.move(right, StablePlace.atStartOf({ parent: left.identifier, label: rightTraitLabel }));\n\t\t\t\texpect(leftHandle.traits.right).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('can be fully demanded', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\t\t\t\tconst rootHandle = new TreeNodeHandle(tree.currentView, simpleTestTree.identifier);\n\t\t\t\tconst rootNode = rootHandle.demandTree();\n\t\t\t\texpect(areNodesEquivalent(simpleTestTree, rootNode)).to.be.true;\n\t\t\t\tconst printBeforeDemand = JSON.stringify(rootNode);\n\t\t\t\t// Demand the tree by walking into its traits. If they were lazy, this would change the `rootNode` object.\n\t\t\t\texpect(areNodesEquivalent(left, rootNode.traits.left[0])).to.be.true;\n\t\t\t\texpect(areNodesEquivalent(right, rootNode.traits.right[0])).to.be.true;\n\t\t\t\t// Ensure that they were _not_ lazy by comparing with the initial print of the tree\n\t\t\t\texpect(JSON.stringify(rootNode)).equals(printBeforeDemand);\n\t\t\t});\n\n\t\t\tit('implement toString', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree({ initialTree: simpleTestTree });\n\t\t\t\tconst rootHandle = new TreeNodeHandle(tree.currentView, simpleTestTree.identifier);\n\t\t\t\tconst print = `${rootHandle}`;\n\t\t\t\t// Shouldn't print the default toString for objects\n\t\t\t\texpect(print.startsWith('[object')).to.be.false;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('telemetry', () => {\n\t\t\tit('decorates events with the correct properties', async () => {\n\t\t\t\t// Test that a handle can wrap a node and retrieve that node's properties\n\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\tinitialTree: simpleTestTree,\n\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\t// Invalid edit\n\t\t\t\ttree.editor.insert(makeEmptyNode(), StablePlace.after(makeEmptyNode()));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t// Force demand, which will cause a telemetry event for the invalid edit to be emitted\n\t\t\t\tawait tree.logViewer.getSnapshot(Number.POSITIVE_INFINITY);\n\t\t\t\texpect(events.length).is.greaterThan(0);\n\t\t\t\tevents.forEach((event) => {\n\t\t\t\t\texpect(isSharedTreeEvent(event)).is.true;\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SharedTreeTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeTests.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 { assert, expect } from 'chai';\nimport { ITelemetryBaseEvent } from '@fluidframework/common-definitions';\nimport { IsoBuffer } from '@fluidframework/common-utils';\nimport { LoaderHeader } from '@fluidframework/container-definitions';\nimport { ISequencedDocumentMessage } from '@fluidframework/protocol-definitions';\nimport {\n\tMockContainerRuntime,\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n} from '@fluidframework/test-runtime-utils';\nimport { assertArrayOfOne, assertNotUndefined, fail, isSharedTreeEvent } from '../../Common';\nimport { EditId, OpSpaceNodeId, TraitLabel } from '../../Identifiers';\nimport { CachingLogViewer } from '../../LogViewer';\nimport { EditLog, OrderedEditSet } from '../../EditLog';\nimport { initialTree } from '../../InitialTree';\nimport { TreeNodeHandle } from '../../TreeNodeHandle';\nimport { deserialize } from '../../SummaryBackCompatibility';\nimport { useFailedSequencedEditTelemetry } from '../../MergeHealth';\nimport { MutableStringInterner } from '../../StringInterner';\nimport { getChangeNodeFromView } from '../../SerializationUtilities';\nimport { EditCommittedEventArguments, SequencedEditAppliedEventArguments, SharedTree } from '../../SharedTree';\nimport {\n\tChangeInternal,\n\tChangeNode,\n\tChangeNode_0_0_2,\n\tChangeTypeInternal,\n\tCompressedChangeInternal,\n\tEditChunkContents,\n\teditsPerChunk,\n\tEditStatus,\n\tEditWithoutId,\n\tFluidEditHandle,\n\tSharedTreeEditOp,\n\tSharedTreeSummary,\n\tSharedTreeSummaryBase,\n\tSharedTreeSummary_0_0_2,\n\tWriteFormat,\n} from '../../persisted-types';\nimport { SharedTreeDiagnosticEvent, SharedTreeEvent } from '../../EventTypes';\nimport { BuildNode, Change, ChangeType, StablePlace, StableRange } from '../../ChangeTypes';\nimport { convertTreeNodes, deepCompareNodes } from '../../EditUtilities';\nimport { serialize, SummaryContents } from '../../Summary';\nimport { InterningTreeCompressor } from '../../TreeCompressor';\nimport { SharedTreeEncoder_0_0_2, SharedTreeEncoder_0_1_1 } from '../../SharedTreeEncoder';\nimport { sequencedIdNormalizer } from '../../NodeIdUtilities';\nimport { convertNodeDataIds } from '../../IdConversion';\nimport { buildLeaf, SimpleTestTree, TestTree } from './TestNode';\nimport { TestFluidHandle, TestFluidSerializer } from './TestSerializer';\nimport { runSharedTreeUndoRedoTestSuite } from './UndoRedoTests';\nimport {\n\tareNodesEquivalent,\n\tassertNoDelta,\n\tSharedTreeTestingComponents,\n\tSharedTreeTestingOptions,\n\tsetUpTestTree,\n\ttestTrait,\n\ttestTraitLabel,\n\ttranslateId,\n\tspyOnSubmittedOps,\n\tnormalizeIds,\n\tnormalizeId,\n\tnormalizeEdit,\n\tsetUpLocalServerTestSharedTree,\n\tapplyNoop,\n\tgetIdNormalizerFromSharedTree,\n\twaitForSummary,\n} from './TestUtilities';\n\nfunction revertEditInTree(tree: SharedTree, edit: EditId): EditId | undefined {\n\treturn tree.revert(edit);\n}\n\n// Options for the undo/redo test suite. The undo and redo functions are the same.\nconst undoRedoOptions = {\n\ttitle: 'Revert',\n\tundo: revertEditInTree,\n\tredo: revertEditInTree,\n};\n\n/**\n * Runs a test suite for operations on `SharedTree` writing ops at `writeFormat`.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSharedTreeOperationsTests(\n\ttitle: string,\n\twriteFormat: WriteFormat,\n\tsetUpTestSharedTreeWithDefaultVersion: (options?: SharedTreeTestingOptions) => SharedTreeTestingComponents\n) {\n\tconst setUpTestSharedTree: typeof setUpTestSharedTreeWithDefaultVersion = (options) =>\n\t\tsetUpTestSharedTreeWithDefaultVersion({ writeFormat, ...options });\n\n\t/**\n\t * Convenience bundling of test components.\n\t * Like {@link SharedTreeTestingComponents}, but contains both the {@link SimpleTestTree} and\n\t * its associated {@link TSharedTree}.\n\t */\n\tinterface SharedTreeTest {\n\t\t/**\n\t\t * {@inheritDoc SharedTreeTestingComponents.tree}\n\t\t */\n\t\tsharedTree: SharedTree;\n\n\t\t/**\n\t\t * {@link SimpleTestTree} corresponding to {@link SharedTreeTest.sharedTree}\n\t\t */\n\t\ttestTree: TestTree;\n\n\t\t/**\n\t\t * {@inheritDoc SharedTreeTestingComponents.componentRuntime}\n\t\t */\n\t\tcomponentRuntime: MockFluidDataStoreRuntime;\n\n\t\t/**\n\t\t * {@inheritDoc SharedTreeTestingComponents.containerRuntimeFactory}\n\t\t */\n\t\tcontainerRuntimeFactory: MockContainerRuntimeFactory;\n\t}\n\n\tfunction createSimpleTestTree(options?: SharedTreeTestingOptions): SharedTreeTest {\n\t\tconst { tree: sharedTree, componentRuntime, containerRuntimeFactory } = setUpTestSharedTree(options);\n\t\tconst testTree = setUpTestTree(sharedTree);\n\t\treturn { sharedTree, testTree, componentRuntime, containerRuntimeFactory };\n\t}\n\n\tdescribe(title, () => {\n\t\tconst testSerializer = new TestFluidSerializer();\n\n\t\tdescribe('SharedTree before initialization', () => {\n\t\t\tit('can create a new SharedTree', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree();\n\t\t\t\texpect(tree).to.not.be.undefined;\n\t\t\t});\n\n\t\t\tit('valid without initial tree', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree();\n\t\t\t\texpect(tree.currentView.getTrait(testTrait(tree.currentView))).deep.equals(\n\t\t\t\t\t[],\n\t\t\t\t\t'Root should exist, and child traits should be valid but empty.'\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('SharedTree in local state', () => {\n\t\t\tit('does not emit change events for each change in a batch of changes', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\n\t\t\t\tlet changeCount = 0;\n\t\t\t\tsharedTree.on(SharedTreeEvent.EditCommitted, () => {\n\t\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\t\tconst rightTrait = sharedTree.currentView.getTrait(testTree.right.traitLocation);\n\n\t\t\t\t\texpect(leftTrait.length).to.equal(0); // \"left\" child is deleted...\n\t\t\t\t\texpect(rightTrait.length).to.equal(2); // ...and added to \"right\" trait\n\n\t\t\t\t\tchangeCount += 1;\n\t\t\t\t});\n\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t...Change.move(StableRange.only(testTree.left), StablePlace.after(testTree.right))\n\t\t\t\t);\n\t\t\t\texpect(changeCount).equals(1);\n\t\t\t});\n\n\t\t\tit('can insert a wrapped tree', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\n\t\t\t\tconst childNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst childId = 0;\n\t\t\t\tconst childrenTraitLabel = 'children' as TraitLabel;\n\t\t\t\tconst parentNode = {\n\t\t\t\t\tidentifier: testTree.generateNodeId(),\n\t\t\t\t\tdefinition: 'node',\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\t[childrenTraitLabel]: childId,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst parentId = 1;\n\t\t\t\tconst buildChild = Change.build(childNode, childId);\n\t\t\t\tconst buildParent = Change.build(parentNode, parentId);\n\t\t\t\tconst insertParent = Change.insert(parentId, StablePlace.before(testTree.left));\n\n\t\t\t\tsharedTree.applyEdit(buildChild, buildParent, insertParent);\n\n\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(2);\n\t\t\t\texpect(leftTrait[0]).to.equal(parentNode.identifier);\n\t\t\t\tconst childrenTrait = sharedTree.currentView.getTrait({\n\t\t\t\t\tparent: parentNode.identifier,\n\t\t\t\t\tlabel: childrenTraitLabel,\n\t\t\t\t});\n\t\t\t\texpect(childrenTrait.length).to.equal(1);\n\t\t\t\texpect(childrenTrait[0]).to.equal(childNode.identifier);\n\t\t\t});\n\n\t\t\tit('prevents multi-parenting detached trees', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowMalformed: true });\n\n\t\t\t\tconst childNode = testTree.buildLeaf();\n\t\t\t\tconst childId = 0;\n\t\t\t\tconst childrenTraitLabel = 'children';\n\t\t\t\tconst parentNode: BuildNode = {\n\t\t\t\t\tidentifier: testTree.generateNodeId(),\n\t\t\t\t\tdefinition: 'node',\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\t[childrenTraitLabel]: childId,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst parentNode2: BuildNode = {\n\t\t\t\t\tidentifier: testTree.generateNodeId(),\n\t\t\t\t\tdefinition: 'node',\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\t[childrenTraitLabel]: childId,\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst buildChild = Change.build(childNode, childId);\n\t\t\t\tconst buildParent = Change.build(parentNode, 1);\n\t\t\t\tconst buildParent2 = Change.build(parentNode2, 2);\n\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\t// we don't expect this edit application to change anything\n\t\t\t\t\tsharedTree.applyEdit(buildChild, buildParent, buildParent2);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// TODO:#58052: Make this test pass.\n\t\t\tit.skip('prevents setting the value of a node in a detached subtree', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowInvalid: true });\n\n\t\t\t\tconst detachedNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst detachedSequenceId = 0;\n\t\t\t\tconst { id } = sharedTree.applyEdit(\n\t\t\t\t\tChange.build(detachedNode, detachedSequenceId),\n\t\t\t\t\tChange.setPayload(detachedNode.identifier, 42),\n\t\t\t\t\tChange.insert(detachedSequenceId, StablePlace.before(testTree.left))\n\t\t\t\t);\n\t\t\t\tconst logViewer = sharedTree.logViewer as CachingLogViewer;\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(id)).status).equals(\n\t\t\t\t\tEditStatus.Invalid\n\t\t\t\t);\n\t\t\t\tsharedTree.currentView.assertConsistent();\n\t\t\t});\n\n\t\t\t// TODO:#58052: Make this test pass.\n\t\t\tit.skip('prevents inserting a node in a detached subtree through a local edit', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowInvalid: true });\n\n\t\t\t\tconst detachedNewNode = testTree.buildLeaf();\n\t\t\t\tconst detachedNewNodeSequenceId = 0;\n\t\t\t\tconst detachedRightNodeSequenceId = 1;\n\t\t\t\tconst { id } = sharedTree.applyEdit(\n\t\t\t\t\tChange.build(detachedNewNode, detachedNewNodeSequenceId),\n\t\t\t\t\tChange.detach(StableRange.only(testTree.right), detachedRightNodeSequenceId),\n\t\t\t\t\t// This change attempts to insert a node under a detached node\n\t\t\t\t\tChange.insert(\n\t\t\t\t\t\tdetachedNewNodeSequenceId,\n\t\t\t\t\t\tStablePlace.atStartOf({ parent: testTree.right.identifier, label: 'foo' as TraitLabel })\n\t\t\t\t\t),\n\t\t\t\t\tChange.insert(detachedRightNodeSequenceId, StablePlace.before(testTree.left))\n\t\t\t\t);\n\t\t\t\tconst logViewer = sharedTree.logViewer as CachingLogViewer;\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(id)).status).equals(\n\t\t\t\t\tEditStatus.Invalid\n\t\t\t\t);\n\t\t\t\tsharedTree.currentView.assertConsistent();\n\t\t\t});\n\n\t\t\tit('prevents deletion of the root', () => {\n\t\t\t\tconst { sharedTree } = createSimpleTestTree({ allowInvalid: true });\n\t\t\t\tconst rootId = sharedTree.convertToNodeId(initialTree.identifier);\n\t\t\t\texpect(sharedTree.currentView.hasNode(rootId));\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\t// Try to delete the root\n\t\t\t\t\tsharedTree.applyEdit(Change.delete(StableRange.only(rootId)));\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('can apply multiple local edits without ack from server', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\n\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\t\tsharedTree.applyEdit(...Change.move(StableRange.only(newNode), StablePlace.before(testTree.left)));\n\n\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTrait.length).equals(2);\n\t\t\t\texpect(leftTrait[0]).equals(newNode.identifier);\n\t\t\t});\n\n\t\t\tit('is not equal to a tree with different current views', () => {\n\t\t\t\tconst { sharedTree: sharedTree1 } = createSimpleTestTree();\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.false;\n\t\t\t});\n\n\t\t\tit('is not equal to a tree with the same current view but different edit logs', () => {\n\t\t\t\tconst { sharedTree: sharedTree1 } = createSimpleTestTree();\n\t\t\t\tconst { sharedTree: sharedTree2 } = createSimpleTestTree();\n\n\t\t\t\t// The edits that create the initial tree have different identities.\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.false;\n\t\t\t});\n\n\t\t\tit('tolerates invalid inserts', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowInvalid: true });\n\n\t\t\t\tconst firstNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst secondNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(firstNode, StablePlace.after(testTree.left)));\n\t\t\t\tsharedTree.applyEdit(Change.delete(StableRange.only(firstNode)));\n\n\t\t\t\t// Trying to insert next to the deleted node should drop, confirm that it doesn't\n\t\t\t\t// change the view\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(secondNode, StablePlace.after(firstNode)));\n\t\t\t\t});\n\n\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(1);\n\t\t\t});\n\n\t\t\tit('tolerates invalid detaches', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowInvalid: true });\n\n\t\t\t\tconst firstNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst secondNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst thirdNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t...Change.insertTree([firstNode, secondNode, thirdNode], StablePlace.after(testTree.left))\n\t\t\t\t);\n\t\t\t\tsharedTree.applyEdit(Change.delete(StableRange.only(secondNode)));\n\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\t// Trying to delete from before firstNode to after secondNode should drop\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\tChange.delete(StableRange.from(StablePlace.before(firstNode)).to(StablePlace.after(secondNode)))\n\t\t\t\t\t);\n\n\t\t\t\t\t// Trying to delete from after thirdNode to before firstNode should drop\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\tChange.delete(StableRange.from(StablePlace.after(thirdNode)).to(StablePlace.before(firstNode)))\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\t// Expect that firstNode did not get deleted\n\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(3);\n\t\t\t});\n\n\t\t\tit('tolerates malformed inserts', () => {\n\t\t\t\tconst { sharedTree } = createSimpleTestTree({ allowMalformed: true });\n\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\tsharedTree.applyEdit(Change.build([], 0));\n\t\t\t\t});\n\t\t\t});\n\n\t\t\trunSharedTreeUndoRedoTestSuite({ localMode: true, ...undoRedoOptions });\n\t\t});\n\n\t\tdescribe('SharedTree in connected state with a remote SharedTree', () => {\n\t\t\t/**\n\t\t\t * Initial tree options for multi-tree tests below.\n\t\t\t * Intended to be passed to {@link createSimpleTestTree}.\n\t\t\t */\n\t\t\tconst tree1Options = { localMode: false };\n\n\t\t\t/**\n\t\t\t * Secondary tree options derived from some initial tree.\n\t\t\t */\n\t\t\tfunction createSecondTreeOptions(\n\t\t\t\tcontainerRuntimeFactory: MockContainerRuntimeFactory\n\t\t\t): SharedTreeTestingOptions {\n\t\t\t\treturn {\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\tid: 'secondTestSharedTree',\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tit('should apply remote changes and converge', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree(tree1Options);\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree(createSecondTreeOptions(containerRuntimeFactory));\n\n\t\t\t\tconst newNodeId1 = sharedTree1.generateNodeId();\n\t\t\t\tsharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(newNodeId1)],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree1.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t// Sync initial tree\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst newNodeId2 = translateId(newNodeId1, sharedTree1, sharedTree2);\n\n\t\t\t\t// Both trees should contain 'left'\n\t\t\t\texpect(sharedTree1.currentView.getViewNode(newNodeId1)).to.not.be.undefined;\n\t\t\t\texpect(sharedTree2.currentView.getViewNode(newNodeId2)).to.not.be.undefined;\n\n\t\t\t\tsharedTree2.applyEdit(Change.delete(StableRange.only(newNodeId2)));\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst rootA = sharedTree1.currentView.getViewNode(sharedTree1.currentView.root);\n\t\t\t\texpect(rootA.traits.get(testTraitLabel)).to.be.undefined;\n\n\t\t\t\tconst rootB = sharedTree2.currentView.getViewNode(sharedTree2.currentView.root);\n\t\t\t\texpect(rootB.traits.get(testTraitLabel)).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('converges in the face of concurrent changes', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree(tree1Options);\n\t\t\t\tconst { sharedTree: sharedTree2 } = createSimpleTestTree(\n\t\t\t\t\tcreateSecondTreeOptions(containerRuntimeFactory)\n\t\t\t\t);\n\n\t\t\t\tconst newNodeId1 = sharedTree1.generateNodeId();\n\t\t\t\tsharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(newNodeId1)],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree1.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// First client deletes a trait containing a node in the initial tree\n\t\t\t\tsharedTree1.applyEdit(Change.delete(StableRange.all(testTrait(sharedTree1.currentView))));\n\n\t\t\t\t// Second client concurrently adds a new node to that trait\n\t\t\t\tconst newNodeId2 = sharedTree2.generateNodeId();\n\t\t\t\tsharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(newNodeId2)],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree2.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Second client's change gets sequenced after the deletion, so the trait\n\t\t\t\t// should exist and contain the second new node on both clients after messages are delivered.\n\t\t\t\tconst leftTrait = normalizeIds(\n\t\t\t\t\tsharedTree1,\n\t\t\t\t\t...sharedTree1.currentView.getTrait(testTrait(sharedTree1.currentView))\n\t\t\t\t);\n\t\t\t\tconst secondLeftTrait = normalizeIds(\n\t\t\t\t\tsharedTree2,\n\t\t\t\t\t...sharedTree2.currentView.getTrait(testTrait(sharedTree2.currentView))\n\t\t\t\t);\n\t\t\t\texpect(leftTrait.length).equals(1);\n\t\t\t\texpect(leftTrait[0]).equals(normalizeId(sharedTree2, newNodeId2));\n\t\t\t\texpect(leftTrait).deep.equals(secondLeftTrait);\n\t\t\t});\n\n\t\t\tit('is equal to a tree with the same state', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree(tree1Options);\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree(createSecondTreeOptions(containerRuntimeFactory));\n\t\t\t\tconst newNodeId1 = sharedTree1.generateNodeId();\n\t\t\t\tsharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tidentifier: newNodeId1,\n\t\t\t\t\t\t\t\tdefinition: 'foo',\n\t\t\t\t\t\t\t\ttraits: { left: buildLeaf(), right: buildLeaf() },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree1.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.true;\n\t\t\t\tsharedTree2.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.only(translateId(newNodeId1, sharedTree1, sharedTree2)))\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.true;\n\t\t\t});\n\n\t\t\t// TODO:#58052: Make this test pass.\n\t\t\tit.skip('prevents inserting a node in a detached subtree as the result of merged edits', () => {\n\t\t\t\tconst { testTree } = createSimpleTestTree();\n\n\t\t\t\tconst rootNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tconst parent1Node = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tconst parent2Node = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst parent2Id = parent2Node.identifier;\n\n\t\t\t\tconst childNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst childId = childNode.identifier;\n\n\t\t\t\tconst initialTree = {\n\t\t\t\t\t...rootNode,\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\tparents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t...parent1Node,\n\t\t\t\t\t\t\t\ttraits: { child: childNode },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tparent2Node,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst childTraitUnderParent2 = { parent: parent2Id, label: 'child' as TraitLabel };\n\t\t\t\tconst badTraitUnderChild = { parent: childId, label: 'whatever' as TraitLabel };\n\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tinitialTree,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree({\n\t\t\t\t\t...createSecondTreeOptions(containerRuntimeFactory),\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Move the child under parent2\n\t\t\t\t// This first edit should succeed locally and globally\n\t\t\t\tconst edit1 = sharedTree1.applyEdit(\n\t\t\t\t\t...Change.move(StableRange.only(childId), StablePlace.atStartOf(childTraitUnderParent2))\n\t\t\t\t);\n\n\t\t\t\t// Concurrently move parent2 under child\n\t\t\t\t// This first edit should succeed locally but fail globally\n\t\t\t\tconst edit2 = sharedTree2.applyEdit(\n\t\t\t\t\t...Change.move(StableRange.only(parent2Id), StablePlace.atStartOf(badTraitUnderChild))\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst logViewer = sharedTree1.logViewer as CachingLogViewer;\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(edit1.id)).status).equals(\n\t\t\t\t\tEditStatus.Applied\n\t\t\t\t);\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(edit2.id)).status).equals(\n\t\t\t\t\tEditStatus.Invalid\n\t\t\t\t);\n\t\t\t\tsharedTree1.currentView.assertConsistent();\n\t\t\t});\n\n\t\t\tit('tolerates invalid inserts', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree({\n\t\t\t\t\t...createSecondTreeOptions(containerRuntimeFactory),\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst firstNode2 = buildLeaf(sharedTree2.generateNodeId());\n\t\t\t\tconst firstEdit = sharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(firstNode2, StablePlace.atStartOf(testTrait(sharedTree2.currentView)))\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Concurrently edit, creating invalid insert.\n\t\t\t\t// Create delete. This will apply.\n\t\t\t\tconst secondEdit = sharedTree1.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.only(translateId(firstNode2, sharedTree2, sharedTree1)))\n\t\t\t\t);\n\n\t\t\t\tlet thirdEdit;\n\t\t\t\tassertNoDelta(sharedTree1, () => {\n\t\t\t\t\t// concurrently insert next to the deleted node: this will become invalid.\n\t\t\t\t\tconst secondNode2 = buildLeaf();\n\t\t\t\t\tthirdEdit = sharedTree2.applyEdit(...Change.insertTree(secondNode2, StablePlace.after(firstNode2)));\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t});\n\n\t\t\t\tconst leftTrait = sharedTree2.currentView.getTrait(testTrait(sharedTree2.currentView));\n\t\t\t\texpect(leftTrait.length).to.equal(0);\n\n\t\t\t\tconst editIds = sharedTree1.edits.editIds;\n\n\t\t\t\texpect(editIds[0]).is.equal(firstEdit.id);\n\t\t\t\texpect(editIds[1]).is.equal(secondEdit.id);\n\t\t\t\texpect(editIds[2]).is.equal(thirdEdit.id);\n\t\t\t});\n\n\t\t\tit('tolerates invalid detaches', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree(createSecondTreeOptions(containerRuntimeFactory));\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst firstNode2 = buildLeaf(sharedTree2.generateNodeId());\n\t\t\t\tconst secondNode2 = buildLeaf(sharedTree2.generateNodeId());\n\t\t\t\tconst thirdNode = buildLeaf();\n\t\t\t\tconst firstEdit = sharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[firstNode2, secondNode2, thirdNode],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree2.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Create delete. This will apply.\n\t\t\t\tconst secondEdit = sharedTree1.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.only(translateId(secondNode2, sharedTree2, sharedTree1)))\n\t\t\t\t);\n\n\t\t\t\t// concurrently delete from before firstNode to after secondNode: this should become invalid\n\t\t\t\tconst thirdEdit = sharedTree2.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.from(StablePlace.before(firstNode2)).to(StablePlace.after(secondNode2)))\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Expect that firstNode did not get deleted\n\t\t\t\tconst leftTrait = sharedTree1.currentView.getTrait(testTrait(sharedTree1.currentView));\n\t\t\t\texpect(leftTrait.length).to.equal(2);\n\n\t\t\t\tconst editIds = sharedTree1.edits.editIds;\n\t\t\t\texpect(editIds[0]).to.equal(firstEdit.id);\n\t\t\t\texpect(editIds[1]).to.equal(secondEdit.id);\n\t\t\t\texpect(editIds[2]).to.equal(thirdEdit.id);\n\t\t\t});\n\n\t\t\tit('tolerates malformed inserts', () => {\n\t\t\t\tconst { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tallowMalformed: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree(createSecondTreeOptions(containerRuntimeFactory));\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tlet editId!: EditId;\n\t\t\t\tassertNoDelta(sharedTree1, () => {\n\t\t\t\t\tconst build = Change.build([], 0);\n\t\t\t\t\teditId = sharedTree2.applyEdit(build).id;\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t});\n\n\t\t\t\t// Edit 0 creates initial tree\n\t\t\t\texpect(sharedTree1.edits.getIdAtIndex(1)).to.equal(editId);\n\t\t\t});\n\n\t\t\trunSharedTreeUndoRedoTestSuite({ localMode: false, ...undoRedoOptions });\n\n\t\t\t// This is a regression test for documents corrupted by the following github issue:\n\t\t\t// https://github.com/microsoft/FluidFramework/issues/4399\n\t\t\tit('tolerates duplicate edits in trailing operations', () => {\n\t\t\t\tconst { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree(tree1Options);\n\t\t\t\tconst remoteRuntime = containerRuntimeFactory.createContainerRuntime(new MockFluidDataStoreRuntime());\n\t\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\t\t\t\tconst initialEditCount = sharedTree1.edits.length;\n\t\t\t\tsharedTree1.applyEdit(Change.setPayload(sharedTree1.currentView.root, 42));\n\t\t\t\tremoteRuntime.submit(ops[0], /* localOpMetadata */ undefined);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(sharedTree1.edits.length).to.equal(initialEditCount + 1);\n\t\t\t});\n\n\t\t\tit('detects concurrent duplicate IDs', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree({\n\t\t\t\t\t...createSecondTreeOptions(containerRuntimeFactory),\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst duplicateId = 'duplicate';\n\t\t\t\tsharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(sharedTree1.generateNodeId(duplicateId))],\n\t\t\t\t\t\tStablePlace.atEndOf(testTrait(sharedTree1.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tsharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(sharedTree2.generateNodeId(duplicateId))],\n\t\t\t\t\t\tStablePlace.atEndOf(testTrait(sharedTree2.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(sharedTree1.currentView.size).to.equal(2);\n\t\t\t\tconst trait1 = sharedTree1.currentView.getTrait(testTrait(sharedTree1.currentView));\n\t\t\t\texpect(trait1.length).to.equal(1);\n\t\t\t\texpect(sharedTree1.convertToStableNodeId(trait1[0])).to.equal(duplicateId);\n\t\t\t\texpect(sharedTree1.equals(sharedTree2));\n\t\t\t});\n\n\t\t\tif (writeFormat !== WriteFormat.v0_0_2) {\n\t\t\t\t// This is a regression test for an issue where edits containing Fluid handles weren't properly\n\t\t\t\t// serialized by chunk uploading code: rather than use an IFluidSerializer, we previously just\n\t\t\t\t// JSON.stringify'd.\n\t\t\t\tit('can round-trip edits containing handles through chunking', async () => {\n\t\t\t\t\tconst blobbedPayload = 'blobbed-string-payload';\n\t\t\t\t\tconst { tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t});\n\t\t\t\t\tconst testTree = setUpTestTree(tree);\n\n\t\t\t\t\tconst buffer = IsoBuffer.from(blobbedPayload, 'utf8');\n\t\t\t\t\tconst blob = await tree.getRuntime().uploadBlob(buffer);\n\t\t\t\t\tconst nodeWithPayload = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\ttree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(nodeWithPayload, StablePlace.after(testTree.left)),\n\t\t\t\t\t\tChange.setPayload(nodeWithPayload.identifier, { blob })\n\t\t\t\t\t);\n\n\t\t\t\t\t// Apply enough edits for the upload of an edit chunk\n\t\t\t\t\tfor (let i = 0; i < (tree.edits as EditLog).editsPerChunk; i++) {\n\t\t\t\t\t\tapplyNoop(tree);\n\t\t\t\t\t}\n\n\t\t\t\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\t\t\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\t\t\t\t// Wait for the ops to to be submitted and processed across the containers\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\t\t\tconst summary = tree.saveSummary() as SharedTreeSummary;\n\n\t\t\t\t\tconst { editHistory } = summary;\n\t\t\t\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\t\t\t\texpect(editChunks.length).to.equal(2);\n\n\t\t\t\t\tconst chunkHandle = editChunks[0].chunk as FluidEditHandle;\n\t\t\t\t\texpect(typeof chunkHandle.get).to.equal('function');\n\n\t\t\t\t\tconst { tree: secondTree } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t\ttestObjectProvider,\n\t\t\t\t\t});\n\t\t\t\t\tsecondTree.loadSummary(summary);\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\n\t\t\t\t\tconst { blob: blobHandle } = new TreeNodeHandle(\n\t\t\t\t\t\tsecondTree.currentView,\n\t\t\t\t\t\ttranslateId(nodeWithPayload.identifier, tree, secondTree)\n\t\t\t\t\t).payload;\n\t\t\t\t\texpect(blobHandle).to.not.be.undefined;\n\t\t\t\t\tconst blobContents = await blobHandle.get();\n\t\t\t\t\texpect(IsoBuffer.from(blobContents, 'utf8').toString()).to.equal(blobbedPayload);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tdescribe('SharedTree summarizing', () => {\n\t\t\tconst testHandle = new TestFluidHandle();\n\n\t\t\tit('throws error when given bad json input', () => {\n\t\t\t\tassert.throws(() => deserialize('', testSerializer));\n\t\t\t\tassert.throws(() => deserialize('~ malformed JSON ~', testSerializer));\n\t\t\t\tassert.throws(() => deserialize('{ unrecognizedKey: 42 }', testSerializer));\n\t\t\t});\n\n\t\t\tit('correctly handles snapshots of default trees', () => {\n\t\t\t\tconst { tree: uninitializedTree } = setUpTestSharedTree();\n\n\t\t\t\t// Serialize the state of one uninitialized tree into a second tree\n\t\t\t\tconst serialized = serialize(uninitializedTree.saveSummary(), testSerializer, testHandle);\n\t\t\t\tconst parsedTree = deserialize(serialized, testSerializer);\n\t\t\t\tif (writeFormat === WriteFormat.v0_0_2) {\n\t\t\t\t\tconst summary = parsedTree as SharedTreeSummary_0_0_2;\n\t\t\t\t\texpect(summary.sequencedEdits).to.deep.equal([]);\n\t\t\t\t\texpect(deepCompareNodes(summary.currentTree, initialTree)).to.be.true;\n\t\t\t\t} else {\n\t\t\t\t\tconst summary = parsedTree as SharedTreeSummary;\n\t\t\t\t\texpect(summary.editHistory).to.deep.equal({ editChunks: [], editIds: [] });\n\t\t\t\t\texpect(summary.currentTree).to.be.instanceOf(Array);\n\t\t\t\t\texpect(summary.internedStrings).to.have.length(1);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t[true, false].forEach((hasLocalEdits) => {\n\t\t\t\tit(`produces correct snapshot for a tree with ${hasLocalEdits ? 'local' : 'acked'} edits`, async () => {\n\t\t\t\t\t// The initial tree results in an edit.\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlocalMode: hasLocalEdits,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst newNode = testTree.buildLeaf();\n\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.before(testTree.left)));\n\t\t\t\t\tif (!hasLocalEdits) {\n\t\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t}\n\n\t\t\t\t\tconst serialized = serialize(sharedTree.saveSummary(), testSerializer, testHandle);\n\t\t\t\t\tconst treeContent: SharedTreeSummaryBase = JSON.parse(serialized);\n\t\t\t\t\tlet parsedTree: SummaryContents;\n\t\t\t\t\tif (writeFormat === WriteFormat.v0_1_1) {\n\t\t\t\t\t\tparsedTree = new SharedTreeEncoder_0_1_1(true).decodeSummary(treeContent as SharedTreeSummary);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparsedTree = new SharedTreeEncoder_0_0_2(true).decodeSummary(\n\t\t\t\t\t\t\ttreeContent as SharedTreeSummary_0_0_2\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\texpect(parsedTree.currentTree).to.not.be.undefined;\n\t\t\t\t\tconst testRoot = assertArrayOfOne(\n\t\t\t\t\t\tassertNotUndefined(parsedTree.currentTree?.traits[testTree.traitLabel])\n\t\t\t\t\t);\n\t\t\t\t\texpect(testRoot).to.not.be.undefined;\n\t\t\t\t\texpect(testRoot.traits.left).to.not.be.undefined;\n\t\t\t\t\texpect(testRoot.traits.right).to.not.be.undefined;\n\t\t\t\t\texpect(testRoot.traits.left.length).to.equal(2);\n\n\t\t\t\t\tconst editLog: OrderedEditSet<ChangeInternal> = new EditLog(parsedTree.editHistory);\n\n\t\t\t\t\t// Expect there to be a change in the edit history in addition to the one from setUpTestSharedTree\n\t\t\t\t\texpect(editLog.length).to.equal(2);\n\n\t\t\t\t\t// The first operation to be sequenced is the tree init\n\t\t\t\t\tconst treeInitEdit = await editLog.getEditAtIndex(1);\n\t\t\t\t\texpect(treeInitEdit.changes.length).to.equal(2);\n\t\t\t\t\texpect(treeInitEdit.changes[0].type).to.equal(ChangeType.Build);\n\t\t\t\t\texpect(treeInitEdit.changes[1].type).to.equal(ChangeType.Insert);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('can be used to initialize a tree', () => {\n\t\t\t\tconst {\n\t\t\t\t\tsharedTree: sharedTree1,\n\t\t\t\t\ttestTree: testTree1,\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t} = createSimpleTestTree({ localMode: false });\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\n\t\t\t\tconst newNode = testTree1.buildLeaf();\n\n\t\t\t\tsharedTree1.applyEdit(...Change.insertTree(newNode, StablePlace.before(testTree1.left)));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tsharedTree2.loadSummary(sharedTree1.saveSummary());\n\n\t\t\t\t// Trees should have equal state since we deserialized the first tree's state into the second tree\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.true;\n\t\t\t});\n\n\t\t\tit('can be used to initialize a tree with an empty edit list', () => {\n\t\t\t\tconst { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree({ localMode: false });\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// The second tree is not caught up to the first tree yet\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.false;\n\n\t\t\t\tsharedTree2.loadSummary(sharedTree1.saveSummary());\n\n\t\t\t\t// Trees should have equal state since we deserialized the first tree's state into the second tree\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.true;\n\t\t\t});\n\n\t\t\tit('asserts when loading a summary with duplicated edits', () => {\n\t\t\t\tconst {\n\t\t\t\t\tsharedTree: sharedTree1,\n\t\t\t\t\ttestTree: testTree1,\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t} = createSimpleTestTree({\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t\tsummarizeHistory: true,\n\t\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\n\t\t\t\tconst newNode = testTree1.buildLeaf();\n\n\t\t\t\tsharedTree1.applyEdit(...Change.insertTree(newNode, StablePlace.before(testTree1.left)));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst summary = sharedTree1.saveSummary() as SharedTreeSummary_0_0_2;\n\t\t\t\tconst sequencedEdits = assertNotUndefined(summary.sequencedEdits).slice();\n\t\t\t\tsequencedEdits.push(sequencedEdits[0]);\n\t\t\t\tconst corruptedSummary = {\n\t\t\t\t\t...summary,\n\t\t\t\t\tsequencedEdits,\n\t\t\t\t};\n\t\t\t\texpect(() => sharedTree2.loadSummary(corruptedSummary))\n\t\t\t\t\t.to.throw(Error)\n\t\t\t\t\t.that.has.property('message')\n\t\t\t\t\t.which.matches(/Duplicate/);\n\t\t\t});\n\n\t\t\tit('can be used without history preservation', async () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({\n\t\t\t\t\tlocalMode: true,\n\t\t\t\t\tsummarizeHistory: false,\n\t\t\t\t});\n\n\t\t\t\tconst newNode = testTree.buildLeaf();\n\t\t\t\tconst { id } = sharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.before(testTree.left)));\n\t\t\t\tconst treeBefore = convertTreeNodes<ChangeNode, ChangeNode_0_0_2>(\n\t\t\t\t\tgetChangeNodeFromView(sharedTree.currentView),\n\t\t\t\t\t(node) => convertNodeDataIds(node, (id) => sharedTree.convertToStableNodeId(id))\n\t\t\t\t);\n\t\t\t\tconst summary = sharedTree.saveSummary();\n\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\n\t\t\t\tsharedTree2.loadSummary(summary);\n\t\t\t\tconst treeAfter = convertTreeNodes<ChangeNode, ChangeNode_0_0_2>(\n\t\t\t\t\tgetChangeNodeFromView(sharedTree2.currentView),\n\t\t\t\t\t(node) => convertNodeDataIds(node, (id) => sharedTree2.convertToStableNodeId(id))\n\t\t\t\t);\n\t\t\t\t// The current state of the tree should be identical to the one contained in the old summary.\n\t\t\t\texpect(deepCompareNodes(treeBefore, treeAfter)).to.be.true;\n\n\t\t\t\t// The history should have been dropped by the default handling behavior.\n\t\t\t\t// It will contain a single entry setting the tree to equal the head revision.\n\t\t\t\texpect(sharedTree2.edits.length).to.equal(1);\n\t\t\t\texpect(await sharedTree2.edits.tryGetEdit(id)).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('correctly handles payloads at the root', () => {\n\t\t\t\tconst payload = 'foo';\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ summarizeHistory: false });\n\t\t\t\ttree.applyEdit(Change.setPayload(tree.currentView.root, payload));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst summary = tree.saveSummary();\n\t\t\t\tconst { tree: tree2 } = setUpTestSharedTree({ summarizeHistory: false });\n\t\t\t\ttree2.loadSummary(summary);\n\t\t\t\texpect(tree2.currentView.tryGetViewNode(tree2.currentView.root)?.payload).to.equal(payload);\n\t\t\t});\n\n\t\t\t// TODO:#49901: Enable these tests once we write edit chunk handles to summaries\n\t\t\tit.skip('does not swallow errors in asynchronous blob uploading', async () => {\n\t\t\t\tconst errorMessage = 'Simulated exception in uploadBlob';\n\t\t\t\tconst { sharedTree, testTree, componentRuntime, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t});\n\t\t\t\tcomponentRuntime.uploadBlob = async () => {\n\t\t\t\t\tthrow new Error(errorMessage);\n\t\t\t\t};\n\n\t\t\t\tlet treeErrorEventWasInvoked = false;\n\t\t\t\tsharedTree.on('error', (error: unknown) => {\n\t\t\t\t\ttreeErrorEventWasInvoked = true;\n\t\t\t\t\texpect(error).to.have.property('message').which.equals(errorMessage);\n\t\t\t\t});\n\n\t\t\t\t// Generate enough edits to cause a chunk upload.\n\t\t\t\tfor (let i = 0; i < (sharedTree.edits as EditLog).editsPerChunk / 2 + 1; i++) {\n\t\t\t\t\tconst insertee = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(insertee, StablePlace.before(testTree.left)));\n\t\t\t\t\tsharedTree.applyEdit(Change.delete(StableRange.only(insertee)));\n\t\t\t\t}\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tsharedTree.saveSummary();\n\n\t\t\t\t// Just waiting for the ChunksEmitted event here isn't sufficient, as the SharedTree error\n\t\t\t\t// will propagate in a separate promise chain.\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 0));\n\t\t\t\texpect(treeErrorEventWasInvoked).to.equal(true, 'SharedTree error was never raised');\n\t\t\t});\n\t\t});\n\n\t\tdescribe('handles', () => {\n\t\t\tit('can reference a node', () => {\n\t\t\t\t// Test that a handle can wrap a node and retrieve that node's properties\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst leftHandle = new TreeNodeHandle(sharedTree.currentView, testTree.left.identifier);\n\t\t\t\texpect(areNodesEquivalent(testTree.left, leftHandle)).to.be.true;\n\t\t\t\texpect(areNodesEquivalent(testTree.right, leftHandle)).to.be.false;\n\t\t\t});\n\n\t\t\tit('can create handles from children', () => {\n\t\t\t\t// Test that when retrieving children via the \"traits\" property of a handle, the\n\t\t\t\t// children are also wrapped in handles\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst rootHandle = new TreeNodeHandle(sharedTree.currentView, testTree.identifier);\n\t\t\t\texpect(areNodesEquivalent(testTree, rootHandle)).to.be.true;\n\t\t\t\tconst leftHandle = rootHandle.traits.left[0];\n\t\t\t\texpect(areNodesEquivalent(testTree.left, leftHandle)).to.be.true;\n\t\t\t\texpect(leftHandle instanceof TreeNodeHandle).to.be.true;\n\t\t\t});\n\n\t\t\tit('do not update when the current view of the tree changes', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst leftHandle = new TreeNodeHandle(sharedTree.currentView, testTree.left.identifier);\n\t\t\t\texpect(leftHandle.traits.right).to.be.undefined;\n\t\t\t\t// Move \"right\" under \"left\"\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t...Change.move(\n\t\t\t\t\t\tStableRange.only(testTree.right),\n\t\t\t\t\t\tStablePlace.atStartOf({ parent: testTree.left.identifier, label: testTree.right.traitLabel })\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\texpect(leftHandle.traits.right).to.be.undefined;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('telemetry', () => {\n\t\t\tdescribe('useFailedSequencedEditTelemetry', () => {\n\t\t\t\tit('decorates events with the correct properties', async () => {\n\t\t\t\t\t// Test that a handle can wrap a node and retrieve that node's properties\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\t});\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\t// Invalid edit\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t// Force demand, which will cause a telemetry event for the invalid edit to be emitted\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).is.greaterThan(0);\n\t\t\t\t\tevents.forEach((event) => {\n\t\t\t\t\t\texpect(isSharedTreeEvent(event)).is.true;\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tit('is logged for invalid locally generated edits when those edits are sequenced', async () => {\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\t});\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\t// Invalid edit\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\texpect(events.length).equals(0);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t// Force demand, which will cause a telemetry event for the invalid edit to be emitted\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(1);\n\t\t\t\t\texpect(events[0].category).equals('generic');\n\t\t\t\t\texpect(events[0].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');\n\t\t\t\t});\n\n\t\t\t\tit('can be disabled and re-enabled', async () => {\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\t});\n\t\t\t\t\tconst { disable } = useFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\texpect(events.length).equals(0);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(1);\n\t\t\t\t\texpect(events[0].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');\n\n\t\t\t\t\tdisable();\n\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(1);\n\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(2);\n\t\t\t\t\texpect(events[1].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');\n\t\t\t\t});\n\n\t\t\t\tit('is not logged for valid edits', async () => {\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t});\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left)));\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(0);\n\t\t\t\t});\n\n\t\t\t\tit('is not logged for remote edits', async () => {\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\t\tlocalMode: false,\n\t\t\t\t\t});\n\t\t\t\t\tconst { sharedTree: sharedTree2, testTree: testTree2 } = createSimpleTestTree({\n\t\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t\tid: 'secondTestSharedTree',\n\t\t\t\t\t\tlocalMode: false,\n\t\t\t\t\t});\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree1);\n\n\t\t\t\t\tsharedTree2.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree2.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree2.buildLeaf(testTree2.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(0);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tdescribe('Events', () => {\n\t\t\tit('fires an event when an edit is committed', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\n\t\t\t\tlet eventCount = 0;\n\t\t\t\tlet editIdFromEvent: EditId | undefined;\n\t\t\t\tsharedTree.on(SharedTreeEvent.EditCommitted, (args: EditCommittedEventArguments) => {\n\t\t\t\t\texpect(args.local).true;\n\t\t\t\t\texpect(args.tree).equals(sharedTree);\n\t\t\t\t\teditIdFromEvent = args.editId;\n\t\t\t\t\teventCount += 1;\n\t\t\t\t});\n\n\t\t\t\t// Invalid change\n\t\t\t\tconst invalidEdit = sharedTree.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\texpect(editIdFromEvent).equals(invalidEdit.id);\n\t\t\t\texpect(eventCount).equals(1);\n\n\t\t\t\t// Valid change\n\t\t\t\tconst { id } = sharedTree.applyEdit(\n\t\t\t\t\t...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left))\n\t\t\t\t);\n\t\t\t\texpect(editIdFromEvent).equals(id);\n\t\t\t\texpect(eventCount).equals(2);\n\t\t\t});\n\n\t\t\tit('fires an event when a sequenced edit is applied', async () => {\n\t\t\t\tconst {\n\t\t\t\t\tsharedTree: sharedTree1,\n\t\t\t\t\ttestTree,\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t} = createSimpleTestTree({\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\tid: 'secondTestSharedTree',\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t});\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tawait sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\n\t\t\t\tconst eventArgs: SequencedEditAppliedEventArguments[] = [];\n\t\t\t\tsharedTree1.on(SharedTreeEvent.SequencedEditApplied, (args: SequencedEditAppliedEventArguments) =>\n\t\t\t\t\teventArgs.push(args)\n\t\t\t\t);\n\n\t\t\t\t// Invalid change\n\t\t\t\tconst change = Change.setPayload(testTree.generateNodeId(), 42);\n\t\t\t\tconst invalidEdit = sharedTree1.applyEdit(change);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tawait sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\n\t\t\t\texpect(eventArgs.length).equals(1);\n\t\t\t\texpect(eventArgs[0].edit.id).equals(invalidEdit.id);\n\t\t\t\texpect(eventArgs[0].wasLocal).equals(true);\n\t\t\t\texpect(eventArgs[0].reconciliationPath.length).equals(0);\n\t\t\t\texpect(eventArgs[0].outcome.status).equals(EditStatus.Invalid);\n\n\t\t\t\t// Valid change\n\t\t\t\tconst validEdit1 = sharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\tStablePlace.after(testTree.left.translateId(sharedTree2))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t// Valid change\n\t\t\t\tconst validEdit2 = sharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left))\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tawait sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\n\t\t\t\texpect(eventArgs.length).equals(3);\n\t\t\t\texpect(eventArgs[1].edit.id).equals(validEdit1.id);\n\t\t\t\texpect(eventArgs[1].wasLocal).equals(false);\n\t\t\t\texpect(eventArgs[1].reconciliationPath.length).equals(0);\n\t\t\t\texpect(eventArgs[1].outcome.status).equals(EditStatus.Applied);\n\n\t\t\t\texpect(eventArgs[2].edit.id).equals(validEdit2.id);\n\t\t\t\texpect(eventArgs[2].wasLocal).equals(true);\n\t\t\t\texpect(eventArgs[2].reconciliationPath.length).equals(1);\n\t\t\t\texpect(eventArgs[2].outcome.status).equals(EditStatus.Applied);\n\t\t\t});\n\t\t});\n\n\t\t/**\n\t\t * This test is a slightly minified regression test for an issue discovered by fuzz testing.\n\t\t * It demonstrates issues with clients using writeFormat v0.1.1 and mixed `summarizeHistory` values.\n\t\t * The problem is illustrated by the following scenario:\n\t\t * 1. Client A and client B join a session. A does not summarize history, but B does.\n\t\t * 2. A is elected to be the summarizer.\n\t\t * 3. Client A and B make 50 edits (half a chunks' worth), then idle.\n\t\t * 4. Client A summarizes. Since it does not summarize history, the summary it produces has a single edit.\n\t\t * 5. Client C joins, configured to write history.\n\t\t * 6. The three clients collaborate further for another 50/51 edits.\n\t\t *\n\t\t * At this point in time, client B thinks the first edit chunk is full, but client C thinks it's only half-full.\n\t\t * The entire edit compression scheme is built upon assuming clients agree where the chunk boundaries are, so this\n\t\t * generally leads to correctness issues. The fuzz test reproed a similar scenario, and what ultimately caused\n\t\t * failure is a newly-loaded client being shocked at a chunk with `startRevision: 400` uploaded (when it thinks\n\t\t * there has only been one edit).\n\t\t *\n\t\t * To fix this, we need to incorporate a scheme where all clients agree on chunk boundaries (e.g., by including the\n\t\t * total number of edits even in no-history summaries).\n\t\t *\n\t\t * In the meantime, we are forbidding collaboration of no-history clients and history clients.\n\t\t */\n\t\tit('can be initialized on multiple clients with different `summarizeHistory` values', async () => {\n\t\t\tconst { tree, testObjectProvider, container } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t});\n\t\t\ttestObjectProvider.logger.registerExpectedEvent(\n\t\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' }\n\t\t\t);\n\n\t\t\tapplyNoop(tree);\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\tconst firstSummaryVersion = await waitForSummary(container);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat,\n\t\t\t\ttestObjectProvider,\n\t\t\t\tsummarizeHistory: true,\n\t\t\t\theaders: { [LoaderHeader.version]: firstSummaryVersion },\n\t\t\t});\n\n\t\t\t// Apply enough edits for the upload of a few edit chunks, and some extra so future chunks are misaligned\n\t\t\tfor (let i = 0; i < (5 * editsPerChunk) / 2; i++) {\n\t\t\t\tapplyNoop(tree);\n\t\t\t}\n\n\t\t\tconst secondSummaryVersion = await waitForSummary(container);\n\n\t\t\tconst { tree: tree3 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat,\n\t\t\t\ttestObjectProvider,\n\t\t\t\tsummarizeHistory: true,\n\t\t\t\theaders: { [LoaderHeader.version]: secondSummaryVersion },\n\t\t\t});\n\n\t\t\t// Verify we loaded a no-history summary.\n\t\t\texpect(tree3.editsInternal.length).to.equal(1);\n\n\t\t\tlet unexpectedHistoryChunkCount = 0;\n\t\t\ttree3.on(SharedTreeDiagnosticEvent.UnexpectedHistoryChunk, () => unexpectedHistoryChunkCount++);\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t// Apply enough edits to guarantee another chunk upload occurs.\n\t\t\tfor (let i = 0; i < editsPerChunk; i++) {\n\t\t\t\tapplyNoop(tree2);\n\t\t\t}\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t// If tree 2 didn't change its write format, it would attempt to upload the above chunk with start revision 200, which is past\n\t\t\t// how many sequenced edits tree 3 thinks there are.\n\t\t\texpect(unexpectedHistoryChunkCount).to.equal(0);\n\t\t}).timeout(/* double summarization can take some time */ 20000);\n\n\t\t// This functionality was only implemented in format 0.1.1.\n\t\tif (writeFormat !== WriteFormat.v0_0_2) {\n\t\t\tdescribe('String interning and tree compression', () => {\n\t\t\t\tfunction getMutableStringInterner(tree: SharedTree): MutableStringInterner {\n\t\t\t\t\tconst summary = tree.saveSummary();\n\t\t\t\t\tswitch (summary.version) {\n\t\t\t\t\t\tcase WriteFormat.v0_0_2:\n\t\t\t\t\t\t\treturn new MutableStringInterner();\n\t\t\t\t\t\tcase WriteFormat.v0_1_1:\n\t\t\t\t\t\t\treturn new MutableStringInterner((summary as SharedTreeSummary).internedStrings);\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tfail(`Invalid summary format: ${summary.version}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tit('compress ops via interning and tree compression and decompress when processing edits', () => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tsharedTree: tree,\n\t\t\t\t\t\ttestTree,\n\t\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t} = createSimpleTestTree({ writeFormat });\n\t\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ containerRuntimeFactory, writeFormat });\n\t\t\t\t\tconst remoteRuntime = containerRuntimeFactory.createContainerRuntime(\n\t\t\t\t\t\tnew MockFluidDataStoreRuntime()\n\t\t\t\t\t);\n\n\t\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\ttree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\t\t\ttree.applyEdit(...Change.move(StableRange.only(newNode), StablePlace.before(testTree.left)));\n\n\t\t\t\t\t// Unit testing the interning of ops requires access violation since factory and messages are protected.\n\t\t\t\t\ttype WithFactory<T> = T & { factory: MockContainerRuntimeFactory };\n\t\t\t\t\ttype WithMessages<T> = T & { messages: ISequencedDocumentMessage[] };\n\t\t\t\t\tconst factory = (remoteRuntime as unknown as WithFactory<MockContainerRuntime>).factory;\n\t\t\t\t\tconst messages = (factory as unknown as WithMessages<MockContainerRuntimeFactory>).messages;\n\n\t\t\t\t\texpect(messages.length).to.equal(3);\n\t\t\t\t\tfor (const message of messages.slice(1)) {\n\t\t\t\t\t\t// After the initial setup edit, common definitions should be interned\n\t\t\t\t\t\tfor (const change of (message.contents as SharedTreeEditOp).edit.changes) {\n\t\t\t\t\t\t\tif (change.type === ChangeTypeInternal.CompressedBuild) {\n\t\t\t\t\t\t\t\tconst stringifiedContents = JSON.stringify(message.contents);\n\t\t\t\t\t\t\t\texpect(stringifiedContents).to.not.include(SimpleTestTree.leftTraitLabel);\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\texpect(tree.equals(secondTree)).to.be.false;\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tconst { internedStrings } = tree.saveSummary() as SharedTreeSummary;\n\n\t\t\t\t\tconst insertEdit = normalizeEdit(tree, tree.editsInternal.getEditInSessionAtIndex(1));\n\t\t\t\t\tconst moveEdit = normalizeEdit(tree, tree.editsInternal.getEditInSessionAtIndex(2));\n\t\t\t\t\tconst insertEdit2 = normalizeEdit(secondTree, secondTree.editsInternal.getEditInSessionAtIndex(1));\n\t\t\t\t\tconst moveEdit2 = normalizeEdit(secondTree, secondTree.editsInternal.getEditInSessionAtIndex(2));\n\t\t\t\t\texpect(insertEdit).to.deep.equal(insertEdit2);\n\t\t\t\t\texpect(moveEdit).to.deep.equal(moveEdit2);\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t\t\texpect(internedStrings).to.include(SimpleTestTree.leftTraitLabel);\n\t\t\t\t\texpect(internedStrings).to.include(newNode.definition);\n\t\t\t\t});\n\n\t\t\t\tit('compress summaries via interning and tree compression on save and decompress on load', () => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tsharedTree: tree,\n\t\t\t\t\t\ttestTree: testTree,\n\t\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t} = createSimpleTestTree({ writeFormat });\n\n\t\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\ttree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\t\t\ttree.applyEdit(...Change.move(StableRange.only(newNode), StablePlace.before(testTree.left)));\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t\tconst summary = tree.saveSummary() as SharedTreeSummary;\n\t\t\t\t\texpect(summary.internedStrings).to.not.be.undefined;\n\t\t\t\t\texpect(summary.internedStrings.length).to.equal(5);\n\n\t\t\t\t\tconst interner = new MutableStringInterner(summary.internedStrings);\n\t\t\t\t\tconst treeCompressor = new InterningTreeCompressor();\n\t\t\t\t\tconst expectedCompressedTree = treeCompressor.compress(\n\t\t\t\t\t\tgetChangeNodeFromView(tree.currentView),\n\t\t\t\t\t\tinterner,\n\t\t\t\t\t\tsequencedIdNormalizer(getIdNormalizerFromSharedTree(tree))\n\t\t\t\t\t);\n\n\t\t\t\t\texpect(summary.currentTree).deep.equal(expectedCompressedTree);\n\n\t\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ writeFormat });\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.false;\n\t\t\t\t\tsecondTree.loadSummary(summary);\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t\t});\n\n\t\t\t\tit('compress and decompress edit chunks via interning and tree compression', async () => {\n\t\t\t\t\tconst { tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t});\n\t\t\t\t\tconst testTree = setUpTestTree(tree);\n\n\t\t\t\t\tconst uncompressedEdits: EditWithoutId<ChangeInternal>[] = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tchanges: tree.edits.getEditInSessionAtIndex(0).changes as ChangeInternal[],\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\n\t\t\t\t\t// Apply enough edits for the upload of an edit chunk\n\t\t\t\t\tfor (let i = 0; i < (tree.edits as EditLog).editsPerChunk - 1; i++) {\n\t\t\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\t\tconst edit = tree.applyEditInternal(\n\t\t\t\t\t\t\tChangeInternal.insertTree([newNode], StablePlace.after(testTree.left))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tuncompressedEdits.push({ changes: edit.changes });\n\t\t\t\t\t}\n\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\t\t\tconst interner = getMutableStringInterner(tree);\n\t\t\t\t\tconst expectedCompressedEdits: readonly EditWithoutId<CompressedChangeInternal<OpSpaceNodeId>>[] =\n\t\t\t\t\t\tnew SharedTreeEncoder_0_1_1(true).encodeEditChunk(\n\t\t\t\t\t\t\tuncompressedEdits,\n\t\t\t\t\t\t\tsequencedIdNormalizer(testTree),\n\t\t\t\t\t\t\tinterner\n\t\t\t\t\t\t).edits;\n\n\t\t\t\t\t// Apply one more edit so that an edit chunk gets uploaded\n\t\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\ttree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\n\t\t\t\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\t\t\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\t\t\t\t// Wait for the ops to to be submitted and processed across the containers\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\t\t\tconst summary = tree.saveSummary() as SharedTreeSummary;\n\n\t\t\t\t\tconst { editHistory } = summary;\n\t\t\t\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\t\t\t\texpect(editChunks.length).to.equal(2);\n\n\t\t\t\t\tconst handle = editChunks[0].chunk as FluidEditHandle;\n\t\t\t\t\texpect(typeof handle.get).to.equal('function');\n\t\t\t\t\tconst chunkContents: EditChunkContents = JSON.parse(IsoBuffer.from(await handle.get()).toString());\n\t\t\t\t\texpect(chunkContents.edits).to.deep.equal(expectedCompressedEdits);\n\n\t\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ writeFormat });\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.false;\n\t\t\t\t\tsecondTree.loadSummary(summary);\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t\t\texpect((await tree.edits.getEditAtIndex(2)).id).to.equal(\n\t\t\t\t\t\t(await secondTree.edits.getEditAtIndex(2)).id\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t});\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { SharedTreeTestingComponents, SharedTreeTestingOptions } from './TestUtilities';
|
|
6
|
+
/**
|
|
7
|
+
* Runs a test suite for operations on `SharedTree` that depend on correct versioning.
|
|
8
|
+
* This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.
|
|
9
|
+
*/
|
|
10
|
+
export declare function runSharedTreeVersioningTests(title: string, setUpTestSharedTree: (options?: SharedTreeTestingOptions) => SharedTreeTestingComponents): void;
|
|
11
|
+
//# sourceMappingURL=SharedTreeVersioningTests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SharedTreeVersioningTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeVersioningTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,EAIN,2BAA2B,EAC3B,wBAAwB,EAIxB,MAAM,iBAAiB,CAAC;AAOzB;;;GAGG;AACH,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,CAAC,OAAO,CAAC,EAAE,wBAAwB,KAAK,2BAA2B,QAkexF"}
|