@fluid-experimental/tree 1.2.1 → 2.0.0-internal.1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +6 -0
- package/dist/Checkout.d.ts +9 -4
- package/dist/Checkout.d.ts.map +1 -1
- package/dist/Checkout.js +34 -25
- package/dist/Checkout.js.map +1 -1
- package/dist/Common.d.ts +31 -18
- package/dist/Common.d.ts.map +1 -1
- package/dist/Common.js +32 -22
- package/dist/Common.js.map +1 -1
- package/dist/EditUtilities.d.ts +5 -0
- package/dist/EditUtilities.d.ts.map +1 -1
- package/dist/EditUtilities.js +4 -3
- package/dist/EditUtilities.js.map +1 -1
- package/dist/HistoryEditFactory.d.ts +5 -3
- package/dist/HistoryEditFactory.d.ts.map +1 -1
- package/dist/HistoryEditFactory.js +18 -3
- package/dist/HistoryEditFactory.js.map +1 -1
- package/dist/SharedTree.d.ts +6 -3
- package/dist/SharedTree.d.ts.map +1 -1
- package/dist/SharedTree.js +4 -4
- package/dist/SharedTree.js.map +1 -1
- package/dist/Transaction.d.ts +2 -2
- package/dist/Transaction.d.ts.map +1 -1
- package/dist/Transaction.js +3 -2
- package/dist/Transaction.js.map +1 -1
- package/lib/Checkout.d.ts +9 -4
- package/lib/Checkout.d.ts.map +1 -1
- package/lib/Checkout.js +36 -27
- package/lib/Checkout.js.map +1 -1
- package/lib/Common.d.ts +31 -18
- package/lib/Common.d.ts.map +1 -1
- package/lib/Common.js +30 -21
- package/lib/Common.js.map +1 -1
- package/lib/EditUtilities.d.ts +5 -0
- package/lib/EditUtilities.d.ts.map +1 -1
- package/lib/EditUtilities.js +4 -3
- package/lib/EditUtilities.js.map +1 -1
- package/lib/HistoryEditFactory.d.ts +5 -3
- package/lib/HistoryEditFactory.d.ts.map +1 -1
- package/lib/HistoryEditFactory.js +18 -3
- package/lib/HistoryEditFactory.js.map +1 -1
- package/lib/SharedTree.d.ts +6 -3
- package/lib/SharedTree.d.ts.map +1 -1
- package/lib/SharedTree.js +5 -5
- package/lib/SharedTree.js.map +1 -1
- package/lib/Transaction.d.ts +2 -2
- package/lib/Transaction.d.ts.map +1 -1
- package/lib/Transaction.js +3 -2
- package/lib/Transaction.js.map +1 -1
- package/lib/test/Checkout.tests.d.ts.map +1 -1
- package/lib/test/Checkout.tests.js +39 -10
- package/lib/test/Checkout.tests.js.map +1 -1
- package/lib/test/Common.tests.js +20 -1
- package/lib/test/Common.tests.js.map +1 -1
- package/lib/test/HistoryEditFactory.tests.js +48 -9
- package/lib/test/HistoryEditFactory.tests.js.map +1 -1
- package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeTests.js +35 -26
- package/lib/test/utilities/SharedTreeTests.js.map +1 -1
- package/lib/test/utilities/TestUtilities.d.ts +5 -0
- package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
- package/lib/test/utilities/TestUtilities.js +4 -3
- package/lib/test/utilities/TestUtilities.js.map +1 -1
- package/lib/test/utilities/UndoRedoTests.js +3 -2
- package/lib/test/utilities/UndoRedoTests.js.map +1 -1
- package/package.json +22 -20
- package/src/Checkout.ts +56 -14
- package/src/Common.ts +38 -21
- package/src/EditUtilities.ts +3 -3
- package/src/HistoryEditFactory.ts +24 -3
- package/src/SharedTree.ts +19 -8
- package/src/Transaction.ts +5 -4
|
@@ -148,6 +148,11 @@ export declare function assertNoDelta(tree: SharedTree, editor: () => void): voi
|
|
|
148
148
|
* Used to test error throwing in async functions.
|
|
149
149
|
*/
|
|
150
150
|
export declare function asyncFunctionThrowsCorrectly(asyncFunction: () => Promise<unknown>, expectedError: string): Promise<boolean>;
|
|
151
|
+
/**
|
|
152
|
+
* Returns true if two nodes have equivalent data, otherwise false.
|
|
153
|
+
* Does not compare children or payloads.
|
|
154
|
+
* @param nodes - two or more nodes to compare
|
|
155
|
+
*/
|
|
151
156
|
export declare function areNodesEquivalent(...nodes: NodeData<unknown>[]): boolean;
|
|
152
157
|
export declare const testDocumentsPathBase: string;
|
|
153
158
|
export declare const versionComparator: (versionA: string, versionB: string) => number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestUtilities.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestUtilities.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TestUtilities.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestUtilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -77,7 +77,7 @@ export function setUpTestSharedTree(options = { localMode: true }) {
|
|
|
77
77
|
throw error;
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
|
-
const newContainerRuntimeFactory = containerRuntimeFactory
|
|
80
|
+
const newContainerRuntimeFactory = containerRuntimeFactory !== null && containerRuntimeFactory !== void 0 ? containerRuntimeFactory : new MockContainerRuntimeFactory();
|
|
81
81
|
if (localMode === true) {
|
|
82
82
|
componentRuntime.local = true;
|
|
83
83
|
}
|
|
@@ -132,7 +132,8 @@ export async function setUpLocalServerTestSharedTree(options) {
|
|
|
132
132
|
enableOfflineLoad: true,
|
|
133
133
|
summaryOptions: {
|
|
134
134
|
summaryConfigOverrides: Object.assign(Object.assign({}, DefaultSummaryConfiguration), {
|
|
135
|
-
|
|
135
|
+
minIdleTime: 1000,
|
|
136
|
+
maxIdleTime: 1000,
|
|
136
137
|
maxTime: 1000 * 12,
|
|
137
138
|
initialSummarizerDelayMs: 0,
|
|
138
139
|
}),
|
|
@@ -233,7 +234,7 @@ export async function asyncFunctionThrowsCorrectly(asyncFunction, expectedError)
|
|
|
233
234
|
}
|
|
234
235
|
return errorMessage === expectedError;
|
|
235
236
|
}
|
|
236
|
-
|
|
237
|
+
/**
|
|
237
238
|
* Returns true if two nodes have equivalent data, otherwise false.
|
|
238
239
|
* Does not compare children or payloads.
|
|
239
240
|
* @param nodes - two or more nodes to compare
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestUtilities.js","sourceRoot":"","sources":["../../../src/test/utilities/TestUtilities.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 { resolve } from 'path';\nimport { v5 as uuidv5 } from 'uuid';\nimport { expect } from 'chai';\nimport { SummaryCollection, DefaultSummaryConfiguration } from '@fluidframework/container-runtime';\nimport { Container, Loader, waitContainerToCatchUp } from '@fluidframework/container-loader';\nimport { requestFluidObject } from '@fluidframework/runtime-utils';\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from '@fluidframework/test-runtime-utils';\nimport {\n\tChannelFactoryRegistry,\n\tITestFluidObject,\n\tTestObjectProvider,\n\tTestContainerRuntimeFactory,\n\tTestFluidObjectFactory,\n\tcreateAndAttachContainer,\n\tITestObjectProvider,\n} from '@fluidframework/test-utils';\nimport { LocalServerTestDriver } from '@fluidframework/test-drivers';\nimport { ITelemetryBaseLogger } from '@fluidframework/common-definitions';\nimport { TelemetryNullLogger } from '@fluidframework/common-utils';\nimport type { IContainer, IHostLoader } from '@fluidframework/container-definitions';\nimport type { IFluidCodeDetails, IFluidHandle, IRequestHeader } from '@fluidframework/core-interfaces';\nimport { ISequencedDocumentMessage } from '@fluidframework/protocol-definitions';\nimport { IContainerRuntimeBase } from '@fluidframework/runtime-definitions';\nimport { IRequest } from '@fluidframework/core-interfaces';\nimport {\n\tAttributionId,\n\tDetachedSequenceId,\n\tEditId,\n\tNodeId,\n\tOpSpaceNodeId,\n\tSessionId,\n\tStableNodeId,\n} from '../../Identifiers';\nimport { assert, fail, identity, ReplaceRecursive } from '../../Common';\nimport { IdCompressor } from '../../id-compressor';\nimport { createSessionId } from '../../id-compressor/NumericUuid';\nimport { getChangeNodeFromViewNode } from '../../SerializationUtilities';\nimport { initialTree } from '../../InitialTree';\nimport {\n\tChangeInternal,\n\tEdit,\n\tNodeData,\n\tPayload,\n\treservedIdCount,\n\tSharedTreeOp,\n\tSharedTreeOp_0_0_2,\n\tWriteFormat,\n} from '../../persisted-types';\nimport { TraitLocation, TreeView } from '../../TreeView';\nimport { SharedTreeDiagnosticEvent } from '../../EventTypes';\nimport { getNodeId, getNodeIdContext, NodeIdContext, NodeIdConverter, NodeIdNormalizer } from '../../NodeIdUtilities';\nimport { newEdit, setTrait } from '../../EditUtilities';\nimport { SharedTree, SharedTreeFactory } from '../../SharedTree';\nimport { BuildNode, Change, StablePlace } from '../../ChangeTypes';\nimport { convertEditIds } from '../../IdConversion';\nimport { OrderedEditSet } from '../../EditLog';\nimport { buildLeaf, RefreshingTestTree, SimpleTestTree, TestTree } from './TestNode';\n\n/** Objects returned by setUpTestSharedTree */\nexport interface SharedTreeTestingComponents {\n\t/** The MockFluidDataStoreRuntime used to created the SharedTree. */\n\tcomponentRuntime: MockFluidDataStoreRuntime;\n\t/**\n\t * The MockContainerRuntimeFactory created if one was not provided in the options.\n\t * Only connected to the SharedTree if the localMode option was set to false.\n\t * */\n\tcontainerRuntimeFactory: MockContainerRuntimeFactory;\n\t/** The SharedTree created and set up. */\n\ttree: SharedTree;\n}\n\n/** Options used to customize setUpTestSharedTree */\nexport interface SharedTreeTestingOptions {\n\t/**\n\t * Id for the SharedTree to be created.\n\t * If two SharedTrees have the same id and the same containerRuntimeFactory,\n\t * they will collaborate (send edits to each other)\n\t */\n\tid?: string;\n\t/** Node to initialize the SharedTree with. */\n\tinitialTree?: BuildNode;\n\t/** If false, a MockContainerRuntimeFactory connected to the SharedTree will be returned. */\n\tlocalMode?: boolean;\n\t/**\n\t * MockContainerRuntimeFactory to connect the SharedTree to. A new one will not be created if one is provided.\n\t * If localMode is set to true, it will not be connected to the created SharedTree.\n\t * */\n\tcontainerRuntimeFactory?: MockContainerRuntimeFactory;\n\t/** Iff true, do not `fail` on invalid edits */\n\tallowInvalid?: boolean;\n\t/** Iff true, do not `fail` on malformed edits */\n\tallowMalformed?: boolean;\n\t/** Unless set to true, a SharedTree error causes the test to fail */\n\tnoFailOnError?: boolean;\n\t/**\n\t * If not set, full history will be preserved.\n\t */\n\tsummarizeHistory?: boolean;\n\t/**\n\t * If not set, summaries will be written in format 0.1.1.\n\t */\n\twriteFormat?: WriteFormat;\n\t/**\n\t * Optional attribution ID to give to the new tree\n\t */\n\tattributionId?: AttributionId;\n\t/**\n\t * If set, uses the given id as the edit id for tree setup. Only has an effect if initialTree is also set.\n\t */\n\tsetupEditId?: EditId;\n\n\t/**\n\t * Telemetry logger injected into the SharedTree.\n\t */\n\tlogger?: ITelemetryBaseLogger;\n}\n\nexport const testTraitLabel = SimpleTestTree.traitLabel;\nexport function testTrait(view: TreeView): TraitLocation {\n\treturn {\n\t\tlabel: testTraitLabel,\n\t\tparent: view.root,\n\t};\n}\n\n/** Sets up and returns an object of components useful for testing SharedTree. */\nexport function setUpTestSharedTree(\n\toptions: SharedTreeTestingOptions = { localMode: true }\n): SharedTreeTestingComponents {\n\tconst {\n\t\tid,\n\t\tinitialTree,\n\t\tlocalMode,\n\t\tcontainerRuntimeFactory,\n\t\tsetupEditId,\n\t\tsummarizeHistory,\n\t\twriteFormat,\n\t\tattributionId,\n\t} = options;\n\tlet componentRuntime: MockFluidDataStoreRuntime;\n\tif (options.logger) {\n\t\tconst proxyHandler: ProxyHandler<MockFluidDataStoreRuntime> = {\n\t\t\tget: (target, prop, receiver) => {\n\t\t\t\tif (prop === 'logger' && options.logger) {\n\t\t\t\t\treturn options.logger;\n\t\t\t\t}\n\t\t\t\treturn target[prop as keyof MockFluidDataStoreRuntime];\n\t\t\t},\n\t\t};\n\t\tcomponentRuntime = new Proxy(new MockFluidDataStoreRuntime(), proxyHandler);\n\t} else {\n\t\tcomponentRuntime = new MockFluidDataStoreRuntime();\n\t}\n\n\t// Enable expensiveValidation\n\tlet factory: SharedTreeFactory;\n\tif (writeFormat === WriteFormat.v0_0_2) {\n\t\tfactory = SharedTree.getFactory(writeFormat, { summarizeHistory: summarizeHistory ?? true });\n\t} else {\n\t\tconst options = {\n\t\t\tsummarizeHistory: summarizeHistory ?? true ? { uploadEditChunks: true } : false,\n\t\t\tattributionId,\n\t\t};\n\t\tfactory = SharedTree.getFactory(writeFormat ?? WriteFormat.v0_1_1, options);\n\t}\n\tconst tree = factory.create(componentRuntime, id === undefined ? 'testSharedTree' : id);\n\n\tif (options.allowInvalid === undefined || !options.allowInvalid) {\n\t\ttree.on(SharedTreeDiagnosticEvent.DroppedInvalidEdit, () => fail('unexpected invalid edit'));\n\t}\n\n\tif (options.allowMalformed === undefined || !options.allowMalformed) {\n\t\ttree.on(SharedTreeDiagnosticEvent.DroppedMalformedEdit, () => fail('unexpected malformed edit'));\n\t}\n\n\tif (options.noFailOnError === undefined || !options.noFailOnError) {\n\t\t// any errors thrown by a SharedObject event listener will be caught and\n\t\t// reemitted on this event. For testing purposes, rethrow so that it\n\t\t// actually causes the test to fail.\n\t\ttree.on('error', (error) => {\n\t\t\tthrow error;\n\t\t});\n\t}\n\n\tconst newContainerRuntimeFactory = containerRuntimeFactory || new MockContainerRuntimeFactory();\n\n\tif (localMode === true) {\n\t\tcomponentRuntime.local = true;\n\t} else {\n\t\tconst containerRuntime = newContainerRuntimeFactory.createContainerRuntime(componentRuntime);\n\t\tconst services = {\n\t\t\tdeltaConnection: containerRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: new MockStorage(undefined),\n\t\t};\n\t\ttree.connect(services);\n\t}\n\n\tif (initialTree !== undefined) {\n\t\tsetTestTree(tree, initialTree, setupEditId);\n\t}\n\n\treturn {\n\t\tcomponentRuntime,\n\t\tcontainerRuntimeFactory: newContainerRuntimeFactory,\n\t\ttree,\n\t};\n}\n\nconst TestDataStoreType = '@fluid-example/test-dataStore';\n\n/** Objects returned by setUpLocalServerTestSharedTree */\nexport interface LocalServerSharedTreeTestingComponents {\n\t/** The testObjectProvider created if one was not set in the options. */\n\ttestObjectProvider: TestObjectProvider;\n\t/** The SharedTree created and set up. */\n\ttree: SharedTree;\n\t/** The container created and set up. */\n\tcontainer: Container;\n\t/** Handles to any blobs uploaded via `blobs` */\n\tuploadedBlobs: IFluidHandle<ArrayBufferLike>[];\n}\n\n/** Options used to customize setUpLocalServerTestSharedTree */\nexport interface LocalServerSharedTreeTestingOptions {\n\t/** Contents of blobs that should be uploaded to the runtime upon creation. Handles to these blobs will be returned. */\n\tblobs?: ArrayBufferLike[];\n\t/** Headers to include on the container load request. */\n\theaders?: IRequestHeader;\n\t/**\n\t * Id for the SharedTree to be created.\n\t * If two SharedTrees have the same id and the same testObjectProvider,\n\t * they will collaborate (send edits to each other)\n\t */\n\tid?: string;\n\t/** Node to initialize the SharedTree with. */\n\tinitialTree?: BuildNode;\n\t/** If set, uses the provider to create the container and create the SharedTree. */\n\ttestObjectProvider?: TestObjectProvider;\n\t/**\n\t * If not set, full history will be preserved.\n\t */\n\tsummarizeHistory?: boolean;\n\t/**\n\t * If not set, summaries will be written in format 0.0.2.\n\t */\n\twriteFormat?: WriteFormat;\n\t/**\n\t * Optional attribution ID to give to the new tree\n\t */\n\tattributionId?: AttributionId;\n\t/**\n\t * If not set, will upload edit chunks when they are full.\n\t */\n\tuploadEditChunks?: boolean;\n\t/**\n\t * If set, uses the given id as the edit id for tree setup. Only has an effect if initialTree is also set.\n\t */\n\tsetupEditId?: EditId;\n\t/**\n\t * If set, will be passed to the container on load\n\t */\n\tpendingLocalState?: string;\n}\n\nconst testObjectProviders: TestObjectProvider[] = [];\nafterEach(() => {\n\tfor (const provider of testObjectProviders) {\n\t\tprovider.reset();\n\t}\n\ttestObjectProviders.length = 0;\n});\n\n/**\n * Sets up and returns an object of components useful for testing SharedTree with a local server.\n * Required for tests that involve the uploadBlob API.\n *\n * Any TestObjectProvider created by this function will be reset after the test completes (via afterEach) hook.\n */\nexport async function setUpLocalServerTestSharedTree(\n\toptions: LocalServerSharedTreeTestingOptions\n): Promise<LocalServerSharedTreeTestingComponents> {\n\tconst {\n\t\tblobs,\n\t\theaders,\n\t\tid,\n\t\tinitialTree,\n\t\ttestObjectProvider,\n\t\tsetupEditId,\n\t\tsummarizeHistory,\n\t\twriteFormat,\n\t\tuploadEditChunks,\n\t\tattributionId,\n\t\tpendingLocalState,\n\t} = options;\n\n\tconst treeId = id ?? 'test';\n\tlet factory: SharedTreeFactory;\n\tif (writeFormat === WriteFormat.v0_0_2) {\n\t\tfactory = SharedTree.getFactory(writeFormat, { summarizeHistory: summarizeHistory ?? true });\n\t} else {\n\t\tconst options = {\n\t\t\tsummarizeHistory: summarizeHistory ?? true ? { uploadEditChunks: uploadEditChunks ?? true } : false,\n\t\t\tattributionId,\n\t\t};\n\t\tfactory = SharedTree.getFactory(writeFormat ?? WriteFormat.v0_1_1, options);\n\t}\n\tconst registry: ChannelFactoryRegistry = [[treeId, factory]];\n\tconst innerRequestHandler = async (request: IRequest, runtime: IContainerRuntimeBase) =>\n\t\truntime.IFluidHandleContext.resolveHandle(request);\n\n\tconst runtimeFactory = () =>\n\t\tnew TestContainerRuntimeFactory(\n\t\t\tTestDataStoreType,\n\t\t\tnew TestFluidObjectFactory(registry),\n\t\t\t{\n\t\t\t\tenableOfflineLoad: true,\n\t\t\t\tsummaryOptions: {\n\t\t\t\t\tsummaryConfigOverrides: {\n\t\t\t\t\t\t...DefaultSummaryConfiguration,\n\t\t\t\t\t\t...{\n\t\t\t\t\t\t\tidleTime: 1000, // Current default idleTime is 15000 which will cause some SharedTree tests to timeout.\n\t\t\t\t\t\t\tmaxTime: 1000 * 12,\n\t\t\t\t\t\t\tinitialSummarizerDelayMs: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t[innerRequestHandler]\n\t\t);\n\n\tconst defaultCodeDetails: IFluidCodeDetails = {\n\t\tpackage: 'defaultTestPackage',\n\t\tconfig: {},\n\t};\n\n\tfunction makeTestLoader(provider: TestObjectProvider): IHostLoader {\n\t\tconst fluidEntryPoint = runtimeFactory();\n\t\treturn provider.createLoader([[defaultCodeDetails, fluidEntryPoint]], {\n\t\t\toptions: { maxClientLeaveWaitTime: 1000 },\n\t\t});\n\t}\n\n\tlet provider: TestObjectProvider;\n\tlet container: Container;\n\n\tif (testObjectProvider !== undefined) {\n\t\tprovider = testObjectProvider;\n\t\tconst driver = new LocalServerTestDriver();\n\t\tconst loader = makeTestLoader(provider);\n\t\t// Once ILoaderOptions is specificable, this should use `provider.loadTestContainer` instead.\n\t\tcontainer = (await loader.resolve(\n\t\t\t{ url: await driver.createContainerUrl(treeId), headers },\n\t\t\tpendingLocalState\n\t\t)) as Container;\n\t\tawait waitContainerToCatchUp(container);\n\t} else {\n\t\tconst driver = new LocalServerTestDriver();\n\t\tprovider = new TestObjectProvider(Loader, driver, runtimeFactory);\n\t\ttestObjectProviders.push(provider);\n\t\t// Once ILoaderOptions is specificable, this should use `provider.makeTestContainer` instead.\n\t\tconst loader = makeTestLoader(provider);\n\t\tcontainer = (await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tdriver.createCreateNewRequest(treeId)\n\t\t)) as Container;\n\t}\n\n\tconst dataObject = await requestFluidObject<ITestFluidObject>(container, '/');\n\n\tconst uploadedBlobs =\n\t\tblobs === undefined ? [] : await Promise.all(blobs.map(async (blob) => dataObject.context.uploadBlob(blob)));\n\tconst tree = await dataObject.getSharedObject<SharedTree>(treeId);\n\n\tif (initialTree !== undefined && testObjectProvider === undefined) {\n\t\tsetTestTree(tree, initialTree, setupEditId);\n\t}\n\n\treturn { container, tree, testObjectProvider: provider, uploadedBlobs };\n}\n\n/** Sets testTrait to contain `node`. */\nfunction setTestTree(tree: SharedTree, node: BuildNode, overrideId?: EditId): EditId {\n\tconst trait = testTrait(tree.currentView);\n\tif (overrideId === undefined) {\n\t\treturn tree.applyEdit(...setTrait(trait, node)).id;\n\t} else {\n\t\tconst changes = setTrait(trait, node).map((c) => tree.internalizeChange(c));\n\t\treturn tree.applyEditInternal({ changes, id: overrideId }).id;\n\t}\n}\n\n/**\n * Creates a list of edits with stable IDs that can be processed by a SharedTree.\n * @returns the list of created edits\n */\nexport function createStableEdits(\n\tnumberOfEdits: number,\n\tidContext: NodeIdContext = makeNodeIdContext(),\n\tpayload: (i: number) => Payload = identity\n): Edit<ChangeInternal>[] {\n\tif (numberOfEdits === 0) {\n\t\treturn [];\n\t}\n\n\tconst uuidNamespace = '44864298-500e-4cf8-9f44-a249e5b3a286';\n\tconst nodeId = idContext.generateNodeId('ae6b24eb-6fa8-42cc-abd2-48f250b7798f');\n\tconst node = buildLeaf(nodeId);\n\tconst insertEmptyNode = newEdit([\n\t\tChangeInternal.build([node], 0 as DetachedSequenceId),\n\t\tChangeInternal.insert(\n\t\t\t0 as DetachedSequenceId,\n\t\t\tStablePlace.atEndOf({ label: testTraitLabel, parent: idContext.convertToNodeId(initialTree.identifier) })\n\t\t),\n\t]);\n\n\tconst edits: Edit<ChangeInternal>[] = [{ ...insertEmptyNode, id: uuidv5('test', uuidNamespace) as EditId }];\n\n\t// Every subsequent edit is a set payload\n\tfor (let i = 1; i < numberOfEdits; i++) {\n\t\tconst edit = newEdit([ChangeInternal.setPayload(nodeId, payload(i))]);\n\t\tedits.push({ ...edit, id: uuidv5(i.toString(), uuidNamespace) as EditId });\n\t}\n\n\treturn edits;\n}\n\n/** Asserts that changes to SharedTree in editor() function do not cause any observable state change */\nexport function assertNoDelta(tree: SharedTree, editor: () => void) {\n\tconst viewA = tree.currentView;\n\teditor();\n\tconst viewB = tree.currentView;\n\tconst delta = viewA.delta(viewB);\n\texpect(delta).deep.equals({\n\t\tchanged: [],\n\t\tadded: [],\n\t\tremoved: [],\n\t});\n}\n\n/**\n * Used to test error throwing in async functions.\n */\nexport async function asyncFunctionThrowsCorrectly(\n\tasyncFunction: () => Promise<unknown>,\n\texpectedError: string\n): Promise<boolean> {\n\tlet errorMessage: string | undefined;\n\n\ttry {\n\t\tawait asyncFunction();\n\t} catch (error) {\n\t\terrorMessage = (error as Error).message;\n\t}\n\n\treturn errorMessage === expectedError;\n}\n\n/*\n * Returns true if two nodes have equivalent data, otherwise false.\n * Does not compare children or payloads.\n * @param nodes - two or more nodes to compare\n */\nexport function areNodesEquivalent(...nodes: NodeData<unknown>[]): boolean {\n\tif (nodes.length < 2) {\n\t\tfail('Too few nodes to compare');\n\t}\n\n\tfor (let i = 1; i < nodes.length; i++) {\n\t\tif (nodes[i].definition !== nodes[0].definition) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (nodes[i].identifier !== nodes[0].identifier) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n// This accounts for this file being executed after compilation. If many tests want to leverage resources, we should unify\n// resource path logic to a single place.\nexport const testDocumentsPathBase = resolve(__dirname, '../../../src/test/documents/');\n\nexport const versionComparator = (versionA: string, versionB: string): number => {\n\tconst versionASplit = versionA.split('.');\n\tconst versionBSplit = versionB.split('.');\n\n\tassert(\n\t\tversionASplit.length === versionBSplit.length && versionASplit.length === 3,\n\t\t'Version numbers should follow semantic versioning.'\n\t);\n\n\tfor (let i = 0; i < 3; ++i) {\n\t\tconst numberA = parseInt(versionASplit[i], 10);\n\t\tconst numberB = parseInt(versionBSplit[i], 10);\n\n\t\tif (numberA > numberB) {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (numberA < numberB) {\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\treturn 0;\n};\n\n/**\n * Create a {@link SimpleTestTree} from the given {@link SharedTree} or {@link IdCompressor}\n */\nexport function setUpTestTree(idSource?: IdCompressor | SharedTree, expensiveValidation = false): TestTree {\n\tconst source = idSource ?? new IdCompressor(createSessionId(), reservedIdCount);\n\tif (source instanceof SharedTree) {\n\t\tassert(source.edits.length === 0, 'tree must be a new SharedTree');\n\t\tconst getNormalizer = () => getIdNormalizerFromSharedTree(source);\n\t\tconst contextWrapper = {\n\t\t\tnormalizeToOpSpace: (id: NodeId) => getNormalizer().normalizeToOpSpace(id),\n\t\t\tnormalizeToSessionSpace: (id: OpSpaceNodeId, sessionId: SessionId) =>\n\t\t\t\tgetNormalizer().normalizeToSessionSpace(id, sessionId),\n\t\t\tget localSessionId() {\n\t\t\t\treturn getNormalizer().localSessionId;\n\t\t\t},\n\t\t};\n\t\tconst simpleTestTree = new SimpleTestTree(source, contextWrapper, expensiveValidation);\n\t\tsetTestTree(source, simpleTestTree);\n\t\treturn simpleTestTree;\n\t}\n\n\tconst context = makeNodeIdContext(source);\n\treturn new SimpleTestTree(context, context, expensiveValidation);\n}\n\n/**\n * Gets an id normalizer from the provided shared-tree. This is\n */\nexport function getIdNormalizerFromSharedTree(sharedTree: SharedTree): NodeIdNormalizer<OpSpaceNodeId> {\n\treturn (\n\t\t((sharedTree as any).idNormalizer as NodeIdNormalizer<OpSpaceNodeId>) ??\n\t\tfail('Failed to find SharedTree normalizer')\n\t);\n}\n\n/**\n * Create a {@link SimpleTestTree} before each test\n */\nexport function refreshTestTree(\n\tidSourceFactory?: (() => IdCompressor) | (() => SharedTree),\n\tfn?: (testTree: TestTree) => void,\n\texpensiveValidation = false\n): TestTree {\n\tconst factory = idSourceFactory ?? (() => new IdCompressor(createSessionId(), reservedIdCount));\n\treturn new RefreshingTestTree(() => {\n\t\treturn setUpTestTree(factory(), expensiveValidation);\n\t}, fn);\n}\n\nexport function makeNodeIdContext(idCompressor?: IdCompressor): NodeIdContext & NodeIdNormalizer<OpSpaceNodeId> {\n\tconst compressor = idCompressor ?? new IdCompressor(createSessionId(), reservedIdCount);\n\treturn getNodeIdContext(compressor);\n}\n\n/**\n * Applies an arbitrary edit to the given SharedTree which leaves the tree in the same state that it was before the edit.\n * This is useful for test scenarios that want to apply edits but don't care what they do.\n */\nexport function applyNoop(tree: SharedTree): Edit<unknown> {\n\treturn tree.applyEdit(...noopEdit(tree.currentView));\n}\n\n/**\n * Creates an arbitrary edit which leaves a tree in the same state that it was before the edit.\n * This is useful for test scenarios that want to create edits but don't care what they do.\n */\nexport function noopEdit(view: TreeView): Change[] {\n\tconst traitLocation = testTrait(view);\n\tconst trait = view.getTrait(traitLocation);\n\t// Set the test trait to the same thing that it already was\n\treturn setTrait(\n\t\ttraitLocation,\n\t\ttrait.map((id) => getChangeNodeFromViewNode(view, id))\n\t);\n}\n\n/** Translate an ID in one context to an ID in another */\nexport function translateId(id: NodeId | NodeData<NodeId>, from: NodeIdConverter, to: NodeIdConverter): NodeId {\n\treturn to.convertToNodeId(from.convertToStableNodeId(getNodeId(id)));\n}\n\nexport function normalizeId(tree: SharedTree, id: NodeId): OpSpaceNodeId {\n\tconst normalizer = getIdNormalizerFromSharedTree(tree);\n\treturn normalizer.normalizeToOpSpace(id);\n}\n\nexport function normalizeIds(tree: SharedTree, ...ids: NodeId[]): OpSpaceNodeId[] {\n\tconst normalizer = getIdNormalizerFromSharedTree(tree);\n\treturn ids.map((id) => normalizer.normalizeToOpSpace(id));\n}\n\nexport function idsAreEqual(treeA: SharedTree, idsA: NodeId[], treeB: SharedTree, idsB: NodeId[]): boolean {\n\tif (idsA.length !== idsB.length) {\n\t\treturn false;\n\t}\n\tconst contextA = getIdNormalizerFromSharedTree(treeA);\n\tconst contextB = getIdNormalizerFromSharedTree(treeB);\n\tfor (let i = 0; i < idsA.length; i++) {\n\t\tif (contextA.normalizeToOpSpace(idsA[i]) !== contextB.normalizeToOpSpace(idsB[i])) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nexport function normalizeEdit(\n\ttree: SharedTree,\n\tedit: Edit<ChangeInternal>\n): Edit<ReplaceRecursive<ChangeInternal, NodeId, OpSpaceNodeId>> {\n\tconst context = getIdNormalizerFromSharedTree(tree);\n\treturn convertEditIds(edit, (id) => context.normalizeToOpSpace(id));\n}\n\nexport function stabilizeEdit(\n\ttree: SharedTree,\n\tedit: Edit<ChangeInternal>\n): Edit<ReplaceRecursive<ChangeInternal, NodeId, StableNodeId>> {\n\treturn convertEditIds(edit, (id) => tree.convertToStableNodeId(id));\n}\n\nexport function getEditLogInternal(tree: SharedTree): OrderedEditSet<ChangeInternal> {\n\treturn tree.edits as unknown as OrderedEditSet<ChangeInternal>;\n}\n\n/**\n * Spies on all future ops submitted to `containerRuntimeFactory`. When ops are submitted, they will be `push`ed into the\n * returned array.\n */\nexport function spyOnSubmittedOps<Op extends SharedTreeOp | SharedTreeOp_0_0_2>(\n\tcontainerRuntimeFactory: MockContainerRuntimeFactory\n): Op[] {\n\tconst ops: Op[] = [];\n\tconst originalPush = containerRuntimeFactory.pushMessage.bind(containerRuntimeFactory);\n\tcontainerRuntimeFactory.pushMessage = (message: Partial<ISequencedDocumentMessage>) => {\n\t\tconst { contents } = message;\n\t\tops.push(contents as Op);\n\t\toriginalPush(message);\n\t};\n\treturn ops;\n}\n\n/**\n * Waits for summarization to occur, and returns a version that can be passed into newly loaded containers\n * to ensure they load this summary version. Use the `LoaderHeader.version` header.\n */\nexport async function waitForSummary(mainContainer: IContainer): Promise<string> {\n\tconst { deltaManager } = mainContainer;\n\tconst summaryCollection = new SummaryCollection(deltaManager, new TelemetryNullLogger());\n\tconst ackedSummary = await summaryCollection.waitSummaryAck(deltaManager.lastSequenceNumber);\n\treturn ackedSummary.summaryAck.contents.handle;\n}\n\n/**\n * Runs an action while the given container has been paused\n */\nexport async function withContainerOffline<TReturn>(\n\tprovider: ITestObjectProvider,\n\tcontainer: IContainer,\n\taction: () => TReturn\n): Promise<{ actionReturn: TReturn; pendingLocalState: string }> {\n\tawait provider.ensureSynchronized();\n\tawait provider.opProcessingController.pauseProcessing(container);\n\tconst actionReturn = action();\n\tconst pendingLocalState = container.closeAndGetPendingLocalState();\n\treturn { actionReturn, pendingLocalState };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TestUtilities.js","sourceRoot":"","sources":["../../../src/test/utilities/TestUtilities.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 { resolve } from 'path';\nimport { v5 as uuidv5 } from 'uuid';\nimport { expect } from 'chai';\nimport { SummaryCollection, DefaultSummaryConfiguration } from '@fluidframework/container-runtime';\nimport { Container, Loader, waitContainerToCatchUp } from '@fluidframework/container-loader';\nimport { requestFluidObject } from '@fluidframework/runtime-utils';\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from '@fluidframework/test-runtime-utils';\nimport {\n\tChannelFactoryRegistry,\n\tITestFluidObject,\n\tTestObjectProvider,\n\tTestContainerRuntimeFactory,\n\tTestFluidObjectFactory,\n\tcreateAndAttachContainer,\n\tITestObjectProvider,\n} from '@fluidframework/test-utils';\nimport { LocalServerTestDriver } from '@fluidframework/test-drivers';\nimport { ITelemetryBaseLogger } from '@fluidframework/common-definitions';\nimport { TelemetryNullLogger } from '@fluidframework/common-utils';\nimport type { IContainer, IHostLoader } from '@fluidframework/container-definitions';\nimport type { IFluidCodeDetails, IFluidHandle, IRequestHeader } from '@fluidframework/core-interfaces';\nimport { ISequencedDocumentMessage } from '@fluidframework/protocol-definitions';\nimport { IContainerRuntimeBase } from '@fluidframework/runtime-definitions';\nimport { IRequest } from '@fluidframework/core-interfaces';\nimport {\n\tAttributionId,\n\tDetachedSequenceId,\n\tEditId,\n\tNodeId,\n\tOpSpaceNodeId,\n\tSessionId,\n\tStableNodeId,\n} from '../../Identifiers';\nimport { assert, fail, identity, ReplaceRecursive } from '../../Common';\nimport { IdCompressor } from '../../id-compressor';\nimport { createSessionId } from '../../id-compressor/NumericUuid';\nimport { getChangeNodeFromViewNode } from '../../SerializationUtilities';\nimport { initialTree } from '../../InitialTree';\nimport {\n\tChangeInternal,\n\tEdit,\n\tNodeData,\n\tPayload,\n\treservedIdCount,\n\tSharedTreeOp,\n\tSharedTreeOp_0_0_2,\n\tWriteFormat,\n} from '../../persisted-types';\nimport { TraitLocation, TreeView } from '../../TreeView';\nimport { SharedTreeDiagnosticEvent } from '../../EventTypes';\nimport { getNodeId, getNodeIdContext, NodeIdContext, NodeIdConverter, NodeIdNormalizer } from '../../NodeIdUtilities';\nimport { newEdit, setTrait } from '../../EditUtilities';\nimport { SharedTree, SharedTreeFactory } from '../../SharedTree';\nimport { BuildNode, Change, StablePlace } from '../../ChangeTypes';\nimport { convertEditIds } from '../../IdConversion';\nimport { OrderedEditSet } from '../../EditLog';\nimport { buildLeaf, RefreshingTestTree, SimpleTestTree, TestTree } from './TestNode';\n\n/** Objects returned by setUpTestSharedTree */\nexport interface SharedTreeTestingComponents {\n\t/** The MockFluidDataStoreRuntime used to created the SharedTree. */\n\tcomponentRuntime: MockFluidDataStoreRuntime;\n\t/**\n\t * The MockContainerRuntimeFactory created if one was not provided in the options.\n\t * Only connected to the SharedTree if the localMode option was set to false.\n\t * */\n\tcontainerRuntimeFactory: MockContainerRuntimeFactory;\n\t/** The SharedTree created and set up. */\n\ttree: SharedTree;\n}\n\n/** Options used to customize setUpTestSharedTree */\nexport interface SharedTreeTestingOptions {\n\t/**\n\t * Id for the SharedTree to be created.\n\t * If two SharedTrees have the same id and the same containerRuntimeFactory,\n\t * they will collaborate (send edits to each other)\n\t */\n\tid?: string;\n\t/** Node to initialize the SharedTree with. */\n\tinitialTree?: BuildNode;\n\t/** If false, a MockContainerRuntimeFactory connected to the SharedTree will be returned. */\n\tlocalMode?: boolean;\n\t/**\n\t * MockContainerRuntimeFactory to connect the SharedTree to. A new one will not be created if one is provided.\n\t * If localMode is set to true, it will not be connected to the created SharedTree.\n\t * */\n\tcontainerRuntimeFactory?: MockContainerRuntimeFactory;\n\t/** Iff true, do not `fail` on invalid edits */\n\tallowInvalid?: boolean;\n\t/** Iff true, do not `fail` on malformed edits */\n\tallowMalformed?: boolean;\n\t/** Unless set to true, a SharedTree error causes the test to fail */\n\tnoFailOnError?: boolean;\n\t/**\n\t * If not set, full history will be preserved.\n\t */\n\tsummarizeHistory?: boolean;\n\t/**\n\t * If not set, summaries will be written in format 0.1.1.\n\t */\n\twriteFormat?: WriteFormat;\n\t/**\n\t * Optional attribution ID to give to the new tree\n\t */\n\tattributionId?: AttributionId;\n\t/**\n\t * If set, uses the given id as the edit id for tree setup. Only has an effect if initialTree is also set.\n\t */\n\tsetupEditId?: EditId;\n\n\t/**\n\t * Telemetry logger injected into the SharedTree.\n\t */\n\tlogger?: ITelemetryBaseLogger;\n}\n\nexport const testTraitLabel = SimpleTestTree.traitLabel;\nexport function testTrait(view: TreeView): TraitLocation {\n\treturn {\n\t\tlabel: testTraitLabel,\n\t\tparent: view.root,\n\t};\n}\n\n/** Sets up and returns an object of components useful for testing SharedTree. */\nexport function setUpTestSharedTree(\n\toptions: SharedTreeTestingOptions = { localMode: true }\n): SharedTreeTestingComponents {\n\tconst {\n\t\tid,\n\t\tinitialTree,\n\t\tlocalMode,\n\t\tcontainerRuntimeFactory,\n\t\tsetupEditId,\n\t\tsummarizeHistory,\n\t\twriteFormat,\n\t\tattributionId,\n\t} = options;\n\tlet componentRuntime: MockFluidDataStoreRuntime;\n\tif (options.logger) {\n\t\tconst proxyHandler: ProxyHandler<MockFluidDataStoreRuntime> = {\n\t\t\tget: (target, prop, receiver) => {\n\t\t\t\tif (prop === 'logger' && options.logger) {\n\t\t\t\t\treturn options.logger;\n\t\t\t\t}\n\t\t\t\treturn target[prop as keyof MockFluidDataStoreRuntime];\n\t\t\t},\n\t\t};\n\t\tcomponentRuntime = new Proxy(new MockFluidDataStoreRuntime(), proxyHandler);\n\t} else {\n\t\tcomponentRuntime = new MockFluidDataStoreRuntime();\n\t}\n\n\t// Enable expensiveValidation\n\tlet factory: SharedTreeFactory;\n\tif (writeFormat === WriteFormat.v0_0_2) {\n\t\tfactory = SharedTree.getFactory(writeFormat, { summarizeHistory: summarizeHistory ?? true });\n\t} else {\n\t\tconst options = {\n\t\t\tsummarizeHistory: summarizeHistory ?? true ? { uploadEditChunks: true } : false,\n\t\t\tattributionId,\n\t\t};\n\t\tfactory = SharedTree.getFactory(writeFormat ?? WriteFormat.v0_1_1, options);\n\t}\n\tconst tree = factory.create(componentRuntime, id === undefined ? 'testSharedTree' : id);\n\n\tif (options.allowInvalid === undefined || !options.allowInvalid) {\n\t\ttree.on(SharedTreeDiagnosticEvent.DroppedInvalidEdit, () => fail('unexpected invalid edit'));\n\t}\n\n\tif (options.allowMalformed === undefined || !options.allowMalformed) {\n\t\ttree.on(SharedTreeDiagnosticEvent.DroppedMalformedEdit, () => fail('unexpected malformed edit'));\n\t}\n\n\tif (options.noFailOnError === undefined || !options.noFailOnError) {\n\t\t// any errors thrown by a SharedObject event listener will be caught and\n\t\t// reemitted on this event. For testing purposes, rethrow so that it\n\t\t// actually causes the test to fail.\n\t\ttree.on('error', (error) => {\n\t\t\tthrow error;\n\t\t});\n\t}\n\n\tconst newContainerRuntimeFactory = containerRuntimeFactory ?? new MockContainerRuntimeFactory();\n\n\tif (localMode === true) {\n\t\tcomponentRuntime.local = true;\n\t} else {\n\t\tconst containerRuntime = newContainerRuntimeFactory.createContainerRuntime(componentRuntime);\n\t\tconst services = {\n\t\t\tdeltaConnection: containerRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: new MockStorage(undefined),\n\t\t};\n\t\ttree.connect(services);\n\t}\n\n\tif (initialTree !== undefined) {\n\t\tsetTestTree(tree, initialTree, setupEditId);\n\t}\n\n\treturn {\n\t\tcomponentRuntime,\n\t\tcontainerRuntimeFactory: newContainerRuntimeFactory,\n\t\ttree,\n\t};\n}\n\nconst TestDataStoreType = '@fluid-example/test-dataStore';\n\n/** Objects returned by setUpLocalServerTestSharedTree */\nexport interface LocalServerSharedTreeTestingComponents {\n\t/** The testObjectProvider created if one was not set in the options. */\n\ttestObjectProvider: TestObjectProvider;\n\t/** The SharedTree created and set up. */\n\ttree: SharedTree;\n\t/** The container created and set up. */\n\tcontainer: Container;\n\t/** Handles to any blobs uploaded via `blobs` */\n\tuploadedBlobs: IFluidHandle<ArrayBufferLike>[];\n}\n\n/** Options used to customize setUpLocalServerTestSharedTree */\nexport interface LocalServerSharedTreeTestingOptions {\n\t/** Contents of blobs that should be uploaded to the runtime upon creation. Handles to these blobs will be returned. */\n\tblobs?: ArrayBufferLike[];\n\t/** Headers to include on the container load request. */\n\theaders?: IRequestHeader;\n\t/**\n\t * Id for the SharedTree to be created.\n\t * If two SharedTrees have the same id and the same testObjectProvider,\n\t * they will collaborate (send edits to each other)\n\t */\n\tid?: string;\n\t/** Node to initialize the SharedTree with. */\n\tinitialTree?: BuildNode;\n\t/** If set, uses the provider to create the container and create the SharedTree. */\n\ttestObjectProvider?: TestObjectProvider;\n\t/**\n\t * If not set, full history will be preserved.\n\t */\n\tsummarizeHistory?: boolean;\n\t/**\n\t * If not set, summaries will be written in format 0.0.2.\n\t */\n\twriteFormat?: WriteFormat;\n\t/**\n\t * Optional attribution ID to give to the new tree\n\t */\n\tattributionId?: AttributionId;\n\t/**\n\t * If not set, will upload edit chunks when they are full.\n\t */\n\tuploadEditChunks?: boolean;\n\t/**\n\t * If set, uses the given id as the edit id for tree setup. Only has an effect if initialTree is also set.\n\t */\n\tsetupEditId?: EditId;\n\t/**\n\t * If set, will be passed to the container on load\n\t */\n\tpendingLocalState?: string;\n}\n\nconst testObjectProviders: TestObjectProvider[] = [];\nafterEach(() => {\n\tfor (const provider of testObjectProviders) {\n\t\tprovider.reset();\n\t}\n\ttestObjectProviders.length = 0;\n});\n\n/**\n * Sets up and returns an object of components useful for testing SharedTree with a local server.\n * Required for tests that involve the uploadBlob API.\n *\n * Any TestObjectProvider created by this function will be reset after the test completes (via afterEach) hook.\n */\nexport async function setUpLocalServerTestSharedTree(\n\toptions: LocalServerSharedTreeTestingOptions\n): Promise<LocalServerSharedTreeTestingComponents> {\n\tconst {\n\t\tblobs,\n\t\theaders,\n\t\tid,\n\t\tinitialTree,\n\t\ttestObjectProvider,\n\t\tsetupEditId,\n\t\tsummarizeHistory,\n\t\twriteFormat,\n\t\tuploadEditChunks,\n\t\tattributionId,\n\t\tpendingLocalState,\n\t} = options;\n\n\tconst treeId = id ?? 'test';\n\tlet factory: SharedTreeFactory;\n\tif (writeFormat === WriteFormat.v0_0_2) {\n\t\tfactory = SharedTree.getFactory(writeFormat, { summarizeHistory: summarizeHistory ?? true });\n\t} else {\n\t\tconst options = {\n\t\t\tsummarizeHistory: summarizeHistory ?? true ? { uploadEditChunks: uploadEditChunks ?? true } : false,\n\t\t\tattributionId,\n\t\t};\n\t\tfactory = SharedTree.getFactory(writeFormat ?? WriteFormat.v0_1_1, options);\n\t}\n\tconst registry: ChannelFactoryRegistry = [[treeId, factory]];\n\tconst innerRequestHandler = async (request: IRequest, runtime: IContainerRuntimeBase) =>\n\t\truntime.IFluidHandleContext.resolveHandle(request);\n\n\tconst runtimeFactory = () =>\n\t\tnew TestContainerRuntimeFactory(\n\t\t\tTestDataStoreType,\n\t\t\tnew TestFluidObjectFactory(registry),\n\t\t\t{\n\t\t\t\tenableOfflineLoad: true,\n\t\t\t\tsummaryOptions: {\n\t\t\t\t\tsummaryConfigOverrides: {\n\t\t\t\t\t\t...DefaultSummaryConfiguration,\n\t\t\t\t\t\t...{\n\t\t\t\t\t\t\tminIdleTime: 1000, // Manually set idle times so some SharedTree tests don't timeout.\n\t\t\t\t\t\t\tmaxIdleTime: 1000,\n\t\t\t\t\t\t\tmaxTime: 1000 * 12,\n\t\t\t\t\t\t\tinitialSummarizerDelayMs: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t[innerRequestHandler]\n\t\t);\n\n\tconst defaultCodeDetails: IFluidCodeDetails = {\n\t\tpackage: 'defaultTestPackage',\n\t\tconfig: {},\n\t};\n\n\tfunction makeTestLoader(provider: TestObjectProvider): IHostLoader {\n\t\tconst fluidEntryPoint = runtimeFactory();\n\t\treturn provider.createLoader([[defaultCodeDetails, fluidEntryPoint]], {\n\t\t\toptions: { maxClientLeaveWaitTime: 1000 },\n\t\t});\n\t}\n\n\tlet provider: TestObjectProvider;\n\tlet container: Container;\n\n\tif (testObjectProvider !== undefined) {\n\t\tprovider = testObjectProvider;\n\t\tconst driver = new LocalServerTestDriver();\n\t\tconst loader = makeTestLoader(provider);\n\t\t// Once ILoaderOptions is specificable, this should use `provider.loadTestContainer` instead.\n\t\tcontainer = (await loader.resolve(\n\t\t\t{ url: await driver.createContainerUrl(treeId), headers },\n\t\t\tpendingLocalState\n\t\t)) as Container;\n\t\tawait waitContainerToCatchUp(container);\n\t} else {\n\t\tconst driver = new LocalServerTestDriver();\n\t\tprovider = new TestObjectProvider(Loader, driver, runtimeFactory);\n\t\ttestObjectProviders.push(provider);\n\t\t// Once ILoaderOptions is specificable, this should use `provider.makeTestContainer` instead.\n\t\tconst loader = makeTestLoader(provider);\n\t\tcontainer = (await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tdriver.createCreateNewRequest(treeId)\n\t\t)) as Container;\n\t}\n\n\tconst dataObject = await requestFluidObject<ITestFluidObject>(container, '/');\n\n\tconst uploadedBlobs =\n\t\tblobs === undefined ? [] : await Promise.all(blobs.map(async (blob) => dataObject.context.uploadBlob(blob)));\n\tconst tree = await dataObject.getSharedObject<SharedTree>(treeId);\n\n\tif (initialTree !== undefined && testObjectProvider === undefined) {\n\t\tsetTestTree(tree, initialTree, setupEditId);\n\t}\n\n\treturn { container, tree, testObjectProvider: provider, uploadedBlobs };\n}\n\n/** Sets testTrait to contain `node`. */\nfunction setTestTree(tree: SharedTree, node: BuildNode, overrideId?: EditId): EditId {\n\tconst trait = testTrait(tree.currentView);\n\tif (overrideId === undefined) {\n\t\treturn tree.applyEdit(...setTrait(trait, node)).id;\n\t} else {\n\t\tconst changes = setTrait(trait, node).map((c) => tree.internalizeChange(c));\n\t\treturn tree.applyEditInternal({ changes, id: overrideId }).id;\n\t}\n}\n\n/**\n * Creates a list of edits with stable IDs that can be processed by a SharedTree.\n * @returns the list of created edits\n */\nexport function createStableEdits(\n\tnumberOfEdits: number,\n\tidContext: NodeIdContext = makeNodeIdContext(),\n\tpayload: (i: number) => Payload = identity\n): Edit<ChangeInternal>[] {\n\tif (numberOfEdits === 0) {\n\t\treturn [];\n\t}\n\n\tconst uuidNamespace = '44864298-500e-4cf8-9f44-a249e5b3a286';\n\tconst nodeId = idContext.generateNodeId('ae6b24eb-6fa8-42cc-abd2-48f250b7798f');\n\tconst node = buildLeaf(nodeId);\n\tconst insertEmptyNode = newEdit([\n\t\tChangeInternal.build([node], 0 as DetachedSequenceId),\n\t\tChangeInternal.insert(\n\t\t\t0 as DetachedSequenceId,\n\t\t\tStablePlace.atEndOf({ label: testTraitLabel, parent: idContext.convertToNodeId(initialTree.identifier) })\n\t\t),\n\t]);\n\n\tconst edits: Edit<ChangeInternal>[] = [{ ...insertEmptyNode, id: uuidv5('test', uuidNamespace) as EditId }];\n\n\t// Every subsequent edit is a set payload\n\tfor (let i = 1; i < numberOfEdits; i++) {\n\t\tconst edit = newEdit([ChangeInternal.setPayload(nodeId, payload(i))]);\n\t\tedits.push({ ...edit, id: uuidv5(i.toString(), uuidNamespace) as EditId });\n\t}\n\n\treturn edits;\n}\n\n/** Asserts that changes to SharedTree in editor() function do not cause any observable state change */\nexport function assertNoDelta(tree: SharedTree, editor: () => void) {\n\tconst viewA = tree.currentView;\n\teditor();\n\tconst viewB = tree.currentView;\n\tconst delta = viewA.delta(viewB);\n\texpect(delta).deep.equals({\n\t\tchanged: [],\n\t\tadded: [],\n\t\tremoved: [],\n\t});\n}\n\n/**\n * Used to test error throwing in async functions.\n */\nexport async function asyncFunctionThrowsCorrectly(\n\tasyncFunction: () => Promise<unknown>,\n\texpectedError: string\n): Promise<boolean> {\n\tlet errorMessage: string | undefined;\n\n\ttry {\n\t\tawait asyncFunction();\n\t} catch (error) {\n\t\terrorMessage = (error as Error).message;\n\t}\n\n\treturn errorMessage === expectedError;\n}\n\n/**\n * Returns true if two nodes have equivalent data, otherwise false.\n * Does not compare children or payloads.\n * @param nodes - two or more nodes to compare\n */\nexport function areNodesEquivalent(...nodes: NodeData<unknown>[]): boolean {\n\tif (nodes.length < 2) {\n\t\tfail('Too few nodes to compare');\n\t}\n\n\tfor (let i = 1; i < nodes.length; i++) {\n\t\tif (nodes[i].definition !== nodes[0].definition) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (nodes[i].identifier !== nodes[0].identifier) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n// This accounts for this file being executed after compilation. If many tests want to leverage resources, we should unify\n// resource path logic to a single place.\nexport const testDocumentsPathBase = resolve(__dirname, '../../../src/test/documents/');\n\nexport const versionComparator = (versionA: string, versionB: string): number => {\n\tconst versionASplit = versionA.split('.');\n\tconst versionBSplit = versionB.split('.');\n\n\tassert(\n\t\tversionASplit.length === versionBSplit.length && versionASplit.length === 3,\n\t\t'Version numbers should follow semantic versioning.'\n\t);\n\n\tfor (let i = 0; i < 3; ++i) {\n\t\tconst numberA = parseInt(versionASplit[i], 10);\n\t\tconst numberB = parseInt(versionBSplit[i], 10);\n\n\t\tif (numberA > numberB) {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (numberA < numberB) {\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\treturn 0;\n};\n\n/**\n * Create a {@link SimpleTestTree} from the given {@link SharedTree} or {@link IdCompressor}\n */\nexport function setUpTestTree(idSource?: IdCompressor | SharedTree, expensiveValidation = false): TestTree {\n\tconst source = idSource ?? new IdCompressor(createSessionId(), reservedIdCount);\n\tif (source instanceof SharedTree) {\n\t\tassert(source.edits.length === 0, 'tree must be a new SharedTree');\n\t\tconst getNormalizer = () => getIdNormalizerFromSharedTree(source);\n\t\tconst contextWrapper = {\n\t\t\tnormalizeToOpSpace: (id: NodeId) => getNormalizer().normalizeToOpSpace(id),\n\t\t\tnormalizeToSessionSpace: (id: OpSpaceNodeId, sessionId: SessionId) =>\n\t\t\t\tgetNormalizer().normalizeToSessionSpace(id, sessionId),\n\t\t\tget localSessionId() {\n\t\t\t\treturn getNormalizer().localSessionId;\n\t\t\t},\n\t\t};\n\t\tconst simpleTestTree = new SimpleTestTree(source, contextWrapper, expensiveValidation);\n\t\tsetTestTree(source, simpleTestTree);\n\t\treturn simpleTestTree;\n\t}\n\n\tconst context = makeNodeIdContext(source);\n\treturn new SimpleTestTree(context, context, expensiveValidation);\n}\n\n/**\n * Gets an id normalizer from the provided shared-tree. This is\n */\nexport function getIdNormalizerFromSharedTree(sharedTree: SharedTree): NodeIdNormalizer<OpSpaceNodeId> {\n\treturn (\n\t\t((sharedTree as any).idNormalizer as NodeIdNormalizer<OpSpaceNodeId>) ??\n\t\tfail('Failed to find SharedTree normalizer')\n\t);\n}\n\n/**\n * Create a {@link SimpleTestTree} before each test\n */\nexport function refreshTestTree(\n\tidSourceFactory?: (() => IdCompressor) | (() => SharedTree),\n\tfn?: (testTree: TestTree) => void,\n\texpensiveValidation = false\n): TestTree {\n\tconst factory = idSourceFactory ?? (() => new IdCompressor(createSessionId(), reservedIdCount));\n\treturn new RefreshingTestTree(() => {\n\t\treturn setUpTestTree(factory(), expensiveValidation);\n\t}, fn);\n}\n\nexport function makeNodeIdContext(idCompressor?: IdCompressor): NodeIdContext & NodeIdNormalizer<OpSpaceNodeId> {\n\tconst compressor = idCompressor ?? new IdCompressor(createSessionId(), reservedIdCount);\n\treturn getNodeIdContext(compressor);\n}\n\n/**\n * Applies an arbitrary edit to the given SharedTree which leaves the tree in the same state that it was before the edit.\n * This is useful for test scenarios that want to apply edits but don't care what they do.\n */\nexport function applyNoop(tree: SharedTree): Edit<unknown> {\n\treturn tree.applyEdit(...noopEdit(tree.currentView));\n}\n\n/**\n * Creates an arbitrary edit which leaves a tree in the same state that it was before the edit.\n * This is useful for test scenarios that want to create edits but don't care what they do.\n */\nexport function noopEdit(view: TreeView): Change[] {\n\tconst traitLocation = testTrait(view);\n\tconst trait = view.getTrait(traitLocation);\n\t// Set the test trait to the same thing that it already was\n\treturn setTrait(\n\t\ttraitLocation,\n\t\ttrait.map((id) => getChangeNodeFromViewNode(view, id))\n\t);\n}\n\n/** Translate an ID in one context to an ID in another */\nexport function translateId(id: NodeId | NodeData<NodeId>, from: NodeIdConverter, to: NodeIdConverter): NodeId {\n\treturn to.convertToNodeId(from.convertToStableNodeId(getNodeId(id)));\n}\n\nexport function normalizeId(tree: SharedTree, id: NodeId): OpSpaceNodeId {\n\tconst normalizer = getIdNormalizerFromSharedTree(tree);\n\treturn normalizer.normalizeToOpSpace(id);\n}\n\nexport function normalizeIds(tree: SharedTree, ...ids: NodeId[]): OpSpaceNodeId[] {\n\tconst normalizer = getIdNormalizerFromSharedTree(tree);\n\treturn ids.map((id) => normalizer.normalizeToOpSpace(id));\n}\n\nexport function idsAreEqual(treeA: SharedTree, idsA: NodeId[], treeB: SharedTree, idsB: NodeId[]): boolean {\n\tif (idsA.length !== idsB.length) {\n\t\treturn false;\n\t}\n\tconst contextA = getIdNormalizerFromSharedTree(treeA);\n\tconst contextB = getIdNormalizerFromSharedTree(treeB);\n\tfor (let i = 0; i < idsA.length; i++) {\n\t\tif (contextA.normalizeToOpSpace(idsA[i]) !== contextB.normalizeToOpSpace(idsB[i])) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nexport function normalizeEdit(\n\ttree: SharedTree,\n\tedit: Edit<ChangeInternal>\n): Edit<ReplaceRecursive<ChangeInternal, NodeId, OpSpaceNodeId>> {\n\tconst context = getIdNormalizerFromSharedTree(tree);\n\treturn convertEditIds(edit, (id) => context.normalizeToOpSpace(id));\n}\n\nexport function stabilizeEdit(\n\ttree: SharedTree,\n\tedit: Edit<ChangeInternal>\n): Edit<ReplaceRecursive<ChangeInternal, NodeId, StableNodeId>> {\n\treturn convertEditIds(edit, (id) => tree.convertToStableNodeId(id));\n}\n\nexport function getEditLogInternal(tree: SharedTree): OrderedEditSet<ChangeInternal> {\n\treturn tree.edits as unknown as OrderedEditSet<ChangeInternal>;\n}\n\n/**\n * Spies on all future ops submitted to `containerRuntimeFactory`. When ops are submitted, they will be `push`ed into the\n * returned array.\n */\nexport function spyOnSubmittedOps<Op extends SharedTreeOp | SharedTreeOp_0_0_2>(\n\tcontainerRuntimeFactory: MockContainerRuntimeFactory\n): Op[] {\n\tconst ops: Op[] = [];\n\tconst originalPush = containerRuntimeFactory.pushMessage.bind(containerRuntimeFactory);\n\tcontainerRuntimeFactory.pushMessage = (message: Partial<ISequencedDocumentMessage>) => {\n\t\tconst { contents } = message;\n\t\tops.push(contents as Op);\n\t\toriginalPush(message);\n\t};\n\treturn ops;\n}\n\n/**\n * Waits for summarization to occur, and returns a version that can be passed into newly loaded containers\n * to ensure they load this summary version. Use the `LoaderHeader.version` header.\n */\nexport async function waitForSummary(mainContainer: IContainer): Promise<string> {\n\tconst { deltaManager } = mainContainer;\n\tconst summaryCollection = new SummaryCollection(deltaManager, new TelemetryNullLogger());\n\tconst ackedSummary = await summaryCollection.waitSummaryAck(deltaManager.lastSequenceNumber);\n\treturn ackedSummary.summaryAck.contents.handle;\n}\n\n/**\n * Runs an action while the given container has been paused\n */\nexport async function withContainerOffline<TReturn>(\n\tprovider: ITestObjectProvider,\n\tcontainer: IContainer,\n\taction: () => TReturn\n): Promise<{ actionReturn: TReturn; pendingLocalState: string }> {\n\tawait provider.ensureSynchronized();\n\tawait provider.opProcessingController.pauseProcessing(container);\n\tconst actionReturn = action();\n\tconst pendingLocalState = container.closeAndGetPendingLocalState();\n\treturn { actionReturn, pendingLocalState };\n}\n"]}
|
|
@@ -14,8 +14,9 @@ import { setUpTestSharedTree, setUpTestTree, translateId } from './TestUtilities
|
|
|
14
14
|
* Runs undo/redo tests for SharedTree
|
|
15
15
|
*/
|
|
16
16
|
export function runSharedTreeUndoRedoTestSuite(options) {
|
|
17
|
+
var _a;
|
|
17
18
|
const { localMode, title, undo, redo, beforeEach: additionalSetup } = options;
|
|
18
|
-
const afterEdit = options.afterEdit
|
|
19
|
+
const afterEdit = (_a = options.afterEdit) !== null && _a !== void 0 ? _a : noop;
|
|
19
20
|
const testOutOfOrderRevert = options.testOutOfOrderRevert === undefined ? true : options.testOutOfOrderRevert;
|
|
20
21
|
const treeOptions = {
|
|
21
22
|
localMode,
|
|
@@ -43,7 +44,7 @@ export function runSharedTreeUndoRedoTestSuite(options) {
|
|
|
43
44
|
const secondTree = localMode
|
|
44
45
|
? undefined
|
|
45
46
|
: setUpTestSharedTree(Object.assign({ containerRuntimeFactory }, secondTreeOptions)).tree;
|
|
46
|
-
undoSharedTree = secondTree
|
|
47
|
+
undoSharedTree = secondTree !== null && secondTree !== void 0 ? secondTree : sharedTree;
|
|
47
48
|
if (additionalSetup !== undefined) {
|
|
48
49
|
if (secondTree !== undefined) {
|
|
49
50
|
additionalSetup([sharedTree, undoSharedTree]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UndoRedoTests.js","sourceRoot":"","sources":["../../../src/test/utilities/UndoRedoTests.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 { MockContainerRuntimeFactory } from '@fluidframework/test-runtime-utils';\nimport { expect } from 'chai';\nimport { noop } from '../../Common';\nimport { DetachedSequenceId, EditId, NodeId } from '../../Identifiers';\nimport { TreeNodeHandle } from '../../TreeNodeHandle';\nimport { SharedTree } from '../../SharedTree';\nimport { Change, StablePlace, StableRange } from '../../ChangeTypes';\nimport { deepCompareNodes } from '../../EditUtilities';\nimport { NodeData } from '../../persisted-types';\nimport { expectDefined } from './TestCommon';\nimport { buildLeaf, TestTree } from './TestNode';\nimport { setUpTestSharedTree, setUpTestTree, translateId } from './TestUtilities';\n\n/** Options used to generate a SharedTree undo/redo test suite. */\ninterface SharedTreeUndoRedoOptions {\n\t/** Determines if the tests should be run in local state or connected state with a remote SharedTree */\n\tlocalMode: boolean;\n\t/** Title used for the test suite describe block. */\n\ttitle: string;\n\t/** Function for undoing an edit on a given tree. */\n\tundo: (tree: SharedTree, editId: EditId) => EditId | undefined;\n\t/** Function for redoing an edit on a given tree. */\n\tredo: (tree: SharedTree, editId: EditId) => EditId | undefined;\n\t/** Optional additional setup to run in a beforeEach block that takes the SharedTrees used in the tests. */\n\tbeforeEach?: (trees: SharedTree[]) => void;\n\t/**\n\t * Function to run after edits. Used for testing the SharedTreeUndoRedoHandler in order to close stack\n\t * operations between edits.\n\t */\n\tafterEdit?: () => void;\n\t/** If true, runs tests for out-of-order undo/redo. True by default. */\n\ttestOutOfOrderRevert?: boolean;\n}\n\n/**\n * Runs undo/redo tests for SharedTree\n */\nexport function runSharedTreeUndoRedoTestSuite(options: SharedTreeUndoRedoOptions): void {\n\tconst { localMode, title, undo, redo, beforeEach: additionalSetup } = options;\n\tconst afterEdit = options.afterEdit || noop;\n\tconst testOutOfOrderRevert = options.testOutOfOrderRevert === undefined ? true : options.testOutOfOrderRevert;\n\n\tconst treeOptions = {\n\t\tlocalMode,\n\t\tallowInvalid: true,\n\t\tallowMalformed: true,\n\t};\n\n\tconst secondTreeOptions = {\n\t\tlocalMode,\n\t\tid: 'secondTestTree',\n\t\tallowInvalid: true,\n\t};\n\n\tdescribe(title, () => {\n\t\tlet testTree: TestTree;\n\t\tlet sharedTree: SharedTree;\n\t\tlet undoSharedTree: SharedTree;\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\n\t\tfunction getTreeHandle() {\n\t\t\treturn new TreeNodeHandle(sharedTree.currentView, testTree.identifier);\n\t\t}\n\n\t\tbeforeEach(() => {\n\t\t\tconst setupResult = setUpTestSharedTree(treeOptions);\n\t\t\tsharedTree = setupResult.tree;\n\t\t\ttestTree = setUpTestTree(sharedTree);\n\t\t\tcontainerRuntimeFactory = setupResult.containerRuntimeFactory;\n\t\t\tconst secondTree = localMode\n\t\t\t\t? undefined\n\t\t\t\t: setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions }).tree;\n\t\t\tundoSharedTree = secondTree || sharedTree;\n\n\t\t\tif (additionalSetup !== undefined) {\n\t\t\t\tif (secondTree !== undefined) {\n\t\t\t\t\tadditionalSetup([sharedTree, undoSharedTree]);\n\t\t\t\t} else {\n\t\t\t\t\tadditionalSetup([sharedTree]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tit('can detach and re-insert the same node', () => {\n\t\t\tconst detachedId = 0 as DetachedSequenceId;\n\t\t\tconst { id } = sharedTree.applyEdit(\n\t\t\t\tChange.detach(StableRange.only(testTree.left), detachedId),\n\t\t\t\tChange.insert(detachedId, StablePlace.atStartOf(testTree.left.traitLocation))\n\t\t\t);\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(deepCompareNodes(getTreeHandle(), testTree)).to.be.true;\n\n\t\t\tconst undoId: EditId = expectDefined(undo(sharedTree, id));\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(deepCompareNodes(getTreeHandle(), testTree)).to.be.true;\n\n\t\t\tredo(sharedTree, undoId);\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(deepCompareNodes(getTreeHandle(), testTree)).to.be.true;\n\t\t});\n\n\t\tit('works for Insert', () => {\n\t\t\tconst newNode = testTree.buildLeaf();\n\n\t\t\tconst { id } = sharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\tafterEdit();\n\t\t\texpect(sharedTree.edits.length).to.equal(2);\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\t// Undo testing\n\t\t\tconst undoId: EditId = expectDefined(undo(undoSharedTree, id));\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(sharedTree.edits.length).to.equal(3);\n\n\t\t\t// Check the inserted node was deleted\n\t\t\tconst leftTraitAfterUndo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\texpect(leftTraitAfterUndo.length).to.equal(1);\n\n\t\t\t// Redo testing\n\t\t\tredo(undoSharedTree, undoId);\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(sharedTree.edits.length).to.equal(4);\n\n\t\t\t// Check the inserted node was reinserted\n\t\t\tconst leftTraitAfterRedo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\texpect(leftTraitAfterRedo.length).to.equal(2);\n\t\t});\n\n\t\t// Scope of detach code and fixtures\n\t\t{\n\t\t\tfor (let startIndex = 0; startIndex < 8; ++startIndex) {\n\t\t\t\tfor (let endIndex = startIndex; endIndex < 8; ++endIndex) {\n\t\t\t\t\tit(`works for Detach [${startIndex} -> ${endIndex}]`, () => {\n\t\t\t\t\t\tconst leftTraitNodes = [\n\t\t\t\t\t\t\ttestTree.buildLeaf(testTree.generateNodeId()),\n\t\t\t\t\t\t\ttestTree.left,\n\t\t\t\t\t\t\ttestTree.buildLeaf(testTree.generateNodeId()),\n\t\t\t\t\t\t];\n\t\t\t\t\t\tconst places = leftTraitPlaces(testTree, leftTraitNodes);\n\n\t\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t\t...Change.insertTree(leftTraitNodes[0], StablePlace.before(testTree.left))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tafterEdit();\n\t\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(leftTraitNodes[2], StablePlace.after(testTree.left)));\n\t\t\t\t\t\tafterEdit();\n\t\t\t\t\t\texpect(sharedTree.currentView.getTrait(testTree.left.traitLocation).length).to.equal(3);\n\n\t\t\t\t\t\tconst range = {\n\t\t\t\t\t\t\tstart: places[startIndex].place,\n\t\t\t\t\t\t\tend: places[endIndex].place,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst countDetached = places[endIndex].index - places[startIndex].index;\n\t\t\t\t\t\tconst { id } = sharedTree.applyEdit(Change.delete(range));\n\t\t\t\t\t\tafterEdit();\n\n\t\t\t\t\t\texpect(sharedTree.edits.length).to.equal(4);\n\t\t\t\t\t\texpect(sharedTree.currentView.getTrait(testTree.left.traitLocation).length).to.equal(\n\t\t\t\t\t\t\t3 - countDetached\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!localMode) {\n\t\t\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Undo testing\n\t\t\t\t\t\tconst undoId: EditId = expectDefined(undo(undoSharedTree, id));\n\n\t\t\t\t\t\tif (!localMode) {\n\t\t\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\texpect(sharedTree.edits.length).to.equal(5);\n\t\t\t\t\t\texpect(sharedTree.currentView.getTrait(testTree.left.traitLocation).length).to.equal(3);\n\n\t\t\t\t\t\t// Redo testing\n\t\t\t\t\t\tredo(undoSharedTree, undoId);\n\n\t\t\t\t\t\tif (!localMode) {\n\t\t\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\texpect(sharedTree.edits.length).to.equal(6);\n\t\t\t\t\t\texpect(sharedTree.currentView.getTrait(testTree.left.traitLocation).length).to.equal(\n\t\t\t\t\t\t\t3 - countDetached\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tit('works for SetValue', () => {\n\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\tsharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\tafterEdit();\n\t\t\tconst testPayload = 5;\n\t\t\tconst { id } = sharedTree.applyEdit(Change.setPayload(newNode.identifier, testPayload));\n\t\t\tafterEdit();\n\t\t\texpect(sharedTree.edits.length).to.equal(3);\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\t// Undo testing\n\t\t\tconst undoId: EditId = expectDefined(undo(undoSharedTree, id));\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(sharedTree.edits.length).to.equal(4);\n\n\t\t\t// Check the node whose value was set now has an empty payload\n\t\t\tconst leftTraitAfterUndo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\tconst nodeAfterUndo = sharedTree.currentView.getViewNode(leftTraitAfterUndo[1]);\n\t\t\texpect(nodeAfterUndo.payload).to.be.undefined;\n\n\t\t\t// Redo testing\n\t\t\tredo(undoSharedTree, undoId);\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(sharedTree.edits.length).to.equal(5);\n\n\t\t\t// Check the inserted node was reinserted\n\t\t\tconst leftTraitAfterRedo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\tconst nodeAfterRedo = sharedTree.currentView.getViewNode(leftTraitAfterRedo[1]);\n\t\t\texpect(nodeAfterRedo.payload).equal(testPayload);\n\t\t});\n\n\t\tit('works for conflicting edits', () => {\n\t\t\tconst newNodeId = sharedTree.generateNodeId();\n\t\t\tconst newNode = buildLeaf(newNodeId);\n\t\t\tsharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.atStartOf(testTree.left.traitLocation)));\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// First tree deletes the new node under left trait\n\t\t\tsharedTree.applyEdit(Change.detach(StableRange.only(newNode)));\n\t\t\tafterEdit();\n\n\t\t\t// Second tree also deletes new left node\n\t\t\tconst translatedNodeId = translateId(newNodeId, sharedTree, undoSharedTree);\n\t\t\tconst { id } = undoSharedTree.applyEdit(Change.detach(StableRange.only(translatedNodeId)));\n\t\t\tafterEdit();\n\n\t\t\t// Synchronize; the first tree's edit will apply but the second tree's will be invalid\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\t// The undo should succeed but do nothing\n\t\t\tundo(undoSharedTree, id);\n\n\t\t\t// Check that the undo had no effect\n\t\t\tconst traitAfterUndo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\texpect(traitAfterUndo.length).equals(1);\n\t\t});\n\n\t\tif (testOutOfOrderRevert === true) {\n\t\t\tit('works for out-of-order Insert', () => {\n\t\t\t\tconst firstNode = testTree.buildLeaf();\n\t\t\t\tconst secondNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tconst { id } = sharedTree.applyEdit(...Change.insertTree(firstNode, StablePlace.after(testTree.left)));\n\t\t\t\tafterEdit();\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(secondNode, StablePlace.after(testTree.left)));\n\t\t\t\tafterEdit();\n\t\t\t\texpect(sharedTree.edits.length).to.equal(3);\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\t// Undo testing\n\t\t\t\tconst undoId: EditId = expectDefined(undo(undoSharedTree, id));\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\tconst editsAfterUndo = sharedTree.edits;\n\t\t\t\texpect(editsAfterUndo.length).to.equal(4);\n\n\t\t\t\tconst leftTraitAfterUndo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTraitAfterUndo.length).to.equal(2);\n\n\t\t\t\t// Check that the node under the left trait is the second node\n\t\t\t\tconst nodeAfterUndo = sharedTree.currentView.getViewNode(leftTraitAfterUndo[1]);\n\t\t\t\texpect(nodeAfterUndo.identifier).to.equal(secondNode.identifier);\n\n\t\t\t\t// Redo testing\n\t\t\t\tredo(undoSharedTree, undoId);\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\texpect(sharedTree.edits.length).to.equal(5);\n\n\t\t\t\tconst leftTraitAfterRedo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTraitAfterRedo.length).to.equal(3);\n\t\t\t});\n\n\t\t\tit('works for out-of-order Detach', () => {\n\t\t\t\tconst firstNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst secondNode = testTree.buildLeaf();\n\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(firstNode, StablePlace.after(testTree.left)));\n\t\t\t\tafterEdit();\n\t\t\t\tconst { id } = sharedTree.applyEdit(Change.delete(StableRange.only(firstNode)));\n\t\t\t\tafterEdit();\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(secondNode, StablePlace.after(testTree.left)));\n\t\t\t\tafterEdit();\n\t\t\t\texpect(sharedTree.edits.length).to.equal(4);\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\t// Undo testing\n\t\t\t\tconst undoId: EditId = expectDefined(undo(undoSharedTree, id));\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\texpect(sharedTree.edits.length).to.equal(5);\n\n\t\t\t\tconst leftTraitAfterUndo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTraitAfterUndo.length).to.equal(3);\n\n\t\t\t\t// Check the first node is the second one under the left trait\n\t\t\t\tconst nodeAfterUndo = sharedTree.currentView.getViewNode(leftTraitAfterUndo[1]);\n\t\t\t\texpect(nodeAfterUndo.identifier).to.equal(firstNode.identifier);\n\n\t\t\t\t// Redo testing\n\t\t\t\tredo(undoSharedTree, undoId);\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\texpect(sharedTree.edits.length).to.equal(6);\n\n\t\t\t\tconst leftTraitAfterRedo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTraitAfterRedo.length).to.equal(2);\n\t\t\t});\n\n\t\t\tit('works for out-of-order SetValue', () => {\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\tafterEdit();\n\t\t\t\tconst testPayload = 10;\n\t\t\t\tconst { id } = sharedTree.applyEdit(Change.setPayload(newNode.identifier, testPayload));\n\t\t\t\tafterEdit();\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\t\tafterEdit();\n\t\t\t\texpect(sharedTree.edits.length).to.equal(4);\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\t// Undo testing\n\t\t\t\tconst undoId: EditId = expectDefined(undo(undoSharedTree, id));\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\texpect(sharedTree.edits.length).to.equal(5);\n\n\t\t\t\t// Check the node whose value was set now has an empty payload\n\t\t\t\tconst leftTraitAfterUndo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\tconst nodeAfterUndo = sharedTree.currentView.getViewNode(leftTraitAfterUndo[1]);\n\t\t\t\texpect(nodeAfterUndo.payload).to.be.undefined;\n\n\t\t\t\t// Redo testing\n\t\t\t\tredo(undoSharedTree, undoId);\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\texpect(sharedTree.edits.length).to.equal(6);\n\n\t\t\t\t// Check the inserted node was reinserted\n\t\t\t\tconst leftTraitAfterRedo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\tconst nodeAfterRedo = sharedTree.currentView.getViewNode(leftTraitAfterRedo[1]);\n\t\t\t\texpect(nodeAfterRedo.payload).equal(testPayload);\n\t\t\t});\n\t\t}\n\t});\n}\n\n/**\n * Generate all possible places in the given trait\n */\nfunction leftTraitPlaces(testTree: TestTree, trait: NodeData<NodeId>[]): { index: number; place: StablePlace }[] {\n\tconst places: { index: number; place: StablePlace }[] = [];\n\tplaces.push({ index: 0, place: StablePlace.atStartOf(testTree.left.traitLocation) });\n\tfor (let i = 0; i < trait.length; i++) {\n\t\tplaces.push({ index: i, place: StablePlace.before(trait[i]) });\n\t\tplaces.push({ index: i + 1, place: StablePlace.after(trait[i]) });\n\t}\n\tplaces.push({ index: 3, place: StablePlace.atEndOf(testTree.left.traitLocation) });\n\treturn places;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"UndoRedoTests.js","sourceRoot":"","sources":["../../../src/test/utilities/UndoRedoTests.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 { MockContainerRuntimeFactory } from '@fluidframework/test-runtime-utils';\nimport { expect } from 'chai';\nimport { noop } from '../../Common';\nimport { DetachedSequenceId, EditId, NodeId } from '../../Identifiers';\nimport { TreeNodeHandle } from '../../TreeNodeHandle';\nimport { SharedTree } from '../../SharedTree';\nimport { Change, StablePlace, StableRange } from '../../ChangeTypes';\nimport { deepCompareNodes } from '../../EditUtilities';\nimport { NodeData } from '../../persisted-types';\nimport { expectDefined } from './TestCommon';\nimport { buildLeaf, TestTree } from './TestNode';\nimport { setUpTestSharedTree, setUpTestTree, translateId } from './TestUtilities';\n\n/** Options used to generate a SharedTree undo/redo test suite. */\ninterface SharedTreeUndoRedoOptions {\n\t/** Determines if the tests should be run in local state or connected state with a remote SharedTree */\n\tlocalMode: boolean;\n\t/** Title used for the test suite describe block. */\n\ttitle: string;\n\t/** Function for undoing an edit on a given tree. */\n\tundo: (tree: SharedTree, editId: EditId) => EditId | undefined;\n\t/** Function for redoing an edit on a given tree. */\n\tredo: (tree: SharedTree, editId: EditId) => EditId | undefined;\n\t/** Optional additional setup to run in a beforeEach block that takes the SharedTrees used in the tests. */\n\tbeforeEach?: (trees: SharedTree[]) => void;\n\t/**\n\t * Function to run after edits. Used for testing the SharedTreeUndoRedoHandler in order to close stack\n\t * operations between edits.\n\t */\n\tafterEdit?: () => void;\n\t/** If true, runs tests for out-of-order undo/redo. True by default. */\n\ttestOutOfOrderRevert?: boolean;\n}\n\n/**\n * Runs undo/redo tests for SharedTree\n */\nexport function runSharedTreeUndoRedoTestSuite(options: SharedTreeUndoRedoOptions): void {\n\tconst { localMode, title, undo, redo, beforeEach: additionalSetup } = options;\n\tconst afterEdit = options.afterEdit ?? noop;\n\tconst testOutOfOrderRevert = options.testOutOfOrderRevert === undefined ? true : options.testOutOfOrderRevert;\n\n\tconst treeOptions = {\n\t\tlocalMode,\n\t\tallowInvalid: true,\n\t\tallowMalformed: true,\n\t};\n\n\tconst secondTreeOptions = {\n\t\tlocalMode,\n\t\tid: 'secondTestTree',\n\t\tallowInvalid: true,\n\t};\n\n\tdescribe(title, () => {\n\t\tlet testTree: TestTree;\n\t\tlet sharedTree: SharedTree;\n\t\tlet undoSharedTree: SharedTree;\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\n\t\tfunction getTreeHandle() {\n\t\t\treturn new TreeNodeHandle(sharedTree.currentView, testTree.identifier);\n\t\t}\n\n\t\tbeforeEach(() => {\n\t\t\tconst setupResult = setUpTestSharedTree(treeOptions);\n\t\t\tsharedTree = setupResult.tree;\n\t\t\ttestTree = setUpTestTree(sharedTree);\n\t\t\tcontainerRuntimeFactory = setupResult.containerRuntimeFactory;\n\t\t\tconst secondTree = localMode\n\t\t\t\t? undefined\n\t\t\t\t: setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions }).tree;\n\t\t\tundoSharedTree = secondTree ?? sharedTree;\n\n\t\t\tif (additionalSetup !== undefined) {\n\t\t\t\tif (secondTree !== undefined) {\n\t\t\t\t\tadditionalSetup([sharedTree, undoSharedTree]);\n\t\t\t\t} else {\n\t\t\t\t\tadditionalSetup([sharedTree]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tit('can detach and re-insert the same node', () => {\n\t\t\tconst detachedId = 0 as DetachedSequenceId;\n\t\t\tconst { id } = sharedTree.applyEdit(\n\t\t\t\tChange.detach(StableRange.only(testTree.left), detachedId),\n\t\t\t\tChange.insert(detachedId, StablePlace.atStartOf(testTree.left.traitLocation))\n\t\t\t);\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(deepCompareNodes(getTreeHandle(), testTree)).to.be.true;\n\n\t\t\tconst undoId: EditId = expectDefined(undo(sharedTree, id));\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(deepCompareNodes(getTreeHandle(), testTree)).to.be.true;\n\n\t\t\tredo(sharedTree, undoId);\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(deepCompareNodes(getTreeHandle(), testTree)).to.be.true;\n\t\t});\n\n\t\tit('works for Insert', () => {\n\t\t\tconst newNode = testTree.buildLeaf();\n\n\t\t\tconst { id } = sharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\tafterEdit();\n\t\t\texpect(sharedTree.edits.length).to.equal(2);\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\t// Undo testing\n\t\t\tconst undoId: EditId = expectDefined(undo(undoSharedTree, id));\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(sharedTree.edits.length).to.equal(3);\n\n\t\t\t// Check the inserted node was deleted\n\t\t\tconst leftTraitAfterUndo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\texpect(leftTraitAfterUndo.length).to.equal(1);\n\n\t\t\t// Redo testing\n\t\t\tredo(undoSharedTree, undoId);\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(sharedTree.edits.length).to.equal(4);\n\n\t\t\t// Check the inserted node was reinserted\n\t\t\tconst leftTraitAfterRedo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\texpect(leftTraitAfterRedo.length).to.equal(2);\n\t\t});\n\n\t\t// Scope of detach code and fixtures\n\t\t{\n\t\t\tfor (let startIndex = 0; startIndex < 8; ++startIndex) {\n\t\t\t\tfor (let endIndex = startIndex; endIndex < 8; ++endIndex) {\n\t\t\t\t\tit(`works for Detach [${startIndex} -> ${endIndex}]`, () => {\n\t\t\t\t\t\tconst leftTraitNodes = [\n\t\t\t\t\t\t\ttestTree.buildLeaf(testTree.generateNodeId()),\n\t\t\t\t\t\t\ttestTree.left,\n\t\t\t\t\t\t\ttestTree.buildLeaf(testTree.generateNodeId()),\n\t\t\t\t\t\t];\n\t\t\t\t\t\tconst places = leftTraitPlaces(testTree, leftTraitNodes);\n\n\t\t\t\t\t\tsharedTree.applyEdit(\n\t\t\t\t\t\t\t...Change.insertTree(leftTraitNodes[0], StablePlace.before(testTree.left))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tafterEdit();\n\t\t\t\t\t\tsharedTree.applyEdit(...Change.insertTree(leftTraitNodes[2], StablePlace.after(testTree.left)));\n\t\t\t\t\t\tafterEdit();\n\t\t\t\t\t\texpect(sharedTree.currentView.getTrait(testTree.left.traitLocation).length).to.equal(3);\n\n\t\t\t\t\t\tconst range = {\n\t\t\t\t\t\t\tstart: places[startIndex].place,\n\t\t\t\t\t\t\tend: places[endIndex].place,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst countDetached = places[endIndex].index - places[startIndex].index;\n\t\t\t\t\t\tconst { id } = sharedTree.applyEdit(Change.delete(range));\n\t\t\t\t\t\tafterEdit();\n\n\t\t\t\t\t\texpect(sharedTree.edits.length).to.equal(4);\n\t\t\t\t\t\texpect(sharedTree.currentView.getTrait(testTree.left.traitLocation).length).to.equal(\n\t\t\t\t\t\t\t3 - countDetached\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!localMode) {\n\t\t\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Undo testing\n\t\t\t\t\t\tconst undoId: EditId = expectDefined(undo(undoSharedTree, id));\n\n\t\t\t\t\t\tif (!localMode) {\n\t\t\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\texpect(sharedTree.edits.length).to.equal(5);\n\t\t\t\t\t\texpect(sharedTree.currentView.getTrait(testTree.left.traitLocation).length).to.equal(3);\n\n\t\t\t\t\t\t// Redo testing\n\t\t\t\t\t\tredo(undoSharedTree, undoId);\n\n\t\t\t\t\t\tif (!localMode) {\n\t\t\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\texpect(sharedTree.edits.length).to.equal(6);\n\t\t\t\t\t\texpect(sharedTree.currentView.getTrait(testTree.left.traitLocation).length).to.equal(\n\t\t\t\t\t\t\t3 - countDetached\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tit('works for SetValue', () => {\n\t\t\tconst newNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\tsharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\tafterEdit();\n\t\t\tconst testPayload = 5;\n\t\t\tconst { id } = sharedTree.applyEdit(Change.setPayload(newNode.identifier, testPayload));\n\t\t\tafterEdit();\n\t\t\texpect(sharedTree.edits.length).to.equal(3);\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\t// Undo testing\n\t\t\tconst undoId: EditId = expectDefined(undo(undoSharedTree, id));\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(sharedTree.edits.length).to.equal(4);\n\n\t\t\t// Check the node whose value was set now has an empty payload\n\t\t\tconst leftTraitAfterUndo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\tconst nodeAfterUndo = sharedTree.currentView.getViewNode(leftTraitAfterUndo[1]);\n\t\t\texpect(nodeAfterUndo.payload).to.be.undefined;\n\n\t\t\t// Redo testing\n\t\t\tredo(undoSharedTree, undoId);\n\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\texpect(sharedTree.edits.length).to.equal(5);\n\n\t\t\t// Check the inserted node was reinserted\n\t\t\tconst leftTraitAfterRedo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\tconst nodeAfterRedo = sharedTree.currentView.getViewNode(leftTraitAfterRedo[1]);\n\t\t\texpect(nodeAfterRedo.payload).equal(testPayload);\n\t\t});\n\n\t\tit('works for conflicting edits', () => {\n\t\t\tconst newNodeId = sharedTree.generateNodeId();\n\t\t\tconst newNode = buildLeaf(newNodeId);\n\t\t\tsharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.atStartOf(testTree.left.traitLocation)));\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// First tree deletes the new node under left trait\n\t\t\tsharedTree.applyEdit(Change.detach(StableRange.only(newNode)));\n\t\t\tafterEdit();\n\n\t\t\t// Second tree also deletes new left node\n\t\t\tconst translatedNodeId = translateId(newNodeId, sharedTree, undoSharedTree);\n\t\t\tconst { id } = undoSharedTree.applyEdit(Change.detach(StableRange.only(translatedNodeId)));\n\t\t\tafterEdit();\n\n\t\t\t// Synchronize; the first tree's edit will apply but the second tree's will be invalid\n\t\t\tif (!localMode) {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\t// The undo should succeed but do nothing\n\t\t\tundo(undoSharedTree, id);\n\n\t\t\t// Check that the undo had no effect\n\t\t\tconst traitAfterUndo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\texpect(traitAfterUndo.length).equals(1);\n\t\t});\n\n\t\tif (testOutOfOrderRevert === true) {\n\t\t\tit('works for out-of-order Insert', () => {\n\t\t\t\tconst firstNode = testTree.buildLeaf();\n\t\t\t\tconst secondNode = testTree.buildLeaf(testTree.generateNodeId());\n\n\t\t\t\tconst { id } = sharedTree.applyEdit(...Change.insertTree(firstNode, StablePlace.after(testTree.left)));\n\t\t\t\tafterEdit();\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(secondNode, StablePlace.after(testTree.left)));\n\t\t\t\tafterEdit();\n\t\t\t\texpect(sharedTree.edits.length).to.equal(3);\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\t// Undo testing\n\t\t\t\tconst undoId: EditId = expectDefined(undo(undoSharedTree, id));\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\tconst editsAfterUndo = sharedTree.edits;\n\t\t\t\texpect(editsAfterUndo.length).to.equal(4);\n\n\t\t\t\tconst leftTraitAfterUndo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTraitAfterUndo.length).to.equal(2);\n\n\t\t\t\t// Check that the node under the left trait is the second node\n\t\t\t\tconst nodeAfterUndo = sharedTree.currentView.getViewNode(leftTraitAfterUndo[1]);\n\t\t\t\texpect(nodeAfterUndo.identifier).to.equal(secondNode.identifier);\n\n\t\t\t\t// Redo testing\n\t\t\t\tredo(undoSharedTree, undoId);\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\texpect(sharedTree.edits.length).to.equal(5);\n\n\t\t\t\tconst leftTraitAfterRedo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTraitAfterRedo.length).to.equal(3);\n\t\t\t});\n\n\t\t\tit('works for out-of-order Detach', () => {\n\t\t\t\tconst firstNode = testTree.buildLeaf(testTree.generateNodeId());\n\t\t\t\tconst secondNode = testTree.buildLeaf();\n\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(firstNode, StablePlace.after(testTree.left)));\n\t\t\t\tafterEdit();\n\t\t\t\tconst { id } = sharedTree.applyEdit(Change.delete(StableRange.only(firstNode)));\n\t\t\t\tafterEdit();\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(secondNode, StablePlace.after(testTree.left)));\n\t\t\t\tafterEdit();\n\t\t\t\texpect(sharedTree.edits.length).to.equal(4);\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\t// Undo testing\n\t\t\t\tconst undoId: EditId = expectDefined(undo(undoSharedTree, id));\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\texpect(sharedTree.edits.length).to.equal(5);\n\n\t\t\t\tconst leftTraitAfterUndo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTraitAfterUndo.length).to.equal(3);\n\n\t\t\t\t// Check the first node is the second one under the left trait\n\t\t\t\tconst nodeAfterUndo = sharedTree.currentView.getViewNode(leftTraitAfterUndo[1]);\n\t\t\t\texpect(nodeAfterUndo.identifier).to.equal(firstNode.identifier);\n\n\t\t\t\t// Redo testing\n\t\t\t\tredo(undoSharedTree, undoId);\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\texpect(sharedTree.edits.length).to.equal(6);\n\n\t\t\t\tconst leftTraitAfterRedo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\texpect(leftTraitAfterRedo.length).to.equal(2);\n\t\t\t});\n\n\t\t\tit('works for out-of-order SetValue', () => {\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\tafterEdit();\n\t\t\t\tconst testPayload = 10;\n\t\t\t\tconst { id } = sharedTree.applyEdit(Change.setPayload(newNode.identifier, testPayload));\n\t\t\t\tafterEdit();\n\t\t\t\tsharedTree.applyEdit(...Change.insertTree(newNode, StablePlace.after(testTree.left)));\n\t\t\t\tafterEdit();\n\t\t\t\texpect(sharedTree.edits.length).to.equal(4);\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\t// Undo testing\n\t\t\t\tconst undoId: EditId = expectDefined(undo(undoSharedTree, id));\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\texpect(sharedTree.edits.length).to.equal(5);\n\n\t\t\t\t// Check the node whose value was set now has an empty payload\n\t\t\t\tconst leftTraitAfterUndo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\tconst nodeAfterUndo = sharedTree.currentView.getViewNode(leftTraitAfterUndo[1]);\n\t\t\t\texpect(nodeAfterUndo.payload).to.be.undefined;\n\n\t\t\t\t// Redo testing\n\t\t\t\tredo(undoSharedTree, undoId);\n\n\t\t\t\tif (!localMode) {\n\t\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\t}\n\n\t\t\t\texpect(sharedTree.edits.length).to.equal(6);\n\n\t\t\t\t// Check the inserted node was reinserted\n\t\t\t\tconst leftTraitAfterRedo = sharedTree.currentView.getTrait(testTree.left.traitLocation);\n\t\t\t\tconst nodeAfterRedo = sharedTree.currentView.getViewNode(leftTraitAfterRedo[1]);\n\t\t\t\texpect(nodeAfterRedo.payload).equal(testPayload);\n\t\t\t});\n\t\t}\n\t});\n}\n\n/**\n * Generate all possible places in the given trait\n */\nfunction leftTraitPlaces(testTree: TestTree, trait: NodeData<NodeId>[]): { index: number; place: StablePlace }[] {\n\tconst places: { index: number; place: StablePlace }[] = [];\n\tplaces.push({ index: 0, place: StablePlace.atStartOf(testTree.left.traitLocation) });\n\tfor (let i = 0; i < trait.length; i++) {\n\t\tplaces.push({ index: i, place: StablePlace.before(trait[i]) });\n\t\tplaces.push({ index: i + 1, place: StablePlace.after(trait[i]) });\n\t}\n\tplaces.push({ index: 3, place: StablePlace.atEndOf(testTree.left.traitLocation) });\n\treturn places;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluid-experimental/tree",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.0.0-internal.1.0.0",
|
|
4
4
|
"description": "Distributed tree",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -24,9 +24,10 @@
|
|
|
24
24
|
"clean": "rimraf dist lib *.tsbuildinfo *.build.log",
|
|
25
25
|
"eslint": "eslint src",
|
|
26
26
|
"eslint:fix": "eslint src --fix",
|
|
27
|
+
"format": "npm run prettier:fix",
|
|
27
28
|
"lint": "npm run prettier && npm run eslint",
|
|
28
29
|
"lint:fix": "npm run prettier:fix && npm run eslint:fix",
|
|
29
|
-
"perf": "cross-env FLUID_TEST_VERBOSE=1 mocha \"dist/**/*.tests.js\" --exit -r node_modules/@fluidframework/mocha-test-setup --
|
|
30
|
+
"perf": "cross-env FLUID_TEST_VERBOSE=1 mocha \"dist/**/*.tests.js\" --node-option unhandled-rejections=strict,expose-gc --exit -r node_modules/@fluidframework/mocha-test-setup --perfMode --fgrep @Benchmark --reporter @fluid-tools/benchmark/dist/MochaReporter.js --timeout 30000",
|
|
30
31
|
"perf:measure": "npm run perf -- --fgrep @Measurement",
|
|
31
32
|
"prettier": "prettier --check \"**/*.{js,json,jsx,md,ts,tsx,yml,yaml}\"",
|
|
32
33
|
"prettier:fix": "prettier --write \"**/*.{js,json,jsx,md,ts,tsx,yml,yaml}\"",
|
|
@@ -37,14 +38,14 @@
|
|
|
37
38
|
},
|
|
38
39
|
"dependencies": {
|
|
39
40
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
40
|
-
"@fluidframework/common-utils": "^0.
|
|
41
|
-
"@fluidframework/container-definitions": "^1.
|
|
42
|
-
"@fluidframework/core-interfaces": "^1.
|
|
43
|
-
"@fluidframework/datastore-definitions": "^1.
|
|
44
|
-
"@fluidframework/protocol-definitions": "^0.
|
|
45
|
-
"@fluidframework/runtime-definitions": "^1.
|
|
46
|
-
"@fluidframework/shared-object-base": "^1.
|
|
47
|
-
"@fluidframework/telemetry-utils": "^1.
|
|
41
|
+
"@fluidframework/common-utils": "^1.0.0",
|
|
42
|
+
"@fluidframework/container-definitions": "^2.0.0-internal.1.0.0",
|
|
43
|
+
"@fluidframework/core-interfaces": "^2.0.0-internal.1.0.0",
|
|
44
|
+
"@fluidframework/datastore-definitions": "^2.0.0-internal.1.0.0",
|
|
45
|
+
"@fluidframework/protocol-definitions": "^1.0.0",
|
|
46
|
+
"@fluidframework/runtime-definitions": "^2.0.0-internal.1.0.0",
|
|
47
|
+
"@fluidframework/shared-object-base": "^2.0.0-internal.1.0.0",
|
|
48
|
+
"@fluidframework/telemetry-utils": "^2.0.0-internal.1.0.0",
|
|
48
49
|
"buffer": "^6.0.3",
|
|
49
50
|
"denque": "^1.5.1",
|
|
50
51
|
"lru-cache": "^6.0.0",
|
|
@@ -52,19 +53,19 @@
|
|
|
52
53
|
"uuid": "^8.3.1"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
55
|
-
"@fluid-internal/stochastic-test-utils": "^1.
|
|
56
|
+
"@fluid-internal/stochastic-test-utils": "^2.0.0-internal.1.0.0",
|
|
56
57
|
"@fluid-tools/benchmark": "^0.40.0",
|
|
57
58
|
"@fluidframework/build-common": "^0.24.0",
|
|
58
|
-
"@fluidframework/container-loader": "^1.
|
|
59
|
-
"@fluidframework/container-runtime": "^1.
|
|
59
|
+
"@fluidframework/container-loader": "^2.0.0-internal.1.0.0",
|
|
60
|
+
"@fluidframework/container-runtime": "^2.0.0-internal.1.0.0",
|
|
60
61
|
"@fluidframework/eslint-config-fluid": "^0.28.2000",
|
|
61
|
-
"@fluidframework/mocha-test-setup": "^1.
|
|
62
|
-
"@fluidframework/runtime-utils": "^1.
|
|
63
|
-
"@fluidframework/test-driver-definitions": "^1.
|
|
64
|
-
"@fluidframework/test-drivers": "^1.
|
|
65
|
-
"@fluidframework/test-runtime-utils": "^1.
|
|
66
|
-
"@fluidframework/test-utils": "^1.
|
|
67
|
-
"@fluidframework/undo-redo": "^1.
|
|
62
|
+
"@fluidframework/mocha-test-setup": "^2.0.0-internal.1.0.0",
|
|
63
|
+
"@fluidframework/runtime-utils": "^2.0.0-internal.1.0.0",
|
|
64
|
+
"@fluidframework/test-driver-definitions": "^2.0.0-internal.1.0.0",
|
|
65
|
+
"@fluidframework/test-drivers": "^2.0.0-internal.1.0.0",
|
|
66
|
+
"@fluidframework/test-runtime-utils": "^2.0.0-internal.1.0.0",
|
|
67
|
+
"@fluidframework/test-utils": "^2.0.0-internal.1.0.0",
|
|
68
|
+
"@fluidframework/undo-redo": "^2.0.0-internal.1.0.0",
|
|
68
69
|
"@microsoft/api-extractor": "^7.22.2",
|
|
69
70
|
"@rushstack/eslint-config": "^2.5.1",
|
|
70
71
|
"@types/lru-cache": "^5.1.0",
|
|
@@ -72,6 +73,7 @@
|
|
|
72
73
|
"@types/random-js": "^1.0.31",
|
|
73
74
|
"chai": "^4.2.0",
|
|
74
75
|
"concurrently": "^6.2.0",
|
|
76
|
+
"copyfiles": "^2.1.0",
|
|
75
77
|
"cross-env": "^7.0.2",
|
|
76
78
|
"easy-table": "^1.1.1",
|
|
77
79
|
"env-cmd": "^10.1.0",
|