@fluid-experimental/tree 0.59.2002 → 0.59.2004

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.
@@ -1 +1 @@
1
- {"version":3,"file":"SharedTreeTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeTests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, expect } from 'chai';\nimport { ITelemetryBaseEvent } from '@fluidframework/common-definitions';\nimport { IsoBuffer } from '@fluidframework/common-utils';\nimport { LoaderHeader } from '@fluidframework/container-definitions';\nimport { ISequencedDocumentMessage } from '@fluidframework/protocol-definitions';\nimport {\n\tMockContainerRuntime,\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n} from '@fluidframework/test-runtime-utils';\nimport { assertArrayOfOne, assertNotUndefined, fail, isSharedTreeEvent } from '../../Common';\nimport { EditId, NodeId, OpSpaceNodeId, TraitLabel } from '../../Identifiers';\nimport { CachingLogViewer } from '../../LogViewer';\nimport { EditLog, OrderedEditSet } from '../../EditLog';\nimport { initialTree } from '../../InitialTree';\nimport { TreeNodeHandle } from '../../TreeNodeHandle';\nimport { deserialize } from '../../SummaryBackCompatibility';\nimport { useFailedSequencedEditTelemetry } from '../../MergeHealth';\nimport { MutableStringInterner } from '../../StringInterner';\nimport { getChangeNodeFromView } from '../../SerializationUtilities';\nimport { EditCommittedEventArguments, SequencedEditAppliedEventArguments, SharedTree } from '../../SharedTree';\nimport {\n\tChangeInternal,\n\tChangeNode,\n\tChangeNode_0_0_2,\n\tChangeTypeInternal,\n\tCompressedChangeInternal,\n\tEditChunkContents,\n\teditsPerChunk,\n\tEditStatus,\n\tEditWithoutId,\n\tFluidEditHandle,\n\tSharedTreeEditOp,\n\tSharedTreeSummary,\n\tSharedTreeSummaryBase,\n\tSharedTreeSummary_0_0_2,\n\tWriteFormat,\n} from '../../persisted-types';\nimport { SharedTreeDiagnosticEvent, SharedTreeEvent } from '../../EventTypes';\nimport { BuildNode, Change, ChangeType, StablePlace, StableRange } from '../../ChangeTypes';\nimport { convertTreeNodes, deepCompareNodes } from '../../EditUtilities';\nimport { serialize, SummaryContents } from '../../Summary';\nimport { InterningTreeCompressor } from '../../TreeCompressor';\nimport { SharedTreeEncoder_0_0_2, SharedTreeEncoder_0_1_1 } from '../../SharedTreeEncoder';\nimport { sequencedIdNormalizer } from '../../NodeIdUtilities';\nimport { convertNodeDataIds } from '../../IdConversion';\nimport { buildLeaf, SimpleTestTree, TestTree } from './TestNode';\nimport { TestFluidHandle, TestFluidSerializer } from './TestSerializer';\nimport { runSharedTreeUndoRedoTestSuite } from './UndoRedoTests';\nimport {\n\tareNodesEquivalent,\n\tassertNoDelta,\n\tSharedTreeTestingComponents,\n\tSharedTreeTestingOptions,\n\tsetUpTestTree,\n\ttestTrait,\n\ttestTraitLabel,\n\ttranslateId,\n\tspyOnSubmittedOps,\n\tnormalizeIds,\n\tnormalizeId,\n\tnormalizeEdit,\n\tsetUpLocalServerTestSharedTree,\n\tapplyNoop,\n\tgetIdNormalizerFromSharedTree,\n\twaitForSummary,\n\tgetEditLogInternal,\n} from './TestUtilities';\n\nfunction revertEditInTree(tree: SharedTree, edit: EditId): EditId | undefined {\n\treturn tree.revert(edit);\n}\n\n// Options for the undo/redo test suite. The undo and redo functions are the same.\nconst undoRedoOptions = {\n\ttitle: 'Revert',\n\tundo: revertEditInTree,\n\tredo: revertEditInTree,\n};\n\n/**\n * Runs a test suite for operations on `SharedTree` writing ops at `writeFormat`.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSharedTreeOperationsTests(\n\ttitle: string,\n\twriteFormat: WriteFormat,\n\tsetUpTestSharedTreeWithDefaultVersion: (options?: SharedTreeTestingOptions) => SharedTreeTestingComponents\n) {\n\tconst setUpTestSharedTree: typeof setUpTestSharedTreeWithDefaultVersion = (options) =>\n\t\tsetUpTestSharedTreeWithDefaultVersion({ writeFormat, ...options });\n\n\t/**\n\t * Convenience bundling of test components.\n\t * Like {@link SharedTreeTestingComponents}, but contains both the {@link SimpleTestTree} and\n\t * its associated {@link TSharedTree}.\n\t */\n\tinterface SharedTreeTest {\n\t\t/**\n\t\t * {@inheritDoc SharedTreeTestingComponents.tree}\n\t\t */\n\t\tsharedTree: SharedTree;\n\n\t\t/**\n\t\t * {@link SimpleTestTree} corresponding to {@link SharedTreeTest.sharedTree}\n\t\t */\n\t\ttestTree: TestTree;\n\n\t\t/**\n\t\t * {@inheritDoc SharedTreeTestingComponents.componentRuntime}\n\t\t */\n\t\tcomponentRuntime: MockFluidDataStoreRuntime;\n\n\t\t/**\n\t\t * {@inheritDoc SharedTreeTestingComponents.containerRuntimeFactory}\n\t\t */\n\t\tcontainerRuntimeFactory: MockContainerRuntimeFactory;\n\t}\n\n\tfunction createSimpleTestTree(options?: SharedTreeTestingOptions): SharedTreeTest {\n\t\tconst { tree: sharedTree, componentRuntime, containerRuntimeFactory } = setUpTestSharedTree(options);\n\t\tconst testTree = setUpTestTree(sharedTree);\n\t\treturn { sharedTree, testTree, componentRuntime, containerRuntimeFactory };\n\t}\n\n\tdescribe(title, () => {\n\t\tconst testSerializer = new TestFluidSerializer();\n\n\t\tdescribe('SharedTree before initialization', () => {\n\t\t\tit('can create a new SharedTree', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree();\n\t\t\t\texpect(tree).to.not.be.undefined;\n\t\t\t});\n\n\t\t\tit('valid without initial tree', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree();\n\t\t\t\texpect(tree.currentView.getTrait(testTrait(tree.currentView))).deep.equals(\n\t\t\t\t\t[],\n\t\t\t\t\t'Root should exist, and child traits should be valid but empty.'\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('SharedTree in local state', () => {\n\t\t\tit('does not emit change events for each change in a batch of changes', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\n\t\t\t\tlet changeCount = 0;\n\t\t\t\tsharedTree.on(SharedTreeEvent.EditCommitted, () => {\n\t\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\t\tconst rightTrait = sharedTree.currentView.getTrait(testTree.right.traitLocation);\n\n\t\t\t\t\texpect(leftTrait.length).to.equal(0); // \"left\" child is deleted...\n\t\t\t\t\texpect(rightTrait.length).to.equal(2); // ...and added to \"right\" trait\n\n\t\t\t\t\tchangeCount += 1;\n\t\t\t\t});\n\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t...Change.move(StableRange.only(testTree.left), StablePlace.after(testTree.right))\n\t\t\t\t);\n\t\t\t\texpect(changeCount).equals(1);\n\t\t\t});\n\n\t\t\tit('can insert a wrapped tree', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\n\t\t\t\tconst childNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst childId = 0;\n\t\t\t\tconst childrenTraitLabel = 'children' as TraitLabel;\n\t\t\t\tconst parentNode = {\n\t\t\t\t\tidentifier: testTree.generateNodeId(),\n\t\t\t\t\tdefinition: 'node',\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\t[childrenTraitLabel]: childId,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst parentId = 1;\n\t\t\t\tconst buildChild = Change.build(childNode, childId);\n\t\t\t\tconst buildParent = Change.build(parentNode, parentId);\n\t\t\t\tconst insertParent = Change.insert(parentId, StablePlace.before(testTree.left));\n\n\t\t\t\tsharedTree.applyEdit(buildChild, buildParent, insertParent);\n\n\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(2);\n\t\t\t\texpect(leftTrait[0]).to.equal(parentNode.identifier);\n\t\t\t\tconst childrenTrait = sharedTree.currentView.getTrait({\n\t\t\t\t\tparent: parentNode.identifier,\n\t\t\t\t\tlabel: childrenTraitLabel,\n\t\t\t\t});\n\t\t\t\texpect(childrenTrait.length).to.equal(1);\n\t\t\t\texpect(childrenTrait[0]).to.equal(childNode.identifier);\n\t\t\t});\n\n\t\t\tit('prevents multi-parenting detached trees', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowMalformed: true });\n\n\t\t\t\tconst childNode = testTree.buildLeaf();\n\t\t\t\tconst childId = 0;\n\t\t\t\tconst childrenTraitLabel = 'children';\n\t\t\t\tconst parentNode: BuildNode = {\n\t\t\t\t\tidentifier: testTree.generateNodeId(),\n\t\t\t\t\tdefinition: 'node',\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\t[childrenTraitLabel]: childId,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst parentNode2: BuildNode = {\n\t\t\t\t\tidentifier: testTree.generateNodeId(),\n\t\t\t\t\tdefinition: 'node',\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\t[childrenTraitLabel]: childId,\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst buildChild = Change.build(childNode, childId);\n\t\t\t\tconst buildParent = Change.build(parentNode, 1);\n\t\t\t\tconst buildParent2 = Change.build(parentNode2, 2);\n\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\t// we don't expect this edit application to change anything\n\t\t\t\t\tsharedTree.applyEdit(buildChild, buildParent, buildParent2);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// TODO:#58052: Make this test pass.\n\t\t\tit.skip('prevents setting the value of a node in a detached subtree', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowInvalid: true });\n\n\t\t\t\tconst detachedNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst detachedSequenceId = 0;\n\t\t\t\tconst { id } = sharedTree.applyEdit(\n\t\t\t\t\tChange.build(detachedNode, detachedSequenceId),\n\t\t\t\t\tChange.setPayload(detachedNode.identifier, 42),\n\t\t\t\t\tChange.insert(detachedSequenceId, StablePlace.before(testTree.left))\n\t\t\t\t);\n\t\t\t\tconst logViewer = sharedTree.logViewer as CachingLogViewer;\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(id)).status).equals(\n\t\t\t\t\tEditStatus.Invalid\n\t\t\t\t);\n\t\t\t\tsharedTree.currentView.assertConsistent();\n\t\t\t});\n\n\t\t\t// TODO:#58052: Make this test pass.\n\t\t\tit.skip('prevents inserting a node in a detached subtree through a local edit', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowInvalid: true });\n\n\t\t\t\tconst detachedNewNode = testTree.buildLeaf();\n\t\t\t\tconst detachedNewNodeSequenceId = 0;\n\t\t\t\tconst detachedRightNodeSequenceId = 1;\n\t\t\t\tconst { id } = sharedTree.applyEdit(\n\t\t\t\t\tChange.build(detachedNewNode, detachedNewNodeSequenceId),\n\t\t\t\t\tChange.detach(StableRange.only(testTree.right), detachedRightNodeSequenceId),\n\t\t\t\t\t// This change attempts to insert a node under a detached node\n\t\t\t\t\tChange.insert(\n\t\t\t\t\t\tdetachedNewNodeSequenceId,\n\t\t\t\t\t\tStablePlace.atStartOf({ parent: testTree.right.identifier, label: 'foo' as TraitLabel })\n\t\t\t\t\t),\n\t\t\t\t\tChange.insert(detachedRightNodeSequenceId, StablePlace.before(testTree.left))\n\t\t\t\t);\n\t\t\t\tconst logViewer = sharedTree.logViewer as CachingLogViewer;\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(id)).status).equals(\n\t\t\t\t\tEditStatus.Invalid\n\t\t\t\t);\n\t\t\t\tsharedTree.currentView.assertConsistent();\n\t\t\t});\n\n\t\t\tit('prevents deletion of the root', () => {\n\t\t\t\tconst { sharedTree } = createSimpleTestTree({ allowInvalid: true });\n\t\t\t\tconst rootId = sharedTree.convertToNodeId(initialTree.identifier);\n\t\t\t\texpect(sharedTree.currentView.hasNode(rootId));\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\t// Try to delete the root\n\t\t\t\t\tsharedTree.applyEdit(Change.delete(StableRange.only(rootId)));\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('can apply multiple local edits without ack from server', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\n\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\t\tsharedTree.applyEdit(...Change.move(StableRange.only(newNode), StablePlace.before(testTree.left)));\n\n\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTrait.length).equals(2);\n\t\t\t\texpect(leftTrait[0]).equals(newNode.identifier);\n\t\t\t});\n\n\t\t\tit('is not equal to a tree with different current views', () => {\n\t\t\t\tconst { sharedTree: sharedTree1 } = createSimpleTestTree();\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.false;\n\t\t\t});\n\n\t\t\tit('is not equal to a tree with the same current view but different edit logs', () => {\n\t\t\t\tconst { sharedTree: sharedTree1 } = createSimpleTestTree();\n\t\t\t\tconst { sharedTree: sharedTree2 } = createSimpleTestTree();\n\n\t\t\t\t// The edits that create the initial tree have different identities.\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.false;\n\t\t\t});\n\n\t\t\tit('tolerates invalid inserts', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowInvalid: true });\n\n\t\t\t\tconst firstNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst secondNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(firstNode, StablePlace.after(testTree.left)));\n\t\t\t\tsharedTree.applyEdit(Change.delete(StableRange.only(firstNode)));\n\n\t\t\t\t// Trying to insert next to the deleted node should drop, confirm that it doesn't\n\t\t\t\t// change the view\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(secondNode, StablePlace.after(firstNode)));\n\t\t\t\t});\n\n\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(1);\n\t\t\t});\n\n\t\t\tit('tolerates invalid detaches', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowInvalid: true });\n\n\t\t\t\tconst firstNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst secondNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst thirdNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t...Change.insertTree([firstNode, secondNode, thirdNode], StablePlace.after(testTree.left))\n\t\t\t\t);\n\t\t\t\tsharedTree.applyEdit(Change.delete(StableRange.only(secondNode)));\n\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\t// Trying to delete from before firstNode to after secondNode should drop\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\tChange.delete(StableRange.from(StablePlace.before(firstNode)).to(StablePlace.after(secondNode)))\n\t\t\t\t\t);\n\n\t\t\t\t\t// Trying to delete from after thirdNode to before firstNode should drop\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\tChange.delete(StableRange.from(StablePlace.after(thirdNode)).to(StablePlace.before(firstNode)))\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\t// Expect that firstNode did not get deleted\n\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(3);\n\t\t\t});\n\n\t\t\tit('tolerates malformed inserts', () => {\n\t\t\t\tconst { sharedTree } = createSimpleTestTree({ allowMalformed: true });\n\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\tsharedTree.applyEdit(Change.build([], 0));\n\t\t\t\t});\n\t\t\t});\n\n\t\t\trunSharedTreeUndoRedoTestSuite({ localMode: true, ...undoRedoOptions });\n\t\t});\n\n\t\tdescribe('SharedTree in connected state with a remote SharedTree', () => {\n\t\t\t/**\n\t\t\t * Initial tree options for multi-tree tests below.\n\t\t\t * Intended to be passed to {@link createSimpleTestTree}.\n\t\t\t */\n\t\t\tconst tree1Options = { localMode: false };\n\n\t\t\t/**\n\t\t\t * Secondary tree options derived from some initial tree.\n\t\t\t */\n\t\t\tfunction createSecondTreeOptions(\n\t\t\t\tcontainerRuntimeFactory: MockContainerRuntimeFactory\n\t\t\t): SharedTreeTestingOptions {\n\t\t\t\treturn {\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\tid: 'secondTestSharedTree',\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tit('should apply remote changes and converge', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree(tree1Options);\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree(createSecondTreeOptions(containerRuntimeFactory));\n\n\t\t\t\tconst newNodeId1 = sharedTree1.generateNodeId();\n\t\t\t\tsharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(newNodeId1)],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree1.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t// Sync initial tree\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst newNodeId2 = translateId(newNodeId1, sharedTree1, sharedTree2);\n\n\t\t\t\t// Both trees should contain 'left'\n\t\t\t\texpect(sharedTree1.currentView.getViewNode(newNodeId1)).to.not.be.undefined;\n\t\t\t\texpect(sharedTree2.currentView.getViewNode(newNodeId2)).to.not.be.undefined;\n\n\t\t\t\tsharedTree2.applyEdit(Change.delete(StableRange.only(newNodeId2)));\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst rootA = sharedTree1.currentView.getViewNode(sharedTree1.currentView.root);\n\t\t\t\texpect(rootA.traits.get(testTraitLabel)).to.be.undefined;\n\n\t\t\t\tconst rootB = sharedTree2.currentView.getViewNode(sharedTree2.currentView.root);\n\t\t\t\texpect(rootB.traits.get(testTraitLabel)).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('converges in the face of concurrent changes', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree(tree1Options);\n\t\t\t\tconst { sharedTree: sharedTree2 } = createSimpleTestTree(\n\t\t\t\t\tcreateSecondTreeOptions(containerRuntimeFactory)\n\t\t\t\t);\n\n\t\t\t\tconst newNodeId1 = sharedTree1.generateNodeId();\n\t\t\t\tsharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(newNodeId1)],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree1.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// First client deletes a trait containing a node in the initial tree\n\t\t\t\tsharedTree1.applyEdit(Change.delete(StableRange.all(testTrait(sharedTree1.currentView))));\n\n\t\t\t\t// Second client concurrently adds a new node to that trait\n\t\t\t\tconst newNodeId2 = sharedTree2.generateNodeId();\n\t\t\t\tsharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(newNodeId2)],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree2.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Second client's change gets sequenced after the deletion, so the trait\n\t\t\t\t// should exist and contain the second new node on both clients after messages are delivered.\n\t\t\t\tconst leftTrait = normalizeIds(\n\t\t\t\t\tsharedTree1,\n\t\t\t\t\t...sharedTree1.currentView.getTrait(testTrait(sharedTree1.currentView))\n\t\t\t\t);\n\t\t\t\tconst secondLeftTrait = normalizeIds(\n\t\t\t\t\tsharedTree2,\n\t\t\t\t\t...sharedTree2.currentView.getTrait(testTrait(sharedTree2.currentView))\n\t\t\t\t);\n\t\t\t\texpect(leftTrait.length).equals(1);\n\t\t\t\texpect(leftTrait[0]).equals(normalizeId(sharedTree2, newNodeId2));\n\t\t\t\texpect(leftTrait).deep.equals(secondLeftTrait);\n\t\t\t});\n\n\t\t\tit('is equal to a tree with the same state', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree(tree1Options);\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree(createSecondTreeOptions(containerRuntimeFactory));\n\t\t\t\tconst newNodeId1 = sharedTree1.generateNodeId();\n\t\t\t\tsharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tidentifier: newNodeId1,\n\t\t\t\t\t\t\t\tdefinition: 'foo',\n\t\t\t\t\t\t\t\ttraits: { left: buildLeaf(), right: buildLeaf() },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree1.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.true;\n\t\t\t\tsharedTree2.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.only(translateId(newNodeId1, sharedTree1, sharedTree2)))\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.true;\n\t\t\t});\n\n\t\t\t// TODO:#58052: Make this test pass.\n\t\t\tit.skip('prevents inserting a node in a detached subtree as the result of merged edits', () => {\n\t\t\t\tconst { testTree } = createSimpleTestTree();\n\n\t\t\t\tconst rootNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tconst parent1Node = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tconst parent2Node = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst parent2Id = parent2Node.identifier;\n\n\t\t\t\tconst childNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst childId = childNode.identifier;\n\n\t\t\t\tconst initialTree = {\n\t\t\t\t\t...rootNode,\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\tparents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t...parent1Node,\n\t\t\t\t\t\t\t\ttraits: { child: childNode },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tparent2Node,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst childTraitUnderParent2 = { parent: parent2Id, label: 'child' as TraitLabel };\n\t\t\t\tconst badTraitUnderChild = { parent: childId, label: 'whatever' as TraitLabel };\n\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tinitialTree,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree({\n\t\t\t\t\t...createSecondTreeOptions(containerRuntimeFactory),\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Move the child under parent2\n\t\t\t\t// This first edit should succeed locally and globally\n\t\t\t\tconst edit1 = sharedTree1.applyEdit(\n\t\t\t\t\t...Change.move(StableRange.only(childId), StablePlace.atStartOf(childTraitUnderParent2))\n\t\t\t\t);\n\n\t\t\t\t// Concurrently move parent2 under child\n\t\t\t\t// This first edit should succeed locally but fail globally\n\t\t\t\tconst edit2 = sharedTree2.applyEdit(\n\t\t\t\t\t...Change.move(StableRange.only(parent2Id), StablePlace.atStartOf(badTraitUnderChild))\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst logViewer = sharedTree1.logViewer as CachingLogViewer;\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(edit1.id)).status).equals(\n\t\t\t\t\tEditStatus.Applied\n\t\t\t\t);\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(edit2.id)).status).equals(\n\t\t\t\t\tEditStatus.Invalid\n\t\t\t\t);\n\t\t\t\tsharedTree1.currentView.assertConsistent();\n\t\t\t});\n\n\t\t\tit('tolerates invalid inserts', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree({\n\t\t\t\t\t...createSecondTreeOptions(containerRuntimeFactory),\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst firstNode2 = buildLeaf(sharedTree2.generateNodeId());\n\t\t\t\tconst firstEdit = sharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(firstNode2, StablePlace.atStartOf(testTrait(sharedTree2.currentView)))\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Concurrently edit, creating invalid insert.\n\t\t\t\t// Create delete. This will apply.\n\t\t\t\tconst secondEdit = sharedTree1.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.only(translateId(firstNode2, sharedTree2, sharedTree1)))\n\t\t\t\t);\n\n\t\t\t\tlet thirdEdit;\n\t\t\t\tassertNoDelta(sharedTree1, () => {\n\t\t\t\t\t// concurrently insert next to the deleted node: this will become invalid.\n\t\t\t\t\tconst secondNode2 = buildLeaf();\n\t\t\t\t\tthirdEdit = sharedTree2.applyEdit(...Change.insertTree(secondNode2, StablePlace.after(firstNode2)));\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t});\n\n\t\t\t\tconst leftTrait = sharedTree2.currentView.getTrait(testTrait(sharedTree2.currentView));\n\t\t\t\texpect(leftTrait.length).to.equal(0);\n\n\t\t\t\tconst editIds = sharedTree1.edits.editIds;\n\n\t\t\t\texpect(editIds[0]).is.equal(firstEdit.id);\n\t\t\t\texpect(editIds[1]).is.equal(secondEdit.id);\n\t\t\t\texpect(editIds[2]).is.equal(thirdEdit.id);\n\t\t\t});\n\n\t\t\tit('tolerates invalid detaches', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree(createSecondTreeOptions(containerRuntimeFactory));\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst firstNode2 = buildLeaf(sharedTree2.generateNodeId());\n\t\t\t\tconst secondNode2 = buildLeaf(sharedTree2.generateNodeId());\n\t\t\t\tconst thirdNode = buildLeaf();\n\t\t\t\tconst firstEdit = sharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[firstNode2, secondNode2, thirdNode],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree2.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Create delete. This will apply.\n\t\t\t\tconst secondEdit = sharedTree1.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.only(translateId(secondNode2, sharedTree2, sharedTree1)))\n\t\t\t\t);\n\n\t\t\t\t// concurrently delete from before firstNode to after secondNode: this should become invalid\n\t\t\t\tconst thirdEdit = sharedTree2.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.from(StablePlace.before(firstNode2)).to(StablePlace.after(secondNode2)))\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Expect that firstNode did not get deleted\n\t\t\t\tconst leftTrait = sharedTree1.currentView.getTrait(testTrait(sharedTree1.currentView));\n\t\t\t\texpect(leftTrait.length).to.equal(2);\n\n\t\t\t\tconst editIds = sharedTree1.edits.editIds;\n\t\t\t\texpect(editIds[0]).to.equal(firstEdit.id);\n\t\t\t\texpect(editIds[1]).to.equal(secondEdit.id);\n\t\t\t\texpect(editIds[2]).to.equal(thirdEdit.id);\n\t\t\t});\n\n\t\t\tit('tolerates malformed inserts', () => {\n\t\t\t\tconst { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tallowMalformed: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree(createSecondTreeOptions(containerRuntimeFactory));\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tlet editId!: EditId;\n\t\t\t\tassertNoDelta(sharedTree1, () => {\n\t\t\t\t\tconst build = Change.build([], 0);\n\t\t\t\t\teditId = sharedTree2.applyEdit(build).id;\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t});\n\n\t\t\t\t// Edit 0 creates initial tree\n\t\t\t\texpect(sharedTree1.edits.getIdAtIndex(1)).to.equal(editId);\n\t\t\t});\n\n\t\t\trunSharedTreeUndoRedoTestSuite({ localMode: false, ...undoRedoOptions });\n\n\t\t\t// This is a regression test for documents corrupted by the following github issue:\n\t\t\t// https://github.com/microsoft/FluidFramework/issues/4399\n\t\t\tit('tolerates duplicate edits in trailing operations', () => {\n\t\t\t\tconst { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree(tree1Options);\n\t\t\t\tconst remoteRuntime = containerRuntimeFactory.createContainerRuntime(new MockFluidDataStoreRuntime());\n\t\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\t\t\t\tconst initialEditCount = sharedTree1.edits.length;\n\t\t\t\tsharedTree1.applyEdit(Change.setPayload(sharedTree1.currentView.root, 42));\n\t\t\t\tremoteRuntime.submit(ops[0], /* localOpMetadata */ undefined);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(sharedTree1.edits.length).to.equal(initialEditCount + 1);\n\t\t\t});\n\n\t\t\tit('detects concurrent duplicate IDs', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree({\n\t\t\t\t\t...createSecondTreeOptions(containerRuntimeFactory),\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst duplicateId = 'duplicate';\n\t\t\t\tsharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(sharedTree1.generateNodeId(duplicateId))],\n\t\t\t\t\t\tStablePlace.atEndOf(testTrait(sharedTree1.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tsharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(sharedTree2.generateNodeId(duplicateId))],\n\t\t\t\t\t\tStablePlace.atEndOf(testTrait(sharedTree2.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(sharedTree1.currentView.size).to.equal(2);\n\t\t\t\tconst trait1 = sharedTree1.currentView.getTrait(testTrait(sharedTree1.currentView));\n\t\t\t\texpect(trait1.length).to.equal(1);\n\t\t\t\texpect(sharedTree1.convertToStableNodeId(trait1[0])).to.equal(duplicateId);\n\t\t\t\texpect(sharedTree1.equals(sharedTree2));\n\t\t\t});\n\n\t\t\tif (writeFormat !== WriteFormat.v0_0_2) {\n\t\t\t\t// This is a regression test for an issue where edits containing Fluid handles weren't properly\n\t\t\t\t// serialized by chunk uploading code: rather than use an IFluidSerializer, we previously just\n\t\t\t\t// JSON.stringify'd.\n\t\t\t\tit('can round-trip edits containing handles through chunking', async () => {\n\t\t\t\t\tconst blobbedPayload = 'blobbed-string-payload';\n\t\t\t\t\tconst { tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t});\n\t\t\t\t\tconst testTree = setUpTestTree(tree);\n\n\t\t\t\t\tconst buffer = IsoBuffer.from(blobbedPayload, 'utf8');\n\t\t\t\t\tconst blob = await tree.getRuntime().uploadBlob(buffer);\n\t\t\t\t\tconst nodeWithPayload = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\ttree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(nodeWithPayload, StablePlace.after(testTree.left)),\n\t\t\t\t\t\tChange.setPayload(nodeWithPayload.identifier, { blob })\n\t\t\t\t\t);\n\n\t\t\t\t\t// Apply enough edits for the upload of an edit chunk\n\t\t\t\t\tfor (let i = 0; i < (tree.edits as EditLog).editsPerChunk; i++) {\n\t\t\t\t\t\tapplyNoop(tree);\n\t\t\t\t\t}\n\n\t\t\t\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\t\t\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\t\t\t\t// Wait for the ops to to be submitted and processed across the containers\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\t\t\tconst summary = tree.saveSummary() as SharedTreeSummary;\n\n\t\t\t\t\tconst { editHistory } = summary;\n\t\t\t\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\t\t\t\texpect(editChunks.length).to.equal(2);\n\n\t\t\t\t\tconst chunkHandle = editChunks[0].chunk as FluidEditHandle;\n\t\t\t\t\texpect(typeof chunkHandle.get).to.equal('function');\n\n\t\t\t\t\tconst { tree: secondTree } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t\ttestObjectProvider,\n\t\t\t\t\t});\n\t\t\t\t\tsecondTree.loadSummary(summary);\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\n\t\t\t\t\tconst { blob: blobHandle } = new TreeNodeHandle(\n\t\t\t\t\t\tsecondTree.currentView,\n\t\t\t\t\t\ttranslateId(nodeWithPayload.identifier, tree, secondTree)\n\t\t\t\t\t).payload;\n\t\t\t\t\texpect(blobHandle).to.not.be.undefined;\n\t\t\t\t\tconst blobContents = await blobHandle.get();\n\t\t\t\t\texpect(IsoBuffer.from(blobContents, 'utf8').toString()).to.equal(blobbedPayload);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tdescribe('SharedTree summarizing', () => {\n\t\t\tconst testHandle = new TestFluidHandle();\n\n\t\t\tit('throws error when given bad json input', () => {\n\t\t\t\tassert.throws(() => deserialize('', testSerializer));\n\t\t\t\tassert.throws(() => deserialize('~ malformed JSON ~', testSerializer));\n\t\t\t\tassert.throws(() => deserialize('{ unrecognizedKey: 42 }', testSerializer));\n\t\t\t});\n\n\t\t\tit('correctly handles snapshots of default trees', () => {\n\t\t\t\tconst { tree: uninitializedTree } = setUpTestSharedTree();\n\n\t\t\t\t// Serialize the state of one uninitialized tree into a second tree\n\t\t\t\tconst serialized = serialize(uninitializedTree.saveSummary(), testSerializer, testHandle);\n\t\t\t\tconst parsedTree = deserialize(serialized, testSerializer);\n\t\t\t\tif (writeFormat === WriteFormat.v0_0_2) {\n\t\t\t\t\tconst summary = parsedTree as SharedTreeSummary_0_0_2;\n\t\t\t\t\texpect(summary.sequencedEdits).to.deep.equal([]);\n\t\t\t\t\texpect(deepCompareNodes(summary.currentTree, initialTree)).to.be.true;\n\t\t\t\t} else {\n\t\t\t\t\tconst summary = parsedTree as SharedTreeSummary;\n\t\t\t\t\texpect(summary.editHistory).to.deep.equal({ editChunks: [], editIds: [] });\n\t\t\t\t\texpect(summary.currentTree).to.be.instanceOf(Array);\n\t\t\t\t\texpect(summary.internedStrings).to.have.length(1);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t[true, false].forEach((hasLocalEdits) => {\n\t\t\t\tit(`produces correct snapshot for a tree with ${hasLocalEdits ? 'local' : 'acked'} edits`, async () => {\n\t\t\t\t\t// The initial tree results in an edit.\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlocalMode: hasLocalEdits,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst newNode = testTree.buildLeaf();\n\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.before(testTree.left)));\n\t\t\t\t\tif (!hasLocalEdits) {\n\t\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t}\n\n\t\t\t\t\tconst serialized = serialize(sharedTree.saveSummary(), testSerializer, testHandle);\n\t\t\t\t\tconst treeContent: SharedTreeSummaryBase = JSON.parse(serialized);\n\t\t\t\t\tlet parsedTree: SummaryContents;\n\t\t\t\t\tif (writeFormat === WriteFormat.v0_1_1) {\n\t\t\t\t\t\tparsedTree = new SharedTreeEncoder_0_1_1(true).decodeSummary(treeContent as SharedTreeSummary);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparsedTree = new SharedTreeEncoder_0_0_2(true).decodeSummary(\n\t\t\t\t\t\t\ttreeContent as SharedTreeSummary_0_0_2\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\texpect(parsedTree.currentTree).to.not.be.undefined;\n\t\t\t\t\tconst testRoot = assertArrayOfOne(\n\t\t\t\t\t\tassertNotUndefined(parsedTree.currentTree?.traits[testTree.traitLabel])\n\t\t\t\t\t);\n\t\t\t\t\texpect(testRoot).to.not.be.undefined;\n\t\t\t\t\texpect(testRoot.traits.left).to.not.be.undefined;\n\t\t\t\t\texpect(testRoot.traits.right).to.not.be.undefined;\n\t\t\t\t\texpect(testRoot.traits.left.length).to.equal(2);\n\n\t\t\t\t\tconst editLog: OrderedEditSet<ChangeInternal> = new EditLog(parsedTree.editHistory);\n\n\t\t\t\t\t// Expect there to be a change in the edit history in addition to the one from setUpTestSharedTree\n\t\t\t\t\texpect(editLog.length).to.equal(2);\n\n\t\t\t\t\t// The first operation to be sequenced is the tree init\n\t\t\t\t\tconst treeInitEdit = await editLog.getEditAtIndex(1);\n\t\t\t\t\texpect(treeInitEdit.changes.length).to.equal(2);\n\t\t\t\t\texpect(treeInitEdit.changes[0].type).to.equal(ChangeType.Build);\n\t\t\t\t\texpect(treeInitEdit.changes[1].type).to.equal(ChangeType.Insert);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('can be used to initialize a tree', () => {\n\t\t\t\tconst {\n\t\t\t\t\tsharedTree: sharedTree1,\n\t\t\t\t\ttestTree: testTree1,\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t} = createSimpleTestTree({ localMode: false });\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\n\t\t\t\tconst newNode = testTree1.buildLeaf();\n\n\t\t\t\tsharedTree1.applyEdit(...Change.insertTree(newNode, StablePlace.before(testTree1.left)));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tsharedTree2.loadSummary(sharedTree1.saveSummary());\n\n\t\t\t\t// Trees should have equal state since we deserialized the first tree's state into the second tree\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.true;\n\t\t\t});\n\n\t\t\tit('can be used to initialize a tree with an empty edit list', () => {\n\t\t\t\tconst { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree({ localMode: false });\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// The second tree is not caught up to the first tree yet\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.false;\n\n\t\t\t\tsharedTree2.loadSummary(sharedTree1.saveSummary());\n\n\t\t\t\t// Trees should have equal state since we deserialized the first tree's state into the second tree\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.true;\n\t\t\t});\n\n\t\t\tit('asserts when loading a summary with duplicated edits', () => {\n\t\t\t\tconst {\n\t\t\t\t\tsharedTree: sharedTree1,\n\t\t\t\t\ttestTree: testTree1,\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t} = createSimpleTestTree({\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t\tsummarizeHistory: true,\n\t\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\n\t\t\t\tconst newNode = testTree1.buildLeaf();\n\n\t\t\t\tsharedTree1.applyEdit(...Change.insertTree(newNode, StablePlace.before(testTree1.left)));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst summary = sharedTree1.saveSummary() as SharedTreeSummary_0_0_2;\n\t\t\t\tconst sequencedEdits = assertNotUndefined(summary.sequencedEdits).slice();\n\t\t\t\tsequencedEdits.push(sequencedEdits[0]);\n\t\t\t\tconst corruptedSummary = {\n\t\t\t\t\t...summary,\n\t\t\t\t\tsequencedEdits,\n\t\t\t\t};\n\t\t\t\texpect(() => sharedTree2.loadSummary(corruptedSummary))\n\t\t\t\t\t.to.throw(Error)\n\t\t\t\t\t.that.has.property('message')\n\t\t\t\t\t.which.matches(/Duplicate/);\n\t\t\t});\n\n\t\t\tit('can be used without history preservation', async () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({\n\t\t\t\t\tlocalMode: true,\n\t\t\t\t\tsummarizeHistory: false,\n\t\t\t\t});\n\n\t\t\t\tconst newNode = testTree.buildLeaf();\n\t\t\t\tconst { id } = sharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.before(testTree.left)));\n\t\t\t\tconst treeBefore = convertTreeNodes<ChangeNode, ChangeNode_0_0_2>(\n\t\t\t\t\tgetChangeNodeFromView(sharedTree.currentView),\n\t\t\t\t\t(node) => convertNodeDataIds(node, (id) => sharedTree.convertToStableNodeId(id))\n\t\t\t\t);\n\t\t\t\tconst summary = sharedTree.saveSummary();\n\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\n\t\t\t\tsharedTree2.loadSummary(summary);\n\t\t\t\tconst treeAfter = convertTreeNodes<ChangeNode, ChangeNode_0_0_2>(\n\t\t\t\t\tgetChangeNodeFromView(sharedTree2.currentView),\n\t\t\t\t\t(node) => convertNodeDataIds(node, (id) => sharedTree2.convertToStableNodeId(id))\n\t\t\t\t);\n\t\t\t\t// The current state of the tree should be identical to the one contained in the old summary.\n\t\t\t\texpect(deepCompareNodes(treeBefore, treeAfter)).to.be.true;\n\n\t\t\t\t// The history should have been dropped by the default handling behavior.\n\t\t\t\t// It will contain a single entry setting the tree to equal the head revision.\n\t\t\t\texpect(sharedTree2.edits.length).to.equal(1);\n\t\t\t\texpect(await sharedTree2.edits.tryGetEdit(id)).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('correctly handles payloads at the root', () => {\n\t\t\t\tconst payload = 'foo';\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ summarizeHistory: false });\n\t\t\t\ttree.applyEdit(Change.setPayload(tree.currentView.root, payload));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst summary = tree.saveSummary();\n\t\t\t\tconst { tree: tree2 } = setUpTestSharedTree({ summarizeHistory: false });\n\t\t\t\ttree2.loadSummary(summary);\n\t\t\t\texpect(tree2.currentView.tryGetViewNode(tree2.currentView.root)?.payload).to.equal(payload);\n\t\t\t});\n\n\t\t\t// TODO:#49901: Enable these tests once we write edit chunk handles to summaries\n\t\t\tit.skip('does not swallow errors in asynchronous blob uploading', async () => {\n\t\t\t\tconst errorMessage = 'Simulated exception in uploadBlob';\n\t\t\t\tconst { sharedTree, testTree, componentRuntime, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t});\n\t\t\t\tcomponentRuntime.uploadBlob = async () => {\n\t\t\t\t\tthrow new Error(errorMessage);\n\t\t\t\t};\n\n\t\t\t\tlet treeErrorEventWasInvoked = false;\n\t\t\t\tsharedTree.on('error', (error: unknown) => {\n\t\t\t\t\ttreeErrorEventWasInvoked = true;\n\t\t\t\t\texpect(error).to.have.property('message').which.equals(errorMessage);\n\t\t\t\t});\n\n\t\t\t\t// Generate enough edits to cause a chunk upload.\n\t\t\t\tfor (let i = 0; i < (sharedTree.edits as EditLog).editsPerChunk / 2 + 1; i++) {\n\t\t\t\t\tconst insertee = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(insertee, StablePlace.before(testTree.left)));\n\t\t\t\t\tsharedTree.applyEdit(Change.delete(StableRange.only(insertee)));\n\t\t\t\t}\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tsharedTree.saveSummary();\n\n\t\t\t\t// Just waiting for the ChunksEmitted event here isn't sufficient, as the SharedTree error\n\t\t\t\t// will propagate in a separate promise chain.\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 0));\n\t\t\t\texpect(treeErrorEventWasInvoked).to.equal(true, 'SharedTree error was never raised');\n\t\t\t});\n\t\t});\n\n\t\tdescribe('handles', () => {\n\t\t\tit('can reference a node', () => {\n\t\t\t\t// Test that a handle can wrap a node and retrieve that node's properties\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst leftHandle = new TreeNodeHandle(sharedTree.currentView, testTree.left.identifier);\n\t\t\t\texpect(areNodesEquivalent(testTree.left, leftHandle)).to.be.true;\n\t\t\t\texpect(areNodesEquivalent(testTree.right, leftHandle)).to.be.false;\n\t\t\t});\n\n\t\t\tit('can create handles from children', () => {\n\t\t\t\t// Test that when retrieving children via the \"traits\" property of a handle, the\n\t\t\t\t// children are also wrapped in handles\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst rootHandle = new TreeNodeHandle(sharedTree.currentView, testTree.identifier);\n\t\t\t\texpect(areNodesEquivalent(testTree, rootHandle)).to.be.true;\n\t\t\t\tconst leftHandle = rootHandle.traits.left[0];\n\t\t\t\texpect(areNodesEquivalent(testTree.left, leftHandle)).to.be.true;\n\t\t\t\texpect(leftHandle instanceof TreeNodeHandle).to.be.true;\n\t\t\t});\n\n\t\t\tit('do not update when the current view of the tree changes', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst leftHandle = new TreeNodeHandle(sharedTree.currentView, testTree.left.identifier);\n\t\t\t\texpect(leftHandle.traits.right).to.be.undefined;\n\t\t\t\t// Move \"right\" under \"left\"\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t...Change.move(\n\t\t\t\t\t\tStableRange.only(testTree.right),\n\t\t\t\t\t\tStablePlace.atStartOf({ parent: testTree.left.identifier, label: testTree.right.traitLabel })\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\texpect(leftHandle.traits.right).to.be.undefined;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('telemetry', () => {\n\t\t\tdescribe('useFailedSequencedEditTelemetry', () => {\n\t\t\t\tit('decorates events with the correct properties', async () => {\n\t\t\t\t\t// Test that a handle can wrap a node and retrieve that node's properties\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\t});\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\t// Invalid edit\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t// Force demand, which will cause a telemetry event for the invalid edit to be emitted\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).is.greaterThan(0);\n\t\t\t\t\tevents.forEach((event) => {\n\t\t\t\t\t\texpect(isSharedTreeEvent(event)).is.true;\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tit('is logged for invalid locally generated edits when those edits are sequenced', async () => {\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\t});\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\t// Invalid edit\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\texpect(events.length).equals(0);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t// Force demand, which will cause a telemetry event for the invalid edit to be emitted\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(1);\n\t\t\t\t\texpect(events[0].category).equals('generic');\n\t\t\t\t\texpect(events[0].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');\n\t\t\t\t});\n\n\t\t\t\tit('can be disabled and re-enabled', async () => {\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\t});\n\t\t\t\t\tconst { disable } = useFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\texpect(events.length).equals(0);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(1);\n\t\t\t\t\texpect(events[0].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');\n\n\t\t\t\t\tdisable();\n\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(1);\n\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(2);\n\t\t\t\t\texpect(events[1].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');\n\t\t\t\t});\n\n\t\t\t\tit('is not logged for valid edits', async () => {\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t});\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left)));\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(0);\n\t\t\t\t});\n\n\t\t\t\tit('is not logged for remote edits', async () => {\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\t\tlocalMode: false,\n\t\t\t\t\t});\n\t\t\t\t\tconst { sharedTree: sharedTree2, testTree: testTree2 } = createSimpleTestTree({\n\t\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t\tid: 'secondTestSharedTree',\n\t\t\t\t\t\tlocalMode: false,\n\t\t\t\t\t});\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree1);\n\n\t\t\t\t\tsharedTree2.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree2.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree2.buildLeaf(testTree2.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(0);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tdescribe('Events', () => {\n\t\t\tit('fires an event when an edit is committed', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\n\t\t\t\tlet eventCount = 0;\n\t\t\t\tlet editIdFromEvent: EditId | undefined;\n\t\t\t\tsharedTree.on(SharedTreeEvent.EditCommitted, (args: EditCommittedEventArguments) => {\n\t\t\t\t\texpect(args.local).true;\n\t\t\t\t\texpect(args.tree).equals(sharedTree);\n\t\t\t\t\teditIdFromEvent = args.editId;\n\t\t\t\t\teventCount += 1;\n\t\t\t\t});\n\n\t\t\t\t// Invalid change\n\t\t\t\tconst invalidEdit = sharedTree.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\texpect(editIdFromEvent).equals(invalidEdit.id);\n\t\t\t\texpect(eventCount).equals(1);\n\n\t\t\t\t// Valid change\n\t\t\t\tconst { id } = sharedTree.applyEdit(\n\t\t\t\t\t...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left))\n\t\t\t\t);\n\t\t\t\texpect(editIdFromEvent).equals(id);\n\t\t\t\texpect(eventCount).equals(2);\n\t\t\t});\n\n\t\t\tit('fires an event when a sequenced edit is applied', async () => {\n\t\t\t\tconst {\n\t\t\t\t\tsharedTree: sharedTree1,\n\t\t\t\t\ttestTree,\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t} = createSimpleTestTree({\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\tid: 'secondTestSharedTree',\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t});\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tawait sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\n\t\t\t\tconst eventArgs: SequencedEditAppliedEventArguments[] = [];\n\t\t\t\tsharedTree1.on(SharedTreeEvent.SequencedEditApplied, (args: SequencedEditAppliedEventArguments) =>\n\t\t\t\t\teventArgs.push(args)\n\t\t\t\t);\n\n\t\t\t\t// Invalid change\n\t\t\t\tconst change = Change.setPayload(testTree.generateNodeId(), 42);\n\t\t\t\tconst invalidEdit = sharedTree1.applyEdit(change);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tawait sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\n\t\t\t\texpect(eventArgs.length).equals(1);\n\t\t\t\texpect(eventArgs[0].edit.id).equals(invalidEdit.id);\n\t\t\t\texpect(eventArgs[0].wasLocal).equals(true);\n\t\t\t\texpect(eventArgs[0].reconciliationPath.length).equals(0);\n\t\t\t\texpect(eventArgs[0].outcome.status).equals(EditStatus.Invalid);\n\n\t\t\t\t// Valid change\n\t\t\t\tconst validEdit1 = sharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\tStablePlace.after(testTree.left.translateId(sharedTree2))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t// Valid change\n\t\t\t\tconst validEdit2 = sharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left))\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tawait sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\n\t\t\t\texpect(eventArgs.length).equals(3);\n\t\t\t\texpect(eventArgs[1].edit.id).equals(validEdit1.id);\n\t\t\t\texpect(eventArgs[1].wasLocal).equals(false);\n\t\t\t\texpect(eventArgs[1].reconciliationPath.length).equals(0);\n\t\t\t\texpect(eventArgs[1].outcome.status).equals(EditStatus.Applied);\n\n\t\t\t\texpect(eventArgs[2].edit.id).equals(validEdit2.id);\n\t\t\t\texpect(eventArgs[2].wasLocal).equals(true);\n\t\t\t\texpect(eventArgs[2].reconciliationPath.length).equals(1);\n\t\t\t\texpect(eventArgs[2].outcome.status).equals(EditStatus.Applied);\n\t\t\t});\n\t\t});\n\n\t\t/**\n\t\t * This test is a slightly minified regression test for an issue discovered by fuzz testing.\n\t\t * It demonstrates issues with clients using writeFormat v0.1.1 and mixed `summarizeHistory` values.\n\t\t * The problem is illustrated by the following scenario:\n\t\t * 1. Client A and client B join a session. A does not summarize history, but B does.\n\t\t * 2. A is elected to be the summarizer.\n\t\t * 3. Client A and B make 50 edits (half a chunks' worth), then idle.\n\t\t * 4. Client A summarizes. Since it does not summarize history, the summary it produces has a single edit.\n\t\t * 5. Client C joins, configured to write history.\n\t\t * 6. The three clients collaborate further for another 50/51 edits.\n\t\t *\n\t\t * At this point in time, client B thinks the first edit chunk is full, but client C thinks it's only half-full.\n\t\t * The entire edit compression scheme is built upon assuming clients agree where the chunk boundaries are, so this\n\t\t * generally leads to correctness issues. The fuzz test reproed a similar scenario, and what ultimately caused\n\t\t * failure is a newly-loaded client being shocked at a chunk with `startRevision: 400` uploaded (when it thinks\n\t\t * there has only been one edit).\n\t\t *\n\t\t * To fix this, we need to incorporate a scheme where all clients agree on chunk boundaries (e.g., by including the\n\t\t * total number of edits even in no-history summaries).\n\t\t *\n\t\t * In the meantime, we are forbidding collaboration of no-history clients and history clients.\n\t\t */\n\t\tit('can be initialized on multiple clients with different `summarizeHistory` values', async () => {\n\t\t\tconst { tree, testObjectProvider, container } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t});\n\t\t\ttestObjectProvider.logger.registerExpectedEvent(\n\t\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' }\n\t\t\t);\n\n\t\t\tapplyNoop(tree);\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\tconst firstSummaryVersion = await waitForSummary(container);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat,\n\t\t\t\ttestObjectProvider,\n\t\t\t\tsummarizeHistory: true,\n\t\t\t\theaders: { [LoaderHeader.version]: firstSummaryVersion },\n\t\t\t});\n\n\t\t\t// Apply enough edits for the upload of a few edit chunks, and some extra so future chunks are misaligned\n\t\t\tfor (let i = 0; i < (5 * editsPerChunk) / 2; i++) {\n\t\t\t\tapplyNoop(tree);\n\t\t\t}\n\n\t\t\tconst secondSummaryVersion = await waitForSummary(container);\n\n\t\t\tconst { tree: tree3 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat,\n\t\t\t\ttestObjectProvider,\n\t\t\t\tsummarizeHistory: true,\n\t\t\t\theaders: { [LoaderHeader.version]: secondSummaryVersion },\n\t\t\t});\n\n\t\t\t// Verify we loaded a no-history summary.\n\t\t\texpect(tree3.edits.length).to.equal(1);\n\n\t\t\tlet unexpectedHistoryChunkCount = 0;\n\t\t\ttree3.on(SharedTreeDiagnosticEvent.UnexpectedHistoryChunk, () => unexpectedHistoryChunkCount++);\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t// Apply enough edits to guarantee another chunk upload occurs.\n\t\t\tfor (let i = 0; i < editsPerChunk; i++) {\n\t\t\t\tapplyNoop(tree2);\n\t\t\t}\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t// If tree 2 didn't change its write format, it would attempt to upload the above chunk with start revision 200, which is past\n\t\t\t// how many sequenced edits tree 3 thinks there are.\n\t\t\texpect(unexpectedHistoryChunkCount).to.equal(0);\n\t\t}).timeout(/* double summarization can take some time */ 20000);\n\n\t\t// This functionality was only implemented in format 0.1.1.\n\t\tif (writeFormat !== WriteFormat.v0_0_2) {\n\t\t\tdescribe('String interning and tree compression', () => {\n\t\t\t\tfunction getMutableStringInterner(tree: SharedTree): MutableStringInterner {\n\t\t\t\t\tconst summary = tree.saveSummary();\n\t\t\t\t\tswitch (summary.version) {\n\t\t\t\t\t\tcase WriteFormat.v0_0_2:\n\t\t\t\t\t\t\treturn new MutableStringInterner();\n\t\t\t\t\t\tcase WriteFormat.v0_1_1:\n\t\t\t\t\t\t\treturn new MutableStringInterner((summary as SharedTreeSummary).internedStrings);\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tfail(`Invalid summary format: ${summary.version}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tit('compress ops via interning and tree compression and decompress when processing edits', () => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tsharedTree: tree,\n\t\t\t\t\t\ttestTree,\n\t\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t} = createSimpleTestTree({ writeFormat });\n\t\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ containerRuntimeFactory, writeFormat });\n\t\t\t\t\tconst remoteRuntime = containerRuntimeFactory.createContainerRuntime(\n\t\t\t\t\t\tnew MockFluidDataStoreRuntime()\n\t\t\t\t\t);\n\n\t\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\ttree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\t\t\ttree.applyEdit(...Change.move(StableRange.only(newNode), StablePlace.before(testTree.left)));\n\n\t\t\t\t\t// Unit testing the interning of ops requires access violation since factory and messages are protected.\n\t\t\t\t\ttype WithFactory<T> = T & { factory: MockContainerRuntimeFactory };\n\t\t\t\t\ttype WithMessages<T> = T & { messages: ISequencedDocumentMessage[] };\n\t\t\t\t\tconst factory = (remoteRuntime as unknown as WithFactory<MockContainerRuntime>).factory;\n\t\t\t\t\tconst messages = (factory as unknown as WithMessages<MockContainerRuntimeFactory>).messages;\n\n\t\t\t\t\texpect(messages.length).to.equal(3);\n\t\t\t\t\tfor (const message of messages.slice(1)) {\n\t\t\t\t\t\t// After the initial setup edit, common definitions should be interned\n\t\t\t\t\t\tfor (const change of (message.contents as SharedTreeEditOp).edit.changes) {\n\t\t\t\t\t\t\tif (change.type === ChangeTypeInternal.CompressedBuild) {\n\t\t\t\t\t\t\t\tconst stringifiedContents = JSON.stringify(message.contents);\n\t\t\t\t\t\t\t\texpect(stringifiedContents).to.not.include(SimpleTestTree.leftTraitLabel);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.false;\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tconst { internedStrings } = tree.saveSummary() as SharedTreeSummary;\n\n\t\t\t\t\tconst log = getEditLogInternal(tree);\n\t\t\t\t\tconst log2 = getEditLogInternal(secondTree);\n\t\t\t\t\tconst insertEdit = normalizeEdit(tree, log.getEditInSessionAtIndex(1));\n\t\t\t\t\tconst moveEdit = normalizeEdit(tree, log.getEditInSessionAtIndex(2));\n\t\t\t\t\tconst insertEdit2 = normalizeEdit(secondTree, log2.getEditInSessionAtIndex(1));\n\t\t\t\t\tconst moveEdit2 = normalizeEdit(secondTree, log2.getEditInSessionAtIndex(2));\n\t\t\t\t\texpect(insertEdit).to.deep.equal(insertEdit2);\n\t\t\t\t\texpect(moveEdit).to.deep.equal(moveEdit2);\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t\t\texpect(internedStrings).to.include(SimpleTestTree.leftTraitLabel);\n\t\t\t\t\texpect(internedStrings).to.include(newNode.definition);\n\t\t\t\t});\n\n\t\t\t\tit('compress summaries via interning and tree compression on save and decompress on load', () => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tsharedTree: tree,\n\t\t\t\t\t\ttestTree: testTree,\n\t\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t} = createSimpleTestTree({ writeFormat });\n\n\t\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\ttree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\t\t\ttree.applyEdit(...Change.move(StableRange.only(newNode), StablePlace.before(testTree.left)));\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t\tconst summary = tree.saveSummary() as SharedTreeSummary;\n\t\t\t\t\texpect(summary.internedStrings).to.not.be.undefined;\n\t\t\t\t\texpect(summary.internedStrings.length).to.equal(5);\n\n\t\t\t\t\tconst interner = new MutableStringInterner(summary.internedStrings);\n\t\t\t\t\tconst treeCompressor = new InterningTreeCompressor();\n\t\t\t\t\tconst expectedCompressedTree = treeCompressor.compress(\n\t\t\t\t\t\tgetChangeNodeFromView(tree.currentView),\n\t\t\t\t\t\tinterner,\n\t\t\t\t\t\tsequencedIdNormalizer(getIdNormalizerFromSharedTree(tree))\n\t\t\t\t\t);\n\n\t\t\t\t\texpect(summary.currentTree).deep.equal(expectedCompressedTree);\n\n\t\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ writeFormat });\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.false;\n\t\t\t\t\tsecondTree.loadSummary(summary);\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t\t});\n\n\t\t\t\tit('compress and decompress edit chunks via interning and tree compression', async () => {\n\t\t\t\t\tconst { tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t});\n\t\t\t\t\tconst testTree = setUpTestTree(tree);\n\n\t\t\t\t\tconst uncompressedEdits: EditWithoutId<ChangeInternal>[] = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tchanges: getEditLogInternal(tree).getEditInSessionAtIndex(0).changes,\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\n\t\t\t\t\t// Apply enough edits for the upload of an edit chunk\n\t\t\t\t\tfor (let i = 0; i < (tree.edits as EditLog).editsPerChunk - 1; i++) {\n\t\t\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\t\tconst edit = tree.applyEditInternal(\n\t\t\t\t\t\t\tChangeInternal.insertTree([newNode], StablePlace.after(testTree.left))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tuncompressedEdits.push({ changes: edit.changes });\n\t\t\t\t\t}\n\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\t\t\tconst interner = getMutableStringInterner(tree);\n\t\t\t\t\tconst expectedCompressedEdits: readonly EditWithoutId<CompressedChangeInternal<OpSpaceNodeId>>[] =\n\t\t\t\t\t\tnew SharedTreeEncoder_0_1_1(true).encodeEditChunk(\n\t\t\t\t\t\t\tuncompressedEdits,\n\t\t\t\t\t\t\tsequencedIdNormalizer(testTree),\n\t\t\t\t\t\t\tinterner\n\t\t\t\t\t\t).edits;\n\n\t\t\t\t\t// Apply one more edit so that an edit chunk gets uploaded\n\t\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\ttree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\n\t\t\t\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\t\t\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\t\t\t\t// Wait for the ops to to be submitted and processed across the containers\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\t\t\tconst summary = tree.saveSummary() as SharedTreeSummary;\n\n\t\t\t\t\tconst { editHistory } = summary;\n\t\t\t\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\t\t\t\texpect(editChunks.length).to.equal(2);\n\n\t\t\t\t\tconst handle = editChunks[0].chunk as FluidEditHandle;\n\t\t\t\t\texpect(typeof handle.get).to.equal('function');\n\t\t\t\t\tconst chunkContents: EditChunkContents = JSON.parse(IsoBuffer.from(await handle.get()).toString());\n\t\t\t\t\texpect(chunkContents.edits).to.deep.equal(expectedCompressedEdits);\n\n\t\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ writeFormat });\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.false;\n\t\t\t\t\tsecondTree.loadSummary(summary);\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t\t\texpect((await tree.edits.getEditAtIndex(2)).id).to.equal(\n\t\t\t\t\t\t(await secondTree.edits.getEditAtIndex(2)).id\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tdescribe('mergeEditsFrom', () => {\n\t\t\tconst getTestTreeRootHandle = (tree: SharedTree, testTree: TestTree): TreeNodeHandle => {\n\t\t\t\tconst view = tree.currentView;\n\t\t\t\tconst handle = new TreeNodeHandle(view, view.root);\n\t\t\t\treturn handle.traits[testTree.traitLabel][0];\n\t\t\t};\n\n\t\t\tit('can be used with simple edits', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst { sharedTree: sharedTree2, testTree: testTree2 } = createSimpleTestTree();\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left)));\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.all({ parent: testTree.identifier, label: testTree.right.traitLabel }))\n\t\t\t\t);\n\t\t\t\tconst preEditRootHandle = getTestTreeRootHandle(sharedTree2, testTree2);\n\t\t\t\tconst edits = [0, 1, 2].map((i) => sharedTree.edits.getEditInSessionAtIndex(i));\n\t\t\t\t// Since the TestTree setup edit is a `setTrait`, this should wipe `testTree2` state.\n\t\t\t\tsharedTree2.mergeEditsFrom(sharedTree, edits);\n\t\t\t\texpect(sharedTree2.edits.length).to.equal(4);\n\t\t\t\tconst rootHandle = getTestTreeRootHandle(sharedTree2, testTree2);\n\t\t\t\texpect(preEditRootHandle.identifier).to.not.equal(rootHandle.identifier);\n\t\t\t\texpect(rootHandle.traits[testTree2.left.traitLabel].length).to.equal(2);\n\t\t\t});\n\n\t\t\tit('can be used with a translation map', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst { sharedTree: sharedTree2, testTree: testTree2 } = createSimpleTestTree();\n\t\t\t\t// For each of the identities in the simple test tree...\n\t\t\t\tconst nodeIdGetters: ((tree: TestTree) => NodeId)[] = [\n\t\t\t\t\t(tree) => tree.identifier,\n\t\t\t\t\t(tree) => tree.left.identifier,\n\t\t\t\t\t(tree) => tree.right.identifier,\n\t\t\t\t];\n\t\t\t\t// Make a map translating that identifier from `testTree` to `testTree2`\n\t\t\t\tconst translationMap = new Map(\n\t\t\t\t\tnodeIdGetters.map((getter) => [\n\t\t\t\t\t\tsharedTree.convertToStableNodeId(getter(testTree)),\n\t\t\t\t\t\tsharedTree2.convertToStableNodeId(getter(testTree2)),\n\t\t\t\t\t])\n\t\t\t\t);\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left)));\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.all({ parent: testTree.identifier, label: testTree.right.traitLabel }))\n\t\t\t\t);\n\t\t\t\tconst edits = [1, 2].map((i) => sharedTree.edits.getEditInSessionAtIndex(i));\n\t\t\t\tsharedTree2.mergeEditsFrom(sharedTree, edits, (id) => translationMap.get(id) ?? id);\n\n\t\t\t\tconst root = getTestTreeRootHandle(sharedTree, testTree);\n\t\t\t\tconst root2 = getTestTreeRootHandle(sharedTree2, testTree2);\n\n\t\t\t\tconst leftTrait = root.traits[testTree.left.traitLabel];\n\t\t\t\tconst leftTrait2 = root2.traits[testTree2.left.traitLabel];\n\n\t\t\t\t// Inserted leaves should be equivalent.\n\t\t\t\texpect(leftTrait2.length).to.equal(2);\n\t\t\t\texpect(leftTrait2[1]).to.deep.equal(leftTrait[1]);\n\t\t\t\t// Right subtree should have been deleted.\n\t\t\t\texpect(Object.entries(root2.traits).length).to.equal(1);\n\t\t\t\texpect(root2.traits[testTree2.right.traitLabel]).to.equal(undefined);\n\t\t\t});\n\t\t});\n\t});\n}\n"]}
1
+ {"version":3,"file":"SharedTreeTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeTests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, expect } from 'chai';\nimport { ITelemetryBaseEvent } from '@fluidframework/common-definitions';\nimport { IsoBuffer } from '@fluidframework/common-utils';\nimport { LoaderHeader } from '@fluidframework/container-definitions';\nimport { ISequencedDocumentMessage } from '@fluidframework/protocol-definitions';\nimport {\n\tMockContainerRuntime,\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n} from '@fluidframework/test-runtime-utils';\nimport { assertArrayOfOne, assertNotUndefined, fail, isSharedTreeEvent } from '../../Common';\nimport { EditId, NodeId, OpSpaceNodeId, TraitLabel } from '../../Identifiers';\nimport { CachingLogViewer } from '../../LogViewer';\nimport { EditLog, OrderedEditSet } from '../../EditLog';\nimport { initialTree } from '../../InitialTree';\nimport { TreeNodeHandle } from '../../TreeNodeHandle';\nimport { deserialize } from '../../SummaryBackCompatibility';\nimport { useFailedSequencedEditTelemetry } from '../../MergeHealth';\nimport { MutableStringInterner } from '../../StringInterner';\nimport { getChangeNodeFromView } from '../../SerializationUtilities';\nimport { EditCommittedEventArguments, SequencedEditAppliedEventArguments, SharedTree } from '../../SharedTree';\nimport {\n\tChangeInternal,\n\tChangeNode,\n\tChangeNode_0_0_2,\n\tChangeTypeInternal,\n\tCompressedChangeInternal,\n\tEditChunkContents,\n\teditsPerChunk,\n\tEditStatus,\n\tEditWithoutId,\n\tFluidEditHandle,\n\tSharedTreeEditOp,\n\tSharedTreeSummary,\n\tSharedTreeSummaryBase,\n\tSharedTreeSummary_0_0_2,\n\tWriteFormat,\n} from '../../persisted-types';\nimport { SharedTreeDiagnosticEvent, SharedTreeEvent } from '../../EventTypes';\nimport { BuildNode, Change, ChangeType, StablePlace, StableRange } from '../../ChangeTypes';\nimport { convertTreeNodes, deepCompareNodes } from '../../EditUtilities';\nimport { serialize, SummaryContents } from '../../Summary';\nimport { InterningTreeCompressor } from '../../TreeCompressor';\nimport { SharedTreeEncoder_0_0_2, SharedTreeEncoder_0_1_1 } from '../../SharedTreeEncoder';\nimport { sequencedIdNormalizer } from '../../NodeIdUtilities';\nimport { convertNodeDataIds } from '../../IdConversion';\nimport { buildLeaf, SimpleTestTree, TestTree } from './TestNode';\nimport { TestFluidHandle, TestFluidSerializer } from './TestSerializer';\nimport { runSharedTreeUndoRedoTestSuite } from './UndoRedoTests';\nimport {\n\tareNodesEquivalent,\n\tassertNoDelta,\n\tSharedTreeTestingComponents,\n\tSharedTreeTestingOptions,\n\tsetUpTestTree,\n\ttestTrait,\n\ttestTraitLabel,\n\ttranslateId,\n\tspyOnSubmittedOps,\n\tnormalizeIds,\n\tnormalizeId,\n\tnormalizeEdit,\n\tsetUpLocalServerTestSharedTree,\n\tapplyNoop,\n\tgetIdNormalizerFromSharedTree,\n\twaitForSummary,\n\tgetEditLogInternal,\n} from './TestUtilities';\n\nfunction revertEditInTree(tree: SharedTree, edit: EditId): EditId | undefined {\n\treturn tree.revert(edit);\n}\n\n// Options for the undo/redo test suite. The undo and redo functions are the same.\nconst undoRedoOptions = {\n\ttitle: 'Revert',\n\tundo: revertEditInTree,\n\tredo: revertEditInTree,\n};\n\n/**\n * Runs a test suite for operations on `SharedTree` writing ops at `writeFormat`.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSharedTreeOperationsTests(\n\ttitle: string,\n\twriteFormat: WriteFormat,\n\tsetUpTestSharedTreeWithDefaultVersion: (options?: SharedTreeTestingOptions) => SharedTreeTestingComponents\n) {\n\tconst setUpTestSharedTree: typeof setUpTestSharedTreeWithDefaultVersion = (options) =>\n\t\tsetUpTestSharedTreeWithDefaultVersion({ writeFormat, ...options });\n\n\t/**\n\t * Convenience bundling of test components.\n\t * Like {@link SharedTreeTestingComponents}, but contains both the {@link SimpleTestTree} and\n\t * its associated {@link TSharedTree}.\n\t */\n\tinterface SharedTreeTest {\n\t\t/**\n\t\t * {@inheritDoc SharedTreeTestingComponents.tree}\n\t\t */\n\t\tsharedTree: SharedTree;\n\n\t\t/**\n\t\t * {@link SimpleTestTree} corresponding to {@link SharedTreeTest.sharedTree}\n\t\t */\n\t\ttestTree: TestTree;\n\n\t\t/**\n\t\t * {@inheritDoc SharedTreeTestingComponents.componentRuntime}\n\t\t */\n\t\tcomponentRuntime: MockFluidDataStoreRuntime;\n\n\t\t/**\n\t\t * {@inheritDoc SharedTreeTestingComponents.containerRuntimeFactory}\n\t\t */\n\t\tcontainerRuntimeFactory: MockContainerRuntimeFactory;\n\t}\n\n\tfunction createSimpleTestTree(options?: SharedTreeTestingOptions): SharedTreeTest {\n\t\tconst { tree: sharedTree, componentRuntime, containerRuntimeFactory } = setUpTestSharedTree(options);\n\t\tconst testTree = setUpTestTree(sharedTree);\n\t\treturn { sharedTree, testTree, componentRuntime, containerRuntimeFactory };\n\t}\n\n\tdescribe(title, () => {\n\t\tconst testSerializer = new TestFluidSerializer();\n\n\t\tdescribe('SharedTree before initialization', () => {\n\t\t\tit('can create a new SharedTree', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree();\n\t\t\t\texpect(tree).to.not.be.undefined;\n\t\t\t});\n\n\t\t\tit('valid without initial tree', () => {\n\t\t\t\tconst { tree } = setUpTestSharedTree();\n\t\t\t\texpect(tree.currentView.getTrait(testTrait(tree.currentView))).deep.equals(\n\t\t\t\t\t[],\n\t\t\t\t\t'Root should exist, and child traits should be valid but empty.'\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('SharedTree in local state', () => {\n\t\t\tit('does not emit change events for each change in a batch of changes', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\n\t\t\t\tlet changeCount = 0;\n\t\t\t\tsharedTree.on(SharedTreeEvent.EditCommitted, () => {\n\t\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\t\tconst rightTrait = sharedTree.currentView.getTrait(testTree.right.traitLocation);\n\n\t\t\t\t\texpect(leftTrait.length).to.equal(0); // \"left\" child is deleted...\n\t\t\t\t\texpect(rightTrait.length).to.equal(2); // ...and added to \"right\" trait\n\n\t\t\t\t\tchangeCount += 1;\n\t\t\t\t});\n\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t...Change.move(StableRange.only(testTree.left), StablePlace.after(testTree.right))\n\t\t\t\t);\n\t\t\t\texpect(changeCount).equals(1);\n\t\t\t});\n\n\t\t\tit('can insert a wrapped tree', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\n\t\t\t\tconst childNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst childId = 0;\n\t\t\t\tconst childrenTraitLabel = 'children' as TraitLabel;\n\t\t\t\tconst parentNode = {\n\t\t\t\t\tidentifier: testTree.generateNodeId(),\n\t\t\t\t\tdefinition: 'node',\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\t[childrenTraitLabel]: childId,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst parentId = 1;\n\t\t\t\tconst buildChild = Change.build(childNode, childId);\n\t\t\t\tconst buildParent = Change.build(parentNode, parentId);\n\t\t\t\tconst insertParent = Change.insert(parentId, StablePlace.before(testTree.left));\n\n\t\t\t\tsharedTree.applyEdit(buildChild, buildParent, insertParent);\n\n\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(2);\n\t\t\t\texpect(leftTrait[0]).to.equal(parentNode.identifier);\n\t\t\t\tconst childrenTrait = sharedTree.currentView.getTrait({\n\t\t\t\t\tparent: parentNode.identifier,\n\t\t\t\t\tlabel: childrenTraitLabel,\n\t\t\t\t});\n\t\t\t\texpect(childrenTrait.length).to.equal(1);\n\t\t\t\texpect(childrenTrait[0]).to.equal(childNode.identifier);\n\t\t\t});\n\n\t\t\tit('prevents multi-parenting detached trees', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowMalformed: true });\n\n\t\t\t\tconst childNode = testTree.buildLeaf();\n\t\t\t\tconst childId = 0;\n\t\t\t\tconst childrenTraitLabel = 'children';\n\t\t\t\tconst parentNode: BuildNode = {\n\t\t\t\t\tidentifier: testTree.generateNodeId(),\n\t\t\t\t\tdefinition: 'node',\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\t[childrenTraitLabel]: childId,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst parentNode2: BuildNode = {\n\t\t\t\t\tidentifier: testTree.generateNodeId(),\n\t\t\t\t\tdefinition: 'node',\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\t[childrenTraitLabel]: childId,\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst buildChild = Change.build(childNode, childId);\n\t\t\t\tconst buildParent = Change.build(parentNode, 1);\n\t\t\t\tconst buildParent2 = Change.build(parentNode2, 2);\n\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\t// we don't expect this edit application to change anything\n\t\t\t\t\tsharedTree.applyEdit(buildChild, buildParent, buildParent2);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// TODO:#58052: Make this test pass.\n\t\t\tit.skip('prevents setting the value of a node in a detached subtree', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowInvalid: true });\n\n\t\t\t\tconst detachedNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst detachedSequenceId = 0;\n\t\t\t\tconst { id } = sharedTree.applyEdit(\n\t\t\t\t\tChange.build(detachedNode, detachedSequenceId),\n\t\t\t\t\tChange.setPayload(detachedNode.identifier, 42),\n\t\t\t\t\tChange.insert(detachedSequenceId, StablePlace.before(testTree.left))\n\t\t\t\t);\n\t\t\t\tconst logViewer = sharedTree.logViewer as CachingLogViewer;\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(id)).status).equals(\n\t\t\t\t\tEditStatus.Invalid\n\t\t\t\t);\n\t\t\t\tsharedTree.currentView.assertConsistent();\n\t\t\t});\n\n\t\t\t// TODO:#58052: Make this test pass.\n\t\t\tit.skip('prevents inserting a node in a detached subtree through a local edit', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowInvalid: true });\n\n\t\t\t\tconst detachedNewNode = testTree.buildLeaf();\n\t\t\t\tconst detachedNewNodeSequenceId = 0;\n\t\t\t\tconst detachedRightNodeSequenceId = 1;\n\t\t\t\tconst { id } = sharedTree.applyEdit(\n\t\t\t\t\tChange.build(detachedNewNode, detachedNewNodeSequenceId),\n\t\t\t\t\tChange.detach(StableRange.only(testTree.right), detachedRightNodeSequenceId),\n\t\t\t\t\t// This change attempts to insert a node under a detached node\n\t\t\t\t\tChange.insert(\n\t\t\t\t\t\tdetachedNewNodeSequenceId,\n\t\t\t\t\t\tStablePlace.atStartOf({ parent: testTree.right.identifier, label: 'foo' as TraitLabel })\n\t\t\t\t\t),\n\t\t\t\t\tChange.insert(detachedRightNodeSequenceId, StablePlace.before(testTree.left))\n\t\t\t\t);\n\t\t\t\tconst logViewer = sharedTree.logViewer as CachingLogViewer;\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(id)).status).equals(\n\t\t\t\t\tEditStatus.Invalid\n\t\t\t\t);\n\t\t\t\tsharedTree.currentView.assertConsistent();\n\t\t\t});\n\n\t\t\tit('prevents deletion of the root', () => {\n\t\t\t\tconst { sharedTree } = createSimpleTestTree({ allowInvalid: true });\n\t\t\t\tconst rootId = sharedTree.convertToNodeId(initialTree.identifier);\n\t\t\t\texpect(sharedTree.currentView.hasNode(rootId));\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\t// Try to delete the root\n\t\t\t\t\tsharedTree.applyEdit(Change.delete(StableRange.only(rootId)));\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('can apply multiple local edits without ack from server', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\n\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\t\tsharedTree.applyEdit(...Change.move(StableRange.only(newNode), StablePlace.before(testTree.left)));\n\n\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTrait.length).equals(2);\n\t\t\t\texpect(leftTrait[0]).equals(newNode.identifier);\n\t\t\t});\n\n\t\t\tit('is not equal to a tree with different current views', () => {\n\t\t\t\tconst { sharedTree: sharedTree1 } = createSimpleTestTree();\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.false;\n\t\t\t});\n\n\t\t\tit('is not equal to a tree with the same current view but different edit logs', () => {\n\t\t\t\tconst { sharedTree: sharedTree1 } = createSimpleTestTree();\n\t\t\t\tconst { sharedTree: sharedTree2 } = createSimpleTestTree();\n\n\t\t\t\t// The edits that create the initial tree have different identities.\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.false;\n\t\t\t});\n\n\t\t\tit('tolerates invalid inserts', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowInvalid: true });\n\n\t\t\t\tconst firstNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst secondNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(firstNode, StablePlace.after(testTree.left)));\n\t\t\t\tsharedTree.applyEdit(Change.delete(StableRange.only(firstNode)));\n\n\t\t\t\t// Trying to insert next to the deleted node should drop, confirm that it doesn't\n\t\t\t\t// change the view\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(secondNode, StablePlace.after(firstNode)));\n\t\t\t\t});\n\n\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(1);\n\t\t\t});\n\n\t\t\tit('tolerates invalid detaches', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({ allowInvalid: true });\n\n\t\t\t\tconst firstNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst secondNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst thirdNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t...Change.insertTree([firstNode, secondNode, thirdNode], StablePlace.after(testTree.left))\n\t\t\t\t);\n\t\t\t\tsharedTree.applyEdit(Change.delete(StableRange.only(secondNode)));\n\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\t// Trying to delete from before firstNode to after secondNode should drop\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\tChange.delete(StableRange.from(StablePlace.before(firstNode)).to(StablePlace.after(secondNode)))\n\t\t\t\t\t);\n\n\t\t\t\t\t// Trying to delete from after thirdNode to before firstNode should drop\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\tChange.delete(StableRange.from(StablePlace.after(thirdNode)).to(StablePlace.before(firstNode)))\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\t// Expect that firstNode did not get deleted\n\t\t\t\tconst leftTrait = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTrait.length).to.equal(3);\n\t\t\t});\n\n\t\t\tit('tolerates malformed inserts', () => {\n\t\t\t\tconst { sharedTree } = createSimpleTestTree({ allowMalformed: true });\n\n\t\t\t\tassertNoDelta(sharedTree, () => {\n\t\t\t\t\tsharedTree.applyEdit(Change.build([], 0));\n\t\t\t\t});\n\t\t\t});\n\n\t\t\trunSharedTreeUndoRedoTestSuite({ localMode: true, ...undoRedoOptions });\n\t\t});\n\n\t\tdescribe('SharedTree in connected state with a remote SharedTree', () => {\n\t\t\t/**\n\t\t\t * Initial tree options for multi-tree tests below.\n\t\t\t * Intended to be passed to {@link createSimpleTestTree}.\n\t\t\t */\n\t\t\tconst tree1Options = { localMode: false };\n\n\t\t\t/**\n\t\t\t * Secondary tree options derived from some initial tree.\n\t\t\t */\n\t\t\tfunction createSecondTreeOptions(\n\t\t\t\tcontainerRuntimeFactory: MockContainerRuntimeFactory\n\t\t\t): SharedTreeTestingOptions {\n\t\t\t\treturn {\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\tid: 'secondTestSharedTree',\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (writeFormat === WriteFormat.v0_0_2) {\n\t\t\t\tit('applies unversioned ops in the 0.0.2 format', () => {\n\t\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree(tree1Options);\n\t\t\t\t\tconst { sharedTree: sharedTree2, testTree: testTree2 } = createSimpleTestTree(\n\t\t\t\t\t\tcreateSecondTreeOptions(containerRuntimeFactory)\n\t\t\t\t\t);\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tconst originalPushMessage = containerRuntimeFactory.pushMessage.bind(containerRuntimeFactory);\n\t\t\t\t\tcontainerRuntimeFactory.pushMessage = (msg) => {\n\t\t\t\t\t\t// Drop the version property to replicate ops created before the version property existed\n\t\t\t\t\t\tmsg.contents.version = undefined;\n\t\t\t\t\t\toriginalPushMessage(msg);\n\t\t\t\t\t};\n\n\t\t\t\t\t// Ensure that an edit can be passed and processed between two trees as normal\n\t\t\t\t\tsharedTree2.applyEdit(Change.delete(StableRange.only(testTree2.right)));\n\n\t\t\t\t\tconst getTestTreeRoot = (sharedTree: SharedTree) =>\n\t\t\t\t\t\tnew TreeNodeHandle(\n\t\t\t\t\t\t\tsharedTree.currentView,\n\t\t\t\t\t\t\tsharedTree.convertToNodeId(sharedTree2.convertToStableNodeId(testTree2.identifier))\n\t\t\t\t\t\t);\n\n\t\t\t\t\tlet root1 = getTestTreeRoot(sharedTree1);\n\t\t\t\t\tlet root2 = getTestTreeRoot(sharedTree2);\n\n\t\t\t\t\texpect(Array.from(root1.traits[testTree2.right.traitLabel])).to.have.length(1);\n\t\t\t\t\texpect(Array.from(root2.traits[testTree2.right.traitLabel] ?? [])).to.have.length(0);\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t\troot1 = getTestTreeRoot(sharedTree1);\n\t\t\t\t\troot2 = getTestTreeRoot(sharedTree2);\n\t\t\t\t\texpect(Array.from(root1.traits[testTree2.right.traitLabel] ?? [])).to.have.length(0);\n\t\t\t\t\texpect(Array.from(root2.traits[testTree2.right.traitLabel] ?? [])).to.have.length(0);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tit('should apply remote changes and converge', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree(tree1Options);\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree(createSecondTreeOptions(containerRuntimeFactory));\n\n\t\t\t\tconst newNodeId1 = sharedTree1.generateNodeId();\n\t\t\t\tsharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(newNodeId1)],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree1.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t// Sync initial tree\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst newNodeId2 = translateId(newNodeId1, sharedTree1, sharedTree2);\n\n\t\t\t\t// Both trees should contain 'left'\n\t\t\t\texpect(sharedTree1.currentView.getViewNode(newNodeId1)).to.not.be.undefined;\n\t\t\t\texpect(sharedTree2.currentView.getViewNode(newNodeId2)).to.not.be.undefined;\n\n\t\t\t\tsharedTree2.applyEdit(Change.delete(StableRange.only(newNodeId2)));\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst rootA = sharedTree1.currentView.getViewNode(sharedTree1.currentView.root);\n\t\t\t\texpect(rootA.traits.get(testTraitLabel)).to.be.undefined;\n\n\t\t\t\tconst rootB = sharedTree2.currentView.getViewNode(sharedTree2.currentView.root);\n\t\t\t\texpect(rootB.traits.get(testTraitLabel)).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('converges in the face of concurrent changes', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree(tree1Options);\n\t\t\t\tconst { sharedTree: sharedTree2 } = createSimpleTestTree(\n\t\t\t\t\tcreateSecondTreeOptions(containerRuntimeFactory)\n\t\t\t\t);\n\n\t\t\t\tconst newNodeId1 = sharedTree1.generateNodeId();\n\t\t\t\tsharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(newNodeId1)],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree1.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// First client deletes a trait containing a node in the initial tree\n\t\t\t\tsharedTree1.applyEdit(Change.delete(StableRange.all(testTrait(sharedTree1.currentView))));\n\n\t\t\t\t// Second client concurrently adds a new node to that trait\n\t\t\t\tconst newNodeId2 = sharedTree2.generateNodeId();\n\t\t\t\tsharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(newNodeId2)],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree2.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Second client's change gets sequenced after the deletion, so the trait\n\t\t\t\t// should exist and contain the second new node on both clients after messages are delivered.\n\t\t\t\tconst leftTrait = normalizeIds(\n\t\t\t\t\tsharedTree1,\n\t\t\t\t\t...sharedTree1.currentView.getTrait(testTrait(sharedTree1.currentView))\n\t\t\t\t);\n\t\t\t\tconst secondLeftTrait = normalizeIds(\n\t\t\t\t\tsharedTree2,\n\t\t\t\t\t...sharedTree2.currentView.getTrait(testTrait(sharedTree2.currentView))\n\t\t\t\t);\n\t\t\t\texpect(leftTrait.length).equals(1);\n\t\t\t\texpect(leftTrait[0]).equals(normalizeId(sharedTree2, newNodeId2));\n\t\t\t\texpect(leftTrait).deep.equals(secondLeftTrait);\n\t\t\t});\n\n\t\t\tit('is equal to a tree with the same state', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree(tree1Options);\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree(createSecondTreeOptions(containerRuntimeFactory));\n\t\t\t\tconst newNodeId1 = sharedTree1.generateNodeId();\n\t\t\t\tsharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tidentifier: newNodeId1,\n\t\t\t\t\t\t\t\tdefinition: 'foo',\n\t\t\t\t\t\t\t\ttraits: { left: buildLeaf(), right: buildLeaf() },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree1.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.true;\n\t\t\t\tsharedTree2.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.only(translateId(newNodeId1, sharedTree1, sharedTree2)))\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.true;\n\t\t\t});\n\n\t\t\t// TODO:#58052: Make this test pass.\n\t\t\tit.skip('prevents inserting a node in a detached subtree as the result of merged edits', () => {\n\t\t\t\tconst { testTree } = createSimpleTestTree();\n\n\t\t\t\tconst rootNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tconst parent1Node = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tconst parent2Node = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst parent2Id = parent2Node.identifier;\n\n\t\t\t\tconst childNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst childId = childNode.identifier;\n\n\t\t\t\tconst initialTree = {\n\t\t\t\t\t...rootNode,\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\tparents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t...parent1Node,\n\t\t\t\t\t\t\t\ttraits: { child: childNode },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tparent2Node,\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst childTraitUnderParent2 = { parent: parent2Id, label: 'child' as TraitLabel };\n\t\t\t\tconst badTraitUnderChild = { parent: childId, label: 'whatever' as TraitLabel };\n\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tinitialTree,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree({\n\t\t\t\t\t...createSecondTreeOptions(containerRuntimeFactory),\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Move the child under parent2\n\t\t\t\t// This first edit should succeed locally and globally\n\t\t\t\tconst edit1 = sharedTree1.applyEdit(\n\t\t\t\t\t...Change.move(StableRange.only(childId), StablePlace.atStartOf(childTraitUnderParent2))\n\t\t\t\t);\n\n\t\t\t\t// Concurrently move parent2 under child\n\t\t\t\t// This first edit should succeed locally but fail globally\n\t\t\t\tconst edit2 = sharedTree2.applyEdit(\n\t\t\t\t\t...Change.move(StableRange.only(parent2Id), StablePlace.atStartOf(badTraitUnderChild))\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst logViewer = sharedTree1.logViewer as CachingLogViewer;\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(edit1.id)).status).equals(\n\t\t\t\t\tEditStatus.Applied\n\t\t\t\t);\n\t\t\t\texpect(logViewer.getEditResultInSession(logViewer.log.getIndexOfId(edit2.id)).status).equals(\n\t\t\t\t\tEditStatus.Invalid\n\t\t\t\t);\n\t\t\t\tsharedTree1.currentView.assertConsistent();\n\t\t\t});\n\n\t\t\tit('tolerates invalid inserts', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree({\n\t\t\t\t\t...createSecondTreeOptions(containerRuntimeFactory),\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst firstNode2 = buildLeaf(sharedTree2.generateNodeId());\n\t\t\t\tconst firstEdit = sharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(firstNode2, StablePlace.atStartOf(testTrait(sharedTree2.currentView)))\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Concurrently edit, creating invalid insert.\n\t\t\t\t// Create delete. This will apply.\n\t\t\t\tconst secondEdit = sharedTree1.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.only(translateId(firstNode2, sharedTree2, sharedTree1)))\n\t\t\t\t);\n\n\t\t\t\tlet thirdEdit;\n\t\t\t\tassertNoDelta(sharedTree1, () => {\n\t\t\t\t\t// concurrently insert next to the deleted node: this will become invalid.\n\t\t\t\t\tconst secondNode2 = buildLeaf();\n\t\t\t\t\tthirdEdit = sharedTree2.applyEdit(...Change.insertTree(secondNode2, StablePlace.after(firstNode2)));\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t});\n\n\t\t\t\tconst leftTrait = sharedTree2.currentView.getTrait(testTrait(sharedTree2.currentView));\n\t\t\t\texpect(leftTrait.length).to.equal(0);\n\n\t\t\t\tconst editIds = sharedTree1.edits.editIds;\n\n\t\t\t\texpect(editIds[0]).is.equal(firstEdit.id);\n\t\t\t\texpect(editIds[1]).is.equal(secondEdit.id);\n\t\t\t\texpect(editIds[2]).is.equal(thirdEdit.id);\n\t\t\t});\n\n\t\t\tit('tolerates invalid detaches', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree(createSecondTreeOptions(containerRuntimeFactory));\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst firstNode2 = buildLeaf(sharedTree2.generateNodeId());\n\t\t\t\tconst secondNode2 = buildLeaf(sharedTree2.generateNodeId());\n\t\t\t\tconst thirdNode = buildLeaf();\n\t\t\t\tconst firstEdit = sharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[firstNode2, secondNode2, thirdNode],\n\t\t\t\t\t\tStablePlace.atStartOf(testTrait(sharedTree2.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Create delete. This will apply.\n\t\t\t\tconst secondEdit = sharedTree1.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.only(translateId(secondNode2, sharedTree2, sharedTree1)))\n\t\t\t\t);\n\n\t\t\t\t// concurrently delete from before firstNode to after secondNode: this should become invalid\n\t\t\t\tconst thirdEdit = sharedTree2.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.from(StablePlace.before(firstNode2)).to(StablePlace.after(secondNode2)))\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Expect that firstNode did not get deleted\n\t\t\t\tconst leftTrait = sharedTree1.currentView.getTrait(testTrait(sharedTree1.currentView));\n\t\t\t\texpect(leftTrait.length).to.equal(2);\n\n\t\t\t\tconst editIds = sharedTree1.edits.editIds;\n\t\t\t\texpect(editIds[0]).to.equal(firstEdit.id);\n\t\t\t\texpect(editIds[1]).to.equal(secondEdit.id);\n\t\t\t\texpect(editIds[2]).to.equal(thirdEdit.id);\n\t\t\t});\n\n\t\t\tit('tolerates malformed inserts', () => {\n\t\t\t\tconst { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tallowMalformed: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree(createSecondTreeOptions(containerRuntimeFactory));\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tlet editId!: EditId;\n\t\t\t\tassertNoDelta(sharedTree1, () => {\n\t\t\t\t\tconst build = Change.build([], 0);\n\t\t\t\t\teditId = sharedTree2.applyEdit(build).id;\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t});\n\n\t\t\t\t// Edit 0 creates initial tree\n\t\t\t\texpect(sharedTree1.edits.getIdAtIndex(1)).to.equal(editId);\n\t\t\t});\n\n\t\t\trunSharedTreeUndoRedoTestSuite({ localMode: false, ...undoRedoOptions });\n\n\t\t\t// This is a regression test for documents corrupted by the following github issue:\n\t\t\t// https://github.com/microsoft/FluidFramework/issues/4399\n\t\t\tit('tolerates duplicate edits in trailing operations', () => {\n\t\t\t\tconst { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree(tree1Options);\n\t\t\t\tconst remoteRuntime = containerRuntimeFactory.createContainerRuntime(new MockFluidDataStoreRuntime());\n\t\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\t\t\t\tconst initialEditCount = sharedTree1.edits.length;\n\t\t\t\tsharedTree1.applyEdit(Change.setPayload(sharedTree1.currentView.root, 42));\n\t\t\t\tremoteRuntime.submit(ops[0], /* localOpMetadata */ undefined);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(sharedTree1.edits.length).to.equal(initialEditCount + 1);\n\t\t\t});\n\n\t\t\tit('detects concurrent duplicate IDs', () => {\n\t\t\t\tconst { tree: sharedTree1, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t\t...tree1Options,\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree({\n\t\t\t\t\t...createSecondTreeOptions(containerRuntimeFactory),\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t});\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tconst duplicateId = 'duplicate';\n\t\t\t\tsharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(sharedTree1.generateNodeId(duplicateId))],\n\t\t\t\t\t\tStablePlace.atEndOf(testTrait(sharedTree1.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\tsharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[buildLeaf(sharedTree2.generateNodeId(duplicateId))],\n\t\t\t\t\t\tStablePlace.atEndOf(testTrait(sharedTree2.currentView))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(sharedTree1.currentView.size).to.equal(2);\n\t\t\t\tconst trait1 = sharedTree1.currentView.getTrait(testTrait(sharedTree1.currentView));\n\t\t\t\texpect(trait1.length).to.equal(1);\n\t\t\t\texpect(sharedTree1.convertToStableNodeId(trait1[0])).to.equal(duplicateId);\n\t\t\t\texpect(sharedTree1.equals(sharedTree2));\n\t\t\t});\n\n\t\t\tif (writeFormat !== WriteFormat.v0_0_2) {\n\t\t\t\t// This is a regression test for an issue where edits containing Fluid handles weren't properly\n\t\t\t\t// serialized by chunk uploading code: rather than use an IFluidSerializer, we previously just\n\t\t\t\t// JSON.stringify'd.\n\t\t\t\tit('can round-trip edits containing handles through chunking', async () => {\n\t\t\t\t\tconst blobbedPayload = 'blobbed-string-payload';\n\t\t\t\t\tconst { tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t});\n\t\t\t\t\tconst testTree = setUpTestTree(tree);\n\n\t\t\t\t\tconst buffer = IsoBuffer.from(blobbedPayload, 'utf8');\n\t\t\t\t\tconst blob = await tree.getRuntime().uploadBlob(buffer);\n\t\t\t\t\tconst nodeWithPayload = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\ttree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(nodeWithPayload, StablePlace.after(testTree.left)),\n\t\t\t\t\t\tChange.setPayload(nodeWithPayload.identifier, { blob })\n\t\t\t\t\t);\n\n\t\t\t\t\t// Apply enough edits for the upload of an edit chunk\n\t\t\t\t\tfor (let i = 0; i < (tree.edits as EditLog).editsPerChunk; i++) {\n\t\t\t\t\t\tapplyNoop(tree);\n\t\t\t\t\t}\n\n\t\t\t\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\t\t\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\t\t\t\t// Wait for the ops to to be submitted and processed across the containers\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\t\t\tconst summary = tree.saveSummary() as SharedTreeSummary;\n\n\t\t\t\t\tconst { editHistory } = summary;\n\t\t\t\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\t\t\t\texpect(editChunks.length).to.equal(2);\n\n\t\t\t\t\tconst chunkHandle = editChunks[0].chunk as FluidEditHandle;\n\t\t\t\t\texpect(typeof chunkHandle.get).to.equal('function');\n\n\t\t\t\t\tconst { tree: secondTree } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t\ttestObjectProvider,\n\t\t\t\t\t});\n\t\t\t\t\tsecondTree.loadSummary(summary);\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\n\t\t\t\t\tconst { blob: blobHandle } = new TreeNodeHandle(\n\t\t\t\t\t\tsecondTree.currentView,\n\t\t\t\t\t\ttranslateId(nodeWithPayload.identifier, tree, secondTree)\n\t\t\t\t\t).payload;\n\t\t\t\t\texpect(blobHandle).to.not.be.undefined;\n\t\t\t\t\tconst blobContents = await blobHandle.get();\n\t\t\t\t\texpect(IsoBuffer.from(blobContents, 'utf8').toString()).to.equal(blobbedPayload);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tdescribe('SharedTree summarizing', () => {\n\t\t\tconst testHandle = new TestFluidHandle();\n\n\t\t\tit('throws error when given bad json input', () => {\n\t\t\t\tassert.throws(() => deserialize('', testSerializer));\n\t\t\t\tassert.throws(() => deserialize('~ malformed JSON ~', testSerializer));\n\t\t\t\tassert.throws(() => deserialize('{ unrecognizedKey: 42 }', testSerializer));\n\t\t\t});\n\n\t\t\tit('correctly handles snapshots of default trees', () => {\n\t\t\t\tconst { tree: uninitializedTree } = setUpTestSharedTree();\n\n\t\t\t\t// Serialize the state of one uninitialized tree into a second tree\n\t\t\t\tconst serialized = serialize(uninitializedTree.saveSummary(), testSerializer, testHandle);\n\t\t\t\tconst parsedTree = deserialize(serialized, testSerializer);\n\t\t\t\tif (writeFormat === WriteFormat.v0_0_2) {\n\t\t\t\t\tconst summary = parsedTree as SharedTreeSummary_0_0_2;\n\t\t\t\t\texpect(summary.sequencedEdits).to.deep.equal([]);\n\t\t\t\t\texpect(deepCompareNodes(summary.currentTree, initialTree)).to.be.true;\n\t\t\t\t} else {\n\t\t\t\t\tconst summary = parsedTree as SharedTreeSummary;\n\t\t\t\t\texpect(summary.editHistory).to.deep.equal({ editChunks: [], editIds: [] });\n\t\t\t\t\texpect(summary.currentTree).to.be.instanceOf(Array);\n\t\t\t\t\texpect(summary.internedStrings).to.have.length(1);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t[true, false].forEach((hasLocalEdits) => {\n\t\t\t\tit(`produces correct snapshot for a tree with ${hasLocalEdits ? 'local' : 'acked'} edits`, async () => {\n\t\t\t\t\t// The initial tree results in an edit.\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlocalMode: hasLocalEdits,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst newNode = testTree.buildLeaf();\n\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.before(testTree.left)));\n\t\t\t\t\tif (!hasLocalEdits) {\n\t\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t}\n\n\t\t\t\t\tconst serialized = serialize(sharedTree.saveSummary(), testSerializer, testHandle);\n\t\t\t\t\tconst treeContent: SharedTreeSummaryBase = JSON.parse(serialized);\n\t\t\t\t\tlet parsedTree: SummaryContents;\n\t\t\t\t\tif (writeFormat === WriteFormat.v0_1_1) {\n\t\t\t\t\t\tparsedTree = new SharedTreeEncoder_0_1_1(true).decodeSummary(treeContent as SharedTreeSummary);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparsedTree = new SharedTreeEncoder_0_0_2(true).decodeSummary(\n\t\t\t\t\t\t\ttreeContent as SharedTreeSummary_0_0_2\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\texpect(parsedTree.currentTree).to.not.be.undefined;\n\t\t\t\t\tconst testRoot = assertArrayOfOne(\n\t\t\t\t\t\tassertNotUndefined(parsedTree.currentTree?.traits[testTree.traitLabel])\n\t\t\t\t\t);\n\t\t\t\t\texpect(testRoot).to.not.be.undefined;\n\t\t\t\t\texpect(testRoot.traits.left).to.not.be.undefined;\n\t\t\t\t\texpect(testRoot.traits.right).to.not.be.undefined;\n\t\t\t\t\texpect(testRoot.traits.left.length).to.equal(2);\n\n\t\t\t\t\tconst editLog: OrderedEditSet<ChangeInternal> = new EditLog(parsedTree.editHistory);\n\n\t\t\t\t\t// Expect there to be a change in the edit history in addition to the one from setUpTestSharedTree\n\t\t\t\t\texpect(editLog.length).to.equal(2);\n\n\t\t\t\t\t// The first operation to be sequenced is the tree init\n\t\t\t\t\tconst treeInitEdit = await editLog.getEditAtIndex(1);\n\t\t\t\t\texpect(treeInitEdit.changes.length).to.equal(2);\n\t\t\t\t\texpect(treeInitEdit.changes[0].type).to.equal(ChangeType.Build);\n\t\t\t\t\texpect(treeInitEdit.changes[1].type).to.equal(ChangeType.Insert);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('can be used to initialize a tree', () => {\n\t\t\t\tconst {\n\t\t\t\t\tsharedTree: sharedTree1,\n\t\t\t\t\ttestTree: testTree1,\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t} = createSimpleTestTree({ localMode: false });\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\n\t\t\t\tconst newNode = testTree1.buildLeaf();\n\n\t\t\t\tsharedTree1.applyEdit(...Change.insertTree(newNode, StablePlace.before(testTree1.left)));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\tsharedTree2.loadSummary(sharedTree1.saveSummary());\n\n\t\t\t\t// Trees should have equal state since we deserialized the first tree's state into the second tree\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.true;\n\t\t\t});\n\n\t\t\tit('can be used to initialize a tree with an empty edit list', () => {\n\t\t\t\tconst { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree({ localMode: false });\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// The second tree is not caught up to the first tree yet\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.false;\n\n\t\t\t\tsharedTree2.loadSummary(sharedTree1.saveSummary());\n\n\t\t\t\t// Trees should have equal state since we deserialized the first tree's state into the second tree\n\t\t\t\texpect(sharedTree1.equals(sharedTree2)).to.be.true;\n\t\t\t});\n\n\t\t\tit('asserts when loading a summary with duplicated edits', () => {\n\t\t\t\tconst {\n\t\t\t\t\tsharedTree: sharedTree1,\n\t\t\t\t\ttestTree: testTree1,\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t} = createSimpleTestTree({\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t\tsummarizeHistory: true,\n\t\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\n\t\t\t\tconst newNode = testTree1.buildLeaf();\n\n\t\t\t\tsharedTree1.applyEdit(...Change.insertTree(newNode, StablePlace.before(testTree1.left)));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst summary = sharedTree1.saveSummary() as SharedTreeSummary_0_0_2;\n\t\t\t\tconst sequencedEdits = assertNotUndefined(summary.sequencedEdits).slice();\n\t\t\t\tsequencedEdits.push(sequencedEdits[0]);\n\t\t\t\tconst corruptedSummary = {\n\t\t\t\t\t...summary,\n\t\t\t\t\tsequencedEdits,\n\t\t\t\t};\n\t\t\t\texpect(() => sharedTree2.loadSummary(corruptedSummary))\n\t\t\t\t\t.to.throw(Error)\n\t\t\t\t\t.that.has.property('message')\n\t\t\t\t\t.which.matches(/Duplicate/);\n\t\t\t});\n\n\t\t\tit('can be used without history preservation', async () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree({\n\t\t\t\t\tlocalMode: true,\n\t\t\t\t\tsummarizeHistory: false,\n\t\t\t\t});\n\n\t\t\t\tconst newNode = testTree.buildLeaf();\n\t\t\t\tconst { id } = sharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.before(testTree.left)));\n\t\t\t\tconst treeBefore = convertTreeNodes<ChangeNode, ChangeNode_0_0_2>(\n\t\t\t\t\tgetChangeNodeFromView(sharedTree.currentView),\n\t\t\t\t\t(node) => convertNodeDataIds(node, (id) => sharedTree.convertToStableNodeId(id))\n\t\t\t\t);\n\t\t\t\tconst summary = sharedTree.saveSummary();\n\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree();\n\n\t\t\t\tsharedTree2.loadSummary(summary);\n\t\t\t\tconst treeAfter = convertTreeNodes<ChangeNode, ChangeNode_0_0_2>(\n\t\t\t\t\tgetChangeNodeFromView(sharedTree2.currentView),\n\t\t\t\t\t(node) => convertNodeDataIds(node, (id) => sharedTree2.convertToStableNodeId(id))\n\t\t\t\t);\n\t\t\t\t// The current state of the tree should be identical to the one contained in the old summary.\n\t\t\t\texpect(deepCompareNodes(treeBefore, treeAfter)).to.be.true;\n\n\t\t\t\t// The history should have been dropped by the default handling behavior.\n\t\t\t\t// It will contain a single entry setting the tree to equal the head revision.\n\t\t\t\texpect(sharedTree2.edits.length).to.equal(1);\n\t\t\t\texpect(await sharedTree2.edits.tryGetEdit(id)).to.be.undefined;\n\t\t\t});\n\n\t\t\tit('correctly handles payloads at the root', () => {\n\t\t\t\tconst payload = 'foo';\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ summarizeHistory: false });\n\t\t\t\ttree.applyEdit(Change.setPayload(tree.currentView.root, payload));\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tconst summary = tree.saveSummary();\n\t\t\t\tconst { tree: tree2 } = setUpTestSharedTree({ summarizeHistory: false });\n\t\t\t\ttree2.loadSummary(summary);\n\t\t\t\texpect(tree2.currentView.tryGetViewNode(tree2.currentView.root)?.payload).to.equal(payload);\n\t\t\t});\n\n\t\t\t// TODO:#49901: Enable these tests once we write edit chunk handles to summaries\n\t\t\tit.skip('does not swallow errors in asynchronous blob uploading', async () => {\n\t\t\t\tconst errorMessage = 'Simulated exception in uploadBlob';\n\t\t\t\tconst { sharedTree, testTree, componentRuntime, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t});\n\t\t\t\tcomponentRuntime.uploadBlob = async () => {\n\t\t\t\t\tthrow new Error(errorMessage);\n\t\t\t\t};\n\n\t\t\t\tlet treeErrorEventWasInvoked = false;\n\t\t\t\tsharedTree.on('error', (error: unknown) => {\n\t\t\t\t\ttreeErrorEventWasInvoked = true;\n\t\t\t\t\texpect(error).to.have.property('message').which.equals(errorMessage);\n\t\t\t\t});\n\n\t\t\t\t// Generate enough edits to cause a chunk upload.\n\t\t\t\tfor (let i = 0; i < (sharedTree.edits as EditLog).editsPerChunk / 2 + 1; i++) {\n\t\t\t\t\tconst insertee = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(insertee, StablePlace.before(testTree.left)));\n\t\t\t\t\tsharedTree.applyEdit(Change.delete(StableRange.only(insertee)));\n\t\t\t\t}\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tsharedTree.saveSummary();\n\n\t\t\t\t// Just waiting for the ChunksEmitted event here isn't sufficient, as the SharedTree error\n\t\t\t\t// will propagate in a separate promise chain.\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 0));\n\t\t\t\texpect(treeErrorEventWasInvoked).to.equal(true, 'SharedTree error was never raised');\n\t\t\t});\n\t\t});\n\n\t\tdescribe('handles', () => {\n\t\t\tit('can reference a node', () => {\n\t\t\t\t// Test that a handle can wrap a node and retrieve that node's properties\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst leftHandle = new TreeNodeHandle(sharedTree.currentView, testTree.left.identifier);\n\t\t\t\texpect(areNodesEquivalent(testTree.left, leftHandle)).to.be.true;\n\t\t\t\texpect(areNodesEquivalent(testTree.right, leftHandle)).to.be.false;\n\t\t\t});\n\n\t\t\tit('can create handles from children', () => {\n\t\t\t\t// Test that when retrieving children via the \"traits\" property of a handle, the\n\t\t\t\t// children are also wrapped in handles\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst rootHandle = new TreeNodeHandle(sharedTree.currentView, testTree.identifier);\n\t\t\t\texpect(areNodesEquivalent(testTree, rootHandle)).to.be.true;\n\t\t\t\tconst leftHandle = rootHandle.traits.left[0];\n\t\t\t\texpect(areNodesEquivalent(testTree.left, leftHandle)).to.be.true;\n\t\t\t\texpect(leftHandle instanceof TreeNodeHandle).to.be.true;\n\t\t\t});\n\n\t\t\tit('do not update when the current view of the tree changes', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst leftHandle = new TreeNodeHandle(sharedTree.currentView, testTree.left.identifier);\n\t\t\t\texpect(leftHandle.traits.right).to.be.undefined;\n\t\t\t\t// Move \"right\" under \"left\"\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t...Change.move(\n\t\t\t\t\t\tStableRange.only(testTree.right),\n\t\t\t\t\t\tStablePlace.atStartOf({ parent: testTree.left.identifier, label: testTree.right.traitLabel })\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\texpect(leftHandle.traits.right).to.be.undefined;\n\t\t\t});\n\t\t});\n\n\t\tdescribe('telemetry', () => {\n\t\t\tdescribe('useFailedSequencedEditTelemetry', () => {\n\t\t\t\tit('decorates events with the correct properties', async () => {\n\t\t\t\t\t// Test that a handle can wrap a node and retrieve that node's properties\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\t});\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\t// Invalid edit\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t// Force demand, which will cause a telemetry event for the invalid edit to be emitted\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).is.greaterThan(0);\n\t\t\t\t\tevents.forEach((event) => {\n\t\t\t\t\t\texpect(isSharedTreeEvent(event)).is.true;\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tit('is logged for invalid locally generated edits when those edits are sequenced', async () => {\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\t});\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\t// Invalid edit\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\texpect(events.length).equals(0);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t// Force demand, which will cause a telemetry event for the invalid edit to be emitted\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(1);\n\t\t\t\t\texpect(events[0].category).equals('generic');\n\t\t\t\t\texpect(events[0].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');\n\t\t\t\t});\n\n\t\t\t\tit('can be disabled and re-enabled', async () => {\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\t});\n\t\t\t\t\tconst { disable } = useFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\texpect(events.length).equals(0);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(1);\n\t\t\t\t\texpect(events[0].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');\n\n\t\t\t\t\tdisable();\n\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(1);\n\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(2);\n\t\t\t\t\texpect(events[1].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');\n\t\t\t\t});\n\n\t\t\t\tit('is not logged for valid edits', async () => {\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t});\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree);\n\n\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left)));\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(0);\n\t\t\t\t});\n\n\t\t\t\tit('is not logged for remote edits', async () => {\n\t\t\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\t\t\tconst { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree({\n\t\t\t\t\t\tlogger: { send: (event) => events.push(event) },\n\t\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\t\tlocalMode: false,\n\t\t\t\t\t});\n\t\t\t\t\tconst { sharedTree: sharedTree2, testTree: testTree2 } = createSimpleTestTree({\n\t\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t\tid: 'secondTestSharedTree',\n\t\t\t\t\t\tlocalMode: false,\n\t\t\t\t\t});\n\t\t\t\t\tuseFailedSequencedEditTelemetry(sharedTree1);\n\n\t\t\t\t\tsharedTree2.applyEdit(\n\t\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t\t[testTree2.buildLeaf()],\n\t\t\t\t\t\t\tStablePlace.after(testTree2.buildLeaf(testTree2.generateNodeId()))\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tawait sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\t\t\t\t\texpect(events.length).equals(0);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tdescribe('Events', () => {\n\t\t\tit('fires an event when an edit is committed', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\n\t\t\t\tlet eventCount = 0;\n\t\t\t\tlet editIdFromEvent: EditId | undefined;\n\t\t\t\tsharedTree.on(SharedTreeEvent.EditCommitted, (args: EditCommittedEventArguments) => {\n\t\t\t\t\texpect(args.local).true;\n\t\t\t\t\texpect(args.tree).equals(sharedTree);\n\t\t\t\t\teditIdFromEvent = args.editId;\n\t\t\t\t\teventCount += 1;\n\t\t\t\t});\n\n\t\t\t\t// Invalid change\n\t\t\t\tconst invalidEdit = sharedTree.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\tStablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\texpect(editIdFromEvent).equals(invalidEdit.id);\n\t\t\t\texpect(eventCount).equals(1);\n\n\t\t\t\t// Valid change\n\t\t\t\tconst { id } = sharedTree.applyEdit(\n\t\t\t\t\t...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left))\n\t\t\t\t);\n\t\t\t\texpect(editIdFromEvent).equals(id);\n\t\t\t\texpect(eventCount).equals(2);\n\t\t\t});\n\n\t\t\tit('fires an event when a sequenced edit is applied', async () => {\n\t\t\t\tconst {\n\t\t\t\t\tsharedTree: sharedTree1,\n\t\t\t\t\ttestTree,\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t} = createSimpleTestTree({\n\t\t\t\t\tallowInvalid: true,\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t});\n\t\t\t\tconst { tree: sharedTree2 } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\tid: 'secondTestSharedTree',\n\t\t\t\t\tlocalMode: false,\n\t\t\t\t});\n\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tawait sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\n\t\t\t\tconst eventArgs: SequencedEditAppliedEventArguments[] = [];\n\t\t\t\tsharedTree1.on(SharedTreeEvent.SequencedEditApplied, (args: SequencedEditAppliedEventArguments) =>\n\t\t\t\t\teventArgs.push(args)\n\t\t\t\t);\n\n\t\t\t\t// Invalid change\n\t\t\t\tconst change = Change.setPayload(testTree.generateNodeId(), 42);\n\t\t\t\tconst invalidEdit = sharedTree1.applyEdit(change);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tawait sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\n\t\t\t\texpect(eventArgs.length).equals(1);\n\t\t\t\texpect(eventArgs[0].edit.id).equals(invalidEdit.id);\n\t\t\t\texpect(eventArgs[0].wasLocal).equals(true);\n\t\t\t\texpect(eventArgs[0].reconciliationPath.length).equals(0);\n\t\t\t\texpect(eventArgs[0].outcome.status).equals(EditStatus.Invalid);\n\n\t\t\t\t// Valid change\n\t\t\t\tconst validEdit1 = sharedTree2.applyEdit(\n\t\t\t\t\t...Change.insertTree(\n\t\t\t\t\t\t[testTree.buildLeaf()],\n\t\t\t\t\t\tStablePlace.after(testTree.left.translateId(sharedTree2))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t// Valid change\n\t\t\t\tconst validEdit2 = sharedTree1.applyEdit(\n\t\t\t\t\t...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left))\n\t\t\t\t);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\tawait sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);\n\n\t\t\t\texpect(eventArgs.length).equals(3);\n\t\t\t\texpect(eventArgs[1].edit.id).equals(validEdit1.id);\n\t\t\t\texpect(eventArgs[1].wasLocal).equals(false);\n\t\t\t\texpect(eventArgs[1].reconciliationPath.length).equals(0);\n\t\t\t\texpect(eventArgs[1].outcome.status).equals(EditStatus.Applied);\n\n\t\t\t\texpect(eventArgs[2].edit.id).equals(validEdit2.id);\n\t\t\t\texpect(eventArgs[2].wasLocal).equals(true);\n\t\t\t\texpect(eventArgs[2].reconciliationPath.length).equals(1);\n\t\t\t\texpect(eventArgs[2].outcome.status).equals(EditStatus.Applied);\n\t\t\t});\n\t\t});\n\n\t\t/**\n\t\t * This test is a slightly minified regression test for an issue discovered by fuzz testing.\n\t\t * It demonstrates issues with clients using writeFormat v0.1.1 and mixed `summarizeHistory` values.\n\t\t * The problem is illustrated by the following scenario:\n\t\t * 1. Client A and client B join a session. A does not summarize history, but B does.\n\t\t * 2. A is elected to be the summarizer.\n\t\t * 3. Client A and B make 50 edits (half a chunks' worth), then idle.\n\t\t * 4. Client A summarizes. Since it does not summarize history, the summary it produces has a single edit.\n\t\t * 5. Client C joins, configured to write history.\n\t\t * 6. The three clients collaborate further for another 50/51 edits.\n\t\t *\n\t\t * At this point in time, client B thinks the first edit chunk is full, but client C thinks it's only half-full.\n\t\t * The entire edit compression scheme is built upon assuming clients agree where the chunk boundaries are, so this\n\t\t * generally leads to correctness issues. The fuzz test reproed a similar scenario, and what ultimately caused\n\t\t * failure is a newly-loaded client being shocked at a chunk with `startRevision: 400` uploaded (when it thinks\n\t\t * there has only been one edit).\n\t\t *\n\t\t * To fix this, we need to incorporate a scheme where all clients agree on chunk boundaries (e.g., by including the\n\t\t * total number of edits even in no-history summaries).\n\t\t *\n\t\t * In the meantime, we are forbidding collaboration of no-history clients and history clients.\n\t\t */\n\t\tit('can be initialized on multiple clients with different `summarizeHistory` values', async () => {\n\t\t\tconst { tree, testObjectProvider, container } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t});\n\t\t\ttestObjectProvider.logger.registerExpectedEvent(\n\t\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' }\n\t\t\t);\n\n\t\t\tapplyNoop(tree);\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\tconst firstSummaryVersion = await waitForSummary(container);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat,\n\t\t\t\ttestObjectProvider,\n\t\t\t\tsummarizeHistory: true,\n\t\t\t\theaders: { [LoaderHeader.version]: firstSummaryVersion },\n\t\t\t});\n\n\t\t\t// Apply enough edits for the upload of a few edit chunks, and some extra so future chunks are misaligned\n\t\t\tfor (let i = 0; i < (5 * editsPerChunk) / 2; i++) {\n\t\t\t\tapplyNoop(tree);\n\t\t\t}\n\n\t\t\tconst secondSummaryVersion = await waitForSummary(container);\n\n\t\t\tconst { tree: tree3 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat,\n\t\t\t\ttestObjectProvider,\n\t\t\t\tsummarizeHistory: true,\n\t\t\t\theaders: { [LoaderHeader.version]: secondSummaryVersion },\n\t\t\t});\n\n\t\t\t// Verify we loaded a no-history summary.\n\t\t\texpect(tree3.edits.length).to.equal(1);\n\n\t\t\tlet unexpectedHistoryChunkCount = 0;\n\t\t\ttree3.on(SharedTreeDiagnosticEvent.UnexpectedHistoryChunk, () => unexpectedHistoryChunkCount++);\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t// Apply enough edits to guarantee another chunk upload occurs.\n\t\t\tfor (let i = 0; i < editsPerChunk; i++) {\n\t\t\t\tapplyNoop(tree2);\n\t\t\t}\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t// If tree 2 didn't change its write format, it would attempt to upload the above chunk with start revision 200, which is past\n\t\t\t// how many sequenced edits tree 3 thinks there are.\n\t\t\texpect(unexpectedHistoryChunkCount).to.equal(0);\n\t\t}).timeout(/* double summarization can take some time */ 20000);\n\n\t\t// This functionality was only implemented in format 0.1.1.\n\t\tif (writeFormat !== WriteFormat.v0_0_2) {\n\t\t\tdescribe('String interning and tree compression', () => {\n\t\t\t\tfunction getMutableStringInterner(tree: SharedTree): MutableStringInterner {\n\t\t\t\t\tconst summary = tree.saveSummary();\n\t\t\t\t\tswitch (summary.version) {\n\t\t\t\t\t\tcase WriteFormat.v0_0_2:\n\t\t\t\t\t\t\treturn new MutableStringInterner();\n\t\t\t\t\t\tcase WriteFormat.v0_1_1:\n\t\t\t\t\t\t\treturn new MutableStringInterner((summary as SharedTreeSummary).internedStrings);\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tfail(`Invalid summary format: ${summary.version}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tit('compress ops via interning and tree compression and decompress when processing edits', () => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tsharedTree: tree,\n\t\t\t\t\t\ttestTree,\n\t\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t} = createSimpleTestTree({ writeFormat });\n\t\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ containerRuntimeFactory, writeFormat });\n\t\t\t\t\tconst remoteRuntime = containerRuntimeFactory.createContainerRuntime(\n\t\t\t\t\t\tnew MockFluidDataStoreRuntime()\n\t\t\t\t\t);\n\n\t\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\ttree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\t\t\ttree.applyEdit(...Change.move(StableRange.only(newNode), StablePlace.before(testTree.left)));\n\n\t\t\t\t\t// Unit testing the interning of ops requires access violation since factory and messages are protected.\n\t\t\t\t\ttype WithFactory<T> = T & { factory: MockContainerRuntimeFactory };\n\t\t\t\t\ttype WithMessages<T> = T & { messages: ISequencedDocumentMessage[] };\n\t\t\t\t\tconst factory = (remoteRuntime as unknown as WithFactory<MockContainerRuntime>).factory;\n\t\t\t\t\tconst messages = (factory as unknown as WithMessages<MockContainerRuntimeFactory>).messages;\n\n\t\t\t\t\texpect(messages.length).to.equal(3);\n\t\t\t\t\tfor (const message of messages.slice(1)) {\n\t\t\t\t\t\t// After the initial setup edit, common definitions should be interned\n\t\t\t\t\t\tfor (const change of (message.contents as SharedTreeEditOp).edit.changes) {\n\t\t\t\t\t\t\tif (change.type === ChangeTypeInternal.CompressedBuild) {\n\t\t\t\t\t\t\t\tconst stringifiedContents = JSON.stringify(message.contents);\n\t\t\t\t\t\t\t\texpect(stringifiedContents).to.not.include(SimpleTestTree.leftTraitLabel);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.false;\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\tconst { internedStrings } = tree.saveSummary() as SharedTreeSummary;\n\n\t\t\t\t\tconst log = getEditLogInternal(tree);\n\t\t\t\t\tconst log2 = getEditLogInternal(secondTree);\n\t\t\t\t\tconst insertEdit = normalizeEdit(tree, log.getEditInSessionAtIndex(1));\n\t\t\t\t\tconst moveEdit = normalizeEdit(tree, log.getEditInSessionAtIndex(2));\n\t\t\t\t\tconst insertEdit2 = normalizeEdit(secondTree, log2.getEditInSessionAtIndex(1));\n\t\t\t\t\tconst moveEdit2 = normalizeEdit(secondTree, log2.getEditInSessionAtIndex(2));\n\t\t\t\t\texpect(insertEdit).to.deep.equal(insertEdit2);\n\t\t\t\t\texpect(moveEdit).to.deep.equal(moveEdit2);\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t\t\texpect(internedStrings).to.include(SimpleTestTree.leftTraitLabel);\n\t\t\t\t\texpect(internedStrings).to.include(newNode.definition);\n\t\t\t\t});\n\n\t\t\t\tit('compress summaries via interning and tree compression on save and decompress on load', () => {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tsharedTree: tree,\n\t\t\t\t\t\ttestTree: testTree,\n\t\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t} = createSimpleTestTree({ writeFormat });\n\n\t\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\ttree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\t\t\ttree.applyEdit(...Change.move(StableRange.only(newNode), StablePlace.before(testTree.left)));\n\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t\t\tconst summary = tree.saveSummary() as SharedTreeSummary;\n\t\t\t\t\texpect(summary.internedStrings).to.not.be.undefined;\n\t\t\t\t\texpect(summary.internedStrings.length).to.equal(5);\n\n\t\t\t\t\tconst interner = new MutableStringInterner(summary.internedStrings);\n\t\t\t\t\tconst treeCompressor = new InterningTreeCompressor();\n\t\t\t\t\tconst expectedCompressedTree = treeCompressor.compress(\n\t\t\t\t\t\tgetChangeNodeFromView(tree.currentView),\n\t\t\t\t\t\tinterner,\n\t\t\t\t\t\tsequencedIdNormalizer(getIdNormalizerFromSharedTree(tree))\n\t\t\t\t\t);\n\n\t\t\t\t\texpect(summary.currentTree).deep.equal(expectedCompressedTree);\n\n\t\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ writeFormat });\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.false;\n\t\t\t\t\tsecondTree.loadSummary(summary);\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t\t});\n\n\t\t\t\tit('compress and decompress edit chunks via interning and tree compression', async () => {\n\t\t\t\t\tconst { tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t});\n\t\t\t\t\tconst testTree = setUpTestTree(tree);\n\n\t\t\t\t\tconst uncompressedEdits: EditWithoutId<ChangeInternal>[] = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tchanges: getEditLogInternal(tree).getEditInSessionAtIndex(0).changes,\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\n\t\t\t\t\t// Apply enough edits for the upload of an edit chunk\n\t\t\t\t\tfor (let i = 0; i < (tree.edits as EditLog).editsPerChunk - 1; i++) {\n\t\t\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\t\tconst edit = tree.applyEditInternal(\n\t\t\t\t\t\t\tChangeInternal.insertTree([newNode], StablePlace.after(testTree.left))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tuncompressedEdits.push({ changes: edit.changes });\n\t\t\t\t\t}\n\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\t\t\tconst interner = getMutableStringInterner(tree);\n\t\t\t\t\tconst expectedCompressedEdits: readonly EditWithoutId<CompressedChangeInternal<OpSpaceNodeId>>[] =\n\t\t\t\t\t\tnew SharedTreeEncoder_0_1_1(true).encodeEditChunk(\n\t\t\t\t\t\t\tuncompressedEdits,\n\t\t\t\t\t\t\tsequencedIdNormalizer(testTree),\n\t\t\t\t\t\t\tinterner\n\t\t\t\t\t\t).edits;\n\n\t\t\t\t\t// Apply one more edit so that an edit chunk gets uploaded\n\t\t\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\t\ttree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\n\t\t\t\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\t\t\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\t\t\t\t// Wait for the ops to to be submitted and processed across the containers\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\t\t\tconst summary = tree.saveSummary() as SharedTreeSummary;\n\n\t\t\t\t\tconst { editHistory } = summary;\n\t\t\t\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\t\t\t\texpect(editChunks.length).to.equal(2);\n\n\t\t\t\t\tconst handle = editChunks[0].chunk as FluidEditHandle;\n\t\t\t\t\texpect(typeof handle.get).to.equal('function');\n\t\t\t\t\tconst chunkContents: EditChunkContents = JSON.parse(IsoBuffer.from(await handle.get()).toString());\n\t\t\t\t\texpect(chunkContents.edits).to.deep.equal(expectedCompressedEdits);\n\n\t\t\t\t\tconst { tree: secondTree } = setUpTestSharedTree({ writeFormat });\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.false;\n\t\t\t\t\tsecondTree.loadSummary(summary);\n\t\t\t\t\texpect(tree.equals(secondTree)).to.be.true;\n\t\t\t\t\texpect((await tree.edits.getEditAtIndex(2)).id).to.equal(\n\t\t\t\t\t\t(await secondTree.edits.getEditAtIndex(2)).id\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tdescribe('mergeEditsFrom', () => {\n\t\t\tconst getTestTreeRootHandle = (tree: SharedTree, testTree: TestTree): TreeNodeHandle => {\n\t\t\t\tconst view = tree.currentView;\n\t\t\t\tconst handle = new TreeNodeHandle(view, view.root);\n\t\t\t\treturn handle.traits[testTree.traitLabel][0];\n\t\t\t};\n\n\t\t\tit('can be used with simple edits', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst { sharedTree: sharedTree2, testTree: testTree2 } = createSimpleTestTree();\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left)));\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.all({ parent: testTree.identifier, label: testTree.right.traitLabel }))\n\t\t\t\t);\n\t\t\t\tconst preEditRootHandle = getTestTreeRootHandle(sharedTree2, testTree2);\n\t\t\t\tconst edits = [0, 1, 2].map((i) => sharedTree.edits.getEditInSessionAtIndex(i));\n\t\t\t\t// Since the TestTree setup edit is a `setTrait`, this should wipe `testTree2` state.\n\t\t\t\tsharedTree2.mergeEditsFrom(sharedTree, edits);\n\t\t\t\texpect(sharedTree2.edits.length).to.equal(4);\n\t\t\t\tconst rootHandle = getTestTreeRootHandle(sharedTree2, testTree2);\n\t\t\t\texpect(preEditRootHandle.identifier).to.not.equal(rootHandle.identifier);\n\t\t\t\texpect(rootHandle.traits[testTree2.left.traitLabel].length).to.equal(2);\n\t\t\t});\n\n\t\t\tit('can be used with a translation map', () => {\n\t\t\t\tconst { sharedTree, testTree } = createSimpleTestTree();\n\t\t\t\tconst { sharedTree: sharedTree2, testTree: testTree2 } = createSimpleTestTree();\n\t\t\t\t// For each of the identities in the simple test tree...\n\t\t\t\tconst nodeIdGetters: ((tree: TestTree) => NodeId)[] = [\n\t\t\t\t\t(tree) => tree.identifier,\n\t\t\t\t\t(tree) => tree.left.identifier,\n\t\t\t\t\t(tree) => tree.right.identifier,\n\t\t\t\t];\n\t\t\t\t// Make a map translating that identifier from `testTree` to `testTree2`\n\t\t\t\tconst translationMap = new Map(\n\t\t\t\t\tnodeIdGetters.map((getter) => [\n\t\t\t\t\t\tsharedTree.convertToStableNodeId(getter(testTree)),\n\t\t\t\t\t\tsharedTree2.convertToStableNodeId(getter(testTree2)),\n\t\t\t\t\t])\n\t\t\t\t);\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left)));\n\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\tChange.delete(StableRange.all({ parent: testTree.identifier, label: testTree.right.traitLabel }))\n\t\t\t\t);\n\t\t\t\tconst edits = [1, 2].map((i) => sharedTree.edits.getEditInSessionAtIndex(i));\n\t\t\t\tsharedTree2.mergeEditsFrom(sharedTree, edits, (id) => translationMap.get(id) ?? id);\n\n\t\t\t\tconst root = getTestTreeRootHandle(sharedTree, testTree);\n\t\t\t\tconst root2 = getTestTreeRootHandle(sharedTree2, testTree2);\n\n\t\t\t\tconst leftTrait = root.traits[testTree.left.traitLabel];\n\t\t\t\tconst leftTrait2 = root2.traits[testTree2.left.traitLabel];\n\n\t\t\t\t// Inserted leaves should be equivalent.\n\t\t\t\texpect(leftTrait2.length).to.equal(2);\n\t\t\t\texpect(leftTrait2[1]).to.deep.equal(leftTrait[1]);\n\t\t\t\t// Right subtree should have been deleted.\n\t\t\t\texpect(Object.entries(root2.traits).length).to.equal(1);\n\t\t\t\texpect(root2.traits[testTree2.right.traitLabel]).to.equal(undefined);\n\t\t\t});\n\t\t});\n\t});\n}\n"]}