@fluid-experimental/tree 0.58.2002 → 0.59.1000
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 +159 -46
- 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 -105
- 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 +61 -32
- 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 +129 -85
- package/dist/LogViewer.d.ts.map +1 -1
- package/dist/LogViewer.js +111 -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 +105 -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 +439 -0
- package/dist/SharedTree.d.ts.map +1 -0
- package/dist/SharedTree.js +1109 -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 +52 -0
- package/dist/Transaction.d.ts.map +1 -0
- package/dist/Transaction.js +72 -0
- package/dist/Transaction.js.map +1 -0
- package/dist/TransactionInternal.d.ts +540 -0
- package/dist/TransactionInternal.d.ts.map +1 -0
- package/dist/TransactionInternal.js +626 -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/docs/Write-Format.md +19 -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 -105
- 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 +53 -24
- 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 +129 -85
- package/lib/LogViewer.d.ts.map +1 -1
- package/lib/LogViewer.js +103 -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 +105 -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 +439 -0
- package/lib/SharedTree.d.ts.map +1 -0
- package/lib/SharedTree.js +1104 -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 +52 -0
- package/lib/Transaction.d.ts.map +1 -0
- package/lib/Transaction.js +68 -0
- package/lib/Transaction.js.map +1 -0
- package/lib/TransactionInternal.d.ts +540 -0
- package/lib/TransactionInternal.d.ts.map +1 -0
- package/lib/TransactionInternal.js +622 -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 +276 -191
- 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 +146 -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 -125
- package/src/Checkout.ts +82 -53
- 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 +156 -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 +1501 -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 +89 -0
- package/src/TransactionInternal.ts +1087 -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 +118 -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/docs/Future.md +0 -155
- 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":"Checkout.tests.js","sourceRoot":"","sources":["../../src/test/Checkout.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport {\n\tsetTrait,\n\tDelete,\n\tEditStatus,\n\tInsert,\n\tMove,\n\tStableRange,\n\tStablePlace,\n\tSide,\n\tEditValidationResult,\n\tSharedTree,\n\tSharedTreeEvent,\n\tCheckout,\n\tCheckoutEvent,\n\tChange,\n} from '../index';\nimport {\n\tleft,\n\tleftTraitLocation,\n\tmakeEmptyNode,\n\tright,\n\trightTraitLocation,\n\tsetUpTestSharedTree,\n\tSharedTreeTestingOptions,\n\tsimpleTestTree,\n} from './utilities/TestUtilities';\n\n/**\n * Checkout test suite\n */\nexport function checkoutTests(\n\tsuiteName: string,\n\tcheckoutFactory: (tree: SharedTree) => Promise<Checkout<Change>>\n): Mocha.Suite {\n\tasync function setUpTestCheckout(\n\t\toptions: SharedTreeTestingOptions = { localMode: true, noFailOnError: true }\n\t): Promise<{ checkout: Checkout<Change>; tree: SharedTree }> {\n\t\tconst { tree } = setUpTestSharedTree(options);\n\t\treturn { checkout: await checkoutFactory(tree), tree };\n\t}\n\n\t/**\n\t * Counts the number of times ViewChange occurs while performing `action`.\n\t * Checks arguments to ViewChange are correct as well.\n\t * @param action Action to perform\n\t * @param options Options object used to construct the initial SharedTree\n\t */\n\tasync function countViewChange(\n\t\taction: (checkout: Checkout<Change>, data: { changeCount: number }) => void | Promise<void>,\n\t\toptions: SharedTreeTestingOptions = { localMode: true }\n\t): Promise<number> {\n\t\tconst { checkout } = await setUpTestCheckout(options);\n\t\tlet lastView = checkout.currentView;\n\t\tconst data = { changeCount: 0 };\n\t\tcheckout.on(CheckoutEvent.ViewChange, (before, after) => {\n\t\t\texpect(after).equals(checkout.currentView);\n\t\t\texpect(before).equals(lastView);\n\t\t\tlastView = after;\n\t\t\tdata.changeCount++;\n\t\t});\n\t\t// Prevent errors from errors (like failed expects) from being hidden.\n\t\tconst errors: Error[] = [];\n\t\tcheckout.on('error', (error) => {\n\t\t\terrors.push(error);\n\t\t});\n\n\t\tawait action(checkout, data);\n\t\texpect(errors).deep.equal([]);\n\t\treturn data.changeCount;\n\t}\n\n\treturn describe(suiteName, () => {\n\t\tit('can only have one edit open at a time', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout();\n\t\t\tcheckout.openEdit();\n\t\t\texpect(() => checkout.openEdit()).throws();\n\t\t});\n\n\t\tit('can only close an edit if one is open', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout();\n\t\t\texpect(() => checkout.closeEdit()).throws();\n\t\t});\n\n\t\tit('can only apply changes if an edit is open', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout();\n\t\t\texpect(() => checkout.applyChanges(Delete.create(StableRange.only(left)))).throws();\n\t\t});\n\n\t\tit('cannot abort an edit if no edit is open', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout();\n\t\t\texpect(() => checkout.abortEdit()).throws();\n\t\t});\n\n\t\tit('can abort valid edits', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout({ initialTree: simpleTestTree });\n\n\t\t\tcheckout.openEdit();\n\t\t\t// Is still valid after a valid edit\n\t\t\tcheckout.applyChanges(Delete.create(StableRange.only(left)));\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\t\t\tcheckout.abortEdit();\n\n\t\t\t// The left node should still be there\n\t\t\texpect(checkout.currentView.getSnapshotNode(left.identifier).identifier).not.undefined;\n\t\t});\n\n\t\tit('can abort invalid edits', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout({ initialTree: simpleTestTree });\n\n\t\t\tcheckout.openEdit();\n\t\t\t// Starts as valid\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\n\t\t\t// Is invalid after an invalid edit\n\t\t\texpect(() => checkout.applyChanges(...Insert.create([left], StablePlace.after(left)))).throws(\n\t\t\t\t'Locally constructed edits must be well-formed and valid.'\n\t\t\t);\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Invalid);\n\t\t\tcheckout.abortEdit();\n\n\t\t\t// Next edit is unaffected\n\t\t\tcheckout.openEdit();\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\t\t\tcheckout.closeEdit();\n\t\t});\n\n\t\tit('can abort malformed edits', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout({ initialTree: simpleTestTree });\n\n\t\t\tcheckout.openEdit();\n\t\t\t// Starts as valid\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\n\t\t\t// Is malformed after a malformed edit\n\t\t\tconst malformedMove = Move.create(\n\t\t\t\t{\n\t\t\t\t\tstart: { side: Side.Before },\n\t\t\t\t\tend: { side: Side.After },\n\t\t\t\t},\n\t\t\t\t{ side: Side.After }\n\t\t\t);\n\t\t\texpect(() => checkout.applyChanges(...malformedMove)).throws(\n\t\t\t\t'Locally constructed edits must be well-formed and valid.'\n\t\t\t);\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Malformed);\n\n\t\t\t// Is still malformed after a subsequent valid edit\n\t\t\texpect(() => checkout.applyChanges(Delete.create(StableRange.only(left)))).throws(\n\t\t\t\t'Cannot apply change to an edit unless all previous changes have applied'\n\t\t\t);\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Malformed);\n\n\t\t\tcheckout.abortEdit();\n\n\t\t\t// Next edit is unaffected\n\t\t\tcheckout.openEdit();\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\t\t\tcheckout.closeEdit();\n\t\t});\n\n\t\tit('cannot get the edit status if no edit is open', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout();\n\t\t\texpect(() => checkout.getEditStatus()).throws();\n\t\t});\n\n\t\tit('Surfaces error events to SharedTree', async () => {\n\t\t\tconst { checkout, tree } = await setUpTestCheckout();\n\t\t\tconst message = 'Simulated unexpected error in ViewChange event handler';\n\t\t\tcheckout.on(CheckoutEvent.ViewChange, () => {\n\t\t\t\tthrow Error(message);\n\t\t\t});\n\t\t\tlet treeErrorHandlerWasCalled = false;\n\t\t\ttree.on('error', (error) => {\n\t\t\t\ttreeErrorHandlerWasCalled = true;\n\t\t\t\texpect(error).to.have.property('message').that.equals(message);\n\t\t\t});\n\n\t\t\t// This could alternatively actually cause a ViewChange via application of an edit.\n\t\t\tcheckout.emit(CheckoutEvent.ViewChange, checkout.currentView, checkout.currentView);\n\t\t\texpect(treeErrorHandlerWasCalled).equals(true);\n\t\t});\n\n\t\tit('exposes the current edit status in the face of valid edits', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout({ initialTree: simpleTestTree });\n\n\t\t\tcheckout.openEdit();\n\t\t\t// Starts as valid\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\n\t\t\t// Is still valid after a valid edit\n\t\t\tcheckout.applyChanges(Delete.create(StableRange.only(left)));\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\n\t\t\tcheckout.closeEdit();\n\t\t});\n\n\t\tit('exposes the current edit status in the face of invalid edits', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout({ initialTree: simpleTestTree });\n\n\t\t\tcheckout.openEdit();\n\t\t\t// Starts as valid\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\n\t\t\t// Is invalid after an invalid edit\n\t\t\texpect(() => checkout.applyChanges(...Insert.create([left], StablePlace.after(left)))).throws(\n\t\t\t\t'Locally constructed edits must be well-formed and valid.'\n\t\t\t);\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Invalid);\n\n\t\t\t// Is still invalid after a subsequent valid edit\n\t\t\texpect(() => checkout.applyChanges(Delete.create(StableRange.only(left)))).throws(\n\t\t\t\t'Cannot apply change to an edit unless all previous changes have applied'\n\t\t\t);\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Invalid);\n\n\t\t\texpect(() => checkout.closeEdit()).throws('Locally constructed edits must be well-formed and valid');\n\n\t\t\t// Next edit is unaffected\n\t\t\tcheckout.openEdit();\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\t\t\tcheckout.closeEdit();\n\t\t});\n\n\t\tit('exposes the current edit status in the face of malformed edits', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout({ initialTree: simpleTestTree });\n\n\t\t\tcheckout.openEdit();\n\t\t\t// Starts as valid\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\n\t\t\t// Is malformed after a malformed edit\n\t\t\tconst malformedMove = Move.create(\n\t\t\t\t{\n\t\t\t\t\tstart: { side: Side.Before },\n\t\t\t\t\tend: { side: Side.After },\n\t\t\t\t},\n\t\t\t\t{ side: Side.After }\n\t\t\t);\n\t\t\texpect(() => checkout.applyChanges(...malformedMove)).throws(\n\t\t\t\t'Locally constructed edits must be well-formed and valid.'\n\t\t\t);\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Malformed);\n\n\t\t\t// Is still malformed after a subsequent valid edit\n\t\t\texpect(() => checkout.applyChanges(Delete.create(StableRange.only(left)))).throws(\n\t\t\t\t'Cannot apply change to an edit unless all previous changes have applied'\n\t\t\t);\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Malformed);\n\n\t\t\texpect(() => checkout.closeEdit()).throws('Locally constructed edits must be well-formed and valid');\n\n\t\t\t// Next edit is unaffected\n\t\t\tcheckout.openEdit();\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\t\t\tcheckout.closeEdit();\n\t\t});\n\n\t\tit('does not invalidate in response to an empty edit', async () => {\n\t\t\tconst invalidations = await countViewChange((checkout) => {\n\t\t\t\tcheckout.openEdit();\n\t\t\t\tcheckout.closeEdit();\n\t\t\t});\n\t\t\texpect(invalidations).equals(0);\n\t\t});\n\n\t\tit('records empty edits', async () => {\n\t\t\tconst { checkout, tree } = await setUpTestCheckout();\n\t\t\tcheckout.openEdit();\n\t\t\tconst editId = checkout.closeEdit();\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\texpect(tree.edits.length).equals(1);\n\t\t\texpect(tree.edits.tryGetEdit(editId)).is.not.undefined;\n\t\t});\n\n\t\tit('will emit invalidation messages in response to changes', async () => {\n\t\t\tconst invalidations = await countViewChange(\n\t\t\t\t(checkout) => {\n\t\t\t\t\tcheckout.applyEdit(Delete.create(StableRange.only(left)));\n\t\t\t\t},\n\t\t\t\t{ initialTree: simpleTestTree }\n\t\t\t);\n\t\t\texpect(invalidations).equals(1);\n\t\t});\n\n\t\tit('will emit invalidation messages in response to payload change', async () => {\n\t\t\tconst invalidations = await countViewChange(\n\t\t\t\t(checkout) => {\n\t\t\t\t\tcheckout.applyEdit(Change.setPayload(left.identifier, 5));\n\t\t\t\t},\n\t\t\t\t{ initialTree: simpleTestTree }\n\t\t\t);\n\t\t\texpect(invalidations).equals(1);\n\t\t});\n\n\t\tit('emits a change event for each batch of changes in a local edit', async () => {\n\t\t\tconst changes = await countViewChange(\n\t\t\t\tasync (checkout, data) => {\n\t\t\t\t\tcheckout.on(CheckoutEvent.ViewChange, () => {\n\t\t\t\t\t\tconst leftTrait = checkout.currentView.getTrait(leftTraitLocation);\n\t\t\t\t\t\tconst rightTrait = checkout.currentView.getTrait(rightTraitLocation);\n\n\t\t\t\t\t\tif (data.changeCount === 1) {\n\t\t\t\t\t\t\texpect(leftTrait.length).to.equal(0); // \"left\" child is deleted...\n\t\t\t\t\t\t\texpect(rightTrait.length).to.equal(1); // ...but \"right\" child is not\n\t\t\t\t\t\t} else if (data.changeCount === 2) {\n\t\t\t\t\t\t\texpect(leftTrait.length).to.equal(0); // \"left\" child is deleted...\n\t\t\t\t\t\t\texpect(rightTrait.length).to.equal(0); // ...and so is \"right\" child\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tcheckout.openEdit();\n\t\t\t\t\texpect(data.changeCount).equals(0);\n\t\t\t\t\tcheckout.applyChanges(Delete.create(StableRange.only(left)));\n\t\t\t\t\texpect(data.changeCount).equals(1);\n\t\t\t\t\tcheckout.applyChanges(Delete.create(StableRange.only(right)));\n\t\t\t\t\texpect(data.changeCount).equals(2);\n\t\t\t\t\tcheckout.closeEdit();\n\t\t\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\t\t},\n\t\t\t\t{ initialTree: simpleTestTree }\n\t\t\t);\n\n\t\t\t// Checkout's use of LogViewer.setKnownEditingResult should enable CachingLogViewer\n\t\t\t// to return the exact same SnapShot object, allowing checkout to so skip an extra change event from closeEdit.\n\t\t\texpect(changes).equals(2);\n\t\t});\n\n\t\tit('emits ViewChange events for edits directly on tree', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout({ initialTree: simpleTestTree });\n\t\t\tlet changeCount = 0;\n\t\t\tcheckout.on(CheckoutEvent.ViewChange, () => {\n\t\t\t\tchangeCount += 1;\n\t\t\t});\n\t\t\texpect(changeCount).equals(0);\n\t\t\tcheckout.tree.applyEdit(Delete.create(StableRange.only(left)));\n\t\t\t// Wait for edit to be included in checkout.\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\texpect(changeCount).equals(1);\n\t\t});\n\n\t\tconst treeOptions = { initialTree: simpleTestTree, localMode: false };\n\t\tconst secondTreeOptions = {\n\t\t\tid: 'secondTestSharedTree',\n\t\t\tlocalMode: false,\n\t\t\tallowInvalid: true,\n\t\t};\n\n\t\tit('emits ViewChange events for remote edits', async () => {\n\t\t\tconst { containerRuntimeFactory, tree } = setUpTestSharedTree({ ...treeOptions });\n\n\t\t\tconst { tree: secondTree } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst checkout = await checkoutFactory(tree);\n\n\t\t\tlet changeCount = 0;\n\t\t\tcheckout.on(CheckoutEvent.ViewChange, () => {\n\t\t\t\tchangeCount += 1;\n\t\t\t});\n\n\t\t\tsecondTree.applyEdit(Delete.create(StableRange.only(left)));\n\t\t\texpect(changeCount).equals(0);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t// Wait for edit to be included in checkout.\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\texpect(changeCount).equals(1);\n\t\t});\n\n\t\tit('connected state with a remote SharedTree equates correctly during edits', async () => {\n\t\t\t// Invalid edits are allowed here because this test creates edits concurrently in two trees,\n\t\t\t// which after syncing, end up with one being invalid.\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, allowInvalid: true });\n\t\t\tconst { tree: secondTree } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst checkout = await checkoutFactory(tree);\n\t\t\tconst secondCheckout = await checkoutFactory(tree);\n\n\t\t\tcheckout.openEdit();\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.true;\n\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\tsecondCheckout.openEdit();\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.true;\n\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\tcheckout.applyChanges(Delete.create(StableRange.only(left)));\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.false;\n\t\t\tsecondCheckout.applyChanges(Delete.create(StableRange.only(left)));\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.true;\n\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\tcheckout.closeEdit();\n\t\t\tsecondCheckout.closeEdit();\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.true;\n\t\t});\n\n\t\tit('can successfully rebase an ongoing local edit', async () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\t// Sync initial tree\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst checkout = await checkoutFactory(tree);\n\t\t\tconst secondCheckout = await checkoutFactory(secondTree);\n\n\t\t\tconst newLeftNode = makeEmptyNode();\n\t\t\tcheckout.openEdit();\n\t\t\tcheckout.applyChanges(...setTrait(leftTraitLocation, [newLeftNode]));\n\n\t\t\t// Concurrently, the second client deletes the right node. This will not conflict with the operation performed\n\t\t\t// on the left trait on the first client.\n\t\t\tsecondCheckout.applyEdit(Delete.create(StableRange.only(right)));\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\n\t\t\t// Deliver the remote change. Since there will not be any conflicts, the result should merge locally and both trait\n\t\t\t// modifications should be reflected in the current view.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\n\t\t\tlet leftTrait = checkout.currentView.getTrait(leftTraitLocation);\n\t\t\tlet rightTrait = checkout.currentView.getTrait(rightTraitLocation);\n\t\t\texpect(leftTrait).deep.equals([newLeftNode.identifier]);\n\t\t\t// The remote deletion of the right node, while delivered, will not be reflected in the view yet.\n\t\t\texpect(rightTrait).deep.equals([right.identifier]);\n\n\t\t\tconst secondLeftTrait = secondCheckout.currentView.getTrait(leftTraitLocation);\n\t\t\tconst secondRightTrait = secondCheckout.currentView.getTrait(rightTraitLocation);\n\t\t\texpect(secondLeftTrait).deep.equals([left.identifier]);\n\t\t\texpect(secondRightTrait.length).equals(0);\n\n\t\t\t// Merge in the latest changes.\n\t\t\tconst rebaseResult = checkout.rebaseCurrentEdit();\n\t\t\texpect(rebaseResult).equals(EditValidationResult.Valid);\n\t\t\tleftTrait = checkout.currentView.getTrait(leftTraitLocation);\n\t\t\trightTrait = checkout.currentView.getTrait(rightTraitLocation);\n\t\t\texpect(leftTrait).deep.equals([newLeftNode.identifier]);\n\t\t\texpect(rightTrait.length).equals(0);\n\n\t\t\tcheckout.closeEdit();\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t});\n\n\t\tit('can handle a failed rebase of an ongoing local edit', async () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\t// Sync initial tree\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst checkout = await checkoutFactory(tree);\n\t\t\tconst secondCheckout = await checkoutFactory(secondTree);\n\n\t\t\tcheckout.openEdit();\n\t\t\t// Move the left node to after the right node\n\t\t\tcheckout.applyChanges(...Move.create(StableRange.only(left), StablePlace.after(right)));\n\n\t\t\t// Concurrently, the second client deletes the right node. This will conflict with the move operation by the first client.\n\t\t\tsecondCheckout.applyEdit(Delete.create(StableRange.only(right)));\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\n\t\t\t// Before rebasing, the first client should still see the right node and will have moved the left node after it.\n\t\t\tconst leftTrait = checkout.currentView.getTrait(leftTraitLocation);\n\t\t\tconst rightTrait = checkout.currentView.getTrait(rightTraitLocation);\n\t\t\texpect(leftTrait).deep.equals([]);\n\t\t\texpect(rightTrait).deep.equals([right.identifier, left.identifier]);\n\n\t\t\t// Merge in the latest changes.\n\t\t\tconst rebaseResult = checkout.rebaseCurrentEdit();\n\t\t\texpect(rebaseResult).equals(EditValidationResult.Invalid);\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.true;\n\t\t});\n\n\t\tit('can dispose and remove listeners', async () => {\n\t\t\t// Arrange\n\t\t\tconst { checkout } = await setUpTestCheckout();\n\n\t\t\t// Assert\n\t\t\texpect(checkout.tree.listenerCount(SharedTreeEvent.EditCommitted)).to.equal(1);\n\n\t\t\t// Act\n\t\t\tcheckout.dispose();\n\n\t\t\t// Assert\n\t\t\texpect(checkout.tree.listenerCount(SharedTreeEvent.EditCommitted)).to.equal(0);\n\t\t});\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Checkout.tests.js","sourceRoot":"","sources":["../../src/test/Checkout.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport {\n\tsetTrait,\n\tEditStatus,\n\tStableRange,\n\tStablePlace,\n\tEditValidationResult,\n\tSharedTree,\n\tSharedTreeEvent,\n\tCheckout,\n\tCheckoutEvent,\n\tChange,\n\tSide,\n\tareRevisionViewsSemanticallyEqual,\n} from '../index';\nimport { TestTree } from './utilities/TestNode';\nimport { setUpTestSharedTree, SharedTreeTestingOptions, setUpTestTree } from './utilities/TestUtilities';\n\n/**\n * Checkout test suite\n */\nexport function checkoutTests(\n\tcheckoutName: string,\n\tcheckoutFactory: (tree: SharedTree) => Promise<Checkout>,\n\tadditionalTests?: () => void\n): void {\n\tasync function setUpTestCheckout(\n\t\toptions: SharedTreeTestingOptions = { localMode: true, noFailOnError: true }\n\t): Promise<{ checkout: Checkout; tree: SharedTree }> {\n\t\tconst { tree } = setUpTestSharedTree(options);\n\t\treturn { checkout: await checkoutFactory(tree), tree };\n\t}\n\n\t/**\n\t * Counts the number of times ViewChange occurs while performing `action`.\n\t * Checks arguments to ViewChange are correct as well.\n\t * @param action Action to perform\n\t * @param options Options object used to construct the initial SharedTree\n\t */\n\tasync function countViewChange(\n\t\taction: (checkout: Checkout, simpleTestTree: TestTree, data: { changeCount: number }) => void | Promise<void>,\n\t\toptions: SharedTreeTestingOptions = { localMode: true }\n\t): Promise<number> {\n\t\tconst { checkout, tree } = await setUpTestCheckout(options);\n\t\tconst simpleTestTree = setUpTestTree(tree);\n\t\tawait checkout.waitForPendingUpdates();\n\t\tlet lastView = checkout.currentView;\n\t\tconst data = { changeCount: 0 };\n\t\tcheckout.on(CheckoutEvent.ViewChange, (before, after) => {\n\t\t\texpect(after).equals(checkout.currentView);\n\t\t\texpect(before).equals(lastView);\n\t\t\tlastView = after;\n\t\t\tdata.changeCount++;\n\t\t});\n\t\t// Prevent errors from errors (like failed expects) from being hidden.\n\t\tconst errors: Error[] = [];\n\t\tcheckout.on('error', (error) => {\n\t\t\terrors.push(error);\n\t\t});\n\n\t\tawait action(checkout, simpleTestTree, data);\n\t\texpect(errors).deep.equal([]);\n\t\treturn data.changeCount;\n\t}\n\n\tasync function setUpTestTreeCheckout(): Promise<{\n\t\tcheckout: Checkout;\n\t\tsharedTree: SharedTree;\n\t\ttestTree: TestTree;\n\t}> {\n\t\tconst { checkout, tree } = await setUpTestCheckout();\n\t\tconst testTree = setUpTestTree(tree);\n\t\tawait checkout.waitForPendingUpdates();\n\t\treturn { checkout, sharedTree: tree, testTree };\n\t}\n\n\tdescribe(checkoutName, () => {\n\t\tit('can only have one edit open at a time', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout();\n\t\t\tcheckout.openEdit();\n\t\t\texpect(() => checkout.openEdit()).throws();\n\t\t});\n\n\t\tit('can only close an edit if one is open', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout();\n\t\t\texpect(() => checkout.closeEdit()).throws();\n\t\t});\n\n\t\tit('can only apply changes if an edit is open', async () => {\n\t\t\tconst { checkout, testTree } = await setUpTestTreeCheckout();\n\t\t\texpect(() => checkout.applyChanges(Change.delete(StableRange.only(testTree.left)))).throws();\n\t\t});\n\n\t\tit('cannot abort an edit if no edit is open', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout();\n\t\t\texpect(() => checkout.abortEdit()).throws();\n\t\t});\n\n\t\tit('can abort valid edits', async () => {\n\t\t\tconst { checkout, testTree } = await setUpTestTreeCheckout();\n\t\t\tcheckout.openEdit();\n\t\t\t// Is still valid after a valid edit\n\t\t\tcheckout.applyChanges(Change.delete(StableRange.only(testTree.left.identifier)));\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\t\t\tcheckout.abortEdit();\n\n\t\t\t// The left node should still be there\n\t\t\texpect(checkout.currentView.getViewNode(testTree.left.identifier).identifier).not.undefined;\n\t\t});\n\n\t\tit('can abort invalid edits', async () => {\n\t\t\tconst { checkout, testTree } = await setUpTestTreeCheckout();\n\t\t\tcheckout.openEdit();\n\t\t\t// Starts as valid\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\n\t\t\t// Is invalid after an invalid edit\n\t\t\texpect(() =>\n\t\t\t\tcheckout.applyChanges(...Change.insertTree(testTree.left, StablePlace.after(testTree.left)))\n\t\t\t).throws('Locally constructed edits must be well-formed and valid.');\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Invalid);\n\t\t\tcheckout.abortEdit();\n\n\t\t\t// Next edit is unaffected\n\t\t\tcheckout.openEdit();\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\t\t\tcheckout.closeEdit();\n\t\t});\n\n\t\tit('can abort malformed edits', async () => {\n\t\t\tconst { checkout, testTree } = await setUpTestTreeCheckout();\n\t\t\tcheckout.openEdit();\n\t\t\t// Starts as valid\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\n\t\t\t// Is malformed after a malformed edit\n\t\t\tconst malformedMove = Change.move(\n\t\t\t\t{\n\t\t\t\t\tstart: { side: Side.Before },\n\t\t\t\t\tend: { side: Side.After },\n\t\t\t\t},\n\t\t\t\t{ side: Side.After }\n\t\t\t);\n\t\t\texpect(() => checkout.applyChanges(...malformedMove)).throws(\n\t\t\t\t'Locally constructed edits must be well-formed and valid.'\n\t\t\t);\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Malformed);\n\n\t\t\t// Is still malformed after a subsequent valid edit\n\t\t\texpect(() => checkout.applyChanges(Change.delete(StableRange.only(testTree.left)))).throws(\n\t\t\t\t'Cannot apply change to an edit unless all previous changes have applied'\n\t\t\t);\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Malformed);\n\n\t\t\tcheckout.abortEdit();\n\n\t\t\t// Next edit is unaffected\n\t\t\tcheckout.openEdit();\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\t\t\tcheckout.closeEdit();\n\t\t});\n\n\t\tit('can try to apply an invalid edit and abort without causing an error', async () => {\n\t\t\tconst { checkout, tree } = await setUpTestCheckout();\n\t\t\tconst simpleTestTree = setUpTestTree(tree);\n\n\t\t\t// tryApplyEdit aborts when applying an invalid edit and returns undefined\n\t\t\texpect(\n\t\t\t\tcheckout.tryApplyEdit(...Change.insertTree(simpleTestTree.left, StablePlace.after(simpleTestTree.left)))\n\t\t\t).to.be.undefined;\n\n\t\t\t// Next edit is unaffected\n\t\t\tcheckout.openEdit();\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\t\t\tcheckout.closeEdit();\n\t\t});\n\n\t\tit('cannot get the edit status if no edit is open', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout();\n\t\t\texpect(() => checkout.getEditStatus()).throws();\n\t\t});\n\n\t\tit('Surfaces error events to SharedTree', async () => {\n\t\t\tconst { checkout, tree } = await setUpTestCheckout();\n\t\t\tconst message = 'Simulated unexpected error in ViewChange event handler';\n\t\t\tcheckout.on(CheckoutEvent.ViewChange, () => {\n\t\t\t\tthrow Error(message);\n\t\t\t});\n\t\t\tlet treeErrorHandlerWasCalled = false;\n\t\t\ttree.on('error', (error) => {\n\t\t\t\ttreeErrorHandlerWasCalled = true;\n\t\t\t\texpect(error).to.have.property('message').that.equals(message);\n\t\t\t});\n\n\t\t\t// This could alternatively actually cause a ViewChange via application of an edit.\n\t\t\tcheckout.emit(CheckoutEvent.ViewChange, checkout.currentView, checkout.currentView);\n\t\t\texpect(treeErrorHandlerWasCalled).equals(true);\n\t\t});\n\n\t\tit('exposes the current edit status in the face of valid edits', async () => {\n\t\t\tconst { checkout, testTree } = await setUpTestTreeCheckout();\n\t\t\tcheckout.openEdit();\n\t\t\t// Starts as valid\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\n\t\t\t// Is still valid after a valid edit\n\t\t\tcheckout.applyChanges(Change.delete(StableRange.only(testTree.left)));\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\n\t\t\tcheckout.closeEdit();\n\t\t});\n\n\t\tit('exposes the current edit status in the face of invalid edits', async () => {\n\t\t\tconst { checkout, testTree } = await setUpTestTreeCheckout();\n\t\t\tcheckout.openEdit();\n\t\t\t// Starts as valid\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\n\t\t\t// Is invalid after an invalid edit\n\t\t\texpect(() =>\n\t\t\t\tcheckout.applyChanges(...Change.insertTree(testTree.left, StablePlace.after(testTree.left)))\n\t\t\t).throws('Locally constructed edits must be well-formed and valid.');\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Invalid);\n\n\t\t\t// Is still invalid after a subsequent valid edit\n\t\t\texpect(() => checkout.applyChanges(Change.delete(StableRange.only(testTree.left)))).throws(\n\t\t\t\t'Cannot apply change to an edit unless all previous changes have applied'\n\t\t\t);\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Invalid);\n\n\t\t\texpect(() => checkout.closeEdit()).throws('Locally constructed edits must be well-formed and valid');\n\n\t\t\t// Next edit is unaffected\n\t\t\tcheckout.openEdit();\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\t\t\tcheckout.closeEdit();\n\t\t});\n\n\t\tit('exposes the current edit status in the face of malformed edits', async () => {\n\t\t\tconst { checkout, testTree } = await setUpTestTreeCheckout();\n\t\t\tcheckout.openEdit();\n\t\t\t// Starts as valid\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\n\t\t\t// Is malformed after a malformed edit\n\t\t\tconst malformedMove = Change.move(\n\t\t\t\t{\n\t\t\t\t\tstart: { side: Side.Before },\n\t\t\t\t\tend: { side: Side.After },\n\t\t\t\t},\n\t\t\t\t{ side: Side.After }\n\t\t\t);\n\t\t\texpect(() => checkout.applyChanges(...malformedMove)).throws(\n\t\t\t\t'Locally constructed edits must be well-formed and valid.'\n\t\t\t);\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Malformed);\n\n\t\t\t// Is still malformed after a subsequent valid edit\n\t\t\texpect(() => checkout.applyChanges(Change.delete(StableRange.only(testTree.left)))).throws(\n\t\t\t\t'Cannot apply change to an edit unless all previous changes have applied'\n\t\t\t);\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Malformed);\n\n\t\t\texpect(() => checkout.closeEdit()).throws('Locally constructed edits must be well-formed and valid');\n\n\t\t\t// Next edit is unaffected\n\t\t\tcheckout.openEdit();\n\t\t\texpect(checkout.getEditStatus()).equals(EditStatus.Applied);\n\t\t\tcheckout.closeEdit();\n\t\t});\n\n\t\tit('does not invalidate in response to an empty edit', async () => {\n\t\t\tconst invalidations = await countViewChange((checkout) => {\n\t\t\t\tcheckout.openEdit();\n\t\t\t\tcheckout.closeEdit();\n\t\t\t});\n\t\t\texpect(invalidations).equals(0);\n\t\t});\n\n\t\tit('records empty edits', async () => {\n\t\t\tconst { checkout, tree } = await setUpTestCheckout();\n\t\t\tcheckout.openEdit();\n\t\t\tconst editId = checkout.closeEdit();\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\texpect(tree.edits.length).equals(1);\n\t\t\texpect(tree.edits.tryGetEdit(editId)).is.not.undefined;\n\t\t});\n\n\t\tit('will emit invalidation messages in response to changes', async () => {\n\t\t\tconst invalidations = await countViewChange((checkout, simpleTestTree) => {\n\t\t\t\tcheckout.applyEdit(Change.delete(StableRange.only(simpleTestTree.left)));\n\t\t\t});\n\t\t\texpect(invalidations).equals(1);\n\t\t});\n\n\t\tit('will emit invalidation messages in response to payload change', async () => {\n\t\t\tconst invalidations = await countViewChange((checkout, simpleTestTree) => {\n\t\t\t\tcheckout.applyEdit(Change.setPayload(simpleTestTree.left.identifier, 5));\n\t\t\t});\n\t\t\texpect(invalidations).equals(1);\n\t\t});\n\n\t\tit('emits a change event for each batch of changes in a local edit', async () => {\n\t\t\tconst changes = await countViewChange(async (checkout, simpleTestTree, data) => {\n\t\t\t\tcheckout.on(CheckoutEvent.ViewChange, () => {\n\t\t\t\t\tconst leftTrait = checkout.currentView.getTrait(simpleTestTree.left.traitLocation);\n\t\t\t\t\tconst rightTrait = checkout.currentView.getTrait(simpleTestTree.right.traitLocation);\n\n\t\t\t\t\tif (data.changeCount === 1) {\n\t\t\t\t\t\texpect(leftTrait.length).to.equal(0); // \"left\" child is deleted...\n\t\t\t\t\t\texpect(rightTrait.length).to.equal(1); // ...but \"right\" child is not\n\t\t\t\t\t} else if (data.changeCount === 2) {\n\t\t\t\t\t\texpect(leftTrait.length).to.equal(0); // \"left\" child is deleted...\n\t\t\t\t\t\texpect(rightTrait.length).to.equal(0); // ...and so is \"right\" child\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tcheckout.openEdit();\n\t\t\t\texpect(data.changeCount).equals(0);\n\t\t\t\tcheckout.applyChanges(Change.delete(StableRange.only(simpleTestTree.left)));\n\t\t\t\texpect(data.changeCount).equals(1);\n\t\t\t\tcheckout.applyChanges(Change.delete(StableRange.only(simpleTestTree.right)));\n\t\t\t\texpect(data.changeCount).equals(2);\n\t\t\t\tcheckout.closeEdit();\n\t\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\t});\n\n\t\t\t// Checkout's use of LogViewer.setKnownEditingResult should enable CachingLogViewer\n\t\t\t// to return the exact same revision view object, allowing checkout to skip an extra change event from closeEdit.\n\t\t\texpect(changes).equals(2);\n\t\t});\n\n\t\tit('emits ViewChange events for edits directly on tree', async () => {\n\t\t\tconst { checkout, testTree } = await setUpTestTreeCheckout();\n\t\t\tlet changeCount = 0;\n\t\t\tcheckout.on(CheckoutEvent.ViewChange, () => {\n\t\t\t\tchangeCount += 1;\n\t\t\t});\n\t\t\texpect(changeCount).equals(0);\n\t\t\tcheckout.tree.applyEdit(Change.delete(StableRange.only(testTree.left)));\n\t\t\t// Wait for edit to be included in checkout.\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\texpect(changeCount).equals(1);\n\t\t});\n\n\t\tit('automatically loads views from edits committed directly on it', async () => {\n\t\t\tconst { checkout, testTree } = await setUpTestTreeCheckout();\n\t\t\tconst viewBefore = checkout.currentView;\n\t\t\tlet changeCount = 0;\n\t\t\tcheckout.on(CheckoutEvent.ViewChange, () => {\n\t\t\t\tchangeCount += 1;\n\t\t\t});\n\t\t\tcheckout.applyEdit(Change.delete(StableRange.only(testTree.left)));\n\t\t\texpect(changeCount).equals(1);\n\t\t\texpect(viewBefore.equals(checkout.currentView)).to.be.false;\n\t\t});\n\n\t\tconst secondTreeOptions = {\n\t\t\tid: 'secondTestSharedTree',\n\t\t\tlocalMode: false,\n\t\t\tallowInvalid: true,\n\t\t};\n\n\t\tit('can wait on edits to be submitted', async () => {\n\t\t\tconst { checkout, testTree } = await setUpTestTreeCheckout();\n\t\t\tlet committedEditsCount = 0;\n\t\t\tcheckout.tree.on(SharedTreeEvent.EditCommitted, () => {\n\t\t\t\tcommittedEditsCount += 1;\n\t\t\t});\n\t\t\texpect(committedEditsCount).equals(0);\n\t\t\tcheckout.tree.applyEdit(Change.delete(StableRange.only(testTree.left)));\n\t\t\tawait checkout.waitForEditsToSubmit();\n\t\t\texpect(committedEditsCount).equals(1);\n\t\t});\n\n\t\tit('emits ViewChange events for remote edits', async () => {\n\t\t\tconst { containerRuntimeFactory, tree } = setUpTestSharedTree({ localMode: false });\n\t\t\tconst simpleTestTree = setUpTestTree(tree);\n\n\t\t\tconst { tree: secondTree } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst checkout = await checkoutFactory(tree);\n\n\t\t\tlet changeCount = 0;\n\t\t\tcheckout.on(CheckoutEvent.ViewChange, () => {\n\t\t\t\tchangeCount += 1;\n\t\t\t});\n\n\t\t\tsecondTree.applyEdit(Change.delete(StableRange.only(simpleTestTree.left.translateId(secondTree))));\n\t\t\texpect(changeCount).equals(0);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t// Wait for edit to be included in checkout.\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\texpect(changeCount).equals(1);\n\t\t\texpect(secondTree.equals(tree));\n\t\t});\n\n\t\tit('connected state with a remote SharedTree equates correctly during edits', async () => {\n\t\t\t// Invalid edits are allowed here because this test creates edits concurrently in two trees,\n\t\t\t// which after syncing, end up with one being invalid.\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ localMode: false, allowInvalid: true });\n\t\t\tconst simpleTestTree = setUpTestTree(tree);\n\t\t\tconst { tree: secondTree } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst checkout = await checkoutFactory(tree);\n\t\t\tconst secondCheckout = await checkoutFactory(tree);\n\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.true;\n\t\t\texpect(checkout.currentView.hasEqualForest(secondCheckout.currentView)).to.be.true;\n\t\t\tcheckout.openEdit();\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.false;\n\t\t\texpect(checkout.currentView.hasEqualForest(secondCheckout.currentView)).to.be.true;\n\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\tsecondCheckout.openEdit();\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.true;\n\t\t\texpect(checkout.currentView.hasEqualForest(secondCheckout.currentView)).to.be.true;\n\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\tcheckout.applyChanges(Change.delete(StableRange.only(simpleTestTree.left)));\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.false;\n\t\t\texpect(checkout.currentView.hasEqualForest(secondCheckout.currentView)).to.be.false;\n\t\t\tsecondCheckout.applyChanges(Change.delete(StableRange.only(simpleTestTree.left)));\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.true;\n\t\t\texpect(checkout.currentView.hasEqualForest(secondCheckout.currentView)).to.be.true;\n\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\tcheckout.closeEdit();\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.false;\n\t\t\texpect(checkout.currentView.hasEqualForest(secondCheckout.currentView)).to.be.true;\n\t\t\tsecondCheckout.closeEdit();\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.true;\n\t\t\texpect(checkout.currentView.hasEqualForest(secondCheckout.currentView)).to.be.true;\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\t\t\texpect(checkout.currentView.equals(secondCheckout.currentView)).to.be.true;\n\t\t\texpect(checkout.currentView.hasEqualForest(secondCheckout.currentView)).to.be.true;\n\t\t});\n\n\t\tit('can successfully rebase an ongoing local edit', async () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ localMode: false });\n\t\t\tconst simpleTestTree = setUpTestTree(tree);\n\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\t// Sync initial tree\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst checkout = await checkoutFactory(tree);\n\t\t\tconst secondCheckout = await checkoutFactory(secondTree);\n\n\t\t\tconst newLeftNode = simpleTestTree.buildLeaf(simpleTestTree.generateNodeId());\n\t\t\tcheckout.openEdit();\n\t\t\tcheckout.applyChanges(...setTrait(simpleTestTree.left.traitLocation, [newLeftNode]));\n\n\t\t\t// Concurrently, the second client deletes the right node. This will not conflict with the operation performed\n\t\t\t// on the left trait on the first client.\n\t\t\tsecondCheckout.applyEdit(Change.delete(StableRange.only(simpleTestTree.right.translateId(secondTree))));\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\n\t\t\t// Deliver the remote change. Since there will not be any conflicts, the result should merge locally and both trait\n\t\t\t// modifications should be reflected in the current view.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\n\t\t\tlet leftTrait = checkout.currentView.getTrait(simpleTestTree.left.traitLocation);\n\t\t\tlet rightTrait = checkout.currentView.getTrait(simpleTestTree.right.traitLocation);\n\t\t\texpect(leftTrait).deep.equals([newLeftNode.identifier]);\n\t\t\t// The remote deletion of the right node, while delivered, will not be reflected in the view yet.\n\t\t\texpect(rightTrait).deep.equals([simpleTestTree.right.identifier]);\n\n\t\t\tconst secondLeftTrait = secondCheckout.currentView.getTrait(\n\t\t\t\tsimpleTestTree.left.traitLocation.translate(secondTree)\n\t\t\t);\n\t\t\tconst secondRightTrait = secondCheckout.currentView.getTrait(\n\t\t\t\tsimpleTestTree.right.traitLocation.translate(secondTree)\n\t\t\t);\n\t\t\texpect(secondLeftTrait).deep.equals([simpleTestTree.left.translateId(secondTree)]);\n\t\t\texpect(secondRightTrait.length).equals(0);\n\n\t\t\t// Merge in the latest changes.\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\tconst rebaseResult = checkout.rebaseCurrentEdit();\n\t\t\texpect(rebaseResult).equals(EditValidationResult.Valid);\n\t\t\tleftTrait = checkout.currentView.getTrait(simpleTestTree.left.traitLocation);\n\t\t\trightTrait = checkout.currentView.getTrait(simpleTestTree.right.traitLocation);\n\t\t\texpect(leftTrait).deep.equals([newLeftNode.identifier]);\n\t\t\texpect(rightTrait.length).equals(0);\n\n\t\t\tcheckout.closeEdit();\n\t\t\t// Again, call this prior to processing ops to accommodate PrefetchingCheckout\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t});\n\n\t\tit('can handle a failed rebase of an ongoing local edit', async () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ localMode: false });\n\t\t\tconst simpleTestTree = setUpTestTree(tree);\n\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\t// Sync initial tree\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst checkout = await checkoutFactory(tree);\n\t\t\tconst secondCheckout = await checkoutFactory(secondTree);\n\n\t\t\tcheckout.openEdit();\n\t\t\t// Move the left node to after the right node\n\t\t\tcheckout.applyChanges(\n\t\t\t\t...Change.move(StableRange.only(simpleTestTree.left), StablePlace.after(simpleTestTree.right))\n\t\t\t);\n\n\t\t\t// Concurrently, the second client deletes the right node. This will conflict with the move operation by the first client.\n\t\t\tsecondCheckout.applyEdit(Change.delete(StableRange.only(simpleTestTree.right.translateId(secondTree))));\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tawait checkout.waitForPendingUpdates();\n\t\t\tawait secondCheckout.waitForPendingUpdates();\n\n\t\t\t// Before rebasing, the first client should still see the right node and will have moved the left node after it.\n\t\t\tconst leftTrait = checkout.currentView.getTrait(simpleTestTree.left.traitLocation);\n\t\t\tconst rightTrait = checkout.currentView.getTrait(simpleTestTree.right.traitLocation);\n\t\t\texpect(leftTrait).deep.equals([]);\n\t\t\texpect(rightTrait).deep.equals([simpleTestTree.right.identifier, simpleTestTree.left.identifier]);\n\n\t\t\t// Merge in the latest changes.\n\t\t\tconst rebaseResult = checkout.rebaseCurrentEdit();\n\t\t\texpect(rebaseResult).equals(EditValidationResult.Invalid);\n\t\t\texpect(\n\t\t\t\tareRevisionViewsSemanticallyEqual(checkout.currentView, tree, secondCheckout.currentView, secondTree)\n\t\t\t).to.be.true;\n\t\t});\n\n\t\tit('can dispose and remove listeners', async () => {\n\t\t\tconst { checkout } = await setUpTestCheckout();\n\t\t\texpect(checkout.tree.listenerCount(SharedTreeEvent.EditCommitted)).to.equal(1);\n\t\t\tcheckout.dispose();\n\t\t\texpect(checkout.tree.listenerCount(SharedTreeEvent.EditCommitted)).to.equal(0);\n\t\t});\n\n\t\tadditionalTests?.();\n\t});\n}\n"]}
|
package/lib/test/Common.tests.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { expect } from 'chai';
|
|
6
|
-
import { memoizeGetter } from '../Common';
|
|
7
|
-
describe('
|
|
6
|
+
import { filter, find, getOrCreate, identity, map, memoizeGetter, reduce } from '../Common';
|
|
7
|
+
describe('Common', () => {
|
|
8
8
|
it('function memoizeGetter() correctly memoizes', () => {
|
|
9
9
|
let x = 0;
|
|
10
10
|
const getAndInc = () => x++;
|
|
@@ -21,5 +21,63 @@ describe('SharedTree common', () => {
|
|
|
21
21
|
expect(obj.getCached).to.equal(2);
|
|
22
22
|
expect(obj.getCached).to.equal(2); // Cached, no increment
|
|
23
23
|
});
|
|
24
|
+
it('identity function returns its input', () => {
|
|
25
|
+
const inputs = [42, 'test', true];
|
|
26
|
+
for (const input of inputs) {
|
|
27
|
+
expect(identity(input)).to.equal(input);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
describe('getOrCreate', () => {
|
|
31
|
+
it('returns existing values', () => {
|
|
32
|
+
const map = new Map();
|
|
33
|
+
const key = 42;
|
|
34
|
+
const value = 'test';
|
|
35
|
+
map.set(key, value);
|
|
36
|
+
expect(getOrCreate(map, key, () => expect.fail('should not call value creator for existing values'))).to.equal(value);
|
|
37
|
+
});
|
|
38
|
+
it('inserts new values', () => {
|
|
39
|
+
const map = new Map();
|
|
40
|
+
const key = 42;
|
|
41
|
+
const value = 'test';
|
|
42
|
+
expect(getOrCreate(map, key, () => value)).to.equal(value);
|
|
43
|
+
expect(map.get(key)).to.equal(value);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
it('maps iterables correctly', () => {
|
|
47
|
+
const inputs = [0, 1, 2, 3];
|
|
48
|
+
const mapper = (n) => n * 2;
|
|
49
|
+
expect([...map(inputs, mapper)]).to.deep.equal(inputs.map(mapper));
|
|
50
|
+
});
|
|
51
|
+
it('filters iterables correctly', () => {
|
|
52
|
+
const inputs = [0, 1, 2, 3];
|
|
53
|
+
const predicate = (n) => n < 2;
|
|
54
|
+
expect([...filter(inputs, predicate)]).to.deep.equal(inputs.filter(predicate));
|
|
55
|
+
});
|
|
56
|
+
describe('reduces iterables', () => {
|
|
57
|
+
const reducer = (p, c) => p + c;
|
|
58
|
+
it('that are empty', () => {
|
|
59
|
+
const inputs = [];
|
|
60
|
+
expect(reduce(inputs, reducer)).to.be.undefined;
|
|
61
|
+
});
|
|
62
|
+
it('that have a single element', () => {
|
|
63
|
+
const inputs = [42];
|
|
64
|
+
expect(reduce(inputs, reducer)).to.equal(inputs.reduce(reducer));
|
|
65
|
+
});
|
|
66
|
+
it('with no initial value', () => {
|
|
67
|
+
const inputs = [0, 1, 2, 3];
|
|
68
|
+
expect(reduce(inputs, reducer)).to.equal(inputs.reduce(reducer));
|
|
69
|
+
});
|
|
70
|
+
it('with an initial value', () => {
|
|
71
|
+
const inputs = [0, 1, 2, 3];
|
|
72
|
+
expect(reduce(inputs, reducer, 42)).to.equal(inputs.reduce(reducer, 42));
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
it('finds elements in iterables', () => {
|
|
76
|
+
const inputs = [0, 1, 2, 3];
|
|
77
|
+
const predicateFind = (n) => n >= 2;
|
|
78
|
+
expect(find(inputs, predicateFind)).to.equal(inputs.find(predicateFind));
|
|
79
|
+
const predicateNever = (n) => n < 0;
|
|
80
|
+
expect(find(inputs, predicateNever)).to.equal(inputs.find(predicateNever));
|
|
81
|
+
});
|
|
24
82
|
});
|
|
25
83
|
//# sourceMappingURL=Common.tests.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Common.tests.js","sourceRoot":"","sources":["../../src/test/Common.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"Common.tests.js","sourceRoot":"","sources":["../../src/test/Common.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { filter, find, getOrCreate, identity, map, memoizeGetter, reduce } from '../Common';\n\ndescribe('Common', () => {\n\tit('function memoizeGetter() correctly memoizes', () => {\n\t\tlet x = 0;\n\t\tconst getAndInc = () => x++;\n\t\tconst obj = {\n\t\t\tget getUncached(): number {\n\t\t\t\treturn getAndInc();\n\t\t\t},\n\t\t\tget getCached(): number {\n\t\t\t\treturn memoizeGetter(this, 'getCached', getAndInc());\n\t\t\t},\n\t\t};\n\n\t\texpect(obj.getUncached).to.equal(0);\n\t\texpect(obj.getUncached).to.equal(1);\n\t\texpect(obj.getCached).to.equal(2);\n\t\texpect(obj.getCached).to.equal(2); // Cached, no increment\n\t});\n\n\tit('identity function returns its input', () => {\n\t\tconst inputs = [42, 'test', true];\n\t\tfor (const input of inputs) {\n\t\t\texpect(identity(input)).to.equal(input);\n\t\t}\n\t});\n\n\tdescribe('getOrCreate', () => {\n\t\tit('returns existing values', () => {\n\t\t\tconst map = new Map<number, string>();\n\t\t\tconst key = 42;\n\t\t\tconst value = 'test';\n\t\t\tmap.set(key, value);\n\t\t\texpect(\n\t\t\t\tgetOrCreate(map, key, () => expect.fail('should not call value creator for existing values'))\n\t\t\t).to.equal(value);\n\t\t});\n\n\t\tit('inserts new values', () => {\n\t\t\tconst map = new Map<number, string>();\n\t\t\tconst key = 42;\n\t\t\tconst value = 'test';\n\t\t\texpect(getOrCreate(map, key, () => value)).to.equal(value);\n\t\t\texpect(map.get(key)).to.equal(value);\n\t\t});\n\t});\n\n\tit('maps iterables correctly', () => {\n\t\tconst inputs = [0, 1, 2, 3];\n\t\tconst mapper = (n: number) => n * 2;\n\t\texpect([...map(inputs, mapper)]).to.deep.equal(inputs.map(mapper));\n\t});\n\n\tit('filters iterables correctly', () => {\n\t\tconst inputs = [0, 1, 2, 3];\n\t\tconst predicate = (n: number) => n < 2;\n\t\texpect([...filter(inputs, predicate)]).to.deep.equal(inputs.filter(predicate));\n\t});\n\n\tdescribe('reduces iterables', () => {\n\t\tconst reducer = (p: number, c: number) => p + c;\n\n\t\tit('that are empty', () => {\n\t\t\tconst inputs: number[] = [];\n\t\t\texpect(reduce(inputs, reducer)).to.be.undefined;\n\t\t});\n\n\t\tit('that have a single element', () => {\n\t\t\tconst inputs = [42];\n\t\t\texpect(reduce(inputs, reducer)).to.equal(inputs.reduce(reducer));\n\t\t});\n\n\t\tit('with no initial value', () => {\n\t\t\tconst inputs = [0, 1, 2, 3];\n\t\t\texpect(reduce(inputs, reducer)).to.equal(inputs.reduce(reducer));\n\t\t});\n\n\t\tit('with an initial value', () => {\n\t\t\tconst inputs = [0, 1, 2, 3];\n\t\t\texpect(reduce(inputs, reducer, 42)).to.equal(inputs.reduce(reducer, 42));\n\t\t});\n\t});\n\n\tit('finds elements in iterables', () => {\n\t\tconst inputs = [0, 1, 2, 3];\n\t\tconst predicateFind = (n: number) => n >= 2;\n\t\texpect(find(inputs, predicateFind)).to.equal(inputs.find(predicateFind));\n\t\tconst predicateNever = (n: number) => n < 0;\n\t\texpect(find(inputs, predicateNever)).to.equal(inputs.find(predicateNever));\n\t});\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EagerCheckout.tests.d.ts","sourceRoot":"","sources":["../../src/test/EagerCheckout.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { expect } from 'chai';
|
|
6
|
+
import { Change, StableRange } from '../ChangeTypes';
|
|
7
|
+
import { EagerCheckout } from '../EagerCheckout';
|
|
8
|
+
import { checkoutTests } from './Checkout.tests';
|
|
9
|
+
import { setUpTestSharedTree, setUpTestTree } from './utilities/TestUtilities';
|
|
10
|
+
checkoutTests('EagerCheckout', async (tree) => Promise.resolve(new EagerCheckout(tree)), () => {
|
|
11
|
+
it('updates eagerly', () => {
|
|
12
|
+
const { tree } = setUpTestSharedTree();
|
|
13
|
+
const testTree = setUpTestTree(tree);
|
|
14
|
+
const checkout = new EagerCheckout(tree);
|
|
15
|
+
expect(tree.currentView.equals(checkout.currentView)).to.be.true;
|
|
16
|
+
tree.applyEdit(Change.delete(StableRange.only(testTree.left)));
|
|
17
|
+
expect(tree.currentView.equals(checkout.currentView)).to.be.true;
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=EagerCheckout.tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EagerCheckout.tests.js","sourceRoot":"","sources":["../../src/test/EagerCheckout.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/E,aAAa,CACZ,eAAe,EACf,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,EACxD,GAAG,EAAE;IACJ,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,mBAAmB,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACjE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IAClE,CAAC,CAAC,CAAC;AACJ,CAAC,CACD,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { Change, StableRange } from '../ChangeTypes';\nimport { EagerCheckout } from '../EagerCheckout';\nimport { checkoutTests } from './Checkout.tests';\nimport { setUpTestSharedTree, setUpTestTree } from './utilities/TestUtilities';\n\ncheckoutTests(\n\t'EagerCheckout',\n\tasync (tree) => Promise.resolve(new EagerCheckout(tree)),\n\t() => {\n\t\tit('updates eagerly', () => {\n\t\t\tconst { tree } = setUpTestSharedTree();\n\t\t\tconst testTree = setUpTestTree(tree);\n\t\t\tconst checkout = new EagerCheckout(tree);\n\n\t\t\texpect(tree.currentView.equals(checkout.currentView)).to.be.true;\n\t\t\ttree.applyEdit(Change.delete(StableRange.only(testTree.left)));\n\t\t\texpect(tree.currentView.equals(checkout.currentView)).to.be.true;\n\t\t});\n\t}\n);\n"]}
|
package/lib/test/Edit.tests.js
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { expect } from 'chai';
|
|
6
|
-
import {
|
|
6
|
+
import { deepCompareNodes } from '../EditUtilities';
|
|
7
|
+
import { refreshTestTree } from './utilities/TestUtilities';
|
|
7
8
|
// TODO #45414: Re-enable when compareEdits compares the actual changes instead of just the edit IDs.
|
|
8
9
|
// Commented out instead of skipped to avoid linting errors.
|
|
9
10
|
// describe('compareSequencedEdits', () => {
|
|
@@ -11,10 +12,10 @@ import { makeEmptyNode, makeTestNode, deepCompareNodes } from './utilities/TestU
|
|
|
11
12
|
// const node = makeTestNode();
|
|
12
13
|
// const editId = '75dd0d7d-ea87-40cf-8860-dc2b9d827597' as EditId;
|
|
13
14
|
// const editA: Edit = {
|
|
14
|
-
// changes: [
|
|
15
|
+
// changes: [Change.delete(StableRange.only(node))],
|
|
15
16
|
// };
|
|
16
17
|
// const sequencedEditB: Edit = {
|
|
17
|
-
// changes: [
|
|
18
|
+
// changes: [Change.delete(StableRange.only(node))],
|
|
18
19
|
// };
|
|
19
20
|
// expect(compareEdits(editA, sequencedEditB)).to.be.true;
|
|
20
21
|
// });
|
|
@@ -22,31 +23,38 @@ import { makeEmptyNode, makeTestNode, deepCompareNodes } from './utilities/TestU
|
|
|
22
23
|
// const node = makeTestNode();
|
|
23
24
|
// const nodeDestination = makeTestNode();
|
|
24
25
|
// const sequencedEditA: Edit = {
|
|
25
|
-
// changes: [
|
|
26
|
+
// changes: [Change.delete(StableRange.only(node))],
|
|
26
27
|
// id: '7366efae-f96a-4f5d-9c6c-eea62ac6dffb' as EditId,
|
|
27
28
|
// };
|
|
28
29
|
// const sequencedEditB: Edit = {
|
|
29
|
-
// changes: [...
|
|
30
|
+
// changes: [...Change.move(StableRange.only(node), StablePlace.before(nodeDestination))],
|
|
30
31
|
// id: '57cb9fa9-9d1d-49eb-919a-5636ed55a65a' as EditId,
|
|
31
32
|
// };
|
|
32
33
|
// expect(compareEdits(sequencedEditA, sequencedEditB)).to.be.false;
|
|
33
34
|
// });
|
|
34
35
|
// });
|
|
35
36
|
describe('deepCompareNodes', () => {
|
|
37
|
+
const testTree = refreshTestTree();
|
|
36
38
|
it('correctly compares two empty nodes', () => {
|
|
37
|
-
const nodeId =
|
|
38
|
-
expect(deepCompareNodes(
|
|
39
|
+
const nodeId = testTree.generateNodeId();
|
|
40
|
+
expect(deepCompareNodes(testTree.buildLeaf(nodeId), testTree.buildLeaf(nodeId))).to.be.true;
|
|
39
41
|
});
|
|
40
42
|
it('correctly compares two deeply equal nodes', () => {
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
+
const otherTree = {
|
|
44
|
+
definition: testTree.definition,
|
|
45
|
+
identifier: testTree.identifier,
|
|
46
|
+
traits: {
|
|
47
|
+
left: [{ definition: testTree.left.definition, identifier: testTree.left.identifier, traits: {} }],
|
|
48
|
+
right: [{ definition: testTree.right.definition, identifier: testTree.right.identifier, traits: {} }],
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
expect(deepCompareNodes(testTree, otherTree)).to.be.true;
|
|
43
52
|
});
|
|
44
53
|
it('returns false for unequal nodes', () => {
|
|
45
|
-
|
|
46
|
-
expect(deepCompareNodes(
|
|
47
|
-
expect(deepCompareNodes(
|
|
48
|
-
expect(deepCompareNodes(
|
|
49
|
-
expect(deepCompareNodes(makeTestNode(), makeEmptyNode())).to.be.false;
|
|
54
|
+
expect(deepCompareNodes(testTree.buildLeaf(testTree.generateNodeId()), testTree.buildLeaf(testTree.generateNodeId()))).to.be.false;
|
|
55
|
+
expect(deepCompareNodes(testTree.buildLeaf(testTree.identifier), testTree)).to.be.false;
|
|
56
|
+
expect(deepCompareNodes(testTree.buildLeaf(testTree.identifier), testTree)).to.be.false;
|
|
57
|
+
expect(deepCompareNodes(testTree, testTree.buildLeaf(testTree.identifier))).to.be.false;
|
|
50
58
|
});
|
|
51
59
|
});
|
|
52
60
|
//# sourceMappingURL=Edit.tests.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Edit.tests.js","sourceRoot":"","sources":["../../src/test/Edit.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"Edit.tests.js","sourceRoot":"","sources":["../../src/test/Edit.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,qGAAqG;AACrG,mEAAmE;AACnE,4CAA4C;AAC5C,8DAA8D;AAC9D,iCAAiC;AACjC,qEAAqE;AACrE,0BAA0B;AAC1B,uDAAuD;AACvD,OAAO;AAEP,mCAAmC;AACnC,uDAAuD;AACvD,OAAO;AAEP,4DAA4D;AAC5D,OAAO;AAEP,kEAAkE;AAClE,iCAAiC;AACjC,4CAA4C;AAE5C,mCAAmC;AACnC,uDAAuD;AACvD,2DAA2D;AAC3D,OAAO;AAEP,mCAAmC;AACnC,6FAA6F;AAC7F,2DAA2D;AAC3D,OAAO;AAEP,sEAAsE;AACtE,OAAO;AACP,MAAM;AAEN,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IAEnC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,MAAM,SAAS,GAAe;YAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,MAAM,EAAE;gBACP,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBAClG,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aACrG;SACD,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC1C,MAAM,CACL,gBAAgB,CACf,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,EAC7C,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAC7C,CACD,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACd,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACxF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACxF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;IACzF,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { deepCompareNodes } from '../EditUtilities';\nimport { ChangeNode } from '../persisted-types';\nimport { refreshTestTree } from './utilities/TestUtilities';\n\n// TODO #45414: Re-enable when compareEdits compares the actual changes instead of just the edit IDs.\n// \t\t\t Commented out instead of skipped to avoid linting errors.\n// describe('compareSequencedEdits', () => {\n// \tit('correctly compares two equal sequenced edits', () => {\n// \t\tconst node = makeTestNode();\n// \t\tconst editId = '75dd0d7d-ea87-40cf-8860-dc2b9d827597' as EditId;\n// \t\tconst editA: Edit = {\n// \t\t\tchanges: [Change.delete(StableRange.only(node))],\n// \t\t};\n\n// \t\tconst sequencedEditB: Edit = {\n// \t\t\tchanges: [Change.delete(StableRange.only(node))],\n// \t\t};\n\n// \t\texpect(compareEdits(editA, sequencedEditB)).to.be.true;\n// \t});\n\n// \tit('correctly compares two non-equal sequenced edits', () => {\n// \t\tconst node = makeTestNode();\n// \t\tconst nodeDestination = makeTestNode();\n\n// \t\tconst sequencedEditA: Edit = {\n// \t\t\tchanges: [Change.delete(StableRange.only(node))],\n// \t\t\tid: '7366efae-f96a-4f5d-9c6c-eea62ac6dffb' as EditId,\n// \t\t};\n\n// \t\tconst sequencedEditB: Edit = {\n// \t\t\tchanges: [...Change.move(StableRange.only(node), StablePlace.before(nodeDestination))],\n// \t\t\tid: '57cb9fa9-9d1d-49eb-919a-5636ed55a65a' as EditId,\n// \t\t};\n\n// \t\texpect(compareEdits(sequencedEditA, sequencedEditB)).to.be.false;\n// \t});\n// });\n\ndescribe('deepCompareNodes', () => {\n\tconst testTree = refreshTestTree();\n\n\tit('correctly compares two empty nodes', () => {\n\t\tconst nodeId = testTree.generateNodeId();\n\t\texpect(deepCompareNodes(testTree.buildLeaf(nodeId), testTree.buildLeaf(nodeId))).to.be.true;\n\t});\n\n\tit('correctly compares two deeply equal nodes', () => {\n\t\tconst otherTree: ChangeNode = {\n\t\t\tdefinition: testTree.definition,\n\t\t\tidentifier: testTree.identifier,\n\t\t\ttraits: {\n\t\t\t\tleft: [{ definition: testTree.left.definition, identifier: testTree.left.identifier, traits: {} }],\n\t\t\t\tright: [{ definition: testTree.right.definition, identifier: testTree.right.identifier, traits: {} }],\n\t\t\t},\n\t\t};\n\t\texpect(deepCompareNodes(testTree, otherTree)).to.be.true;\n\t});\n\n\tit('returns false for unequal nodes', () => {\n\t\texpect(\n\t\t\tdeepCompareNodes(\n\t\t\t\ttestTree.buildLeaf(testTree.generateNodeId()),\n\t\t\t\ttestTree.buildLeaf(testTree.generateNodeId())\n\t\t\t)\n\t\t).to.be.false;\n\t\texpect(deepCompareNodes(testTree.buildLeaf(testTree.identifier), testTree)).to.be.false;\n\t\texpect(deepCompareNodes(testTree.buildLeaf(testTree.identifier), testTree)).to.be.false;\n\t\texpect(deepCompareNodes(testTree, testTree.buildLeaf(testTree.identifier))).to.be.false;\n\t});\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditLog.perf.tests.d.ts","sourceRoot":"","sources":["../../src/test/EditLog.perf.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { benchmark, BenchmarkType } from '@fluid-tools/benchmark';
|
|
6
|
+
import { Change, StablePlace } from '../ChangeTypes';
|
|
7
|
+
import { EditLog } from '../EditLog';
|
|
8
|
+
import { newEdit } from '../EditUtilities';
|
|
9
|
+
import { setUpTestTree } from './utilities/TestUtilities';
|
|
10
|
+
describe('EditLog Perf', () => {
|
|
11
|
+
const insertNumbers = [10, 50, 100, 500, 1000];
|
|
12
|
+
insertNumbers.forEach((numberOfInserts) => {
|
|
13
|
+
const edits = [];
|
|
14
|
+
const testTree = setUpTestTree();
|
|
15
|
+
for (let i = 0; i < numberOfInserts; i++) {
|
|
16
|
+
edits.push(newEdit(Change.insertTree(testTree.buildLeaf(), StablePlace.atEndOf(testTree.traitLocation))));
|
|
17
|
+
}
|
|
18
|
+
benchmark({
|
|
19
|
+
type: BenchmarkType.Measurement,
|
|
20
|
+
title: `process ${numberOfInserts} sequenced inserts`,
|
|
21
|
+
benchmarkFn: () => {
|
|
22
|
+
const log = new EditLog();
|
|
23
|
+
edits.forEach((edit) => {
|
|
24
|
+
log.addSequencedEdit(edit, { sequenceNumber: 1, referenceSequenceNumber: 0 });
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=EditLog.perf.tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditLog.perf.tests.js","sourceRoot":"","sources":["../../src/test/EditLog.perf.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,MAAM,aAAa,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAE/C,aAAa,CAAC,OAAO,CAAC,CAAC,eAAe,EAAE,EAAE;QACzC,MAAM,KAAK,GAAmB,EAAE,CAAC;QAEjC,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE;YACzC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;SAC1G;QAED,SAAS,CAAC;YACT,IAAI,EAAE,aAAa,CAAC,WAAW;YAC/B,KAAK,EAAE,WAAW,eAAe,oBAAoB;YACrD,WAAW,EAAE,GAAG,EAAE;gBACjB,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;gBAE1B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBACtB,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,uBAAuB,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC/E,CAAC,CAAC,CAAC;YACJ,CAAC;SACD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { benchmark, BenchmarkType } from '@fluid-tools/benchmark';\nimport { Change, StablePlace } from '../ChangeTypes';\nimport { EditLog } from '../EditLog';\nimport { newEdit } from '../EditUtilities';\nimport { Edit } from '../persisted-types';\nimport { setUpTestTree } from './utilities/TestUtilities';\n\ndescribe('EditLog Perf', () => {\n\tconst insertNumbers = [10, 50, 100, 500, 1000];\n\n\tinsertNumbers.forEach((numberOfInserts) => {\n\t\tconst edits: Edit<Change>[] = [];\n\n\t\tconst testTree = setUpTestTree();\n\t\tfor (let i = 0; i < numberOfInserts; i++) {\n\t\t\tedits.push(newEdit(Change.insertTree(testTree.buildLeaf(), StablePlace.atEndOf(testTree.traitLocation))));\n\t\t}\n\n\t\tbenchmark({\n\t\t\ttype: BenchmarkType.Measurement,\n\t\t\ttitle: `process ${numberOfInserts} sequenced inserts`,\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tconst log = new EditLog();\n\n\t\t\t\tedits.forEach((edit) => {\n\t\t\t\t\tlog.addSequencedEdit(edit, { sequenceNumber: 1, referenceSequenceNumber: 0 });\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t});\n});\n"]}
|
|
@@ -6,7 +6,7 @@ import { expect } from 'chai';
|
|
|
6
6
|
import { IsoBuffer } from '@fluidframework/common-utils';
|
|
7
7
|
import { EditLog, separateEditAndId } from '../EditLog';
|
|
8
8
|
import { assertNotUndefined } from '../Common';
|
|
9
|
-
import { newEdit } from '../
|
|
9
|
+
import { newEdit } from '../EditUtilities';
|
|
10
10
|
/**
|
|
11
11
|
* Creates an edit log with the specified number of chunks, stored as handles instead of edits.
|
|
12
12
|
* @param numberOfChunks - The number of chunks to add to the edit log.
|
|
@@ -14,7 +14,7 @@ import { newEdit } from '../generic';
|
|
|
14
14
|
* @param editsPerChunkOnEditLog - The number of edits per chunk that gets set for future edits to the edit log.
|
|
15
15
|
* @returns The edit log created with handles.
|
|
16
16
|
*/
|
|
17
|
-
function createEditLogWithHandles(numberOfChunks = 2, editsPerChunk = 5
|
|
17
|
+
function createEditLogWithHandles(numberOfChunks = 2, editsPerChunk = 5) {
|
|
18
18
|
const editIds = [];
|
|
19
19
|
const editChunks = [];
|
|
20
20
|
let inProgessChunk = [];
|
|
@@ -29,21 +29,25 @@ function createEditLogWithHandles(numberOfChunks = 2, editsPerChunk = 5, editsPe
|
|
|
29
29
|
}
|
|
30
30
|
const handles = editChunks.map((chunk) => {
|
|
31
31
|
return {
|
|
32
|
+
absolutePath: 'test blob',
|
|
32
33
|
get: async () => {
|
|
33
34
|
return IsoBuffer.from(JSON.stringify({ edits: chunk }));
|
|
34
35
|
},
|
|
35
36
|
};
|
|
36
37
|
});
|
|
37
38
|
let startRevision = 0;
|
|
38
|
-
const handlesWithKeys = handles.map((
|
|
39
|
+
const handlesWithKeys = handles.map((baseHandle) => {
|
|
39
40
|
const handle = {
|
|
40
41
|
startRevision,
|
|
41
|
-
chunk
|
|
42
|
+
chunk: {
|
|
43
|
+
get: async () => JSON.parse(IsoBuffer.from(await baseHandle.get()).toString()).edits,
|
|
44
|
+
baseHandle,
|
|
45
|
+
},
|
|
42
46
|
};
|
|
43
47
|
startRevision = startRevision + 5;
|
|
44
48
|
return handle;
|
|
45
49
|
});
|
|
46
|
-
const editLog = new EditLog({ editChunks: handlesWithKeys, editIds }
|
|
50
|
+
const editLog = new EditLog({ editChunks: handlesWithKeys, editIds });
|
|
47
51
|
return editLog;
|
|
48
52
|
}
|
|
49
53
|
describe('EditLog', () => {
|
|
@@ -244,7 +248,7 @@ describe('EditLog', () => {
|
|
|
244
248
|
it('can add edits to logs with varying edit chunk sizes', async () => {
|
|
245
249
|
const numberOfChunks = 2;
|
|
246
250
|
const editsPerChunk = 5;
|
|
247
|
-
const log = createEditLogWithHandles(numberOfChunks, editsPerChunk
|
|
251
|
+
const log = createEditLogWithHandles(numberOfChunks, editsPerChunk);
|
|
248
252
|
// Load the edits for the last edit chunk
|
|
249
253
|
await log.getEditAtIndex(numberOfChunks * editsPerChunk - 1);
|
|
250
254
|
// Add a sequenced edit and check it's been added
|