@fluid-experimental/tree 0.59.2001 → 0.59.3000
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +2 -0
- package/.vscode/SharedTree.code-workspace +15 -0
- package/.vscode/settings.json +6 -0
- package/dist/ChangeCompression.js +9 -9
- package/dist/ChangeCompression.js.map +1 -1
- package/dist/ChangeTypes.d.ts +1 -6
- package/dist/ChangeTypes.d.ts.map +1 -1
- package/dist/ChangeTypes.js +5 -5
- package/dist/ChangeTypes.js.map +1 -1
- package/dist/Checkout.js +14 -14
- package/dist/Checkout.js.map +1 -1
- package/dist/Common.d.ts +21 -3
- package/dist/Common.d.ts.map +1 -1
- package/dist/Common.js +29 -4
- package/dist/Common.js.map +1 -1
- package/dist/EditLog.js +26 -25
- package/dist/EditLog.js.map +1 -1
- package/dist/EditUtilities.js +17 -17
- package/dist/EditUtilities.js.map +1 -1
- package/dist/Forest.js +31 -31
- package/dist/Forest.js.map +1 -1
- package/dist/HistoryEditFactory.js +9 -9
- package/dist/HistoryEditFactory.js.map +1 -1
- package/dist/IdConversion.js +9 -9
- package/dist/IdConversion.js.map +1 -1
- package/dist/Identifiers.d.ts +4 -0
- package/dist/Identifiers.d.ts.map +1 -1
- package/dist/Identifiers.js.map +1 -1
- package/dist/LogViewer.d.ts +1 -5
- package/dist/LogViewer.d.ts.map +1 -1
- package/dist/LogViewer.js +11 -19
- package/dist/LogViewer.js.map +1 -1
- package/dist/MergeHealth.js +2 -2
- package/dist/MergeHealth.js.map +1 -1
- package/dist/NodeIdUtilities.js +2 -2
- package/dist/NodeIdUtilities.js.map +1 -1
- package/dist/PayloadUtilities.js +1 -1
- package/dist/PayloadUtilities.js.map +1 -1
- package/dist/RevisionValueCache.d.ts +13 -10
- package/dist/RevisionValueCache.d.ts.map +1 -1
- package/dist/RevisionValueCache.js +14 -11
- package/dist/RevisionValueCache.js.map +1 -1
- package/dist/RevisionView.js +4 -4
- package/dist/RevisionView.js.map +1 -1
- package/dist/SerializationUtilities.js +4 -4
- package/dist/SerializationUtilities.js.map +1 -1
- package/dist/SharedTree.d.ts +93 -31
- package/dist/SharedTree.d.ts.map +1 -1
- package/dist/SharedTree.js +160 -131
- package/dist/SharedTree.js.map +1 -1
- package/dist/SharedTreeEncoder.d.ts +3 -3
- package/dist/SharedTreeEncoder.d.ts.map +1 -1
- package/dist/SharedTreeEncoder.js +36 -36
- package/dist/SharedTreeEncoder.js.map +1 -1
- package/dist/StringInterner.js +1 -1
- package/dist/StringInterner.js.map +1 -1
- package/dist/Summary.js +1 -1
- package/dist/Summary.js.map +1 -1
- package/dist/SummaryBackCompatibility.js +8 -8
- package/dist/SummaryBackCompatibility.js.map +1 -1
- package/dist/Transaction.js +1 -1
- package/dist/Transaction.js.map +1 -1
- package/dist/TransactionInternal.js +17 -17
- package/dist/TransactionInternal.js.map +1 -1
- package/dist/TreeCompressor.d.ts.map +1 -1
- package/dist/TreeCompressor.js +6 -8
- package/dist/TreeCompressor.js.map +1 -1
- package/dist/TreeNodeHandle.js +4 -4
- package/dist/TreeNodeHandle.js.map +1 -1
- package/dist/TreeView.js +7 -7
- package/dist/TreeView.js.map +1 -1
- package/dist/TreeViewUtilities.js +2 -2
- package/dist/TreeViewUtilities.js.map +1 -1
- package/dist/UndoRedoHandler.js +1 -1
- package/dist/UndoRedoHandler.js.map +1 -1
- package/dist/UuidUtilities.d.ts +30 -0
- package/dist/UuidUtilities.d.ts.map +1 -0
- package/dist/UuidUtilities.js +106 -0
- package/dist/UuidUtilities.js.map +1 -0
- package/dist/id-compressor/AppendOnlySortedMap.d.ts +52 -28
- package/dist/id-compressor/AppendOnlySortedMap.d.ts.map +1 -1
- package/dist/id-compressor/AppendOnlySortedMap.js +167 -90
- package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -1
- package/dist/id-compressor/IdCompressor.d.ts +43 -42
- package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
- package/dist/id-compressor/IdCompressor.js +179 -177
- package/dist/id-compressor/IdCompressor.js.map +1 -1
- package/dist/id-compressor/IdRange.js +1 -1
- package/dist/id-compressor/IdRange.js.map +1 -1
- package/dist/id-compressor/NumericUuid.d.ts +6 -14
- package/dist/id-compressor/NumericUuid.d.ts.map +1 -1
- package/dist/id-compressor/NumericUuid.js +15 -76
- package/dist/id-compressor/NumericUuid.js.map +1 -1
- package/dist/id-compressor/SessionIdNormalizer.d.ts +122 -0
- package/dist/id-compressor/SessionIdNormalizer.d.ts.map +1 -0
- package/dist/id-compressor/SessionIdNormalizer.js +418 -0
- package/dist/id-compressor/SessionIdNormalizer.js.map +1 -0
- package/dist/id-compressor/persisted-types/0.0.1.d.ts +6 -13
- package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
- package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/persisted-types/0.1.1.d.ts +1 -6
- package/dist/persisted-types/0.1.1.d.ts.map +1 -1
- package/dist/persisted-types/0.1.1.js +3 -3
- package/dist/persisted-types/0.1.1.js.map +1 -1
- package/lib/ChangeTypes.d.ts +1 -6
- package/lib/ChangeTypes.d.ts.map +1 -1
- package/lib/Checkout.js.map +1 -1
- package/lib/Common.d.ts +21 -3
- package/lib/Common.d.ts.map +1 -1
- package/lib/Common.js +25 -3
- package/lib/Common.js.map +1 -1
- package/lib/EditLog.js +2 -1
- package/lib/EditLog.js.map +1 -1
- package/lib/EditUtilities.js.map +1 -1
- package/lib/Forest.js.map +1 -1
- package/lib/HistoryEditFactory.js.map +1 -1
- package/lib/Identifiers.d.ts +4 -0
- package/lib/Identifiers.d.ts.map +1 -1
- package/lib/Identifiers.js.map +1 -1
- package/lib/LogViewer.d.ts +1 -5
- package/lib/LogViewer.d.ts.map +1 -1
- package/lib/LogViewer.js +5 -13
- package/lib/LogViewer.js.map +1 -1
- package/lib/MergeHealth.js.map +1 -1
- package/lib/NodeIdUtilities.js.map +1 -1
- package/lib/RevisionValueCache.d.ts +13 -10
- package/lib/RevisionValueCache.d.ts.map +1 -1
- package/lib/RevisionValueCache.js +10 -7
- package/lib/RevisionValueCache.js.map +1 -1
- package/lib/RevisionView.js.map +1 -1
- package/lib/SharedTree.d.ts +93 -31
- package/lib/SharedTree.d.ts.map +1 -1
- package/lib/SharedTree.js +107 -78
- package/lib/SharedTree.js.map +1 -1
- package/lib/SharedTreeEncoder.d.ts +3 -3
- package/lib/SharedTreeEncoder.d.ts.map +1 -1
- package/lib/SharedTreeEncoder.js +4 -4
- package/lib/SharedTreeEncoder.js.map +1 -1
- package/lib/StringInterner.js.map +1 -1
- package/lib/Summary.js.map +1 -1
- package/lib/TreeCompressor.d.ts.map +1 -1
- package/lib/TreeCompressor.js +1 -3
- package/lib/TreeCompressor.js.map +1 -1
- package/lib/TreeNodeHandle.js.map +1 -1
- package/lib/TreeView.js.map +1 -1
- package/lib/TreeViewUtilities.js.map +1 -1
- package/lib/UuidUtilities.d.ts +30 -0
- package/lib/UuidUtilities.d.ts.map +1 -0
- package/lib/UuidUtilities.js +98 -0
- package/lib/UuidUtilities.js.map +1 -0
- package/lib/id-compressor/AppendOnlySortedMap.d.ts +52 -28
- package/lib/id-compressor/AppendOnlySortedMap.d.ts.map +1 -1
- package/lib/id-compressor/AppendOnlySortedMap.js +165 -88
- package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -1
- package/lib/id-compressor/IdCompressor.d.ts +43 -42
- package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
- package/lib/id-compressor/IdCompressor.js +97 -95
- package/lib/id-compressor/IdCompressor.js.map +1 -1
- package/lib/id-compressor/NumericUuid.d.ts +6 -14
- package/lib/id-compressor/NumericUuid.d.ts.map +1 -1
- package/lib/id-compressor/NumericUuid.js +11 -70
- package/lib/id-compressor/NumericUuid.js.map +1 -1
- package/lib/id-compressor/SessionIdNormalizer.d.ts +122 -0
- package/lib/id-compressor/SessionIdNormalizer.d.ts.map +1 -0
- package/lib/id-compressor/SessionIdNormalizer.js +414 -0
- package/lib/id-compressor/SessionIdNormalizer.js.map +1 -0
- package/lib/id-compressor/persisted-types/0.0.1.d.ts +6 -13
- package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
- package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/persisted-types/0.1.1.d.ts +1 -6
- package/lib/persisted-types/0.1.1.d.ts.map +1 -1
- package/lib/persisted-types/0.1.1.js.map +1 -1
- package/lib/test/AppendOnlySortedMap.perf.tests.d.ts +6 -0
- package/lib/test/AppendOnlySortedMap.perf.tests.d.ts.map +1 -0
- package/lib/test/AppendOnlySortedMap.perf.tests.js +49 -0
- package/lib/test/AppendOnlySortedMap.perf.tests.js.map +1 -0
- package/lib/test/AppendOnlySortedMap.tests.js +56 -14
- package/lib/test/AppendOnlySortedMap.tests.js.map +1 -1
- package/lib/test/Checkout.tests.js +2 -2
- package/lib/test/Checkout.tests.js.map +1 -1
- package/lib/test/Forest.tests.js.map +1 -1
- package/lib/test/IdCompressor.perf.tests.js +8 -2
- package/lib/test/IdCompressor.perf.tests.js.map +1 -1
- package/lib/test/IdCompressor.tests.js +75 -24
- package/lib/test/IdCompressor.tests.js.map +1 -1
- package/lib/test/LogViewer.tests.js +3 -5
- package/lib/test/LogViewer.tests.js.map +1 -1
- package/lib/test/NumericUuid.perf.tests.js +4 -4
- package/lib/test/NumericUuid.perf.tests.js.map +1 -1
- package/lib/test/NumericUuid.tests.js +5 -4
- package/lib/test/NumericUuid.tests.js.map +1 -1
- package/lib/test/RevisionValueCache.tests.js.map +1 -1
- package/lib/test/RevisionView.tests.js.map +1 -1
- package/lib/test/SessionIdNormalizer.tests.d.ts +6 -0
- package/lib/test/SessionIdNormalizer.tests.d.ts.map +1 -0
- package/lib/test/SessionIdNormalizer.tests.js +299 -0
- package/lib/test/SessionIdNormalizer.tests.js.map +1 -0
- package/lib/test/Summary.tests.js +1 -1
- package/lib/test/Summary.tests.js.map +1 -1
- package/lib/test/TreeCompression.tests.js +1 -1
- package/lib/test/TreeCompression.tests.js.map +1 -1
- package/lib/test/Virtualization.tests.js +1 -1
- package/lib/test/Virtualization.tests.js.map +1 -1
- package/lib/test/fuzz/Generators.d.ts +3 -14
- package/lib/test/fuzz/Generators.d.ts.map +1 -1
- package/lib/test/fuzz/Generators.js +60 -151
- package/lib/test/fuzz/Generators.js.map +1 -1
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +10 -7
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -1
- package/lib/test/fuzz/SharedTreeFuzzTests.js +94 -104
- package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -1
- package/lib/test/fuzz/Types.d.ts +2 -9
- package/lib/test/fuzz/Types.d.ts.map +1 -1
- package/lib/test/fuzz/Types.js +1 -1
- package/lib/test/fuzz/Types.js.map +1 -1
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts +57 -11
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +1 -1
- package/lib/test/utilities/IdCompressorTestUtilities.js +112 -98
- package/lib/test/utilities/IdCompressorTestUtilities.js.map +1 -1
- package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -1
- package/lib/test/utilities/PendingLocalStateTests.js +2 -1
- package/lib/test/utilities/PendingLocalStateTests.js.map +1 -1
- package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeTests.js +30 -1
- package/lib/test/utilities/SharedTreeTests.js.map +1 -1
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeVersioningTests.js +20 -0
- package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -1
- package/lib/test/utilities/SummaryLoadPerfTests.d.ts.map +1 -1
- package/lib/test/utilities/SummaryLoadPerfTests.js +6 -3
- package/lib/test/utilities/SummaryLoadPerfTests.js.map +1 -1
- package/lib/test/utilities/TestNode.js.map +1 -1
- package/lib/test/utilities/TestUtilities.d.ts +9 -1
- package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
- package/lib/test/utilities/TestUtilities.js +27 -13
- package/lib/test/utilities/TestUtilities.js.map +1 -1
- package/package.json +19 -17
- package/src/Common.ts +42 -4
- package/src/EditLog.ts +1 -1
- package/src/Identifiers.ts +5 -0
- package/src/LogViewer.ts +4 -20
- package/src/RevisionValueCache.ts +11 -8
- package/src/SharedTree.ts +222 -75
- package/src/SharedTreeEncoder.ts +17 -11
- package/src/TreeCompressor.ts +2 -4
- package/src/UuidUtilities.ts +123 -0
- package/src/id-compressor/AppendOnlySortedMap.ts +183 -94
- package/src/id-compressor/IdCompressor.ts +144 -132
- package/src/id-compressor/NumericUuid.ts +11 -80
- package/src/id-compressor/SessionIdNormalizer.ts +497 -0
- package/src/id-compressor/persisted-types/0.0.1.ts +12 -15
- package/src/index.ts +5 -0
|
@@ -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\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"]}
|
|
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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Forest.tests.js","sourceRoot":"","sources":["../../src/test/Forest.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAc,MAAM,WAAW,CAAC;AAInE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,MAAM,cAAc,GAAG,MAAoB,CAAC;AAE5C,SAAS,0BAA0B,CAAC,QAAkB,EAAE,EAAU,EAAE,GAAG,QAAkB;IACxF,uCACI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KACzB,MAAM,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAC5E;AACH,CAAC;AAED,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACvB,IAAI,QAAgB,CAAC;IACrB,IAAI,OAAe,CAAC;IACpB,IAAI,aAAqB,CAAC;IAC1B,IAAI,YAAoB,CAAC;IAEzB,IAAI,SAAqB,CAAC;IAC1B,IAAI,UAAsB,CAAC;IAC3B,IAAI,WAAmB,CAAC;IACxB,IAAI,aAAqB,CAAC;IAC1B,IAAI,YAAoB,CAAC;IACzB,IAAI,iBAAyB,CAAC;IAC9B,IAAI,eAAuB,CAAC;IAE5B,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;QACjD,QAAQ,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;QAC9B,OAAO,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;QAC7B,aAAa,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;QACnC,YAAY,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;QAElC,SAAS,GAAG,0BAA0B,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACnD,UAAU,GAAG,0BAA0B,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACrD,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9C,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5G,iBAAiB,GAAG,YAAY;aAC9B,GAAG,CAAC,CAAC,0BAA0B,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;aACnD,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;QAErE,eAAe,GAAG,YAAY;aAC5B,GAAG,CAAC,CAAC,0BAA0B,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,0BAA0B,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;aAChG,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACtC,WAAW,CAAC,gBAAgB,EAAE,CAAC;QAC/B,YAAY,CAAC,gBAAgB,EAAE,CAAC;QAChC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAChH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;;QACxC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAC5D,MAAM,OAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,0CAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;QACxB,IAAI,OAAO,GAAG,WAAW,CAAC;QAC1B,MAAM,QAAQ,GAAiB,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE;YAClC,MAAM,IAAI,GAAG,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;YAC7E,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SAC9B;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC3B,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,qHAAqH;IACrH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,0BAA0B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC9F,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC3B,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC/B,uBAAuB,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,oCAAoC;QACzF,uBAAuB,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACnE,MAAM,kBAAkB,GAAG,aAAa,CAAC,GAAG,CAAC;YAC5C,0BAA0B,CAAC,QAAQ,EAAE,OAAO,CAAC;YAC7C,0BAA0B,CAAC,QAAQ,EAAE,aAAa,CAAC;SACnD,CAAC,CAAC;QAEH,sBAAsB,CAAC,kBAAkB,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IACnG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACrE,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC;YACtC,0BAA0B,CAAC,QAAQ,EAAE,aAAa,CAAC;YACnD,0BAA0B,CAAC,QAAQ,EAAE,YAAY,CAAC;SAClD,CAAC,CAAC;QAEH,sBAAsB,CAAC,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;QACpF,sBAAsB,CAAC,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACnD,MAAM,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,0BAA0B,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;QAChG,sBAAsB,CAAC,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAClD,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,0BAA0B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACzF,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAClG,sBAAsB,CACtB,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CACjG,sBAAsB,CACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACvE,MAAM,gBAAgB,GAAG,aAAa,CAAC,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,sBAAsB,CAAC,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,sBAAsB,CAAC,iBAAiB,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC/C,sBAAsB,CAAC,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAC1F,4BAA4B,CAC5B,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CACzF,4BAA4B,CAC5B,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CACxF,4BAA4B,CAC5B,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CACxF,4BAA4B,CAC5B,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CACxF,4BAA4B,CAC5B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC5B,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1D,UAAU,CAAC,gBAAgB,EAAE,CAAC;QAC9B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC/B,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;QACzD,UAAU,CAAC,gBAAgB,EAAE,CAAC;QAC9B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACtC,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACxC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAErD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;QAChD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;QAChD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,SAAS,sBAAsB,CAC9B,MAAc,EACd,QAAgB,EAChB,KAAiB,EACjB,KAAa,EACb,QAAkB;;QAElB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,CAAC,GAAG,OAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxF,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC/D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC/B,MAAM,UAAU,GAAG,gBAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,CAAC,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;SAChD;IACF,CAAC;IAED,SAAS,sBAAsB,CAC9B,MAAc,EACd,QAAgB,EAChB,KAAiB,EACjB,UAAkB,EAClB,QAAgB;;QAEhB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,CAAC,GAAG,OAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,GAAG,UAAU,CAAC,CAAC;QACxE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,qBAAqB,CAC1E,QAAQ,EACR,KAAK,EACL,UAAU,EACV,QAAQ,CACR,CAAC;QAEF,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;SAC9B;aAAM;YACN,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;SACzC;QAED,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtC,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE;YAClC,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;SAClE;IACF,CAAC;IAED,SAAS,uBAAuB,CAAC,MAAc,EAAE,MAAc,EAAE,OAAuB;QACvF,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;AACF,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { compareForestNodes, Forest, ForestNode } from '../Forest';\nimport { NodeId, TraitLabel } from '../Identifiers';\nimport { Payload } from '../persisted-types';\nimport { TestTree } from './utilities/TestNode';\nimport { refreshTestTree } from './utilities/TestUtilities';\n\nconst mainTraitLabel = 'main' as TraitLabel;\n\nfunction makeForestNodeWithChildren(testTree: TestTree, id: NodeId, ...children: NodeId[]): ForestNode {\n\treturn {\n\t\t...testTree.buildLeaf(id),\n\t\ttraits: new Map(children.length > 0 ? [[mainTraitLabel, [...children]]] : []),\n\t};\n}\n\ndescribe('Forest', () => {\n\tlet parentId: NodeId;\n\tlet childId: NodeId;\n\tlet secondChildId: NodeId;\n\tlet thirdChildId: NodeId;\n\n\tlet childNode: ForestNode;\n\tlet parentNode: ForestNode;\n\tlet emptyForest: Forest;\n\tlet oneNodeForest: Forest;\n\tlet parentForest: Forest;\n\tlet grandparentForest: Forest;\n\tlet threeLeafForest: Forest;\n\n\tconst testTree = refreshTestTree(undefined, (t) => {\n\t\tparentId = t.generateNodeId();\n\t\tchildId = t.generateNodeId();\n\t\tsecondChildId = t.generateNodeId();\n\t\tthirdChildId = t.generateNodeId();\n\n\t\tchildNode = makeForestNodeWithChildren(t, childId);\n\t\tparentNode = makeForestNodeWithChildren(t, parentId);\n\t\temptyForest = Forest.create(true);\n\t\toneNodeForest = emptyForest.add([parentNode]);\n\t\tparentForest = oneNodeForest.add([childNode]).attachRangeOfChildren(parentId, mainTraitLabel, 0, [childId]);\n\t\tgrandparentForest = parentForest\n\t\t\t.add([makeForestNodeWithChildren(t, secondChildId)])\n\t\t\t.attachRangeOfChildren(childId, mainTraitLabel, 0, [secondChildId]);\n\n\t\tthreeLeafForest = parentForest\n\t\t\t.add([makeForestNodeWithChildren(t, secondChildId), makeForestNodeWithChildren(t, thirdChildId)])\n\t\t\t.attachRangeOfChildren(parentId, mainTraitLabel, 1, [secondChildId, thirdChildId]);\n\t});\n\n\tit('test forests are consistent', () => {\n\t\temptyForest.assertConsistent();\n\t\tparentForest.assertConsistent();\n\t\texpect(emptyForest.size).equals(0);\n\t\texpect(parentForest.size).equals(2);\n\t});\n\n\tit('fails on multiparenting', () => {\n\t\texpect(() => oneNodeForest.add([makeForestNodeWithChildren(testTree, parentId, childId, childId)])).to.throw();\n\t});\n\n\tit('cannot add a node with a duplicate ID', () => {\n\t\texpect(() => oneNodeForest.add([makeForestNodeWithChildren(testTree, parentId)])).to.throw();\n\t});\n\n\tit('can get nodes in the forest', () => {\n\t\texpect(compareForestNodes(parentForest.get(childId), childNode));\n\t\texpect(compareForestNodes(parentForest.get(parentId), parentNode));\n\t});\n\n\tit('can get parents in the forest', () => {\n\t\texpect(parentForest.tryGetParent(parentId)).to.be.undefined;\n\t\texpect(parentForest.tryGetParent(childId)?.parentId).to.equal(parentId);\n\t});\n\n\tit('can add nodes', () => {\n\t\tlet forestA = emptyForest;\n\t\tconst children: ForestNode[] = [];\n\t\tconst numToAdd = 10;\n\t\tfor (let i = 0; i < numToAdd; i++) {\n\t\t\tconst node = makeForestNodeWithChildren(testTree, testTree.generateNodeId());\n\t\t\tchildren.push(node);\n\t\t\tforestA = forestA.add([node]);\n\t\t}\n\t\tconst forestB = emptyForest.add(children);\n\t\tforestA.assertConsistent();\n\t\tforestB.assertConsistent();\n\t\texpect(forestA.size).to.equal(10);\n\t\texpect(forestA.equals(forestB)).to.be.true;\n\t});\n\n\t// Test that Forest.add() adds descendants and ancestors correctly regardless of the order in which they are supplied\n\tit('can add nodes in any order', () => {\n\t\tconst childId = testTree.generateNodeId();\n\t\tconst parentId = testTree.generateNodeId();\n\t\tconst child = makeForestNodeWithChildren(testTree, childId);\n\t\tconst parent = makeForestNodeWithChildren(testTree, parentId, childId);\n\t\tconst grandparent = makeForestNodeWithChildren(testTree, testTree.generateNodeId(), parentId);\n\t\tconst forestA = emptyForest.add([child, parent, grandparent]);\n\t\tconst forestB = emptyForest.add([grandparent, parent, child]);\n\t\tforestA.assertConsistent();\n\t\tforestB.assertConsistent();\n\t\texpect(forestA.size).to.equal(3);\n\t\texpect(forestA.equals(forestB)).to.be.true;\n\t});\n\n\tit('can replace payloads', () => {\n\t\texpectSuccessfulReplace(oneNodeForest, parentId, 0); // Set a payload when there was none\n\t\texpectSuccessfulReplace(oneNodeForest, parentId, 1); // Change a payload\n\t});\n\n\tit('can correctly attach a range to an empty trait on a root', () => {\n\t\tconst moreChildrenForest = oneNodeForest.add([\n\t\t\tmakeForestNodeWithChildren(testTree, childId),\n\t\t\tmakeForestNodeWithChildren(testTree, secondChildId),\n\t\t]);\n\n\t\texpectSuccessfulAttach(moreChildrenForest, parentId, mainTraitLabel, 0, [childId, secondChildId]);\n\t});\n\n\tit('can correctly attach ranges to a populated trait on a root', () => {\n\t\tconst twoLeafForest = parentForest.add([\n\t\t\tmakeForestNodeWithChildren(testTree, secondChildId),\n\t\t\tmakeForestNodeWithChildren(testTree, thirdChildId),\n\t\t]);\n\n\t\texpectSuccessfulAttach(twoLeafForest, parentId, mainTraitLabel, 1, [secondChildId]);\n\t\texpectSuccessfulAttach(twoLeafForest, parentId, mainTraitLabel, 1, [thirdChildId]);\n\t});\n\n\tit('can correctly attach ranges under a leaf', () => {\n\t\tconst threeNodeForest = parentForest.add([makeForestNodeWithChildren(testTree, secondChildId)]);\n\t\texpectSuccessfulAttach(threeNodeForest, childId, mainTraitLabel, 0, [secondChildId]);\n\t});\n\n\tit('only accepts valid indices for attaches', () => {\n\t\tconst twoNodeForest = oneNodeForest.add([makeForestNodeWithChildren(testTree, childId)]);\n\t\texpect(() => twoNodeForest.attachRangeOfChildren(parentId, mainTraitLabel, -1, [childId])).to.throw(\n\t\t\t'invalid attach index'\n\t\t);\n\t\texpect(() => twoNodeForest.attachRangeOfChildren(parentId, mainTraitLabel, 1, [childId])).to.throw(\n\t\t\t'invalid attach index'\n\t\t);\n\t});\n\n\tit('does not add trait when attaching empty range to empty trait', () => {\n\t\tconst forestWithAttach = oneNodeForest.attachRangeOfChildren(parentId, mainTraitLabel, 0, []);\n\t\tconst newParent = forestWithAttach.get(parentId);\n\t\texpect(newParent.traits.get(mainTraitLabel)).equals(undefined);\n\t});\n\n\tit('can correctly detach a range on a root node', () => {\n\t\texpectSuccessfulDetach(threeLeafForest, parentId, mainTraitLabel, 1, 2);\n\t});\n\n\tit('can correctly detach a range on a leaf node', () => {\n\t\texpectSuccessfulDetach(grandparentForest, childId, mainTraitLabel, 0, 1);\n\t});\n\n\tit('can correctly detach an entire trait', () => {\n\t\texpectSuccessfulDetach(threeLeafForest, parentId, mainTraitLabel, 0, 2);\n\t});\n\n\tit('only accepts valid indices for detaches', () => {\n\t\texpect(() => parentForest.detachRangeOfChildren(parentId, mainTraitLabel, -1, -1)).to.throw(\n\t\t\t'invalid detach index range'\n\t\t);\n\t\texpect(() => parentForest.detachRangeOfChildren(parentId, mainTraitLabel, -1, 0)).to.throw(\n\t\t\t'invalid detach index range'\n\t\t);\n\t\texpect(() => parentForest.detachRangeOfChildren(parentId, mainTraitLabel, 1, 0)).to.throw(\n\t\t\t'invalid detach index range'\n\t\t);\n\t\texpect(() => parentForest.detachRangeOfChildren(parentId, mainTraitLabel, 0, 2)).to.throw(\n\t\t\t'invalid detach index range'\n\t\t);\n\t\texpect(() => parentForest.detachRangeOfChildren(parentId, mainTraitLabel, 1, 2)).to.throw(\n\t\t\t'invalid detach index range'\n\t\t);\n\t});\n\n\tit('cannot delete parented nodes', () => {\n\t\texpect(() => parentForest.delete([childId], false)).throws('deleted nodes must be unparented');\n\t});\n\n\tit('can delete a root', () => {\n\t\tconst deleteRoot = parentForest.delete([parentId], false);\n\t\tdeleteRoot.assertConsistent();\n\t\texpect(deleteRoot.size).to.equal(1);\n\t\texpect(deleteRoot.tryGet(childId)).to.not.be.undefined;\n\t});\n\n\tit('can delete a subtree', () => {\n\t\tconst deleteLeaf = parentForest.delete([parentId], true);\n\t\tdeleteLeaf.assertConsistent();\n\t\texpect(deleteLeaf.size).to.equal(0);\n\t});\n\n\tit('calculates deltas correctly', () => {\n\t\tconst add = emptyForest.delta(oneNodeForest);\n\t\tconst remove = oneNodeForest.delta(emptyForest);\n\t\tconst same = parentForest.delta(parentForest);\n\t\tconst modified = parentForest.setValue(childId, -1);\n\t\tconst modify = parentForest.delta(modified);\n\n\t\texpect(remove).deep.equals({ changed: [], added: [], removed: [parentId] });\n\t\texpect(add).deep.equals({ changed: [], added: [parentId], removed: [] });\n\t\texpect(same).deep.equals({ changed: [], added: [], removed: [] });\n\t\texpect(modify).deep.equals({ changed: [childId], added: [], removed: [] });\n\t});\n\n\tit('calculates equality correctly', () => {\n\t\tconst modified = parentForest.setValue(parentId, -1);\n\n\t\texpect(oneNodeForest.equals(emptyForest)).false;\n\t\texpect(emptyForest.equals(oneNodeForest)).false;\n\t\texpect(parentForest.equals(parentForest)).true;\n\t\texpect(parentForest.equals(modified)).false;\n\t});\n\n\tfunction expectSuccessfulAttach(\n\t\tforest: Forest,\n\t\tparentId: NodeId,\n\t\tlabel: TraitLabel,\n\t\tindex: number,\n\t\tchildIds: NodeId[]\n\t): void {\n\t\tconst parent = forest.get(parentId);\n\t\tconst expectedTrait = [...(parent.traits.get(label) ?? [])];\n\t\texpectedTrait.splice(index, 0, ...childIds);\n\t\tconst forestWithAttach = forest.attachRangeOfChildren(parentId, label, index, childIds);\n\t\tconst newParent = forestWithAttach.get(parentId);\n\t\texpect(newParent.traits.get(label)).deep.equals(expectedTrait);\n\t\tfor (const childId of childIds) {\n\t\t\tconst parentData = forestWithAttach.tryGetParent(childId);\n\t\t\texpect(parentData?.traitParent).to.equal(label);\n\t\t\texpect(parentData?.parentId).to.equal(parentId);\n\t\t}\n\t}\n\n\tfunction expectSuccessfulDetach(\n\t\tforest: Forest,\n\t\tparentId: NodeId,\n\t\tlabel: TraitLabel,\n\t\tstartIndex: number,\n\t\tendIndex: number\n\t): void {\n\t\tconst parent = forest.get(parentId);\n\t\tconst expectedTrait = [...(parent.traits.get(label) ?? [])];\n\t\tconst spliced = expectedTrait.splice(startIndex, endIndex - startIndex);\n\t\tconst { forest: forestWithDetach, detached } = forest.detachRangeOfChildren(\n\t\t\tparentId,\n\t\t\tlabel,\n\t\t\tstartIndex,\n\t\t\tendIndex\n\t\t);\n\n\t\tconst newParent = forestWithDetach.get(parentId);\n\t\tconst trait = newParent.traits.get(label);\n\t\tif (expectedTrait.length === 0) {\n\t\t\texpect(trait).to.be.undefined;\n\t\t} else {\n\t\t\texpect(trait).deep.equals(expectedTrait);\n\t\t}\n\n\t\texpect(detached).deep.equals(spliced);\n\t\tfor (const detachedId of detached) {\n\t\t\texpect(forestWithDetach.tryGetParent(detachedId)).to.be.undefined;\n\t\t}\n\t}\n\n\tfunction expectSuccessfulReplace(forest: Forest, nodeId: NodeId, payload: Payload | null): void {\n\t\tconst forestWithReplace = forest.setValue(nodeId, payload);\n\t\tconst newNode = forestWithReplace.get(nodeId);\n\t\texpect(newNode.payload).equals(payload);\n\t}\n});\n"]}
|
|
1
|
+
{"version":3,"file":"Forest.tests.js","sourceRoot":"","sources":["../../src/test/Forest.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 { compareForestNodes, Forest, ForestNode } from '../Forest';\nimport { NodeId, TraitLabel } from '../Identifiers';\nimport { Payload } from '../persisted-types';\nimport { TestTree } from './utilities/TestNode';\nimport { refreshTestTree } from './utilities/TestUtilities';\n\nconst mainTraitLabel = 'main' as TraitLabel;\n\nfunction makeForestNodeWithChildren(testTree: TestTree, id: NodeId, ...children: NodeId[]): ForestNode {\n\treturn {\n\t\t...testTree.buildLeaf(id),\n\t\ttraits: new Map(children.length > 0 ? [[mainTraitLabel, [...children]]] : []),\n\t};\n}\n\ndescribe('Forest', () => {\n\tlet parentId: NodeId;\n\tlet childId: NodeId;\n\tlet secondChildId: NodeId;\n\tlet thirdChildId: NodeId;\n\n\tlet childNode: ForestNode;\n\tlet parentNode: ForestNode;\n\tlet emptyForest: Forest;\n\tlet oneNodeForest: Forest;\n\tlet parentForest: Forest;\n\tlet grandparentForest: Forest;\n\tlet threeLeafForest: Forest;\n\n\tconst testTree = refreshTestTree(undefined, (t) => {\n\t\tparentId = t.generateNodeId();\n\t\tchildId = t.generateNodeId();\n\t\tsecondChildId = t.generateNodeId();\n\t\tthirdChildId = t.generateNodeId();\n\n\t\tchildNode = makeForestNodeWithChildren(t, childId);\n\t\tparentNode = makeForestNodeWithChildren(t, parentId);\n\t\temptyForest = Forest.create(true);\n\t\toneNodeForest = emptyForest.add([parentNode]);\n\t\tparentForest = oneNodeForest.add([childNode]).attachRangeOfChildren(parentId, mainTraitLabel, 0, [childId]);\n\t\tgrandparentForest = parentForest\n\t\t\t.add([makeForestNodeWithChildren(t, secondChildId)])\n\t\t\t.attachRangeOfChildren(childId, mainTraitLabel, 0, [secondChildId]);\n\n\t\tthreeLeafForest = parentForest\n\t\t\t.add([makeForestNodeWithChildren(t, secondChildId), makeForestNodeWithChildren(t, thirdChildId)])\n\t\t\t.attachRangeOfChildren(parentId, mainTraitLabel, 1, [secondChildId, thirdChildId]);\n\t});\n\n\tit('test forests are consistent', () => {\n\t\temptyForest.assertConsistent();\n\t\tparentForest.assertConsistent();\n\t\texpect(emptyForest.size).equals(0);\n\t\texpect(parentForest.size).equals(2);\n\t});\n\n\tit('fails on multiparenting', () => {\n\t\texpect(() => oneNodeForest.add([makeForestNodeWithChildren(testTree, parentId, childId, childId)])).to.throw();\n\t});\n\n\tit('cannot add a node with a duplicate ID', () => {\n\t\texpect(() => oneNodeForest.add([makeForestNodeWithChildren(testTree, parentId)])).to.throw();\n\t});\n\n\tit('can get nodes in the forest', () => {\n\t\texpect(compareForestNodes(parentForest.get(childId), childNode));\n\t\texpect(compareForestNodes(parentForest.get(parentId), parentNode));\n\t});\n\n\tit('can get parents in the forest', () => {\n\t\texpect(parentForest.tryGetParent(parentId)).to.be.undefined;\n\t\texpect(parentForest.tryGetParent(childId)?.parentId).to.equal(parentId);\n\t});\n\n\tit('can add nodes', () => {\n\t\tlet forestA = emptyForest;\n\t\tconst children: ForestNode[] = [];\n\t\tconst numToAdd = 10;\n\t\tfor (let i = 0; i < numToAdd; i++) {\n\t\t\tconst node = makeForestNodeWithChildren(testTree, testTree.generateNodeId());\n\t\t\tchildren.push(node);\n\t\t\tforestA = forestA.add([node]);\n\t\t}\n\t\tconst forestB = emptyForest.add(children);\n\t\tforestA.assertConsistent();\n\t\tforestB.assertConsistent();\n\t\texpect(forestA.size).to.equal(10);\n\t\texpect(forestA.equals(forestB)).to.be.true;\n\t});\n\n\t// Test that Forest.add() adds descendants and ancestors correctly regardless of the order in which they are supplied\n\tit('can add nodes in any order', () => {\n\t\tconst childId = testTree.generateNodeId();\n\t\tconst parentId = testTree.generateNodeId();\n\t\tconst child = makeForestNodeWithChildren(testTree, childId);\n\t\tconst parent = makeForestNodeWithChildren(testTree, parentId, childId);\n\t\tconst grandparent = makeForestNodeWithChildren(testTree, testTree.generateNodeId(), parentId);\n\t\tconst forestA = emptyForest.add([child, parent, grandparent]);\n\t\tconst forestB = emptyForest.add([grandparent, parent, child]);\n\t\tforestA.assertConsistent();\n\t\tforestB.assertConsistent();\n\t\texpect(forestA.size).to.equal(3);\n\t\texpect(forestA.equals(forestB)).to.be.true;\n\t});\n\n\tit('can replace payloads', () => {\n\t\texpectSuccessfulReplace(oneNodeForest, parentId, 0); // Set a payload when there was none\n\t\texpectSuccessfulReplace(oneNodeForest, parentId, 1); // Change a payload\n\t});\n\n\tit('can correctly attach a range to an empty trait on a root', () => {\n\t\tconst moreChildrenForest = oneNodeForest.add([\n\t\t\tmakeForestNodeWithChildren(testTree, childId),\n\t\t\tmakeForestNodeWithChildren(testTree, secondChildId),\n\t\t]);\n\n\t\texpectSuccessfulAttach(moreChildrenForest, parentId, mainTraitLabel, 0, [childId, secondChildId]);\n\t});\n\n\tit('can correctly attach ranges to a populated trait on a root', () => {\n\t\tconst twoLeafForest = parentForest.add([\n\t\t\tmakeForestNodeWithChildren(testTree, secondChildId),\n\t\t\tmakeForestNodeWithChildren(testTree, thirdChildId),\n\t\t]);\n\n\t\texpectSuccessfulAttach(twoLeafForest, parentId, mainTraitLabel, 1, [secondChildId]);\n\t\texpectSuccessfulAttach(twoLeafForest, parentId, mainTraitLabel, 1, [thirdChildId]);\n\t});\n\n\tit('can correctly attach ranges under a leaf', () => {\n\t\tconst threeNodeForest = parentForest.add([makeForestNodeWithChildren(testTree, secondChildId)]);\n\t\texpectSuccessfulAttach(threeNodeForest, childId, mainTraitLabel, 0, [secondChildId]);\n\t});\n\n\tit('only accepts valid indices for attaches', () => {\n\t\tconst twoNodeForest = oneNodeForest.add([makeForestNodeWithChildren(testTree, childId)]);\n\t\texpect(() => twoNodeForest.attachRangeOfChildren(parentId, mainTraitLabel, -1, [childId])).to.throw(\n\t\t\t'invalid attach index'\n\t\t);\n\t\texpect(() => twoNodeForest.attachRangeOfChildren(parentId, mainTraitLabel, 1, [childId])).to.throw(\n\t\t\t'invalid attach index'\n\t\t);\n\t});\n\n\tit('does not add trait when attaching empty range to empty trait', () => {\n\t\tconst forestWithAttach = oneNodeForest.attachRangeOfChildren(parentId, mainTraitLabel, 0, []);\n\t\tconst newParent = forestWithAttach.get(parentId);\n\t\texpect(newParent.traits.get(mainTraitLabel)).equals(undefined);\n\t});\n\n\tit('can correctly detach a range on a root node', () => {\n\t\texpectSuccessfulDetach(threeLeafForest, parentId, mainTraitLabel, 1, 2);\n\t});\n\n\tit('can correctly detach a range on a leaf node', () => {\n\t\texpectSuccessfulDetach(grandparentForest, childId, mainTraitLabel, 0, 1);\n\t});\n\n\tit('can correctly detach an entire trait', () => {\n\t\texpectSuccessfulDetach(threeLeafForest, parentId, mainTraitLabel, 0, 2);\n\t});\n\n\tit('only accepts valid indices for detaches', () => {\n\t\texpect(() => parentForest.detachRangeOfChildren(parentId, mainTraitLabel, -1, -1)).to.throw(\n\t\t\t'invalid detach index range'\n\t\t);\n\t\texpect(() => parentForest.detachRangeOfChildren(parentId, mainTraitLabel, -1, 0)).to.throw(\n\t\t\t'invalid detach index range'\n\t\t);\n\t\texpect(() => parentForest.detachRangeOfChildren(parentId, mainTraitLabel, 1, 0)).to.throw(\n\t\t\t'invalid detach index range'\n\t\t);\n\t\texpect(() => parentForest.detachRangeOfChildren(parentId, mainTraitLabel, 0, 2)).to.throw(\n\t\t\t'invalid detach index range'\n\t\t);\n\t\texpect(() => parentForest.detachRangeOfChildren(parentId, mainTraitLabel, 1, 2)).to.throw(\n\t\t\t'invalid detach index range'\n\t\t);\n\t});\n\n\tit('cannot delete parented nodes', () => {\n\t\texpect(() => parentForest.delete([childId], false)).throws('deleted nodes must be unparented');\n\t});\n\n\tit('can delete a root', () => {\n\t\tconst deleteRoot = parentForest.delete([parentId], false);\n\t\tdeleteRoot.assertConsistent();\n\t\texpect(deleteRoot.size).to.equal(1);\n\t\texpect(deleteRoot.tryGet(childId)).to.not.be.undefined;\n\t});\n\n\tit('can delete a subtree', () => {\n\t\tconst deleteLeaf = parentForest.delete([parentId], true);\n\t\tdeleteLeaf.assertConsistent();\n\t\texpect(deleteLeaf.size).to.equal(0);\n\t});\n\n\tit('calculates deltas correctly', () => {\n\t\tconst add = emptyForest.delta(oneNodeForest);\n\t\tconst remove = oneNodeForest.delta(emptyForest);\n\t\tconst same = parentForest.delta(parentForest);\n\t\tconst modified = parentForest.setValue(childId, -1);\n\t\tconst modify = parentForest.delta(modified);\n\n\t\texpect(remove).deep.equals({ changed: [], added: [], removed: [parentId] });\n\t\texpect(add).deep.equals({ changed: [], added: [parentId], removed: [] });\n\t\texpect(same).deep.equals({ changed: [], added: [], removed: [] });\n\t\texpect(modify).deep.equals({ changed: [childId], added: [], removed: [] });\n\t});\n\n\tit('calculates equality correctly', () => {\n\t\tconst modified = parentForest.setValue(parentId, -1);\n\n\t\texpect(oneNodeForest.equals(emptyForest)).false;\n\t\texpect(emptyForest.equals(oneNodeForest)).false;\n\t\texpect(parentForest.equals(parentForest)).true;\n\t\texpect(parentForest.equals(modified)).false;\n\t});\n\n\tfunction expectSuccessfulAttach(\n\t\tforest: Forest,\n\t\tparentId: NodeId,\n\t\tlabel: TraitLabel,\n\t\tindex: number,\n\t\tchildIds: NodeId[]\n\t): void {\n\t\tconst parent = forest.get(parentId);\n\t\tconst expectedTrait = [...(parent.traits.get(label) ?? [])];\n\t\texpectedTrait.splice(index, 0, ...childIds);\n\t\tconst forestWithAttach = forest.attachRangeOfChildren(parentId, label, index, childIds);\n\t\tconst newParent = forestWithAttach.get(parentId);\n\t\texpect(newParent.traits.get(label)).deep.equals(expectedTrait);\n\t\tfor (const childId of childIds) {\n\t\t\tconst parentData = forestWithAttach.tryGetParent(childId);\n\t\t\texpect(parentData?.traitParent).to.equal(label);\n\t\t\texpect(parentData?.parentId).to.equal(parentId);\n\t\t}\n\t}\n\n\tfunction expectSuccessfulDetach(\n\t\tforest: Forest,\n\t\tparentId: NodeId,\n\t\tlabel: TraitLabel,\n\t\tstartIndex: number,\n\t\tendIndex: number\n\t): void {\n\t\tconst parent = forest.get(parentId);\n\t\tconst expectedTrait = [...(parent.traits.get(label) ?? [])];\n\t\tconst spliced = expectedTrait.splice(startIndex, endIndex - startIndex);\n\t\tconst { forest: forestWithDetach, detached } = forest.detachRangeOfChildren(\n\t\t\tparentId,\n\t\t\tlabel,\n\t\t\tstartIndex,\n\t\t\tendIndex\n\t\t);\n\n\t\tconst newParent = forestWithDetach.get(parentId);\n\t\tconst trait = newParent.traits.get(label);\n\t\tif (expectedTrait.length === 0) {\n\t\t\texpect(trait).to.be.undefined;\n\t\t} else {\n\t\t\texpect(trait).deep.equals(expectedTrait);\n\t\t}\n\n\t\texpect(detached).deep.equals(spliced);\n\t\tfor (const detachedId of detached) {\n\t\t\texpect(forestWithDetach.tryGetParent(detachedId)).to.be.undefined;\n\t\t}\n\t}\n\n\tfunction expectSuccessfulReplace(forest: Forest, nodeId: NodeId, payload: Payload | null): void {\n\t\tconst forestWithReplace = forest.setValue(nodeId, payload);\n\t\tconst newNode = forestWithReplace.get(nodeId);\n\t\texpect(newNode.payload).equals(payload);\n\t}\n});\n"]}
|
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { benchmark, BenchmarkType } from '@fluid-tools/benchmark';
|
|
6
6
|
import { v4 } from 'uuid';
|
|
7
|
+
import { take } from '@fluid-internal/stochastic-test-utils';
|
|
7
8
|
import { fail } from '../Common';
|
|
8
9
|
import { defaultClusterCapacity, IdCompressor, isFinalId, isLocalId, } from '../id-compressor/IdCompressor';
|
|
9
10
|
import { createSessionId, numericUuidFromStableId, stableIdFromNumericUuid } from '../id-compressor/NumericUuid';
|
|
10
|
-
import { Client, IdCompressorTestNetwork, performFuzzActions, sessionIds, } from './utilities/IdCompressorTestUtilities';
|
|
11
|
+
import { Client, IdCompressorTestNetwork, makeOpGenerator, performFuzzActions, sessionIds, } from './utilities/IdCompressorTestUtilities';
|
|
11
12
|
describe('IdCompressor Perf', () => {
|
|
12
13
|
const type = BenchmarkType.Measurement;
|
|
13
14
|
const localClient = Client.Client1;
|
|
@@ -21,7 +22,12 @@ describe('IdCompressor Perf', () => {
|
|
|
21
22
|
return network;
|
|
22
23
|
}
|
|
23
24
|
function createPerfCompressor(network, allowLocal, includeOverrides, client) {
|
|
24
|
-
|
|
25
|
+
const maxClusterSize = 25;
|
|
26
|
+
const generator = take(1000, makeOpGenerator({ includeOverrides, validateInterval: 2000, maxClusterSize }));
|
|
27
|
+
if (network.initialClusterSize > maxClusterSize) {
|
|
28
|
+
network.enqueueCapacityChange(maxClusterSize);
|
|
29
|
+
}
|
|
30
|
+
performFuzzActions(generator, network, Math.E, client, allowLocal ? false : true);
|
|
25
31
|
return [network.getCompressorUnsafe(client), network.getIdLog(client)];
|
|
26
32
|
}
|
|
27
33
|
function setupCompressorWithId(local, override, clusterHasOtherOverrides) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdCompressor.perf.tests.js","sourceRoot":"","sources":["../../src/test/IdCompressor.perf.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 { benchmark, BenchmarkType } from '@fluid-tools/benchmark';\nimport { v4 } from 'uuid';\nimport { fail, Mutable } from '../Common';\nimport {\n\tdefaultClusterCapacity,\n\tIdCompressor,\n\tIdRangeDescriptor,\n\tisFinalId,\n\tisLocalId,\n} from '../id-compressor/IdCompressor';\nimport { IdCreationRange, UnackedLocalId, SerializedIdCompressorWithNoSession } from '../id-compressor';\nimport { createSessionId, numericUuidFromStableId, stableIdFromNumericUuid } from '../id-compressor/NumericUuid';\nimport {\n\tCompressedId,\n\tFinalCompressedId,\n\tLocalCompressedId,\n\tOpSpaceCompressedId,\n\tSessionId,\n\tSessionSpaceCompressedId,\n} from '../Identifiers';\nimport {\n\tClient,\n\tIdCompressorTestNetwork,\n\tperformFuzzActions,\n\tsessionIds,\n\tTestIdData,\n} from './utilities/IdCompressorTestUtilities';\n\ndescribe('IdCompressor Perf', () => {\n\tconst type = BenchmarkType.Measurement;\n\tconst localClient = Client.Client1;\n\tconst remoteClient = Client.Client2;\n\tlet compressor: IdCompressor;\n\tlet remoteCompressor: IdCompressor;\n\n\tfunction setupCompressors(\n\t\tclusterSize: number,\n\t\tallowLocal: boolean,\n\t\tincludeOverrides: boolean\n\t): IdCompressorTestNetwork {\n\t\tconst network = new IdCompressorTestNetwork(clusterSize);\n\t\t[compressor] = createPerfCompressor(network, allowLocal, includeOverrides, localClient);\n\t\t[remoteCompressor] = createPerfCompressor(network, allowLocal, includeOverrides, remoteClient);\n\t\treturn network;\n\t}\n\n\tfunction createPerfCompressor(\n\t\tnetwork: IdCompressorTestNetwork,\n\t\tallowLocal: boolean,\n\t\tincludeOverrides: boolean,\n\t\tclient: Client\n\t): [IdCompressor, readonly TestIdData[]] {\n\t\tperformFuzzActions(network, Math.E, includeOverrides, client, allowLocal ? false : true);\n\t\treturn [network.getCompressorUnsafe(client), network.getIdLog(client)];\n\t}\n\n\tfunction setupCompressorWithId(local: boolean, override: boolean, clusterHasOtherOverrides: boolean): CompressedId {\n\t\tconst clusterCapacity = defaultClusterCapacity;\n\t\tconst network = setupCompressors(clusterCapacity, true, true);\n\t\tif (!clusterHasOtherOverrides) {\n\t\t\tnetwork.allocateAndSendIds(localClient, clusterCapacity);\n\t\t} else {\n\t\t\tnetwork.allocateAndSendIds(localClient, 2, {\n\t\t\t\t0: 'override1',\n\t\t\t\t1: 'override2',\n\t\t\t});\n\t\t}\n\t\tif (override) {\n\t\t\tnetwork.allocateAndSendIds(localClient, 1, { 0: 'override3' });\n\t\t} else {\n\t\t\tnetwork.allocateAndSendIds(localClient, 1);\n\t\t}\n\n\t\tif (!local) {\n\t\t\tnetwork.deliverOperations(localClient);\n\t\t}\n\n\t\tconst ids = network.getIdLog(localClient);\n\t\tconst lastId = ids[ids.length - 1].id;\n\t\treturn lastId;\n\t}\n\n\tfunction benchmarkWithIdTypes(creator: (local: boolean, override: boolean, titleSuffix: string) => void) {\n\t\tfor (const local of [true, false]) {\n\t\t\tfor (const override of [true, false]) {\n\t\t\t\tconst titleSuffix = ` (${override ? 'override' : 'sequential'})`;\n\t\t\t\tcreator(local, override, titleSuffix);\n\t\t\t}\n\t\t}\n\t}\n\n\t[true, false].forEach((isLocal) => {\n\t\tlet range: IdRangeDescriptor<SessionSpaceCompressedId>;\n\t\tlet sessionId: SessionId;\n\t\tconst numIds = 100;\n\t\tconst clusterSize = Math.round(numIds / 2);\n\t\tconst setupRange = (isLocal: boolean) => {\n\t\t\tsetupCompressors(clusterSize, true, false);\n\t\t\tconst originCompressor = isLocal ? compressor : remoteCompressor;\n\t\t\tsessionId = originCompressor.localSessionId;\n\t\t\trange = originCompressor.generateCompressedIdRange(numIds);\n\t\t\tconst creationRange = originCompressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(creationRange);\n\t\t};\n\t\tconst beforeLocal = () => setupRange(false);\n\t\tconst beforeRemote = () => setupRange(true);\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `get ${numIds} sequential IDs for a ${isLocal ? 'local' : 'remote'} range`,\n\t\t\tbefore: isLocal ? beforeLocal : beforeRemote,\n\t\t\tbenchmarkFn: () => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst ids = compressor.getIdsFromRange(range!, sessionId!);\n\t\t\t\tfor (let i = 0; i < numIds; i++) {\n\t\t\t\t\tids.get(i); // get a sequential ID\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t});\n\n\t[true, false].forEach((override) => {\n\t\tconst numericSource = numericUuidFromStableId(createSessionId());\n\t\tlet overrideIndex = 0;\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `allocate local ID (${override ? 'override' : 'sequential'})`,\n\t\t\tbefore: () => {\n\t\t\t\tsetupCompressors(defaultClusterCapacity, true, false);\n\t\t\t},\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tcompressor.generateCompressedId(\n\t\t\t\t\toverride ? stableIdFromNumericUuid(numericSource, overrideIndex++) : undefined\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t});\n\n\t[true, false].forEach((override) => {\n\t\tfor (const clusterSize of [1, 10, 500, 1000]) {\n\t\t\tconst overrideCount = 3;\n\t\t\tconst numIds = 7;\n\t\t\tconst session1 = '8150a099-5302-4672-b5f3-7a4492b59418' as SessionId;\n\t\t\tconst session2 = 'f2ded886-92da-4248-967b-eb96ee04cf51' as SessionId;\n\t\t\tlet session: SessionId = session1;\n\t\t\tlet lastFinalizedLocalId1 = 0 as LocalCompressedId;\n\t\t\tlet lastFinalizedLocalId2 = 0 as LocalCompressedId;\n\t\t\tlet overrideIndex = 0;\n\t\t\tbenchmark({\n\t\t\t\ttype,\n\t\t\t\ttitle: `finalize a range of IDs (cluster size =${clusterSize}${override ? ', overrides present' : ''})`,\n\t\t\t\tbefore: () => {\n\t\t\t\t\tsetupCompressors(clusterSize, false, false);\n\t\t\t\t},\n\t\t\t\tbenchmarkFn: () => {\n\t\t\t\t\t// Create a range with as minimal overhead as possible, as we'd like for this code to not exist\n\t\t\t\t\t// in the timing loop at all (but benchmark forces us to do so)\n\t\t\t\t\tconst isLocal = session === session1;\n\t\t\t\t\tconst first = ((isLocal ? lastFinalizedLocalId1 : lastFinalizedLocalId2) - 1) as LocalCompressedId &\n\t\t\t\t\t\tOpSpaceCompressedId;\n\t\t\t\t\tlet overrides: Mutable<IdCreationRange.Overrides> | undefined;\n\t\t\t\t\tconst actualOverrideCount = override ? overrideCount : 0;\n\t\t\t\t\tif (actualOverrideCount > 0) {\n\t\t\t\t\t\toverrides = [] as unknown as Mutable<IdCreationRange.Overrides>;\n\t\t\t\t\t\tfor (let i = 0; i < actualOverrideCount; i++) {\n\t\t\t\t\t\t\toverrides.push([\n\t\t\t\t\t\t\t\t(first - i) as LocalCompressedId & OpSpaceCompressedId,\n\t\t\t\t\t\t\t\t`override${overrideIndex++}`,\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst last = (first - numIds) as UnackedLocalId;\n\t\t\t\t\tconst range: IdCreationRange = {\n\t\t\t\t\t\tsessionId: session,\n\t\t\t\t\t\tids: {\n\t\t\t\t\t\t\tfirst,\n\t\t\t\t\t\t\tlast,\n\t\t\t\t\t\t\toverrides,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\n\t\t\t\t\tcompressor.finalizeCreationRange(range);\n\n\t\t\t\t\tif (isLocal) {\n\t\t\t\t\t\tlastFinalizedLocalId1 = last;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastFinalizedLocalId2 = last;\n\t\t\t\t\t}\n\t\t\t\t\t// Alternate clients to sidestep optimization that packs them all into last cluster\n\t\t\t\t\tsession = isLocal ? session1 : session2;\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t});\n\n\t[true, false].forEach((override) => {\n\t\tconst idCount = 5;\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `creates an ID range (${override ? 'with overrides' : ''})`,\n\t\t\tbefore: () => {\n\t\t\t\tsetupCompressors(defaultClusterCapacity, true, false);\n\t\t\t},\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tif (override) {\n\t\t\t\t\tcompressor.generateCompressedId(v4());\n\t\t\t\t}\n\t\t\t\tcompressor.generateCompressedIdRange(idCount);\n\t\t\t\tcompressor.takeNextCreationRange();\n\t\t\t},\n\t\t});\n\t});\n\n\tbenchmarkWithIdTypes((local, override, titleSuffix) => {\n\t\tlet idToDecompress!: CompressedId;\n\t\tconst before = () => {\n\t\t\tidToDecompress = setupCompressorWithId(local, override, true);\n\t\t};\n\t\tconst benchmarkFn = () => {\n\t\t\tcompressor.decompress(idToDecompress);\n\t\t};\n\t\tif (local) {\n\t\t\tbenchmark({\n\t\t\t\ttype,\n\t\t\t\ttitle: `decompress local ID into stable IDs${titleSuffix}`,\n\t\t\t\tbefore,\n\t\t\t\tbenchmarkFn,\n\t\t\t});\n\t\t} else {\n\t\t\tconst titleBase = 'decompress final ID into stable IDs';\n\t\t\tif (override) {\n\t\t\t\tbenchmark({\n\t\t\t\t\ttype,\n\t\t\t\t\ttitle: titleBase + titleSuffix,\n\t\t\t\t\tbefore,\n\t\t\t\t\tbenchmarkFn,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (const clusterHasOverride of [true, false]) {\n\t\t\t\t\tbenchmark({\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\ttitle: `${titleBase} (sequential, overrides ${\n\t\t\t\t\t\t\tclusterHasOverride ? 'present' : 'not present'\n\t\t\t\t\t\t} in owning cluster)`,\n\t\t\t\t\t\tbefore: () => {\n\t\t\t\t\t\t\tidToDecompress = setupCompressorWithId(local, override, clusterHasOverride);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbenchmarkFn,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\tbenchmarkWithIdTypes((local, override, titleSuffix) => {\n\t\tlet stableToCompress!: string;\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `compress a stable ID to a ${local ? 'local' : 'final'} ID${titleSuffix}`,\n\t\t\tbefore: () => {\n\t\t\t\tconst idAdded = setupCompressorWithId(local, override, true);\n\t\t\t\tstableToCompress = compressor.decompress(idAdded);\n\t\t\t},\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tcompressor.recompress(stableToCompress);\n\t\t\t},\n\t\t});\n\t});\n\n\tlet final!: FinalCompressedId;\n\tbenchmark({\n\t\ttype,\n\t\ttitle: `normalize a final ID from the local session to session space`,\n\t\tbefore: () => {\n\t\t\tconst network = setupCompressors(defaultClusterCapacity, true, true);\n\t\t\tnetwork.allocateAndSendIds(localClient, 1);\n\t\t\tnetwork.deliverOperations(localClient);\n\t\t\tconst log = network.getSequencedIdLog(localClient);\n\t\t\tconst id = compressor.normalizeToOpSpace(log[log.length - 1].id);\n\t\t\tfinal = isFinalId(id) ? id : fail('not a final ID');\n\t\t},\n\t\tbenchmarkFn: () => {\n\t\t\tcompressor.normalizeToSessionSpace(final, compressor.localSessionId);\n\t\t},\n\t});\n\n\tlet localId!: LocalCompressedId;\n\tbenchmark({\n\t\ttype,\n\t\ttitle: `normalize a local ID from the local session to session space`,\n\t\tbefore: () => {\n\t\t\tconst network = setupCompressors(defaultClusterCapacity, true, true);\n\t\t\tnetwork.allocateAndSendIds(localClient, 1);\n\t\t\tnetwork.deliverOperations(localClient);\n\t\t\tconst log = network.getIdLog(localClient);\n\t\t\tconst id = log[log.length - 1].id;\n\t\t\tlocalId = isLocalId(id) ? id : fail('not a local ID');\n\t\t},\n\t\tbenchmarkFn: () => {\n\t\t\tcompressor.normalizeToOpSpace(localId);\n\t\t},\n\t});\n\n\tconst remoteSessionId = sessionIds.get(remoteClient);\n\tlet opSpaceId: OpSpaceCompressedId | undefined;\n\tbenchmark({\n\t\ttype,\n\t\ttitle: `normalize a local ID from a remote session to session space`,\n\t\tbefore: () => {\n\t\t\tconst network = setupCompressors(defaultClusterCapacity, true, true);\n\t\t\tnetwork.allocateAndSendIds(remoteClient, 1);\n\t\t\tconst log = network.getIdLog(remoteClient);\n\t\t\tconst id = remoteCompressor.normalizeToOpSpace(log[log.length - 1].id);\n\t\t\topSpaceId = isLocalId(id) ? id : fail('not a local ID');\n\t\t\t// Ensure id is finalized on local compressor\n\t\t\tnetwork.deliverOperations(localClient);\n\t\t},\n\t\tbenchmarkFn: () => {\n\t\t\tcompressor.normalizeToSessionSpace(opSpaceId ?? fail(), remoteSessionId);\n\t\t},\n\t});\n\n\tfor (const overrideInClusters of [true, false]) {\n\t\tconst titleSuffix = ` (${overrideInClusters ? 'with' : 'without'} overrides)`;\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `serialize an IdCompressor${titleSuffix}`,\n\t\t\tbefore: () => {\n\t\t\t\tsetupCompressors(defaultClusterCapacity, false, overrideInClusters);\n\t\t\t},\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tcompressor.serialize(false);\n\t\t\t},\n\t\t});\n\n\t\tlet serialized!: SerializedIdCompressorWithNoSession;\n\t\tconst remoteSessionId = createSessionId();\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `deserialize an IdCompressor${titleSuffix}`,\n\t\t\tbefore: () => {\n\t\t\t\tsetupCompressors(defaultClusterCapacity, false, overrideInClusters);\n\t\t\t\tserialized = compressor.serialize(false);\n\t\t\t},\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tIdCompressor.deserialize(serialized, remoteSessionId);\n\t\t\t},\n\t\t});\n\t}\n});\n"]}
|
|
1
|
+
{"version":3,"file":"IdCompressor.perf.tests.js","sourceRoot":"","sources":["../../src/test/IdCompressor.perf.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 { benchmark, BenchmarkType } from '@fluid-tools/benchmark';\nimport { v4 } from 'uuid';\nimport { take } from '@fluid-internal/stochastic-test-utils';\nimport { fail, Mutable } from '../Common';\nimport {\n\tdefaultClusterCapacity,\n\tIdCompressor,\n\tIdRangeDescriptor,\n\tisFinalId,\n\tisLocalId,\n} from '../id-compressor/IdCompressor';\nimport { IdCreationRange, UnackedLocalId, SerializedIdCompressorWithNoSession } from '../id-compressor';\nimport { createSessionId, numericUuidFromStableId, stableIdFromNumericUuid } from '../id-compressor/NumericUuid';\nimport {\n\tCompressedId,\n\tFinalCompressedId,\n\tLocalCompressedId,\n\tOpSpaceCompressedId,\n\tSessionId,\n\tSessionSpaceCompressedId,\n} from '../Identifiers';\nimport {\n\tClient,\n\tIdCompressorTestNetwork,\n\tmakeOpGenerator,\n\tperformFuzzActions,\n\tsessionIds,\n\tTestIdData,\n} from './utilities/IdCompressorTestUtilities';\n\ndescribe('IdCompressor Perf', () => {\n\tconst type = BenchmarkType.Measurement;\n\tconst localClient = Client.Client1;\n\tconst remoteClient = Client.Client2;\n\tlet compressor: IdCompressor;\n\tlet remoteCompressor: IdCompressor;\n\n\tfunction setupCompressors(\n\t\tclusterSize: number,\n\t\tallowLocal: boolean,\n\t\tincludeOverrides: boolean\n\t): IdCompressorTestNetwork {\n\t\tconst network = new IdCompressorTestNetwork(clusterSize);\n\t\t[compressor] = createPerfCompressor(network, allowLocal, includeOverrides, localClient);\n\t\t[remoteCompressor] = createPerfCompressor(network, allowLocal, includeOverrides, remoteClient);\n\t\treturn network;\n\t}\n\n\tfunction createPerfCompressor(\n\t\tnetwork: IdCompressorTestNetwork,\n\t\tallowLocal: boolean,\n\t\tincludeOverrides: boolean,\n\t\tclient: Client\n\t): [IdCompressor, readonly TestIdData[]] {\n\t\tconst maxClusterSize = 25;\n\t\tconst generator = take(1000, makeOpGenerator({ includeOverrides, validateInterval: 2000, maxClusterSize }));\n\t\tif (network.initialClusterSize > maxClusterSize) {\n\t\t\tnetwork.enqueueCapacityChange(maxClusterSize);\n\t\t}\n\t\tperformFuzzActions(generator, network, Math.E, client, allowLocal ? false : true);\n\t\treturn [network.getCompressorUnsafe(client), network.getIdLog(client)];\n\t}\n\n\tfunction setupCompressorWithId(local: boolean, override: boolean, clusterHasOtherOverrides: boolean): CompressedId {\n\t\tconst clusterCapacity = defaultClusterCapacity;\n\t\tconst network = setupCompressors(clusterCapacity, true, true);\n\t\tif (!clusterHasOtherOverrides) {\n\t\t\tnetwork.allocateAndSendIds(localClient, clusterCapacity);\n\t\t} else {\n\t\t\tnetwork.allocateAndSendIds(localClient, 2, {\n\t\t\t\t0: 'override1',\n\t\t\t\t1: 'override2',\n\t\t\t});\n\t\t}\n\t\tif (override) {\n\t\t\tnetwork.allocateAndSendIds(localClient, 1, { 0: 'override3' });\n\t\t} else {\n\t\t\tnetwork.allocateAndSendIds(localClient, 1);\n\t\t}\n\n\t\tif (!local) {\n\t\t\tnetwork.deliverOperations(localClient);\n\t\t}\n\n\t\tconst ids = network.getIdLog(localClient);\n\t\tconst lastId = ids[ids.length - 1].id;\n\t\treturn lastId;\n\t}\n\n\tfunction benchmarkWithIdTypes(creator: (local: boolean, override: boolean, titleSuffix: string) => void) {\n\t\tfor (const local of [true, false]) {\n\t\t\tfor (const override of [true, false]) {\n\t\t\t\tconst titleSuffix = ` (${override ? 'override' : 'sequential'})`;\n\t\t\t\tcreator(local, override, titleSuffix);\n\t\t\t}\n\t\t}\n\t}\n\n\t[true, false].forEach((isLocal) => {\n\t\tlet range: IdRangeDescriptor<SessionSpaceCompressedId>;\n\t\tlet sessionId: SessionId;\n\t\tconst numIds = 100;\n\t\tconst clusterSize = Math.round(numIds / 2);\n\t\tconst setupRange = (isLocal: boolean) => {\n\t\t\tsetupCompressors(clusterSize, true, false);\n\t\t\tconst originCompressor = isLocal ? compressor : remoteCompressor;\n\t\t\tsessionId = originCompressor.localSessionId;\n\t\t\trange = originCompressor.generateCompressedIdRange(numIds);\n\t\t\tconst creationRange = originCompressor.takeNextCreationRange();\n\t\t\tcompressor.finalizeCreationRange(creationRange);\n\t\t};\n\t\tconst beforeLocal = () => setupRange(false);\n\t\tconst beforeRemote = () => setupRange(true);\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `get ${numIds} sequential IDs for a ${isLocal ? 'local' : 'remote'} range`,\n\t\t\tbefore: isLocal ? beforeLocal : beforeRemote,\n\t\t\tbenchmarkFn: () => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst ids = compressor.getIdsFromRange(range!, sessionId!);\n\t\t\t\tfor (let i = 0; i < numIds; i++) {\n\t\t\t\t\tids.get(i); // get a sequential ID\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t});\n\n\t[true, false].forEach((override) => {\n\t\tconst numericSource = numericUuidFromStableId(createSessionId());\n\t\tlet overrideIndex = 0;\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `allocate local ID (${override ? 'override' : 'sequential'})`,\n\t\t\tbefore: () => {\n\t\t\t\tsetupCompressors(defaultClusterCapacity, true, false);\n\t\t\t},\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tcompressor.generateCompressedId(\n\t\t\t\t\toverride ? stableIdFromNumericUuid(numericSource, overrideIndex++) : undefined\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t});\n\n\t[true, false].forEach((override) => {\n\t\tfor (const clusterSize of [1, 10, 500, 1000]) {\n\t\t\tconst overrideCount = 3;\n\t\t\tconst numIds = 7;\n\t\t\tconst session1 = '8150a099-5302-4672-b5f3-7a4492b59418' as SessionId;\n\t\t\tconst session2 = 'f2ded886-92da-4248-967b-eb96ee04cf51' as SessionId;\n\t\t\tlet session: SessionId = session1;\n\t\t\tlet lastFinalizedLocalId1 = 0 as LocalCompressedId;\n\t\t\tlet lastFinalizedLocalId2 = 0 as LocalCompressedId;\n\t\t\tlet overrideIndex = 0;\n\t\t\tbenchmark({\n\t\t\t\ttype,\n\t\t\t\ttitle: `finalize a range of IDs (cluster size =${clusterSize}${override ? ', overrides present' : ''})`,\n\t\t\t\tbefore: () => {\n\t\t\t\t\tsetupCompressors(clusterSize, false, false);\n\t\t\t\t},\n\t\t\t\tbenchmarkFn: () => {\n\t\t\t\t\t// Create a range with as minimal overhead as possible, as we'd like for this code to not exist\n\t\t\t\t\t// in the timing loop at all (but benchmark forces us to do so)\n\t\t\t\t\tconst isLocal = session === session1;\n\t\t\t\t\tconst first = ((isLocal ? lastFinalizedLocalId1 : lastFinalizedLocalId2) - 1) as LocalCompressedId &\n\t\t\t\t\t\tOpSpaceCompressedId;\n\t\t\t\t\tlet overrides: Mutable<IdCreationRange.Overrides> | undefined;\n\t\t\t\t\tconst actualOverrideCount = override ? overrideCount : 0;\n\t\t\t\t\tif (actualOverrideCount > 0) {\n\t\t\t\t\t\toverrides = [] as unknown as Mutable<IdCreationRange.Overrides>;\n\t\t\t\t\t\tfor (let i = 0; i < actualOverrideCount; i++) {\n\t\t\t\t\t\t\toverrides.push([\n\t\t\t\t\t\t\t\t(first - i) as LocalCompressedId & OpSpaceCompressedId,\n\t\t\t\t\t\t\t\t`override${overrideIndex++}`,\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst last = (first - numIds) as UnackedLocalId;\n\t\t\t\t\tconst range: IdCreationRange = {\n\t\t\t\t\t\tsessionId: session,\n\t\t\t\t\t\tids: {\n\t\t\t\t\t\t\tfirst,\n\t\t\t\t\t\t\tlast,\n\t\t\t\t\t\t\toverrides,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\n\t\t\t\t\tcompressor.finalizeCreationRange(range);\n\n\t\t\t\t\tif (isLocal) {\n\t\t\t\t\t\tlastFinalizedLocalId1 = last;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastFinalizedLocalId2 = last;\n\t\t\t\t\t}\n\t\t\t\t\t// Alternate clients to sidestep optimization that packs them all into last cluster\n\t\t\t\t\tsession = isLocal ? session1 : session2;\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t});\n\n\t[true, false].forEach((override) => {\n\t\tconst idCount = 5;\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `creates an ID range (${override ? 'with overrides' : ''})`,\n\t\t\tbefore: () => {\n\t\t\t\tsetupCompressors(defaultClusterCapacity, true, false);\n\t\t\t},\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tif (override) {\n\t\t\t\t\tcompressor.generateCompressedId(v4());\n\t\t\t\t}\n\t\t\t\tcompressor.generateCompressedIdRange(idCount);\n\t\t\t\tcompressor.takeNextCreationRange();\n\t\t\t},\n\t\t});\n\t});\n\n\tbenchmarkWithIdTypes((local, override, titleSuffix) => {\n\t\tlet idToDecompress!: CompressedId;\n\t\tconst before = () => {\n\t\t\tidToDecompress = setupCompressorWithId(local, override, true);\n\t\t};\n\t\tconst benchmarkFn = () => {\n\t\t\tcompressor.decompress(idToDecompress);\n\t\t};\n\t\tif (local) {\n\t\t\tbenchmark({\n\t\t\t\ttype,\n\t\t\t\ttitle: `decompress local ID into stable IDs${titleSuffix}`,\n\t\t\t\tbefore,\n\t\t\t\tbenchmarkFn,\n\t\t\t});\n\t\t} else {\n\t\t\tconst titleBase = 'decompress final ID into stable IDs';\n\t\t\tif (override) {\n\t\t\t\tbenchmark({\n\t\t\t\t\ttype,\n\t\t\t\t\ttitle: titleBase + titleSuffix,\n\t\t\t\t\tbefore,\n\t\t\t\t\tbenchmarkFn,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfor (const clusterHasOverride of [true, false]) {\n\t\t\t\t\tbenchmark({\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\ttitle: `${titleBase} (sequential, overrides ${\n\t\t\t\t\t\t\tclusterHasOverride ? 'present' : 'not present'\n\t\t\t\t\t\t} in owning cluster)`,\n\t\t\t\t\t\tbefore: () => {\n\t\t\t\t\t\t\tidToDecompress = setupCompressorWithId(local, override, clusterHasOverride);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbenchmarkFn,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\tbenchmarkWithIdTypes((local, override, titleSuffix) => {\n\t\tlet stableToCompress!: string;\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `compress a stable ID to a ${local ? 'local' : 'final'} ID${titleSuffix}`,\n\t\t\tbefore: () => {\n\t\t\t\tconst idAdded = setupCompressorWithId(local, override, true);\n\t\t\t\tstableToCompress = compressor.decompress(idAdded);\n\t\t\t},\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tcompressor.recompress(stableToCompress);\n\t\t\t},\n\t\t});\n\t});\n\n\tlet final!: FinalCompressedId;\n\tbenchmark({\n\t\ttype,\n\t\ttitle: `normalize a final ID from the local session to session space`,\n\t\tbefore: () => {\n\t\t\tconst network = setupCompressors(defaultClusterCapacity, true, true);\n\t\t\tnetwork.allocateAndSendIds(localClient, 1);\n\t\t\tnetwork.deliverOperations(localClient);\n\t\t\tconst log = network.getSequencedIdLog(localClient);\n\t\t\tconst id = compressor.normalizeToOpSpace(log[log.length - 1].id);\n\t\t\tfinal = isFinalId(id) ? id : fail('not a final ID');\n\t\t},\n\t\tbenchmarkFn: () => {\n\t\t\tcompressor.normalizeToSessionSpace(final, compressor.localSessionId);\n\t\t},\n\t});\n\n\tlet localId!: LocalCompressedId;\n\tbenchmark({\n\t\ttype,\n\t\ttitle: `normalize a local ID from the local session to session space`,\n\t\tbefore: () => {\n\t\t\tconst network = setupCompressors(defaultClusterCapacity, true, true);\n\t\t\tnetwork.allocateAndSendIds(localClient, 1);\n\t\t\tnetwork.deliverOperations(localClient);\n\t\t\tconst log = network.getIdLog(localClient);\n\t\t\tconst id = log[log.length - 1].id;\n\t\t\tlocalId = isLocalId(id) ? id : fail('not a local ID');\n\t\t},\n\t\tbenchmarkFn: () => {\n\t\t\tcompressor.normalizeToOpSpace(localId);\n\t\t},\n\t});\n\n\tconst remoteSessionId = sessionIds.get(remoteClient);\n\tlet opSpaceId: OpSpaceCompressedId | undefined;\n\tbenchmark({\n\t\ttype,\n\t\ttitle: `normalize a local ID from a remote session to session space`,\n\t\tbefore: () => {\n\t\t\tconst network = setupCompressors(defaultClusterCapacity, true, true);\n\t\t\tnetwork.allocateAndSendIds(remoteClient, 1);\n\t\t\tconst log = network.getIdLog(remoteClient);\n\t\t\tconst id = remoteCompressor.normalizeToOpSpace(log[log.length - 1].id);\n\t\t\topSpaceId = isLocalId(id) ? id : fail('not a local ID');\n\t\t\t// Ensure id is finalized on local compressor\n\t\t\tnetwork.deliverOperations(localClient);\n\t\t},\n\t\tbenchmarkFn: () => {\n\t\t\tcompressor.normalizeToSessionSpace(opSpaceId ?? fail(), remoteSessionId);\n\t\t},\n\t});\n\n\tfor (const overrideInClusters of [true, false]) {\n\t\tconst titleSuffix = ` (${overrideInClusters ? 'with' : 'without'} overrides)`;\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `serialize an IdCompressor${titleSuffix}`,\n\t\t\tbefore: () => {\n\t\t\t\tsetupCompressors(defaultClusterCapacity, false, overrideInClusters);\n\t\t\t},\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tcompressor.serialize(false);\n\t\t\t},\n\t\t});\n\n\t\tlet serialized!: SerializedIdCompressorWithNoSession;\n\t\tconst remoteSessionId = createSessionId();\n\t\tbenchmark({\n\t\t\ttype,\n\t\t\ttitle: `deserialize an IdCompressor${titleSuffix}`,\n\t\t\tbefore: () => {\n\t\t\t\tsetupCompressors(defaultClusterCapacity, false, overrideInClusters);\n\t\t\t\tserialized = compressor.serialize(false);\n\t\t\t},\n\t\t\tbenchmarkFn: () => {\n\t\t\t\tIdCompressor.deserialize(serialized, remoteSessionId);\n\t\t\t},\n\t\t});\n\t}\n});\n"]}
|