@fluidframework/sequence 2.0.0-dev-rc.2.0.0.245554 → 2.0.0-dev-rc.3.0.0.250606
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/IntervalCollectionValues.d.ts +2 -2
- package/dist/IntervalCollectionValues.d.ts.map +1 -1
- package/dist/IntervalCollectionValues.js.map +1 -1
- package/dist/intervalCollection.d.ts +3 -3
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +34 -30
- package/dist/intervalCollection.js.map +1 -1
- package/dist/intervalCollectionMap.d.ts +3 -3
- package/dist/intervalCollectionMap.d.ts.map +1 -1
- package/dist/intervalCollectionMap.js +1 -1
- package/dist/intervalCollectionMap.js.map +1 -1
- package/dist/intervalCollectionMapInterfaces.d.ts +2 -2
- package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -1
- package/dist/intervalCollectionMapInterfaces.js.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.js +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointIndex.js +1 -1
- package/dist/intervalIndex/endpointIndex.js.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +2 -2
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.js +2 -3
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.js +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/dist/intervalTree.d.ts +1 -1
- package/dist/intervalTree.d.ts.map +1 -1
- package/dist/intervalTree.js.map +1 -1
- package/dist/intervals/interval.d.ts.map +1 -1
- package/dist/intervals/interval.js +2 -2
- package/dist/intervals/interval.js.map +1 -1
- package/dist/intervals/sequenceInterval.d.ts.map +1 -1
- package/dist/intervals/sequenceInterval.js +1 -1
- package/dist/intervals/sequenceInterval.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/revertibles.d.ts +1 -1
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js.map +1 -1
- package/dist/sequence.d.ts +5 -5
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +5 -5
- package/dist/sequence.js.map +1 -1
- package/dist/sequenceFactory.d.ts +1 -1
- package/dist/sequenceFactory.d.ts.map +1 -1
- package/dist/sequenceFactory.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +2 -2
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/dist/sharedSequence.d.ts +1 -1
- package/dist/sharedSequence.d.ts.map +1 -1
- package/dist/sharedSequence.js.map +1 -1
- package/dist/sharedString.d.ts +1 -1
- package/dist/sharedString.d.ts.map +1 -1
- package/dist/sharedString.js.map +1 -1
- package/lib/IntervalCollectionValues.d.ts +2 -2
- package/lib/IntervalCollectionValues.d.ts.map +1 -1
- package/lib/IntervalCollectionValues.js.map +1 -1
- package/lib/intervalCollection.d.ts +3 -3
- package/lib/intervalCollection.d.ts.map +1 -1
- package/lib/intervalCollection.js +6 -2
- package/lib/intervalCollection.js.map +1 -1
- package/lib/intervalCollectionMap.d.ts +3 -3
- package/lib/intervalCollectionMap.d.ts.map +1 -1
- package/lib/intervalCollectionMap.js +3 -3
- package/lib/intervalCollectionMap.js.map +1 -1
- package/lib/intervalCollectionMapInterfaces.d.ts +2 -2
- package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -1
- package/lib/intervalCollectionMapInterfaces.js.map +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
- package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
- package/lib/intervalIndex/endpointIndex.js.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +2 -2
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.js +2 -3
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
- package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/lib/intervalTree.d.ts +1 -1
- package/lib/intervalTree.d.ts.map +1 -1
- package/lib/intervalTree.js.map +1 -1
- package/lib/intervals/interval.d.ts.map +1 -1
- package/lib/intervals/interval.js +1 -1
- package/lib/intervals/interval.js.map +1 -1
- package/lib/intervals/sequenceInterval.d.ts.map +1 -1
- package/lib/intervals/sequenceInterval.js +1 -1
- package/lib/intervals/sequenceInterval.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/revertibles.d.ts +1 -1
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +2 -2
- package/lib/revertibles.js.map +1 -1
- package/lib/sequence.d.ts +5 -5
- package/lib/sequence.d.ts.map +1 -1
- package/lib/sequence.js +7 -7
- package/lib/sequence.js.map +1 -1
- package/lib/sequenceFactory.d.ts +1 -1
- package/lib/sequenceFactory.d.ts.map +1 -1
- package/lib/sequenceFactory.js.map +1 -1
- package/lib/sharedIntervalCollection.d.ts +2 -2
- package/lib/sharedIntervalCollection.d.ts.map +1 -1
- package/lib/sharedIntervalCollection.js +1 -1
- package/lib/sharedIntervalCollection.js.map +1 -1
- package/lib/sharedSequence.d.ts +1 -1
- package/lib/sharedSequence.d.ts.map +1 -1
- package/lib/sharedSequence.js.map +1 -1
- package/lib/sharedString.d.ts +1 -1
- package/lib/sharedString.d.ts.map +1 -1
- package/lib/sharedString.js +1 -1
- package/lib/sharedString.js.map +1 -1
- package/lib/test/createSnapshotFiles.js +1 -1
- package/lib/test/createSnapshotFiles.js.map +1 -1
- package/lib/test/fuzz/fuzzUtils.js +3 -3
- package/lib/test/fuzz/fuzzUtils.js.map +1 -1
- package/lib/test/fuzz/intervalCollection.fuzz.spec.js +1 -1
- package/lib/test/fuzz/intervalCollection.fuzz.spec.js.map +1 -1
- package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js +2 -2
- package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js.map +1 -1
- package/lib/test/fuzz/sharedString.fuzz.spec.js +1 -1
- package/lib/test/fuzz/sharedString.fuzz.spec.js.map +1 -1
- package/lib/test/generateSharedStrings.js +2 -2
- package/lib/test/generateSharedStrings.js.map +1 -1
- package/lib/test/intervalCollection.detached.spec.js +4 -2
- package/lib/test/intervalCollection.detached.spec.js.map +1 -1
- package/lib/test/intervalCollection.events.spec.js +4 -4
- package/lib/test/intervalCollection.events.spec.js.map +1 -1
- package/lib/test/intervalCollection.perf.spec.js +1 -1
- package/lib/test/intervalCollection.perf.spec.js.map +1 -1
- package/lib/test/intervalCollection.snapshot.spec.js +5 -5
- package/lib/test/intervalCollection.snapshot.spec.js.map +1 -1
- package/lib/test/intervalCollection.spec.js +4 -4
- package/lib/test/intervalCollection.spec.js.map +1 -1
- package/lib/test/intervalIndexTestUtils.js.map +1 -1
- package/lib/test/intervalRebasing.spec.js +3 -3
- package/lib/test/intervalRebasing.spec.js.map +1 -1
- package/lib/test/intervalStashedOps.spec.js +3 -3
- package/lib/test/intervalStashedOps.spec.js.map +1 -1
- package/lib/test/intervalTestUtils.js.map +1 -1
- package/lib/test/memory/sharedSequence.spec.js.map +1 -1
- package/lib/test/memory/sharedString.spec.js +2 -2
- package/lib/test/memory/sharedString.spec.js.map +1 -1
- package/lib/test/overlappingSequenceIntervalsIndex.spec.js +4 -4
- package/lib/test/overlappingSequenceIntervalsIndex.spec.js.map +1 -1
- package/lib/test/partialLoad.spec.js +2 -2
- package/lib/test/partialLoad.spec.js.map +1 -1
- package/lib/test/rebasing.spec.js +3 -3
- package/lib/test/rebasing.spec.js.map +1 -1
- package/lib/test/reentrancy.spec.js +3 -3
- package/lib/test/reentrancy.spec.js.map +1 -1
- package/lib/test/revertibles.spec.js +54 -6
- package/lib/test/revertibles.spec.js.map +1 -1
- package/lib/test/sequenceDeltaEvent.spec.js +1 -1
- package/lib/test/sequenceDeltaEvent.spec.js.map +1 -1
- package/lib/test/sharedIntervalCollection.spec.js +2 -2
- package/lib/test/sharedIntervalCollection.spec.js.map +1 -1
- package/lib/test/sharedString.spec.js +3 -3
- package/lib/test/sharedString.spec.js.map +1 -1
- package/lib/test/snapshotEmptyProps.spec.js +2 -2
- package/lib/test/snapshotEmptyProps.spec.js.map +1 -1
- package/lib/test/snapshotVersion.spec.js +2 -2
- package/lib/test/snapshotVersion.spec.js.map +1 -1
- package/lib/test/subSequence.spec.js.map +1 -1
- package/lib/test/v1IntervalCollectionHelpers.js +1 -1
- package/lib/test/v1IntervalCollectionHelpers.js.map +1 -1
- package/package.json +23 -20
- package/src/IntervalCollectionValues.ts +4 -4
- package/src/intervalCollection.ts +28 -24
- package/src/intervalCollectionMap.ts +15 -15
- package/src/intervalCollectionMapInterfaces.ts +4 -4
- package/src/intervalIndex/endpointInRangeIndex.ts +1 -0
- package/src/intervalIndex/endpointIndex.ts +1 -0
- package/src/intervalIndex/idIntervalIndex.ts +1 -1
- package/src/intervalIndex/overlappingIntervalsIndex.ts +5 -4
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +3 -2
- package/src/intervalIndex/startpointInRangeIndex.ts +1 -0
- package/src/intervalTree.ts +2 -2
- package/src/intervals/interval.ts +2 -1
- package/src/intervals/sequenceInterval.ts +1 -1
- package/src/packageVersion.ts +1 -1
- package/src/revertibles.ts +7 -7
- package/src/sequence.ts +19 -19
- package/src/sequenceFactory.ts +2 -2
- package/src/sharedIntervalCollection.ts +7 -7
- package/src/sharedSequence.ts +1 -1
- package/src/sharedString.ts +2 -2
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import fs from "fs";
|
|
6
6
|
import { convertSummaryTreeToITree } from "@fluidframework/runtime-utils";
|
|
7
|
-
import {
|
|
7
|
+
import { LocationBase, generateStrings } from "./generateSharedStrings.js";
|
|
8
8
|
for (const { snapshotPath, expected, snapshotIsNormalized } of generateStrings()) {
|
|
9
9
|
const summaryTree = expected.getAttachSummary().summary;
|
|
10
10
|
const snapshotTree = convertSummaryTreeToITree(summaryTree);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSnapshotFiles.js","sourceRoot":"","sources":["../../src/test/createSnapshotFiles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"createSnapshotFiles.js","sourceRoot":"","sources":["../../src/test/createSnapshotFiles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE3E,KAAK,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,eAAe,EAAE,EAAE;IACjF,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC;IACxD,MAAM,YAAY,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,oBAAoB,IAAI,YAAY,KAAK,6BAA6B,EAAE;QAC3E,EAAE,CAAC,aAAa,CACf,GAAG,YAAY,GAAG,YAAY,OAAO,EACrC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAC1C,CAAC;KACF;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\nimport { convertSummaryTreeToITree } from \"@fluidframework/runtime-utils\";\nimport { LocationBase, generateStrings } from \"./generateSharedStrings.js\";\n\nfor (const { snapshotPath, expected, snapshotIsNormalized } of generateStrings()) {\n\tconst summaryTree = expected.getAttachSummary().summary;\n\tconst snapshotTree = convertSummaryTreeToITree(summaryTree);\n\tif (snapshotIsNormalized || snapshotPath === \"v1Intervals/withV1Intervals\") {\n\t\tfs.writeFileSync(\n\t\t\t`${LocationBase}${snapshotPath}.json`,\n\t\t\tJSON.stringify(snapshotTree, undefined, 1),\n\t\t);\n\t}\n}\n"]}
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import * as path from "path";
|
|
6
5
|
import { strict as assert } from "assert";
|
|
6
|
+
import * as path from "path";
|
|
7
7
|
import { combineReducersAsync, createWeightedAsyncGenerator, } from "@fluid-private/stochastic-test-utils";
|
|
8
|
+
import { Side } from "../../intervalCollection.js";
|
|
8
9
|
import { revertSharedStringRevertibles } from "../../revertibles.js";
|
|
9
10
|
import { SharedStringFactory } from "../../sequenceFactory.js";
|
|
10
|
-
import { Side } from "../../intervalCollection.js";
|
|
11
|
-
import { assertEquivalentSharedStrings } from "../intervalTestUtils.js";
|
|
12
11
|
import { _dirname } from "../dirname.cjs";
|
|
12
|
+
import { assertEquivalentSharedStrings } from "../intervalTestUtils.js";
|
|
13
13
|
export function isRevertibleSharedString(s) {
|
|
14
14
|
return s.revertibles !== undefined;
|
|
15
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuzzUtils.js","sourceRoot":"","sources":["../../../src/test/fuzz/fuzzUtils.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 */\nimport * as path from \"path\";\nimport { strict as assert } from \"assert\";\nimport {\n\tAcceptanceCondition,\n\tcombineReducersAsync,\n\tAsyncReducer,\n\tAsyncGenerator,\n\tcreateWeightedAsyncGenerator,\n} from \"@fluid-private/stochastic-test-utils\";\nimport { DDSFuzzModel, DDSFuzzSuiteOptions, DDSFuzzTestState } from \"@fluid-private/test-dds-utils\";\nimport {\n\tIChannelAttributes,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { PropertySet } from \"@fluidframework/merge-tree\";\nimport { revertSharedStringRevertibles, SharedStringRevertible } from \"../../revertibles.js\";\nimport { SharedStringFactory } from \"../../sequenceFactory.js\";\nimport { SharedString } from \"../../sharedString.js\";\nimport { Side, type IIntervalCollection } from \"../../intervalCollection.js\";\nimport { assertEquivalentSharedStrings } from \"../intervalTestUtils.js\";\nimport { _dirname } from \"../dirname.cjs\";\nimport type { SequenceInterval } from \"../../index.js\";\n\nexport type RevertibleSharedString = SharedString & {\n\trevertibles: SharedStringRevertible[];\n\t// This field prevents change events that are emitted while in the process of a revert from\n\t// being added into the revertibles stack.\n\tisCurrentRevert: boolean;\n};\nexport function isRevertibleSharedString(s: SharedString): s is RevertibleSharedString {\n\treturn (s as RevertibleSharedString).revertibles !== undefined;\n}\n\nexport interface RangeSpec {\n\tstart: number;\n\tend: number;\n}\n\nexport interface IntervalCollectionSpec {\n\tcollectionName: string;\n}\n\nexport interface AddText {\n\ttype: \"addText\";\n\tindex: number;\n\tcontent: string;\n}\n\nexport interface RemoveRange extends RangeSpec {\n\ttype: \"removeRange\";\n}\n\nexport interface ObliterateRange extends RangeSpec {\n\ttype: \"obliterateRange\";\n}\n\n// For non-interval collection fuzzing, annotating text would also be useful.\nexport interface AddInterval extends IntervalCollectionSpec, RangeSpec {\n\ttype: \"addInterval\";\n\t// Normally interval ids get autogenerated, but including it here allows tracking\n\t// what happened to an interval over the course of its lifetime based on the history\n\t// file, which is useful for debugging test failures.\n\tid: string;\n\tstartSide: Side;\n\tendSide: Side;\n}\n\nexport interface ChangeInterval extends IntervalCollectionSpec {\n\ttype: \"changeInterval\";\n\tstart: number | undefined;\n\tend: number | undefined;\n\tid: string;\n\tstartSide: Side;\n\tendSide: Side;\n\tproperties: PropertySet | undefined;\n}\n\nexport interface DeleteInterval extends IntervalCollectionSpec {\n\ttype: \"deleteInterval\";\n\tid: string;\n}\n\nexport interface RevertSharedStringRevertibles {\n\ttype: \"revertSharedStringRevertibles\";\n\teditsToRevert: number;\n}\n\nexport interface RevertibleWeights {\n\trevertWeight: number;\n\taddText: number;\n\tremoveRange: number;\n\tobliterateRange: number;\n\taddInterval: number;\n\tdeleteInterval: number;\n\tchangeInterval: number;\n}\n\nexport type IntervalOperation = AddInterval | ChangeInterval | DeleteInterval;\nexport type OperationWithRevert = IntervalOperation | RevertSharedStringRevertibles;\nexport type TextOperation = AddText | RemoveRange | ObliterateRange;\n\nexport type ClientOperation = IntervalOperation | TextOperation;\n\nexport type RevertOperation = OperationWithRevert | TextOperation;\nexport type Operation = RevertOperation;\n\nexport type FuzzTestState = DDSFuzzTestState<SharedStringFactory>;\n\nexport interface SharedStringOperationGenerationConfig {\n\t/**\n\t * Maximum length of the SharedString (locally) before no further AddText operations are generated.\n\t * Note due to concurrency, during test execution the actual length of the string may exceed this.\n\t */\n\tmaxStringLength?: number;\n\tmaxInsertLength?: number;\n\tweights?: {\n\t\taddText: number;\n\t\tremoveRange: number;\n\t\tobliterateRange: number;\n\t};\n}\n\nexport interface IntervalOperationGenerationConfig extends SharedStringOperationGenerationConfig {\n\t/**\n\t * Maximum number of intervals (locally) before no further AddInterval operations are generated.\n\t * Note due to concurrency, during test execution the actual number of intervals may exceed this.\n\t */\n\tmaxIntervals?: number;\n\tintervalCollectionNamePool?: string[];\n\tpropertyNamePool?: string[];\n\tvalidateInterval?: number;\n\tweights?: RevertibleWeights & SharedStringOperationGenerationConfig[\"weights\"];\n}\n\nexport const defaultSharedStringOperationGenerationConfig: Required<SharedStringOperationGenerationConfig> =\n\t{\n\t\tmaxStringLength: 1000,\n\t\tmaxInsertLength: 10,\n\t\tweights: {\n\t\t\taddText: 2,\n\t\t\tremoveRange: 1,\n\t\t\tobliterateRange: 1,\n\t\t},\n\t};\nexport const defaultIntervalOperationGenerationConfig: Required<IntervalOperationGenerationConfig> =\n\t{\n\t\t...defaultSharedStringOperationGenerationConfig,\n\t\tmaxIntervals: 100,\n\t\tintervalCollectionNamePool: [\"comments\"],\n\t\tpropertyNamePool: [\"prop1\", \"prop2\", \"prop3\"],\n\t\tvalidateInterval: 100,\n\t\tweights: {\n\t\t\t...defaultSharedStringOperationGenerationConfig.weights,\n\t\t\trevertWeight: 2,\n\t\t\taddInterval: 2,\n\t\t\tdeleteInterval: 2,\n\t\t\tchangeInterval: 2,\n\t\t\tobliterateRange: 0,\n\t\t},\n\t};\n\nexport interface LoggingInfo {\n\t/** id of the interval to track over time */\n\tintervalId: string;\n\t/** Clients to print */\n\tclientIds: string[];\n}\n\nfunction logCurrentState(state: FuzzTestState, loggingInfo: LoggingInfo): void {\n\tfor (const id of loggingInfo.clientIds) {\n\t\tconst { channel } = state.clients.find((s) => s.containerRuntime.clientId === id) ?? {};\n\t\tassert(channel);\n\t\tconst labels = channel.getIntervalCollectionLabels();\n\t\tconst interval = Array.from(labels)\n\t\t\t.map((label) =>\n\t\t\t\tchannel.getIntervalCollection(label).getIntervalById(loggingInfo.intervalId),\n\t\t\t)\n\t\t\t.find((result) => result !== undefined);\n\n\t\tconsole.log(`Client ${id}:`);\n\t\tif (interval !== undefined) {\n\t\t\tconst start = channel.localReferencePositionToPosition(interval.start);\n\t\t\tconst end = channel.localReferencePositionToPosition(interval.end);\n\t\t\tif (end === start) {\n\t\t\t\tconsole.log(`${\" \".repeat(start)}x`);\n\t\t\t} else {\n\t\t\t\tconsole.log(`${\" \".repeat(start)}[${\" \".repeat(end - start - 1)}]`);\n\t\t\t}\n\t\t}\n\t\tconsole.log(channel.getText());\n\t\tconsole.log(\"\\n\");\n\t}\n}\n\ntype ClientOpState = FuzzTestState;\n\nexport function makeReducer(\n\tloggingInfo?: LoggingInfo,\n): AsyncReducer<Operation | RevertOperation, ClientOpState> {\n\tconst withLogging =\n\t\t<T>(baseReducer: AsyncReducer<T, ClientOpState>): AsyncReducer<T, ClientOpState> =>\n\t\tasync (state, operation) => {\n\t\t\tif (loggingInfo !== undefined) {\n\t\t\t\tlogCurrentState(state, loggingInfo);\n\t\t\t\tconsole.log(\"-\".repeat(20));\n\t\t\t\tconsole.log(\"Next operation:\", JSON.stringify(operation, undefined, 4));\n\t\t\t}\n\t\t\tawait baseReducer(state, operation);\n\t\t};\n\n\tconst reducer = combineReducersAsync<Operation | RevertOperation, ClientOpState>({\n\t\taddText: async ({ client }, { index, content }) => {\n\t\t\tclient.channel.insertText(index, content);\n\t\t},\n\t\tremoveRange: async ({ client }, { start, end }) => {\n\t\t\tclient.channel.removeRange(start, end);\n\t\t},\n\t\tobliterateRange: async ({ client }, { start, end }) => {\n\t\t\tclient.channel.obliterateRange(start, end);\n\t\t},\n\t\taddInterval: async ({ client }, { start, end, collectionName, id, startSide, endSide }) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(collectionName);\n\t\t\tcollection.add({\n\t\t\t\tstart: { pos: start, side: startSide },\n\t\t\t\tend: { pos: end, side: endSide },\n\t\t\t\tprops: { intervalId: id },\n\t\t\t});\n\t\t},\n\t\tdeleteInterval: async ({ client }, { id, collectionName }) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(collectionName);\n\t\t\tcollection.removeIntervalById(id);\n\t\t},\n\t\tchangeInterval: async (\n\t\t\t{ client },\n\t\t\t{ id, start, end, collectionName, startSide, endSide, properties },\n\t\t) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(collectionName);\n\t\t\tif (start !== undefined && end !== undefined) {\n\t\t\t\tcollection.change(id, {\n\t\t\t\t\tstart: { pos: start, side: startSide },\n\t\t\t\t\tend: { pos: end, side: endSide },\n\t\t\t\t\tprops: properties,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tcollection.change(id, { props: properties });\n\t\t\t}\n\t\t},\n\t\trevertSharedStringRevertibles: async ({ client }, { editsToRevert }) => {\n\t\t\tassert(isRevertibleSharedString(client.channel));\n\t\t\tclient.channel.isCurrentRevert = true;\n\t\t\tconst few = client.channel.revertibles.splice(-editsToRevert, editsToRevert);\n\t\t\trevertSharedStringRevertibles(client.channel, few);\n\t\t\tclient.channel.isCurrentRevert = false;\n\t\t},\n\t});\n\n\treturn withLogging(reducer);\n}\n\nexport function createSharedStringGeneratorOperations(\n\toptionsParam?: SharedStringOperationGenerationConfig,\n) {\n\tconst options = { ...defaultSharedStringOperationGenerationConfig, ...(optionsParam ?? {}) };\n\n\t// All subsequent helper functions are generators; note that they don't actually apply any operations.\n\tfunction startPosition({ random, client }: ClientOpState): number {\n\t\treturn random.integer(0, Math.max(0, client.channel.getLength() - 1));\n\t}\n\n\tfunction exclusiveRange(state: ClientOpState): RangeSpec {\n\t\tconst start = startPosition(state);\n\t\tconst end = state.random.integer(start + 1, state.client.channel.getLength());\n\t\treturn { start, end };\n\t}\n\n\tfunction exclusiveRangeLeaveChar(state: ClientOpState): RangeSpec {\n\t\tconst start = state.random.integer(0, state.client.channel.getLength() - 2);\n\t\tconst end = state.random.integer(start + 1, state.client.channel.getLength() - 1);\n\t\treturn { start, end };\n\t}\n\n\tasync function addText(state: ClientOpState): Promise<AddText> {\n\t\tconst { random, client } = state;\n\t\treturn {\n\t\t\ttype: \"addText\",\n\t\t\tindex: random.integer(0, client.channel.getLength()),\n\t\t\tcontent: random.string(random.integer(1, options.maxInsertLength)),\n\t\t};\n\t}\n\n\tasync function obliterateRange(state: ClientOpState): Promise<ObliterateRange> {\n\t\treturn {\n\t\t\ttype: \"obliterateRange\",\n\t\t\t...exclusiveRange(state),\n\t\t};\n\t}\n\n\tasync function removeRange(state: ClientOpState): Promise<RemoveRange> {\n\t\treturn { type: \"removeRange\", ...exclusiveRange(state) };\n\t}\n\n\tasync function removeRangeLeaveChar(state: ClientOpState): Promise<RemoveRange> {\n\t\treturn { type: \"removeRange\", ...exclusiveRangeLeaveChar(state) };\n\t}\n\n\tconst lengthSatisfies =\n\t\t(criteria: (length: number) => boolean): AcceptanceCondition<ClientOpState> =>\n\t\t({ client }) =>\n\t\t\tcriteria(client.channel.getLength());\n\tconst hasNonzeroLength = lengthSatisfies((length) => length > 0);\n\tconst isShorterThanMaxLength = lengthSatisfies((length) => length < options.maxStringLength);\n\n\treturn {\n\t\tstartPosition,\n\t\texclusiveRange,\n\t\texclusiveRangeLeaveChar,\n\t\taddText,\n\t\tobliterateRange,\n\t\tremoveRange,\n\t\tremoveRangeLeaveChar,\n\t\tlengthSatisfies,\n\t\thasNonzeroLength,\n\t\tisShorterThanMaxLength,\n\t};\n}\n\nexport class SharedStringFuzzFactory extends SharedStringFactory {\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<SharedString> {\n\t\truntime.options.intervalStickinessEnabled = true;\n\t\truntime.options.mergeTreeEnableObliterate = true;\n\t\treturn super.load(runtime, id, services, attributes);\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): SharedString {\n\t\tdocument.options.intervalStickinessEnabled = true;\n\t\tdocument.options.mergeTreeEnableObliterate = true;\n\t\treturn super.create(document, id);\n\t}\n}\n\nexport const baseModel: Omit<\n\tDDSFuzzModel<SharedStringFactory, Operation, FuzzTestState>,\n\t\"workloadName\" | \"generatorFactory\"\n> = {\n\treducer:\n\t\t// makeReducer supports a param for logging output which tracks the provided intervalId over time:\n\t\t// { intervalId: \"00000000-0000-0000-0000-000000000000\", clientIds: [\"A\", \"B\", \"C\"] }\n\t\tmakeReducer(),\n\tvalidateConsistency: assertEquivalentSharedStrings,\n\tfactory: new SharedStringFuzzFactory(),\n\tminimizationTransforms: [\n\t\t(op) => {\n\t\t\tif (op.type !== \"addText\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\top.content = op.content.slice(1);\n\t\t},\n\t\t(op) => {\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"addText\":\n\t\t\t\t\tif (op.index > 0) {\n\t\t\t\t\t\top.index -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"removeRange\":\n\t\t\t\tcase \"addInterval\":\n\t\t\t\tcase \"changeInterval\":\n\t\t\t\t\tif (op.start !== undefined && op.start > 0) {\n\t\t\t\t\t\top.start -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (op.end !== undefined && op.end > 0) {\n\t\t\t\t\t\top.end -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t(op) => {\n\t\t\tif (\n\t\t\t\top.type !== \"removeRange\" &&\n\t\t\t\top.type !== \"addInterval\" &&\n\t\t\t\top.type !== \"changeInterval\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (op.end !== undefined && op.end > 0) {\n\t\t\t\top.end -= 1;\n\t\t\t}\n\t\t},\n\t],\n};\n\nexport const defaultFuzzOptions: Partial<DDSFuzzSuiteOptions> = {\n\tvalidationStrategy: { type: \"fixedInterval\", interval: 10 },\n\treconnectProbability: 0.1,\n\tnumberOfClients: 3,\n\tclientJoinOptions: {\n\t\tmaxNumberOfClients: 6,\n\t\tclientAddProbability: 0.1,\n\t},\n\tdefaultTestCount: 100,\n\tsaveFailures: { directory: path.join(_dirname, \"../../src/test/fuzz/results\") },\n\tparseOperations: (serialized: string) => {\n\t\tconst operations: Operation[] = JSON.parse(serialized);\n\t\t// Replace this value with some other interval ID and uncomment to filter replay of the test\n\t\t// suite to only include interval operations with this ID.\n\t\t// const filterIntervalId = \"00000000-0000-0000-0000-000000000000\";\n\t\t// if (filterIntervalId) {\n\t\t// \treturn operations.filter((entry) =>\n\t\t// \t\t[undefined, filterIntervalId].includes((entry as any).id),\n\t\t// \t);\n\t\t// }\n\t\treturn operations;\n\t},\n};\n\nexport function makeIntervalOperationGenerator(\n\toptionsParam?: IntervalOperationGenerationConfig,\n\talwaysLeaveChar: boolean = false,\n): AsyncGenerator<Operation, ClientOpState> {\n\tconst {\n\t\tstartPosition,\n\t\taddText,\n\t\tobliterateRange,\n\t\tremoveRange,\n\t\tremoveRangeLeaveChar,\n\t\tlengthSatisfies,\n\t\thasNonzeroLength,\n\t\tisShorterThanMaxLength,\n\t} = createSharedStringGeneratorOperations(optionsParam);\n\n\tconst options = { ...defaultIntervalOperationGenerationConfig, ...(optionsParam ?? {}) };\n\n\tfunction isNonEmpty(collection: IIntervalCollection<SequenceInterval>): boolean {\n\t\tfor (const _ of collection) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction inclusiveRange(state: ClientOpState): RangeSpec {\n\t\tconst start = startPosition(state);\n\t\tconst end = state.random.integer(\n\t\t\tstart,\n\t\t\tMath.max(start, state.client.channel.getLength() - 1),\n\t\t);\n\t\treturn { start, end };\n\t}\n\n\tfunction inclusiveRangeWithUndefined(\n\t\tstate: ClientOpState,\n\t): RangeSpec | { start: undefined; end: undefined } {\n\t\treturn state.random.bool() ? inclusiveRange(state) : { start: undefined, end: undefined };\n\t}\n\n\tfunction propertySet(state: ClientOpState): PropertySet {\n\t\tconst propNamesShuffled = [...options.propertyNamePool];\n\t\tstate.random.shuffle(propNamesShuffled);\n\t\tconst propsToChange = propNamesShuffled.slice(\n\t\t\t0,\n\t\t\tstate.random.integer(1, propNamesShuffled.length),\n\t\t);\n\t\tconst propSet: PropertySet = {};\n\t\tfor (const name of propsToChange) {\n\t\t\tpropSet[name] = state.random.string(5);\n\t\t}\n\t\treturn propSet;\n\t}\n\n\tfunction propertySetWithUndefined(state: ClientOpState): PropertySet | undefined {\n\t\treturn state.random.bool() ? propertySet(state) : undefined;\n\t}\n\n\tfunction nonEmptyIntervalCollection({ client, random }: ClientOpState): string {\n\t\tconst nonEmptyLabels = Array.from(client.channel.getIntervalCollectionLabels()).filter(\n\t\t\t(label) => {\n\t\t\t\tconst collection = client.channel.getIntervalCollection(label);\n\t\t\t\treturn isNonEmpty(collection);\n\t\t\t},\n\t\t);\n\t\treturn random.pick(nonEmptyLabels);\n\t}\n\n\tfunction interval(state: ClientOpState): { collectionName: string; id: string } {\n\t\tconst collectionName = nonEmptyIntervalCollection(state);\n\t\tconst intervals = Array.from(state.client.channel.getIntervalCollection(collectionName));\n\t\tconst id = state.random.pick(intervals)?.getIntervalId();\n\t\tassert(id);\n\n\t\treturn {\n\t\t\tid,\n\t\t\tcollectionName,\n\t\t};\n\t}\n\n\tasync function addInterval(state: ClientOpState): Promise<AddInterval> {\n\t\treturn {\n\t\t\ttype: \"addInterval\",\n\t\t\t...inclusiveRange(state),\n\t\t\tcollectionName: state.random.pick(options.intervalCollectionNamePool),\n\t\t\tid: state.random.uuid4(),\n\t\t\tstartSide: state.random.pick([Side.Before, Side.After]),\n\t\t\tendSide: state.random.pick([Side.Before, Side.After]),\n\t\t};\n\t}\n\n\tasync function deleteInterval(state: ClientOpState): Promise<DeleteInterval> {\n\t\treturn {\n\t\t\ttype: \"deleteInterval\",\n\t\t\t...interval(state),\n\t\t};\n\t}\n\n\tasync function changeInterval(state: ClientOpState): Promise<ChangeInterval> {\n\t\tconst { start, end } = inclusiveRangeWithUndefined(state);\n\t\tconst properties = propertySetWithUndefined(state);\n\t\treturn {\n\t\t\ttype: \"changeInterval\",\n\t\t\tstart,\n\t\t\tend,\n\t\t\tstartSide: state.random.pick([Side.Before, Side.After]),\n\t\t\tendSide: state.random.pick([Side.Before, Side.After]),\n\t\t\tproperties,\n\t\t\t...interval(state),\n\t\t};\n\t}\n\n\tconst hasAnInterval = ({ client }: ClientOpState): boolean =>\n\t\tArray.from(client.channel.getIntervalCollectionLabels()).some((label) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(label);\n\t\t\treturn isNonEmpty(collection);\n\t\t});\n\n\tconst hasNotTooManyIntervals: AcceptanceCondition<ClientOpState> = ({ client }) => {\n\t\tlet intervalCount = 0;\n\t\tfor (const label of client.channel.getIntervalCollectionLabels()) {\n\t\t\tfor (const _ of client.channel.getIntervalCollection(label)) {\n\t\t\t\tintervalCount++;\n\t\t\t\tif (intervalCount >= options.maxIntervals) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n\n\tconst all =\n\t\t<T>(...clauses: AcceptanceCondition<T>[]): AcceptanceCondition<T> =>\n\t\t(t: T) =>\n\t\t\tclauses.reduce<boolean>((prev, cond) => prev && cond(t), true);\n\tconst usableWeights = optionsParam?.weights ?? defaultIntervalOperationGenerationConfig.weights;\n\treturn createWeightedAsyncGenerator<Operation, ClientOpState>([\n\t\t[addText, usableWeights.addText, isShorterThanMaxLength],\n\t\t[\n\t\t\talwaysLeaveChar ? removeRangeLeaveChar : removeRange,\n\t\t\tusableWeights.removeRange,\n\t\t\talwaysLeaveChar\n\t\t\t\t? lengthSatisfies((length) => {\n\t\t\t\t\t\treturn length > 1;\n\t\t\t\t })\n\t\t\t\t: hasNonzeroLength,\n\t\t],\n\t\t[obliterateRange, usableWeights.obliterateRange, hasNonzeroLength],\n\t\t[addInterval, usableWeights.addInterval, all(hasNotTooManyIntervals, hasNonzeroLength)],\n\t\t[deleteInterval, usableWeights.deleteInterval, hasAnInterval],\n\t\t[changeInterval, usableWeights.changeInterval, all(hasAnInterval, hasNonzeroLength)],\n\t]);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fuzzUtils.js","sourceRoot":"","sources":["../../../src/test/fuzz/fuzzUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAIN,oBAAoB,EACpB,4BAA4B,GAC5B,MAAM,sCAAsC,CAAC;AAS9C,OAAO,EAA4B,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAA0B,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAQxE,MAAM,UAAU,wBAAwB,CAAC,CAAe;IACvD,OAAQ,CAA4B,CAAC,WAAW,KAAK,SAAS,CAAC;AAChE,CAAC;AAuGD,MAAM,CAAC,MAAM,4CAA4C,GACxD;IACC,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,EAAE;IACnB,OAAO,EAAE;QACR,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,CAAC;KAClB;CACD,CAAC;AACH,MAAM,CAAC,MAAM,wCAAwC,GACpD;IACC,GAAG,4CAA4C;IAC/C,YAAY,EAAE,GAAG;IACjB,0BAA0B,EAAE,CAAC,UAAU,CAAC;IACxC,gBAAgB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;IAC7C,gBAAgB,EAAE,GAAG;IACrB,OAAO,EAAE;QACR,GAAG,4CAA4C,CAAC,OAAO;QACvD,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,CAAC;QACd,cAAc,EAAE,CAAC;QACjB,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,CAAC;KAClB;CACD,CAAC;AASH,SAAS,eAAe,CAAC,KAAoB,EAAE,WAAwB;IACtE,KAAK,MAAM,EAAE,IAAI,WAAW,CAAC,SAAS,EAAE;QACvC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;QACxF,MAAM,CAAC,OAAO,CAAC,CAAC;QAChB,MAAM,MAAM,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;aACjC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACd,OAAO,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,UAAU,CAAC,CAC5E;aACA,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAEzC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC7B,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,gCAAgC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,GAAG,GAAG,OAAO,CAAC,gCAAgC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACnE,IAAI,GAAG,KAAK,KAAK,EAAE;gBAClB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACrC;iBAAM;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;aACpE;SACD;QACD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAClB;AACF,CAAC;AAID,MAAM,UAAU,WAAW,CAC1B,WAAyB;IAEzB,MAAM,WAAW,GAChB,CAAI,WAA2C,EAAkC,EAAE,CACnF,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC1B,IAAI,WAAW,KAAK,SAAS,EAAE;YAC9B,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;SACxE;QACD,MAAM,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,oBAAoB,CAA6C;QAChF,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;YACjD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QACD,WAAW,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;YACjD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,eAAe,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;YACrD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,WAAW,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;YACzF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;YACxE,UAAU,CAAC,GAAG,CAAC;gBACd,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;gBACtC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE;gBAChC,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;aACzB,CAAC,CAAC;QACJ,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;YAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;YACxE,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,cAAc,EAAE,KAAK,EACpB,EAAE,MAAM,EAAE,EACV,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,EACjE,EAAE;YACH,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;YACxE,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE;gBAC7C,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE;oBACrB,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE;oBACtC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE;oBAChC,KAAK,EAAE,UAAU;iBACjB,CAAC,CAAC;aACH;iBAAM;gBACN,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;aAC7C;QACF,CAAC;QACD,6BAA6B,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;YACtE,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;YACtC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAC7E,6BAA6B,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;QACxC,CAAC;KACD,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,qCAAqC,CACpD,YAAoD;IAEpD,MAAM,OAAO,GAAG,EAAE,GAAG,4CAA4C,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;IAE7F,sGAAsG;IACtG,SAAS,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAiB;QACvD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,SAAS,cAAc,CAAC,KAAoB;QAC3C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9E,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,SAAS,uBAAuB,CAAC,KAAoB;QACpD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QAClF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,UAAU,OAAO,CAAC,KAAoB;QAC1C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QACjC,OAAO;YACN,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACpD,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;SAClE,CAAC;IACH,CAAC;IAED,KAAK,UAAU,eAAe,CAAC,KAAoB;QAClD,OAAO;YACN,IAAI,EAAE,iBAAiB;YACvB,GAAG,cAAc,CAAC,KAAK,CAAC;SACxB,CAAC;IACH,CAAC;IAED,KAAK,UAAU,WAAW,CAAC,KAAoB;QAC9C,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;IAC1D,CAAC;IAED,KAAK,UAAU,oBAAoB,CAAC,KAAoB;QACvD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,eAAe,GACpB,CAAC,QAAqC,EAAsC,EAAE,CAC9E,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CACd,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,eAAe,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjE,MAAM,sBAAsB,GAAG,eAAe,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE7F,OAAO;QACN,aAAa;QACb,cAAc;QACd,uBAAuB;QACvB,OAAO;QACP,eAAe;QACf,WAAW;QACX,oBAAoB;QACpB,eAAe;QACf,gBAAgB;QAChB,sBAAsB;KACtB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,uBAAwB,SAAQ,mBAAmB;IACxD,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,OAAO,CAAC,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACjD,OAAO,CAAC,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACjD,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtD,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,QAAQ,CAAC,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;QAClD,QAAQ,CAAC,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;QAClD,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;CACD;AAED,MAAM,CAAC,MAAM,SAAS,GAGlB;IACH,OAAO;IACN,kGAAkG;IAClG,qFAAqF;IACrF,WAAW,EAAE;IACd,mBAAmB,EAAE,6BAA6B;IAClD,OAAO,EAAE,IAAI,uBAAuB,EAAE;IACtC,sBAAsB,EAAE;QACvB,CAAC,EAAE,EAAE,EAAE;YACN,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE;gBAC1B,OAAO;aACP;YACD,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,CAAC,EAAE,EAAE,EAAE;YACN,QAAQ,EAAE,CAAC,IAAI,EAAE;gBAChB,KAAK,SAAS;oBACb,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE;wBACjB,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;qBACd;oBACD,MAAM;gBACP,KAAK,aAAa,CAAC;gBACnB,KAAK,aAAa,CAAC;gBACnB,KAAK,gBAAgB;oBACpB,IAAI,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE;wBAC3C,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;qBACd;oBACD,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE;wBACvC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;qBACZ;oBACD,MAAM;gBACP;oBACC,MAAM;aACP;QACF,CAAC;QACD,CAAC,EAAE,EAAE,EAAE;YACN,IACC,EAAE,CAAC,IAAI,KAAK,aAAa;gBACzB,EAAE,CAAC,IAAI,KAAK,aAAa;gBACzB,EAAE,CAAC,IAAI,KAAK,gBAAgB,EAC3B;gBACD,OAAO;aACP;YACD,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE;gBACvC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;aACZ;QACF,CAAC;KACD;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAiC;IAC/D,kBAAkB,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC3D,oBAAoB,EAAE,GAAG;IACzB,eAAe,EAAE,CAAC;IAClB,iBAAiB,EAAE;QAClB,kBAAkB,EAAE,CAAC;QACrB,oBAAoB,EAAE,GAAG;KACzB;IACD,gBAAgB,EAAE,GAAG;IACrB,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,6BAA6B,CAAC,EAAE;IAC/E,eAAe,EAAE,CAAC,UAAkB,EAAE,EAAE;QACvC,MAAM,UAAU,GAAgB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACvD,4FAA4F;QAC5F,0DAA0D;QAC1D,mEAAmE;QACnE,0BAA0B;QAC1B,uCAAuC;QACvC,+DAA+D;QAC/D,MAAM;QACN,IAAI;QACJ,OAAO,UAAU,CAAC;IACnB,CAAC;CACD,CAAC;AAEF,MAAM,UAAU,8BAA8B,CAC7C,YAAgD,EAChD,kBAA2B,KAAK;IAEhC,MAAM,EACL,aAAa,EACb,OAAO,EACP,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,GACtB,GAAG,qCAAqC,CAAC,YAAY,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,EAAE,GAAG,wCAAwC,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;IAEzF,SAAS,UAAU,CAAC,UAAiD;QACpE,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE;YAC3B,OAAO,IAAI,CAAC;SACZ;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAED,SAAS,cAAc,CAAC,KAAoB;QAC3C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAC/B,KAAK,EACL,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CACrD,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,SAAS,2BAA2B,CACnC,KAAoB;QAEpB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IAC3F,CAAC;IAED,SAAS,WAAW,CAAC,KAAoB;QACxC,MAAM,iBAAiB,GAAG,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACxD,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,iBAAiB,CAAC,KAAK,CAC5C,CAAC,EACD,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CACjD,CAAC;QACF,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;YACjC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SACvC;QACD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,SAAS,wBAAwB,CAAC,KAAoB;QACrD,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,CAAC;IAED,SAAS,0BAA0B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAiB;QACpE,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC,MAAM,CACrF,CAAC,KAAK,EAAE,EAAE;YACT,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAC/D,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC,CACD,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,QAAQ,CAAC,KAAoB;QACrC,MAAM,cAAc,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC;QACzF,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;QACzD,MAAM,CAAC,EAAE,CAAC,CAAC;QAEX,OAAO;YACN,EAAE;YACF,cAAc;SACd,CAAC;IACH,CAAC;IAED,KAAK,UAAU,WAAW,CAAC,KAAoB;QAC9C,OAAO;YACN,IAAI,EAAE,aAAa;YACnB,GAAG,cAAc,CAAC,KAAK,CAAC;YACxB,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC;YACrE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE;YACxB,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACvD,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;SACrD,CAAC;IACH,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,KAAoB;QACjD,OAAO;YACN,IAAI,EAAE,gBAAgB;YACtB,GAAG,QAAQ,CAAC,KAAK,CAAC;SAClB,CAAC;IACH,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,KAAoB;QACjD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QACnD,OAAO;YACN,IAAI,EAAE,gBAAgB;YACtB,KAAK;YACL,GAAG;YACH,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACvD,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,UAAU;YACV,GAAG,QAAQ,CAAC,KAAK,CAAC;SAClB,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,EAAE,MAAM,EAAiB,EAAW,EAAE,CAC5D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACvE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC/D,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEJ,MAAM,sBAAsB,GAAuC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACjF,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE;YACjE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE;gBAC5D,aAAa,EAAE,CAAC;gBAChB,IAAI,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE;oBAC1C,OAAO,KAAK,CAAC;iBACb;aACD;SACD;QACD,OAAO,IAAI,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,GAAG,GACR,CAAI,GAAG,OAAiC,EAA0B,EAAE,CACpE,CAAC,CAAI,EAAE,EAAE,CACR,OAAO,CAAC,MAAM,CAAU,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,YAAY,EAAE,OAAO,IAAI,wCAAwC,CAAC,OAAO,CAAC;IAChG,OAAO,4BAA4B,CAA2B;QAC7D,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,sBAAsB,CAAC;QACxD;YACC,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,WAAW;YACpD,aAAa,CAAC,WAAW;YACzB,eAAe;gBACd,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC3B,OAAO,MAAM,GAAG,CAAC,CAAC;gBAClB,CAAC,CAAC;gBACJ,CAAC,CAAC,gBAAgB;SACnB;QACD,CAAC,eAAe,EAAE,aAAa,CAAC,eAAe,EAAE,gBAAgB,CAAC;QAClE,CAAC,WAAW,EAAE,aAAa,CAAC,WAAW,EAAE,GAAG,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;QACvF,CAAC,cAAc,EAAE,aAAa,CAAC,cAAc,EAAE,aAAa,CAAC;QAC7D,CAAC,cAAc,EAAE,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;KACpF,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport * as path from \"path\";\nimport {\n\tAcceptanceCondition,\n\tAsyncGenerator,\n\tAsyncReducer,\n\tcombineReducersAsync,\n\tcreateWeightedAsyncGenerator,\n} from \"@fluid-private/stochastic-test-utils\";\nimport { DDSFuzzModel, DDSFuzzSuiteOptions, DDSFuzzTestState } from \"@fluid-private/test-dds-utils\";\nimport {\n\tIChannelAttributes,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { PropertySet } from \"@fluidframework/merge-tree\";\nimport type { SequenceInterval } from \"../../index.js\";\nimport { type IIntervalCollection, Side } from \"../../intervalCollection.js\";\nimport { SharedStringRevertible, revertSharedStringRevertibles } from \"../../revertibles.js\";\nimport { SharedStringFactory } from \"../../sequenceFactory.js\";\nimport { SharedString } from \"../../sharedString.js\";\nimport { _dirname } from \"../dirname.cjs\";\nimport { assertEquivalentSharedStrings } from \"../intervalTestUtils.js\";\n\nexport type RevertibleSharedString = SharedString & {\n\trevertibles: SharedStringRevertible[];\n\t// This field prevents change events that are emitted while in the process of a revert from\n\t// being added into the revertibles stack.\n\tisCurrentRevert: boolean;\n};\nexport function isRevertibleSharedString(s: SharedString): s is RevertibleSharedString {\n\treturn (s as RevertibleSharedString).revertibles !== undefined;\n}\n\nexport interface RangeSpec {\n\tstart: number;\n\tend: number;\n}\n\nexport interface IntervalCollectionSpec {\n\tcollectionName: string;\n}\n\nexport interface AddText {\n\ttype: \"addText\";\n\tindex: number;\n\tcontent: string;\n}\n\nexport interface RemoveRange extends RangeSpec {\n\ttype: \"removeRange\";\n}\n\nexport interface ObliterateRange extends RangeSpec {\n\ttype: \"obliterateRange\";\n}\n\n// For non-interval collection fuzzing, annotating text would also be useful.\nexport interface AddInterval extends IntervalCollectionSpec, RangeSpec {\n\ttype: \"addInterval\";\n\t// Normally interval ids get autogenerated, but including it here allows tracking\n\t// what happened to an interval over the course of its lifetime based on the history\n\t// file, which is useful for debugging test failures.\n\tid: string;\n\tstartSide: Side;\n\tendSide: Side;\n}\n\nexport interface ChangeInterval extends IntervalCollectionSpec {\n\ttype: \"changeInterval\";\n\tstart: number | undefined;\n\tend: number | undefined;\n\tid: string;\n\tstartSide: Side;\n\tendSide: Side;\n\tproperties: PropertySet | undefined;\n}\n\nexport interface DeleteInterval extends IntervalCollectionSpec {\n\ttype: \"deleteInterval\";\n\tid: string;\n}\n\nexport interface RevertSharedStringRevertibles {\n\ttype: \"revertSharedStringRevertibles\";\n\teditsToRevert: number;\n}\n\nexport interface RevertibleWeights {\n\trevertWeight: number;\n\taddText: number;\n\tremoveRange: number;\n\tobliterateRange: number;\n\taddInterval: number;\n\tdeleteInterval: number;\n\tchangeInterval: number;\n}\n\nexport type IntervalOperation = AddInterval | ChangeInterval | DeleteInterval;\nexport type OperationWithRevert = IntervalOperation | RevertSharedStringRevertibles;\nexport type TextOperation = AddText | RemoveRange | ObliterateRange;\n\nexport type ClientOperation = IntervalOperation | TextOperation;\n\nexport type RevertOperation = OperationWithRevert | TextOperation;\nexport type Operation = RevertOperation;\n\nexport type FuzzTestState = DDSFuzzTestState<SharedStringFactory>;\n\nexport interface SharedStringOperationGenerationConfig {\n\t/**\n\t * Maximum length of the SharedString (locally) before no further AddText operations are generated.\n\t * Note due to concurrency, during test execution the actual length of the string may exceed this.\n\t */\n\tmaxStringLength?: number;\n\tmaxInsertLength?: number;\n\tweights?: {\n\t\taddText: number;\n\t\tremoveRange: number;\n\t\tobliterateRange: number;\n\t};\n}\n\nexport interface IntervalOperationGenerationConfig extends SharedStringOperationGenerationConfig {\n\t/**\n\t * Maximum number of intervals (locally) before no further AddInterval operations are generated.\n\t * Note due to concurrency, during test execution the actual number of intervals may exceed this.\n\t */\n\tmaxIntervals?: number;\n\tintervalCollectionNamePool?: string[];\n\tpropertyNamePool?: string[];\n\tvalidateInterval?: number;\n\tweights?: RevertibleWeights & SharedStringOperationGenerationConfig[\"weights\"];\n}\n\nexport const defaultSharedStringOperationGenerationConfig: Required<SharedStringOperationGenerationConfig> =\n\t{\n\t\tmaxStringLength: 1000,\n\t\tmaxInsertLength: 10,\n\t\tweights: {\n\t\t\taddText: 2,\n\t\t\tremoveRange: 1,\n\t\t\tobliterateRange: 1,\n\t\t},\n\t};\nexport const defaultIntervalOperationGenerationConfig: Required<IntervalOperationGenerationConfig> =\n\t{\n\t\t...defaultSharedStringOperationGenerationConfig,\n\t\tmaxIntervals: 100,\n\t\tintervalCollectionNamePool: [\"comments\"],\n\t\tpropertyNamePool: [\"prop1\", \"prop2\", \"prop3\"],\n\t\tvalidateInterval: 100,\n\t\tweights: {\n\t\t\t...defaultSharedStringOperationGenerationConfig.weights,\n\t\t\trevertWeight: 2,\n\t\t\taddInterval: 2,\n\t\t\tdeleteInterval: 2,\n\t\t\tchangeInterval: 2,\n\t\t\tobliterateRange: 0,\n\t\t},\n\t};\n\nexport interface LoggingInfo {\n\t/** id of the interval to track over time */\n\tintervalId: string;\n\t/** Clients to print */\n\tclientIds: string[];\n}\n\nfunction logCurrentState(state: FuzzTestState, loggingInfo: LoggingInfo): void {\n\tfor (const id of loggingInfo.clientIds) {\n\t\tconst { channel } = state.clients.find((s) => s.containerRuntime.clientId === id) ?? {};\n\t\tassert(channel);\n\t\tconst labels = channel.getIntervalCollectionLabels();\n\t\tconst interval = Array.from(labels)\n\t\t\t.map((label) =>\n\t\t\t\tchannel.getIntervalCollection(label).getIntervalById(loggingInfo.intervalId),\n\t\t\t)\n\t\t\t.find((result) => result !== undefined);\n\n\t\tconsole.log(`Client ${id}:`);\n\t\tif (interval !== undefined) {\n\t\t\tconst start = channel.localReferencePositionToPosition(interval.start);\n\t\t\tconst end = channel.localReferencePositionToPosition(interval.end);\n\t\t\tif (end === start) {\n\t\t\t\tconsole.log(`${\" \".repeat(start)}x`);\n\t\t\t} else {\n\t\t\t\tconsole.log(`${\" \".repeat(start)}[${\" \".repeat(end - start - 1)}]`);\n\t\t\t}\n\t\t}\n\t\tconsole.log(channel.getText());\n\t\tconsole.log(\"\\n\");\n\t}\n}\n\ntype ClientOpState = FuzzTestState;\n\nexport function makeReducer(\n\tloggingInfo?: LoggingInfo,\n): AsyncReducer<Operation | RevertOperation, ClientOpState> {\n\tconst withLogging =\n\t\t<T>(baseReducer: AsyncReducer<T, ClientOpState>): AsyncReducer<T, ClientOpState> =>\n\t\tasync (state, operation) => {\n\t\t\tif (loggingInfo !== undefined) {\n\t\t\t\tlogCurrentState(state, loggingInfo);\n\t\t\t\tconsole.log(\"-\".repeat(20));\n\t\t\t\tconsole.log(\"Next operation:\", JSON.stringify(operation, undefined, 4));\n\t\t\t}\n\t\t\tawait baseReducer(state, operation);\n\t\t};\n\n\tconst reducer = combineReducersAsync<Operation | RevertOperation, ClientOpState>({\n\t\taddText: async ({ client }, { index, content }) => {\n\t\t\tclient.channel.insertText(index, content);\n\t\t},\n\t\tremoveRange: async ({ client }, { start, end }) => {\n\t\t\tclient.channel.removeRange(start, end);\n\t\t},\n\t\tobliterateRange: async ({ client }, { start, end }) => {\n\t\t\tclient.channel.obliterateRange(start, end);\n\t\t},\n\t\taddInterval: async ({ client }, { start, end, collectionName, id, startSide, endSide }) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(collectionName);\n\t\t\tcollection.add({\n\t\t\t\tstart: { pos: start, side: startSide },\n\t\t\t\tend: { pos: end, side: endSide },\n\t\t\t\tprops: { intervalId: id },\n\t\t\t});\n\t\t},\n\t\tdeleteInterval: async ({ client }, { id, collectionName }) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(collectionName);\n\t\t\tcollection.removeIntervalById(id);\n\t\t},\n\t\tchangeInterval: async (\n\t\t\t{ client },\n\t\t\t{ id, start, end, collectionName, startSide, endSide, properties },\n\t\t) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(collectionName);\n\t\t\tif (start !== undefined && end !== undefined) {\n\t\t\t\tcollection.change(id, {\n\t\t\t\t\tstart: { pos: start, side: startSide },\n\t\t\t\t\tend: { pos: end, side: endSide },\n\t\t\t\t\tprops: properties,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tcollection.change(id, { props: properties });\n\t\t\t}\n\t\t},\n\t\trevertSharedStringRevertibles: async ({ client }, { editsToRevert }) => {\n\t\t\tassert(isRevertibleSharedString(client.channel));\n\t\t\tclient.channel.isCurrentRevert = true;\n\t\t\tconst few = client.channel.revertibles.splice(-editsToRevert, editsToRevert);\n\t\t\trevertSharedStringRevertibles(client.channel, few);\n\t\t\tclient.channel.isCurrentRevert = false;\n\t\t},\n\t});\n\n\treturn withLogging(reducer);\n}\n\nexport function createSharedStringGeneratorOperations(\n\toptionsParam?: SharedStringOperationGenerationConfig,\n) {\n\tconst options = { ...defaultSharedStringOperationGenerationConfig, ...(optionsParam ?? {}) };\n\n\t// All subsequent helper functions are generators; note that they don't actually apply any operations.\n\tfunction startPosition({ random, client }: ClientOpState): number {\n\t\treturn random.integer(0, Math.max(0, client.channel.getLength() - 1));\n\t}\n\n\tfunction exclusiveRange(state: ClientOpState): RangeSpec {\n\t\tconst start = startPosition(state);\n\t\tconst end = state.random.integer(start + 1, state.client.channel.getLength());\n\t\treturn { start, end };\n\t}\n\n\tfunction exclusiveRangeLeaveChar(state: ClientOpState): RangeSpec {\n\t\tconst start = state.random.integer(0, state.client.channel.getLength() - 2);\n\t\tconst end = state.random.integer(start + 1, state.client.channel.getLength() - 1);\n\t\treturn { start, end };\n\t}\n\n\tasync function addText(state: ClientOpState): Promise<AddText> {\n\t\tconst { random, client } = state;\n\t\treturn {\n\t\t\ttype: \"addText\",\n\t\t\tindex: random.integer(0, client.channel.getLength()),\n\t\t\tcontent: random.string(random.integer(1, options.maxInsertLength)),\n\t\t};\n\t}\n\n\tasync function obliterateRange(state: ClientOpState): Promise<ObliterateRange> {\n\t\treturn {\n\t\t\ttype: \"obliterateRange\",\n\t\t\t...exclusiveRange(state),\n\t\t};\n\t}\n\n\tasync function removeRange(state: ClientOpState): Promise<RemoveRange> {\n\t\treturn { type: \"removeRange\", ...exclusiveRange(state) };\n\t}\n\n\tasync function removeRangeLeaveChar(state: ClientOpState): Promise<RemoveRange> {\n\t\treturn { type: \"removeRange\", ...exclusiveRangeLeaveChar(state) };\n\t}\n\n\tconst lengthSatisfies =\n\t\t(criteria: (length: number) => boolean): AcceptanceCondition<ClientOpState> =>\n\t\t({ client }) =>\n\t\t\tcriteria(client.channel.getLength());\n\tconst hasNonzeroLength = lengthSatisfies((length) => length > 0);\n\tconst isShorterThanMaxLength = lengthSatisfies((length) => length < options.maxStringLength);\n\n\treturn {\n\t\tstartPosition,\n\t\texclusiveRange,\n\t\texclusiveRangeLeaveChar,\n\t\taddText,\n\t\tobliterateRange,\n\t\tremoveRange,\n\t\tremoveRangeLeaveChar,\n\t\tlengthSatisfies,\n\t\thasNonzeroLength,\n\t\tisShorterThanMaxLength,\n\t};\n}\n\nexport class SharedStringFuzzFactory extends SharedStringFactory {\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<SharedString> {\n\t\truntime.options.intervalStickinessEnabled = true;\n\t\truntime.options.mergeTreeEnableObliterate = true;\n\t\treturn super.load(runtime, id, services, attributes);\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): SharedString {\n\t\tdocument.options.intervalStickinessEnabled = true;\n\t\tdocument.options.mergeTreeEnableObliterate = true;\n\t\treturn super.create(document, id);\n\t}\n}\n\nexport const baseModel: Omit<\n\tDDSFuzzModel<SharedStringFactory, Operation, FuzzTestState>,\n\t\"workloadName\" | \"generatorFactory\"\n> = {\n\treducer:\n\t\t// makeReducer supports a param for logging output which tracks the provided intervalId over time:\n\t\t// { intervalId: \"00000000-0000-0000-0000-000000000000\", clientIds: [\"A\", \"B\", \"C\"] }\n\t\tmakeReducer(),\n\tvalidateConsistency: assertEquivalentSharedStrings,\n\tfactory: new SharedStringFuzzFactory(),\n\tminimizationTransforms: [\n\t\t(op) => {\n\t\t\tif (op.type !== \"addText\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\top.content = op.content.slice(1);\n\t\t},\n\t\t(op) => {\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"addText\":\n\t\t\t\t\tif (op.index > 0) {\n\t\t\t\t\t\top.index -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"removeRange\":\n\t\t\t\tcase \"addInterval\":\n\t\t\t\tcase \"changeInterval\":\n\t\t\t\t\tif (op.start !== undefined && op.start > 0) {\n\t\t\t\t\t\top.start -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (op.end !== undefined && op.end > 0) {\n\t\t\t\t\t\top.end -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t(op) => {\n\t\t\tif (\n\t\t\t\top.type !== \"removeRange\" &&\n\t\t\t\top.type !== \"addInterval\" &&\n\t\t\t\top.type !== \"changeInterval\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (op.end !== undefined && op.end > 0) {\n\t\t\t\top.end -= 1;\n\t\t\t}\n\t\t},\n\t],\n};\n\nexport const defaultFuzzOptions: Partial<DDSFuzzSuiteOptions> = {\n\tvalidationStrategy: { type: \"fixedInterval\", interval: 10 },\n\treconnectProbability: 0.1,\n\tnumberOfClients: 3,\n\tclientJoinOptions: {\n\t\tmaxNumberOfClients: 6,\n\t\tclientAddProbability: 0.1,\n\t},\n\tdefaultTestCount: 100,\n\tsaveFailures: { directory: path.join(_dirname, \"../../src/test/fuzz/results\") },\n\tparseOperations: (serialized: string) => {\n\t\tconst operations: Operation[] = JSON.parse(serialized);\n\t\t// Replace this value with some other interval ID and uncomment to filter replay of the test\n\t\t// suite to only include interval operations with this ID.\n\t\t// const filterIntervalId = \"00000000-0000-0000-0000-000000000000\";\n\t\t// if (filterIntervalId) {\n\t\t// \treturn operations.filter((entry) =>\n\t\t// \t\t[undefined, filterIntervalId].includes((entry as any).id),\n\t\t// \t);\n\t\t// }\n\t\treturn operations;\n\t},\n};\n\nexport function makeIntervalOperationGenerator(\n\toptionsParam?: IntervalOperationGenerationConfig,\n\talwaysLeaveChar: boolean = false,\n): AsyncGenerator<Operation, ClientOpState> {\n\tconst {\n\t\tstartPosition,\n\t\taddText,\n\t\tobliterateRange,\n\t\tremoveRange,\n\t\tremoveRangeLeaveChar,\n\t\tlengthSatisfies,\n\t\thasNonzeroLength,\n\t\tisShorterThanMaxLength,\n\t} = createSharedStringGeneratorOperations(optionsParam);\n\n\tconst options = { ...defaultIntervalOperationGenerationConfig, ...(optionsParam ?? {}) };\n\n\tfunction isNonEmpty(collection: IIntervalCollection<SequenceInterval>): boolean {\n\t\tfor (const _ of collection) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction inclusiveRange(state: ClientOpState): RangeSpec {\n\t\tconst start = startPosition(state);\n\t\tconst end = state.random.integer(\n\t\t\tstart,\n\t\t\tMath.max(start, state.client.channel.getLength() - 1),\n\t\t);\n\t\treturn { start, end };\n\t}\n\n\tfunction inclusiveRangeWithUndefined(\n\t\tstate: ClientOpState,\n\t): RangeSpec | { start: undefined; end: undefined } {\n\t\treturn state.random.bool() ? inclusiveRange(state) : { start: undefined, end: undefined };\n\t}\n\n\tfunction propertySet(state: ClientOpState): PropertySet {\n\t\tconst propNamesShuffled = [...options.propertyNamePool];\n\t\tstate.random.shuffle(propNamesShuffled);\n\t\tconst propsToChange = propNamesShuffled.slice(\n\t\t\t0,\n\t\t\tstate.random.integer(1, propNamesShuffled.length),\n\t\t);\n\t\tconst propSet: PropertySet = {};\n\t\tfor (const name of propsToChange) {\n\t\t\tpropSet[name] = state.random.string(5);\n\t\t}\n\t\treturn propSet;\n\t}\n\n\tfunction propertySetWithUndefined(state: ClientOpState): PropertySet | undefined {\n\t\treturn state.random.bool() ? propertySet(state) : undefined;\n\t}\n\n\tfunction nonEmptyIntervalCollection({ client, random }: ClientOpState): string {\n\t\tconst nonEmptyLabels = Array.from(client.channel.getIntervalCollectionLabels()).filter(\n\t\t\t(label) => {\n\t\t\t\tconst collection = client.channel.getIntervalCollection(label);\n\t\t\t\treturn isNonEmpty(collection);\n\t\t\t},\n\t\t);\n\t\treturn random.pick(nonEmptyLabels);\n\t}\n\n\tfunction interval(state: ClientOpState): { collectionName: string; id: string } {\n\t\tconst collectionName = nonEmptyIntervalCollection(state);\n\t\tconst intervals = Array.from(state.client.channel.getIntervalCollection(collectionName));\n\t\tconst id = state.random.pick(intervals)?.getIntervalId();\n\t\tassert(id);\n\n\t\treturn {\n\t\t\tid,\n\t\t\tcollectionName,\n\t\t};\n\t}\n\n\tasync function addInterval(state: ClientOpState): Promise<AddInterval> {\n\t\treturn {\n\t\t\ttype: \"addInterval\",\n\t\t\t...inclusiveRange(state),\n\t\t\tcollectionName: state.random.pick(options.intervalCollectionNamePool),\n\t\t\tid: state.random.uuid4(),\n\t\t\tstartSide: state.random.pick([Side.Before, Side.After]),\n\t\t\tendSide: state.random.pick([Side.Before, Side.After]),\n\t\t};\n\t}\n\n\tasync function deleteInterval(state: ClientOpState): Promise<DeleteInterval> {\n\t\treturn {\n\t\t\ttype: \"deleteInterval\",\n\t\t\t...interval(state),\n\t\t};\n\t}\n\n\tasync function changeInterval(state: ClientOpState): Promise<ChangeInterval> {\n\t\tconst { start, end } = inclusiveRangeWithUndefined(state);\n\t\tconst properties = propertySetWithUndefined(state);\n\t\treturn {\n\t\t\ttype: \"changeInterval\",\n\t\t\tstart,\n\t\t\tend,\n\t\t\tstartSide: state.random.pick([Side.Before, Side.After]),\n\t\t\tendSide: state.random.pick([Side.Before, Side.After]),\n\t\t\tproperties,\n\t\t\t...interval(state),\n\t\t};\n\t}\n\n\tconst hasAnInterval = ({ client }: ClientOpState): boolean =>\n\t\tArray.from(client.channel.getIntervalCollectionLabels()).some((label) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(label);\n\t\t\treturn isNonEmpty(collection);\n\t\t});\n\n\tconst hasNotTooManyIntervals: AcceptanceCondition<ClientOpState> = ({ client }) => {\n\t\tlet intervalCount = 0;\n\t\tfor (const label of client.channel.getIntervalCollectionLabels()) {\n\t\t\tfor (const _ of client.channel.getIntervalCollection(label)) {\n\t\t\t\tintervalCount++;\n\t\t\t\tif (intervalCount >= options.maxIntervals) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n\n\tconst all =\n\t\t<T>(...clauses: AcceptanceCondition<T>[]): AcceptanceCondition<T> =>\n\t\t(t: T) =>\n\t\t\tclauses.reduce<boolean>((prev, cond) => prev && cond(t), true);\n\tconst usableWeights = optionsParam?.weights ?? defaultIntervalOperationGenerationConfig.weights;\n\treturn createWeightedAsyncGenerator<Operation, ClientOpState>([\n\t\t[addText, usableWeights.addText, isShorterThanMaxLength],\n\t\t[\n\t\t\talwaysLeaveChar ? removeRangeLeaveChar : removeRange,\n\t\t\tusableWeights.removeRange,\n\t\t\talwaysLeaveChar\n\t\t\t\t? lengthSatisfies((length) => {\n\t\t\t\t\t\treturn length > 1;\n\t\t\t\t })\n\t\t\t\t: hasNonzeroLength,\n\t\t],\n\t\t[obliterateRange, usableWeights.obliterateRange, hasNonzeroLength],\n\t\t[addInterval, usableWeights.addInterval, all(hasNotTooManyIntervals, hasNonzeroLength)],\n\t\t[deleteInterval, usableWeights.deleteInterval, hasAnInterval],\n\t\t[changeInterval, usableWeights.changeInterval, all(hasAnInterval, hasNonzeroLength)],\n\t]);\n}\n"]}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { takeAsync } from "@fluid-private/stochastic-test-utils";
|
|
6
6
|
import { createDDSFuzzSuite } from "@fluid-private/test-dds-utils";
|
|
7
7
|
import { FlushMode } from "@fluidframework/runtime-definitions";
|
|
8
|
-
import {
|
|
8
|
+
import { baseModel, defaultFuzzOptions, defaultIntervalOperationGenerationConfig, makeIntervalOperationGenerator, } from "./fuzzUtils.js";
|
|
9
9
|
const baseIntervalModel = {
|
|
10
10
|
...baseModel,
|
|
11
11
|
generatorFactory: () => takeAsync(100, makeIntervalOperationGenerator(defaultIntervalOperationGenerationConfig)),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intervalCollection.fuzz.spec.js","sourceRoot":"","sources":["../../../src/test/fuzz/intervalCollection.fuzz.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,OAAO,EACN,
|
|
1
|
+
{"version":3,"file":"intervalCollection.fuzz.spec.js","sourceRoot":"","sources":["../../../src/test/fuzz/intervalCollection.fuzz.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,OAAO,EACN,SAAS,EACT,kBAAkB,EAClB,wCAAwC,EACxC,8BAA8B,GAC9B,MAAM,gBAAgB,CAAC;AAExB,MAAM,iBAAiB,GAAG;IACzB,GAAG,SAAS;IACZ,gBAAgB,EAAE,GAAG,EAAE,CACtB,SAAS,CAAC,GAAG,EAAE,8BAA8B,CAAC,wCAAwC,CAAC,CAAC;CACzF,CAAC;AAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAChD,MAAM,KAAK,GAAG;QACb,GAAG,iBAAiB;QACpB,YAAY,EAAE,6BAA6B;KAC3C,CAAC;IAEF,kBAAkB,CAAC,KAAK,EAAE;QACzB,GAAG,kBAAkB;QACrB,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAClB,oGAAoG;QACpG,sGAAsG;QACtG,uEAAuE;QACvE,aAAa;KACb,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IACjD,MAAM,KAAK,GAAG;QACb,GAAG,iBAAiB;QACpB,YAAY,EAAE,2CAA2C;KACzD,CAAC;IAEF,kBAAkB,CAAC,KAAK,EAAE;QACzB,GAAG,kBAAkB;QACrB,iBAAiB,EAAE;YAClB,oBAAoB,EAAE,GAAG;YACzB,kBAAkB,EAAE,MAAM,CAAC,gBAAgB;YAC3C,0BAA0B,EAAE,GAAG;SAC/B;QACD,UAAU;QACV,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAClB,uEAAuE;QACvE,aAAa;KACb,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC7D,MAAM,gBAAgB,GAAG;QACxB,GAAG,iBAAiB;QACpB,YAAY,EAAE,wCAAwC;KACtD,CAAC;IAEF,MAAM,OAAO,GAAG;QACf,GAAG,kBAAkB;QACrB,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACd,oBAAoB,EAAE,GAAG;QACzB,iBAAiB,EAAE;YAClB,kBAAkB,EAAE,CAAC;YACrB,oBAAoB,EAAE,GAAG;SACzB;KACD,CAAC;IAEF,kBAAkB,CAAC,gBAAgB,EAAE;QACpC,GAAG,OAAO;QACV,uEAAuE;QACvE,aAAa;KACb,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sDAAsD,EAAE,GAAG,EAAE;IACrE,MAAM,0BAA0B,GAAG;QAClC,GAAG,iBAAiB;QACpB,YAAY,EAAE,mCAAmC;KACjD,CAAC;IAEF,kBAAkB,CAAC,0BAA0B,EAAE;QAC9C,GAAG,kBAAkB;QACrB,eAAe;QACf,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACd,oBAAoB,EAAE,GAAG;QACzB,iBAAiB,EAAE;YAClB,kBAAkB,EAAE,CAAC;YACrB,oBAAoB,EAAE,GAAG;SACzB;QACD,iBAAiB,EAAE,GAAG;QACtB,uBAAuB,EAAE;YACxB,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,qBAAqB,EAAE,IAAI;SAC3B;QACD,uEAAuE;KACvE,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { takeAsync } from \"@fluid-private/stochastic-test-utils\";\nimport { createDDSFuzzSuite } from \"@fluid-private/test-dds-utils\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport {\n\tbaseModel,\n\tdefaultFuzzOptions,\n\tdefaultIntervalOperationGenerationConfig,\n\tmakeIntervalOperationGenerator,\n} from \"./fuzzUtils.js\";\n\nconst baseIntervalModel = {\n\t...baseModel,\n\tgeneratorFactory: () =>\n\t\ttakeAsync(100, makeIntervalOperationGenerator(defaultIntervalOperationGenerationConfig)),\n};\n\ndescribe(\"IntervalCollection fuzz testing\", () => {\n\tconst model = {\n\t\t...baseIntervalModel,\n\t\tworkloadName: \"default interval collection\",\n\t};\n\n\tcreateDDSFuzzSuite(model, {\n\t\t...defaultFuzzOptions,\n\t\tskip: [32, 56, 86],\n\t\t// Note: there are some known eventual consistency issues which the tests don't currently reproduce.\n\t\t// Search this package for AB#6552 (or look at that work item) for a skipped test and further details.\n\t\t// Uncomment this line to replay a specific seed from its failure file:\n\t\t// replay: 0,\n\t});\n});\n\ndescribe(\"IntervalCollection with stashing\", () => {\n\tconst model = {\n\t\t...baseIntervalModel,\n\t\tworkloadName: \"default interval collection with stashing\",\n\t};\n\n\tcreateDDSFuzzSuite(model, {\n\t\t...defaultFuzzOptions,\n\t\tclientJoinOptions: {\n\t\t\tclientAddProbability: 0.1,\n\t\t\tmaxNumberOfClients: Number.MAX_SAFE_INTEGER,\n\t\t\tstashableClientProbability: 0.2,\n\t\t},\n\t\t// AB#7220\n\t\tskip: [22, 56, 86],\n\t\t// Uncomment this line to replay a specific seed from its failure file:\n\t\t// replay: 0,\n\t});\n});\n\ndescribe(\"IntervalCollection no reconnect fuzz testing\", () => {\n\tconst noReconnectModel = {\n\t\t...baseIntervalModel,\n\t\tworkloadName: \"interval collection without reconnects\",\n\t};\n\n\tconst options = {\n\t\t...defaultFuzzOptions,\n\t\tskip: [56, 86],\n\t\treconnectProbability: 0.0,\n\t\tclientJoinOptions: {\n\t\t\tmaxNumberOfClients: 3,\n\t\t\tclientAddProbability: 0.0,\n\t\t},\n\t};\n\n\tcreateDDSFuzzSuite(noReconnectModel, {\n\t\t...options,\n\t\t// Uncomment this line to replay a specific seed from its failure file:\n\t\t// replay: 0,\n\t});\n});\n\ndescribe(\"IntervalCollection fuzz testing with rebased batches\", () => {\n\tconst noReconnectWithRebaseModel = {\n\t\t...baseIntervalModel,\n\t\tworkloadName: \"interval collection with rebasing\",\n\t};\n\n\tcreateDDSFuzzSuite(noReconnectWithRebaseModel, {\n\t\t...defaultFuzzOptions,\n\t\t// todo AB#5603\n\t\tskip: [46, 56],\n\t\treconnectProbability: 0.0,\n\t\tclientJoinOptions: {\n\t\t\tmaxNumberOfClients: 3,\n\t\t\tclientAddProbability: 0.0,\n\t\t},\n\t\trebaseProbability: 0.2,\n\t\tcontainerRuntimeOptions: {\n\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\tenableGroupedBatching: true,\n\t\t},\n\t\t// Uncomment this line to replay a specific seed from its failure file:\n\t});\n});\n"]}
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { strict as assert } from "assert";
|
|
6
|
+
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
6
7
|
import { createWeightedAsyncGenerator as createWeightedGenerator, takeAsync as take, } from "@fluid-private/stochastic-test-utils";
|
|
7
8
|
import { createDDSFuzzSuite, } from "@fluid-private/test-dds-utils";
|
|
8
|
-
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
9
9
|
import { FlushMode } from "@fluidframework/runtime-definitions";
|
|
10
10
|
import { appendAddIntervalToRevertibles, appendChangeIntervalToRevertibles, appendDeleteIntervalToRevertibles, appendIntervalPropertyChangedToRevertibles, appendSharedStringDeltaToRevertibles, } from "../../revertibles.js";
|
|
11
|
-
import {
|
|
11
|
+
import { baseModel, defaultFuzzOptions, isRevertibleSharedString, makeIntervalOperationGenerator, } from "./fuzzUtils.js";
|
|
12
12
|
const emitter = new TypedEventEmitter();
|
|
13
13
|
emitter.on("clientCreate", (client) => {
|
|
14
14
|
const channel = client.channel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intervalRevertibles.fuzz.spec.js","sourceRoot":"","sources":["../../../src/test/fuzz/intervalRevertibles.fuzz.spec.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 { strict as assert } from \"assert\";\nimport {\n\tcreateWeightedAsyncGenerator as createWeightedGenerator,\n\tAsyncGenerator as Generator,\n\ttakeAsync as take,\n} from \"@fluid-private/stochastic-test-utils\";\nimport {\n\tcreateDDSFuzzSuite,\n\tDDSFuzzModel,\n\tDDSFuzzHarnessEvents,\n\tDDSFuzzSuiteOptions,\n} from \"@fluid-private/test-dds-utils\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport {\n\tappendAddIntervalToRevertibles,\n\tappendChangeIntervalToRevertibles,\n\tappendDeleteIntervalToRevertibles,\n\tappendIntervalPropertyChangedToRevertibles,\n\tappendSharedStringDeltaToRevertibles,\n} from \"../../revertibles.js\";\nimport {\n\tFuzzTestState,\n\tRevertOperation,\n\tRevertibleSharedString,\n\tisRevertibleSharedString,\n\tIntervalOperationGenerationConfig,\n\tRevertSharedStringRevertibles,\n\tSharedStringFuzzFactory,\n\tbaseModel,\n\tdefaultFuzzOptions,\n\tmakeIntervalOperationGenerator,\n} from \"./fuzzUtils.js\";\n\nconst emitter = new TypedEventEmitter<DDSFuzzHarnessEvents>();\n\nemitter.on(\"clientCreate\", (client) => {\n\tconst channel = client.channel as RevertibleSharedString;\n\tchannel.revertibles = [];\n\tchannel.isCurrentRevert = false;\n\n\tchannel.on(\"createIntervalCollection\", (label) => {\n\t\tconst collection = channel.getIntervalCollection(label);\n\n\t\tassert(isRevertibleSharedString(channel));\n\t\tcollection.on(\"addInterval\", (interval, local, op) => {\n\t\t\tif (local && !channel.isCurrentRevert) {\n\t\t\t\tappendAddIntervalToRevertibles(interval, channel.revertibles);\n\t\t\t}\n\t\t});\n\t\tcollection.on(\"deleteInterval\", (interval, local, op) => {\n\t\t\tif (local && !channel.isCurrentRevert) {\n\t\t\t\tappendDeleteIntervalToRevertibles(channel, interval, channel.revertibles);\n\t\t\t}\n\t\t});\n\t\tcollection.on(\"changeInterval\", (interval, previousInterval, local, op, slide) => {\n\t\t\tif (local && !channel.isCurrentRevert && !slide) {\n\t\t\t\tappendChangeIntervalToRevertibles(\n\t\t\t\t\tchannel,\n\t\t\t\t\tinterval,\n\t\t\t\t\tpreviousInterval,\n\t\t\t\t\tchannel.revertibles,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\tcollection.on(\"propertyChanged\", (interval, propertyDeltas, local, op) => {\n\t\t\tif (local && !channel.isCurrentRevert) {\n\t\t\t\tappendIntervalPropertyChangedToRevertibles(\n\t\t\t\t\tinterval,\n\t\t\t\t\tpropertyDeltas,\n\t\t\t\t\tchannel.revertibles,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\tchannel.on(\"sequenceDelta\", (op) => {\n\t\t\tif (op.isLocal && !channel.isCurrentRevert) {\n\t\t\t\tappendSharedStringDeltaToRevertibles(channel, op, channel.revertibles);\n\t\t\t}\n\t\t});\n\t});\n});\n\nconst defaultRevertiblesFuzzOptions: Partial<DDSFuzzSuiteOptions> = {\n\t...defaultFuzzOptions,\n\treconnectProbability: 0,\n\tclientJoinOptions: {\n\t\tmaxNumberOfClients: 6,\n\t\tclientAddProbability: 0,\n\t},\n};\n\nconst optionsWithEmitter: Partial<DDSFuzzSuiteOptions> = {\n\t...defaultRevertiblesFuzzOptions,\n\temitter,\n};\n\ntype ClientOpState = FuzzTestState;\nfunction operationGenerator(\n\toptionsParam: IntervalOperationGenerationConfig,\n): Generator<RevertOperation, ClientOpState> {\n\tasync function revertSharedStringRevertibles(\n\t\tstate: ClientOpState,\n\t): Promise<RevertSharedStringRevertibles> {\n\t\tassert(isRevertibleSharedString(state.client.channel));\n\t\treturn {\n\t\t\ttype: \"revertSharedStringRevertibles\",\n\t\t\t// grab a random number of edits to revert\n\t\t\teditsToRevert: state.random.integer(1, state.client.channel.revertibles.length),\n\t\t};\n\t}\n\n\tconst hasRevertibles = ({ client }: ClientOpState): boolean => {\n\t\tassert(isRevertibleSharedString(client.channel));\n\t\treturn client.channel.revertibles.length > 0;\n\t};\n\n\tassert(optionsParam.weights !== undefined);\n\tconst baseGenerator = makeIntervalOperationGenerator(optionsParam, true);\n\treturn createWeightedGenerator<RevertOperation, ClientOpState>([\n\t\t[revertSharedStringRevertibles, optionsParam.weights.revertWeight, hasRevertibles],\n\t\t[baseGenerator, 1],\n\t]);\n}\n\ndescribe(\"IntervalCollection fuzz testing\", () => {\n\tconst model: DDSFuzzModel<SharedStringFuzzFactory, RevertOperation, FuzzTestState> = {\n\t\t...baseModel,\n\t\tworkloadName: \"interval collection with revertibles\",\n\t\tgeneratorFactory: () =>\n\t\t\ttake(\n\t\t\t\t100,\n\t\t\t\t// Weights are explicitly defined here while bugs are being resolved. Once resolved,\n\t\t\t\t// the weights in the defaultOptions parameter will be used.\n\t\t\t\toperationGenerator({\n\t\t\t\t\tweights: {\n\t\t\t\t\t\trevertWeight: 2,\n\t\t\t\t\t\taddText: 2,\n\t\t\t\t\t\tremoveRange: 1,\n\t\t\t\t\t\tobliterateRange: 0,\n\t\t\t\t\t\taddInterval: 2,\n\t\t\t\t\t\tdeleteInterval: 2,\n\t\t\t\t\t\tchangeInterval: 2,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\t};\n\n\tcreateDDSFuzzSuite(model, optionsWithEmitter);\n});\n\ndescribe(\"IntervalCollection fuzz testing with rebasing\", () => {\n\tconst model: DDSFuzzModel<SharedStringFuzzFactory, RevertOperation, FuzzTestState> = {\n\t\t...baseModel,\n\t\tworkloadName: \"interval collection with revertibles and rebasing\",\n\t\tgeneratorFactory: () =>\n\t\t\ttake(\n\t\t\t\t100,\n\t\t\t\t// Weights are explicitly defined here while bugs are being resolved. Once resolved,\n\t\t\t\t// the weights in the defaultOptions parameter will be used.\n\t\t\t\toperationGenerator({\n\t\t\t\t\tweights: {\n\t\t\t\t\t\trevertWeight: 2,\n\t\t\t\t\t\taddText: 2,\n\t\t\t\t\t\tremoveRange: 1,\n\t\t\t\t\t\tobliterateRange: 0,\n\t\t\t\t\t\taddInterval: 2,\n\t\t\t\t\t\tdeleteInterval: 2,\n\t\t\t\t\t\tchangeInterval: 2,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\t};\n\n\tcreateDDSFuzzSuite(model, {\n\t\t...optionsWithEmitter,\n\t\trebaseProbability: 0.15,\n\t\tcontainerRuntimeOptions: {\n\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\tenableGroupedBatching: true,\n\t\t},\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"intervalRevertibles.fuzz.spec.js","sourceRoot":"","sources":["../../../src/test/fuzz/intervalRevertibles.fuzz.spec.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 { strict as assert } from \"assert\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tAsyncGenerator as Generator,\n\tcreateWeightedAsyncGenerator as createWeightedGenerator,\n\ttakeAsync as take,\n} from \"@fluid-private/stochastic-test-utils\";\nimport {\n\tDDSFuzzHarnessEvents,\n\tDDSFuzzModel,\n\tDDSFuzzSuiteOptions,\n\tcreateDDSFuzzSuite,\n} from \"@fluid-private/test-dds-utils\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport {\n\tappendAddIntervalToRevertibles,\n\tappendChangeIntervalToRevertibles,\n\tappendDeleteIntervalToRevertibles,\n\tappendIntervalPropertyChangedToRevertibles,\n\tappendSharedStringDeltaToRevertibles,\n} from \"../../revertibles.js\";\nimport {\n\tFuzzTestState,\n\tIntervalOperationGenerationConfig,\n\tRevertOperation,\n\tRevertSharedStringRevertibles,\n\tRevertibleSharedString,\n\tSharedStringFuzzFactory,\n\tbaseModel,\n\tdefaultFuzzOptions,\n\tisRevertibleSharedString,\n\tmakeIntervalOperationGenerator,\n} from \"./fuzzUtils.js\";\n\nconst emitter = new TypedEventEmitter<DDSFuzzHarnessEvents>();\n\nemitter.on(\"clientCreate\", (client) => {\n\tconst channel = client.channel as RevertibleSharedString;\n\tchannel.revertibles = [];\n\tchannel.isCurrentRevert = false;\n\n\tchannel.on(\"createIntervalCollection\", (label) => {\n\t\tconst collection = channel.getIntervalCollection(label);\n\n\t\tassert(isRevertibleSharedString(channel));\n\t\tcollection.on(\"addInterval\", (interval, local, op) => {\n\t\t\tif (local && !channel.isCurrentRevert) {\n\t\t\t\tappendAddIntervalToRevertibles(interval, channel.revertibles);\n\t\t\t}\n\t\t});\n\t\tcollection.on(\"deleteInterval\", (interval, local, op) => {\n\t\t\tif (local && !channel.isCurrentRevert) {\n\t\t\t\tappendDeleteIntervalToRevertibles(channel, interval, channel.revertibles);\n\t\t\t}\n\t\t});\n\t\tcollection.on(\"changeInterval\", (interval, previousInterval, local, op, slide) => {\n\t\t\tif (local && !channel.isCurrentRevert && !slide) {\n\t\t\t\tappendChangeIntervalToRevertibles(\n\t\t\t\t\tchannel,\n\t\t\t\t\tinterval,\n\t\t\t\t\tpreviousInterval,\n\t\t\t\t\tchannel.revertibles,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\tcollection.on(\"propertyChanged\", (interval, propertyDeltas, local, op) => {\n\t\t\tif (local && !channel.isCurrentRevert) {\n\t\t\t\tappendIntervalPropertyChangedToRevertibles(\n\t\t\t\t\tinterval,\n\t\t\t\t\tpropertyDeltas,\n\t\t\t\t\tchannel.revertibles,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\tchannel.on(\"sequenceDelta\", (op) => {\n\t\t\tif (op.isLocal && !channel.isCurrentRevert) {\n\t\t\t\tappendSharedStringDeltaToRevertibles(channel, op, channel.revertibles);\n\t\t\t}\n\t\t});\n\t});\n});\n\nconst defaultRevertiblesFuzzOptions: Partial<DDSFuzzSuiteOptions> = {\n\t...defaultFuzzOptions,\n\treconnectProbability: 0,\n\tclientJoinOptions: {\n\t\tmaxNumberOfClients: 6,\n\t\tclientAddProbability: 0,\n\t},\n};\n\nconst optionsWithEmitter: Partial<DDSFuzzSuiteOptions> = {\n\t...defaultRevertiblesFuzzOptions,\n\temitter,\n};\n\ntype ClientOpState = FuzzTestState;\nfunction operationGenerator(\n\toptionsParam: IntervalOperationGenerationConfig,\n): Generator<RevertOperation, ClientOpState> {\n\tasync function revertSharedStringRevertibles(\n\t\tstate: ClientOpState,\n\t): Promise<RevertSharedStringRevertibles> {\n\t\tassert(isRevertibleSharedString(state.client.channel));\n\t\treturn {\n\t\t\ttype: \"revertSharedStringRevertibles\",\n\t\t\t// grab a random number of edits to revert\n\t\t\teditsToRevert: state.random.integer(1, state.client.channel.revertibles.length),\n\t\t};\n\t}\n\n\tconst hasRevertibles = ({ client }: ClientOpState): boolean => {\n\t\tassert(isRevertibleSharedString(client.channel));\n\t\treturn client.channel.revertibles.length > 0;\n\t};\n\n\tassert(optionsParam.weights !== undefined);\n\tconst baseGenerator = makeIntervalOperationGenerator(optionsParam, true);\n\treturn createWeightedGenerator<RevertOperation, ClientOpState>([\n\t\t[revertSharedStringRevertibles, optionsParam.weights.revertWeight, hasRevertibles],\n\t\t[baseGenerator, 1],\n\t]);\n}\n\ndescribe(\"IntervalCollection fuzz testing\", () => {\n\tconst model: DDSFuzzModel<SharedStringFuzzFactory, RevertOperation, FuzzTestState> = {\n\t\t...baseModel,\n\t\tworkloadName: \"interval collection with revertibles\",\n\t\tgeneratorFactory: () =>\n\t\t\ttake(\n\t\t\t\t100,\n\t\t\t\t// Weights are explicitly defined here while bugs are being resolved. Once resolved,\n\t\t\t\t// the weights in the defaultOptions parameter will be used.\n\t\t\t\toperationGenerator({\n\t\t\t\t\tweights: {\n\t\t\t\t\t\trevertWeight: 2,\n\t\t\t\t\t\taddText: 2,\n\t\t\t\t\t\tremoveRange: 1,\n\t\t\t\t\t\tobliterateRange: 0,\n\t\t\t\t\t\taddInterval: 2,\n\t\t\t\t\t\tdeleteInterval: 2,\n\t\t\t\t\t\tchangeInterval: 2,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\t};\n\n\tcreateDDSFuzzSuite(model, optionsWithEmitter);\n});\n\ndescribe(\"IntervalCollection fuzz testing with rebasing\", () => {\n\tconst model: DDSFuzzModel<SharedStringFuzzFactory, RevertOperation, FuzzTestState> = {\n\t\t...baseModel,\n\t\tworkloadName: \"interval collection with revertibles and rebasing\",\n\t\tgeneratorFactory: () =>\n\t\t\ttake(\n\t\t\t\t100,\n\t\t\t\t// Weights are explicitly defined here while bugs are being resolved. Once resolved,\n\t\t\t\t// the weights in the defaultOptions parameter will be used.\n\t\t\t\toperationGenerator({\n\t\t\t\t\tweights: {\n\t\t\t\t\t\trevertWeight: 2,\n\t\t\t\t\t\taddText: 2,\n\t\t\t\t\t\tremoveRange: 1,\n\t\t\t\t\t\tobliterateRange: 0,\n\t\t\t\t\t\taddInterval: 2,\n\t\t\t\t\t\tdeleteInterval: 2,\n\t\t\t\t\t\tchangeInterval: 2,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t),\n\t};\n\n\tcreateDDSFuzzSuite(model, {\n\t\t...optionsWithEmitter,\n\t\trebaseProbability: 0.15,\n\t\tcontainerRuntimeOptions: {\n\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\tenableGroupedBatching: true,\n\t\t},\n\t});\n});\n"]}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { createWeightedAsyncGenerator as createWeightedGenerator, takeAsync as take, } from "@fluid-private/stochastic-test-utils";
|
|
6
6
|
import { createDDSFuzzSuite } from "@fluid-private/test-dds-utils";
|
|
7
7
|
import { FlushMode } from "@fluidframework/runtime-definitions";
|
|
8
|
-
import {
|
|
8
|
+
import { baseModel, createSharedStringGeneratorOperations, defaultFuzzOptions, defaultIntervalOperationGenerationConfig, } from "./fuzzUtils.js";
|
|
9
9
|
export function makeSharedStringOperationGenerator(optionsParam, alwaysLeaveChar = false) {
|
|
10
10
|
const { addText, removeRange, removeRangeLeaveChar, lengthSatisfies, hasNonzeroLength, isShorterThanMaxLength, } = createSharedStringGeneratorOperations(optionsParam);
|
|
11
11
|
const usableWeights = optionsParam?.weights ?? defaultIntervalOperationGenerationConfig.weights;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sharedString.fuzz.spec.js","sourceRoot":"","sources":["../../../src/test/fuzz/sharedString.fuzz.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"sharedString.fuzz.spec.js","sourceRoot":"","sources":["../../../src/test/fuzz/sharedString.fuzz.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAEN,4BAA4B,IAAI,uBAAuB,EACvD,SAAS,IAAI,IAAI,GACjB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,OAAO,EAIN,SAAS,EACT,qCAAqC,EACrC,kBAAkB,EAClB,wCAAwC,GACxC,MAAM,gBAAgB,CAAC;AAGxB,MAAM,UAAU,kCAAkC,CACjD,YAAoD,EACpD,kBAA2B,KAAK;IAEhC,MAAM,EACL,OAAO,EACP,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,GACtB,GAAG,qCAAqC,CAAC,YAAY,CAAC,CAAC;IAExD,MAAM,aAAa,GAAG,YAAY,EAAE,OAAO,IAAI,wCAAwC,CAAC,OAAO,CAAC;IAChG,OAAO,uBAAuB,CAA2B;QACxD,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,sBAAsB,CAAC;QACxD;YACC,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,WAAW;YACpD,aAAa,CAAC,WAAW;YACzB,eAAe;gBACd,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC3B,OAAO,MAAM,GAAG,CAAC,CAAC;gBAClB,CAAC,CAAC;gBACJ,CAAC,CAAC,gBAAgB;SACnB;KACD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,qBAAqB,GAAG;IAC7B,GAAG,SAAS;IACZ,gBAAgB,EAAE,GAAG,EAAE,CACtB,IAAI,CAAC,GAAG,EAAE,kCAAkC,CAAC,wCAAwC,CAAC,CAAC;CACxF,CAAC;AAEF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IAC1C,kBAAkB,CACjB,EAAE,GAAG,qBAAqB,EAAE,YAAY,EAAE,SAAS,EAAE,EACrD;QACC,GAAG,kBAAkB;QACrB,uEAAuE;QACvE,aAAa;KACb,CACD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAChD,kBAAkB,CACjB,EAAE,GAAG,qBAAqB,EAAE,YAAY,EAAE,SAAS,EAAE,EACrD;QACC,GAAG,kBAAkB;QACrB,iBAAiB,EAAE;YAClB,oBAAoB,EAAE,GAAG;YACzB,kBAAkB,EAAE,MAAM,CAAC,gBAAgB;YAC3C,0BAA0B,EAAE,GAAG;SAC/B;QACD,uEAAuE;QACvE,aAAa;KACb,CACD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC/D,kBAAkB,CACjB,EAAE,GAAG,qBAAqB,EAAE,YAAY,EAAE,4BAA4B,EAAE,EACxE;QACC,GAAG,kBAAkB;QACrB,oBAAoB,EAAE,GAAG;QACzB,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE;YAClB,kBAAkB,EAAE,CAAC;YACrB,oBAAoB,EAAE,GAAG;SACzB;QACD,iBAAiB,EAAE,GAAG;QACtB,uBAAuB,EAAE;YACxB,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,qBAAqB,EAAE,IAAI;SAC3B;QACD,uEAAuE;QACvE,aAAa;KACb,CACD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,uCAAuC;AACvC,EAAE;AACF,gFAAgF;AAChF,oBAAoB;AACpB,QAAQ,CAAC,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;IAClF,kBAAkB,CACjB;QACC,GAAG,qBAAqB;QACxB,YAAY,EAAE,0CAA0C;KACxD,EACD;QACC,GAAG,kBAAkB;QACrB,oBAAoB,EAAE,GAAG;QACzB,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE;YAClB,kBAAkB,EAAE,CAAC;YACrB,oBAAoB,EAAE,GAAG;SACzB;QACD,iBAAiB,EAAE,GAAG;QACtB,uBAAuB,EAAE;YACxB,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,qBAAqB,EAAE,IAAI;SAC3B;QACD,uEAAuE;QACvE,aAAa;KACb,CACD,CAAC;AACH,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tAsyncGenerator as Generator,\n\tcreateWeightedAsyncGenerator as createWeightedGenerator,\n\ttakeAsync as take,\n} from \"@fluid-private/stochastic-test-utils\";\nimport { createDDSFuzzSuite } from \"@fluid-private/test-dds-utils\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport {\n\tFuzzTestState,\n\tOperation,\n\tSharedStringOperationGenerationConfig,\n\tbaseModel,\n\tcreateSharedStringGeneratorOperations,\n\tdefaultFuzzOptions,\n\tdefaultIntervalOperationGenerationConfig,\n} from \"./fuzzUtils.js\";\n\ntype ClientOpState = FuzzTestState;\nexport function makeSharedStringOperationGenerator(\n\toptionsParam?: SharedStringOperationGenerationConfig,\n\talwaysLeaveChar: boolean = false,\n): Generator<Operation, ClientOpState> {\n\tconst {\n\t\taddText,\n\t\tremoveRange,\n\t\tremoveRangeLeaveChar,\n\t\tlengthSatisfies,\n\t\thasNonzeroLength,\n\t\tisShorterThanMaxLength,\n\t} = createSharedStringGeneratorOperations(optionsParam);\n\n\tconst usableWeights = optionsParam?.weights ?? defaultIntervalOperationGenerationConfig.weights;\n\treturn createWeightedGenerator<Operation, ClientOpState>([\n\t\t[addText, usableWeights.addText, isShorterThanMaxLength],\n\t\t[\n\t\t\talwaysLeaveChar ? removeRangeLeaveChar : removeRange,\n\t\t\tusableWeights.removeRange,\n\t\t\talwaysLeaveChar\n\t\t\t\t? lengthSatisfies((length) => {\n\t\t\t\t\t\treturn length > 1;\n\t\t\t\t })\n\t\t\t\t: hasNonzeroLength,\n\t\t],\n\t]);\n}\n\nconst baseSharedStringModel = {\n\t...baseModel,\n\tgeneratorFactory: () =>\n\t\ttake(100, makeSharedStringOperationGenerator(defaultIntervalOperationGenerationConfig)),\n};\n\ndescribe(\"SharedString fuzz testing\", () => {\n\tcreateDDSFuzzSuite(\n\t\t{ ...baseSharedStringModel, workloadName: \"default\" },\n\t\t{\n\t\t\t...defaultFuzzOptions,\n\t\t\t// Uncomment this line to replay a specific seed from its failure file:\n\t\t\t// replay: 0,\n\t\t},\n\t);\n});\n\ndescribe(\"SharedString fuzz with stashing\", () => {\n\tcreateDDSFuzzSuite(\n\t\t{ ...baseSharedStringModel, workloadName: \"default\" },\n\t\t{\n\t\t\t...defaultFuzzOptions,\n\t\t\tclientJoinOptions: {\n\t\t\t\tclientAddProbability: 0.1,\n\t\t\t\tmaxNumberOfClients: Number.MAX_SAFE_INTEGER,\n\t\t\t\tstashableClientProbability: 0.2,\n\t\t\t},\n\t\t\t// Uncomment this line to replay a specific seed from its failure file:\n\t\t\t// replay: 0,\n\t\t},\n\t);\n});\n\ndescribe(\"SharedString fuzz testing with rebased batches\", () => {\n\tcreateDDSFuzzSuite(\n\t\t{ ...baseSharedStringModel, workloadName: \"SharedString with rebasing\" },\n\t\t{\n\t\t\t...defaultFuzzOptions,\n\t\t\treconnectProbability: 0.0,\n\t\t\tnumberOfClients: 3,\n\t\t\tclientJoinOptions: {\n\t\t\t\tmaxNumberOfClients: 3,\n\t\t\t\tclientAddProbability: 0.0,\n\t\t\t},\n\t\t\trebaseProbability: 0.2,\n\t\t\tcontainerRuntimeOptions: {\n\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\tenableGroupedBatching: true,\n\t\t\t},\n\t\t\t// Uncomment this line to replay a specific seed from its failure file:\n\t\t\t// replay: 0,\n\t\t},\n\t);\n});\n\n// todo: potentially related to AB#7050\n//\n// `intervalRebasing.spec.ts` contains some reduced tests exhibiting the crashes\n// linked to AB#7050\ndescribe.skip(\"SharedString fuzz testing with rebased batches and reconnect\", () => {\n\tcreateDDSFuzzSuite(\n\t\t{\n\t\t\t...baseSharedStringModel,\n\t\t\tworkloadName: \"SharedString with rebasing and reconnect\",\n\t\t},\n\t\t{\n\t\t\t...defaultFuzzOptions,\n\t\t\treconnectProbability: 0.3,\n\t\t\tnumberOfClients: 3,\n\t\t\tclientJoinOptions: {\n\t\t\t\tmaxNumberOfClients: 3,\n\t\t\t\tclientAddProbability: 0.0,\n\t\t\t},\n\t\t\trebaseProbability: 0.2,\n\t\t\tcontainerRuntimeOptions: {\n\t\t\t\tflushMode: FlushMode.TurnBased,\n\t\t\t\tenableGroupedBatching: true,\n\t\t\t},\n\t\t\t// Uncomment this line to replay a specific seed from its failure file:\n\t\t\t// replay: 0,\n\t\t},\n\t);\n});\n"]}
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
// eslint-disable-next-line import/no-internal-modules
|
|
6
6
|
import { SnapshotLegacy as Snapshot } from "@fluidframework/merge-tree/test";
|
|
7
|
-
import { MersenneTwister19937, Random } from "random-js";
|
|
8
7
|
import * as mocks from "@fluidframework/test-runtime-utils";
|
|
9
|
-
import {
|
|
8
|
+
import { MersenneTwister19937, Random } from "random-js";
|
|
10
9
|
import { SharedStringFactory } from "../sequenceFactory.js";
|
|
10
|
+
import { SharedString } from "../sharedString.js";
|
|
11
11
|
import { SharedStringWithV1IntervalCollection, V1IntervalCollectionSharedStringFactory, } from "./v1IntervalCollectionHelpers.js";
|
|
12
12
|
export const LocationBase = "src/test/snapshots/";
|
|
13
13
|
export const supportedVersions = new Map([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateSharedStrings.js","sourceRoot":"","sources":["../../src/test/generateSharedStrings.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\n// eslint-disable-next-line import/no-internal-modules\nimport { SnapshotLegacy as Snapshot } from \"@fluidframework/merge-tree/test\";\nimport { MersenneTwister19937, Random } from \"random-js\";\nimport * as mocks from \"@fluidframework/test-runtime-utils\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport {\n\tSharedStringWithV1IntervalCollection,\n\tV1IntervalCollectionSharedStringFactory,\n} from \"./v1IntervalCollectionHelpers.js\";\n\nexport const LocationBase: string = \"src/test/snapshots/\";\n\nexport const supportedVersions = new Map<string, any>([\n\t// the catchUpBlob had to be renamed.\n\t// We are now support any name for this blob.\n\t// so for legacy set it to another name to ensure\n\t// we keep support\n\t[\"legacy\", { catchUpBlobName: \"randomNameForCatchUpOps\" }],\n\t[\"legacyWithCatchUp\", {}],\n\t[\"v1\", { newMergeTreeSnapshotFormat: true }],\n\t[\"v1Intervals\", {}],\n]);\n\nfunction createIntervals(sharedString) {\n\tconst rand = new Random(MersenneTwister19937.seed(0));\n\tconst collection1 = sharedString.getIntervalCollection(\"collection1\");\n\tcollection1.add({ start: 1, end: 5, props: { intervalId: rand.uuid4() } });\n\n\tconst collection2 = sharedString.getIntervalCollection(\"collection2\");\n\tfor (let i = 0; i < sharedString.getLength() - 5; i += 100) {\n\t\tcollection2.add({ start: i, end: i + 5, props: { intervalId: rand.uuid4() } });\n\t}\n}\n\nexport function* generateStrings(): Generator<{\n\tsnapshotPath: string;\n\texpected: SharedString;\n\tsnapshotIsNormalized: boolean; // false for v1, true for new formats\n}> {\n\tfor (const [version, options] of supportedVersions) {\n\t\tconst documentId = \"fakeId\";\n\t\tconst dataStoreRuntime: mocks.MockFluidDataStoreRuntime =\n\t\t\tnew mocks.MockFluidDataStoreRuntime();\n\t\tconst createNewSharedString = (): SharedString => {\n\t\t\tconst string = new SharedString(\n\t\t\t\tdataStoreRuntime,\n\t\t\t\tdocumentId,\n\t\t\t\tSharedStringFactory.Attributes,\n\t\t\t);\n\t\t\tstring.initializeLocal();\n\t\t\treturn string;\n\t\t};\n\t\tconst createNewV1SharedString = (): SharedStringWithV1IntervalCollection => {\n\t\t\tconst string = new SharedStringWithV1IntervalCollection(\n\t\t\t\tdataStoreRuntime,\n\t\t\t\tdocumentId,\n\t\t\t\tV1IntervalCollectionSharedStringFactory.Attributes,\n\t\t\t);\n\t\t\tstring.initializeLocal();\n\t\t\treturn string;\n\t\t};\n\n\t\tconst normalized = version !== \"v1Intervals\";\n\n\t\tfor (const key of Object.keys(options)) {\n\t\t\tdataStoreRuntime.options[key] = options[key];\n\t\t}\n\t\tconst insertText = \"text\";\n\n\t\tlet sharedString = createNewSharedString();\n\t\t// Small enough so snapshot won't have body\n\t\tfor (let i = 0; i < Snapshot.sizeOfFirstChunk / insertText.length / 2; ++i) {\n\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t}\n\n\t\tyield {\n\t\t\tsnapshotPath: `${version}/headerOnly`,\n\t\t\texpected: sharedString,\n\t\t\tsnapshotIsNormalized: normalized,\n\t\t};\n\n\t\tsharedString = createNewSharedString();\n\t\t// Big enough that snapshot will have body\n\t\tfor (let i = 0; i < (Snapshot.sizeOfFirstChunk / insertText.length) * 2; ++i) {\n\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t}\n\n\t\tyield {\n\t\t\tsnapshotPath: `${version}/headerAndBody`,\n\t\t\texpected: sharedString,\n\t\t\tsnapshotIsNormalized: normalized,\n\t\t};\n\n\t\tsharedString = createNewSharedString();\n\t\t// Very big sharedString\n\t\tfor (let i = 0; i < Snapshot.sizeOfFirstChunk; ++i) {\n\t\t\tsharedString.insertText(0, `${insertText}-${i}`);\n\t\t}\n\n\t\tyield {\n\t\t\tsnapshotPath: `${version}/largeBody`,\n\t\t\texpected: sharedString,\n\t\t\tsnapshotIsNormalized: normalized,\n\t\t};\n\n\t\tsharedString = createNewSharedString();\n\t\t// SharedString with markers\n\t\tfor (let i = 0; i < (Snapshot.sizeOfFirstChunk / insertText.length) * 2; ++i) {\n\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t}\n\t\tfor (let i = 0; i < sharedString.getLength(); i += 70) {\n\t\t\tsharedString.insertMarker(i, 1, {\n\t\t\t\tItemType: \"Paragraph\",\n\t\t\t\tProperties: { Bold: false },\n\t\t\t\tmarkerId: `marker${i}`,\n\t\t\t\treferenceTileLabels: [\"Eop\"],\n\t\t\t});\n\t\t}\n\n\t\tyield {\n\t\t\tsnapshotPath: `${version}/withMarkers`,\n\t\t\texpected: sharedString,\n\t\t\tsnapshotIsNormalized: normalized,\n\t\t};\n\n\t\tsharedString = createNewSharedString();\n\t\t// SharedString with annotations\n\t\tfor (let i = 0; i < (Snapshot.sizeOfFirstChunk / insertText.length) * 2; ++i) {\n\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t}\n\t\tfor (let i = 0; i < sharedString.getLength(); i += 70) {\n\t\t\tsharedString.annotateRange(i, i + 10, { bold: true });\n\t\t}\n\n\t\tyield {\n\t\t\tsnapshotPath: `${version}/withAnnotations`,\n\t\t\texpected: sharedString,\n\t\t\tsnapshotIsNormalized: normalized,\n\t\t};\n\n\t\tsharedString = createNewSharedString();\n\t\t// SharedString with intervals\n\t\tfor (let i = 0; i < Snapshot.sizeOfFirstChunk / insertText.length / 2; i++) {\n\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t}\n\n\t\tcreateIntervals(sharedString);\n\n\t\tyield {\n\t\t\tsnapshotPath: `${version}/withIntervals`,\n\t\t\texpected: sharedString,\n\t\t\tsnapshotIsNormalized: normalized,\n\t\t};\n\n\t\tif (version === \"v1Intervals\") {\n\t\t\tsharedString = createNewV1SharedString();\n\t\t\t// SharedString with V1 intervals\n\t\t\tfor (let i = 0; i < Snapshot.sizeOfFirstChunk / insertText.length / 2; i++) {\n\t\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t\t}\n\t\t\tcreateIntervals(sharedString);\n\n\t\t\tyield {\n\t\t\t\tsnapshotPath: `${version}/withV1Intervals`,\n\t\t\t\texpected: sharedString,\n\t\t\t\tsnapshotIsNormalized: normalized,\n\t\t\t};\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"generateSharedStrings.js","sourceRoot":"","sources":["../../src/test/generateSharedStrings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sDAAsD;AACtD,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,KAAK,KAAK,MAAM,oCAAoC,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACN,oCAAoC,EACpC,uCAAuC,GACvC,MAAM,kCAAkC,CAAC;AAE1C,MAAM,CAAC,MAAM,YAAY,GAAW,qBAAqB,CAAC;AAE1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAc;IACrD,qCAAqC;IACrC,6CAA6C;IAC7C,iDAAiD;IACjD,kBAAkB;IAClB,CAAC,QAAQ,EAAE,EAAE,eAAe,EAAE,yBAAyB,EAAE,CAAC;IAC1D,CAAC,mBAAmB,EAAE,EAAE,CAAC;IACzB,CAAC,IAAI,EAAE,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC,aAAa,EAAE,EAAE,CAAC;CACnB,CAAC,CAAC;AAEH,SAAS,eAAe,CAAC,YAAY;IACpC,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,YAAY,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACtE,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAE3E,MAAM,WAAW,GAAG,YAAY,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE;QAC3D,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;KAC/E;AACF,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,eAAe;IAK/B,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,iBAAiB,EAAE;QACnD,MAAM,UAAU,GAAG,QAAQ,CAAC;QAC5B,MAAM,gBAAgB,GACrB,IAAI,KAAK,CAAC,yBAAyB,EAAE,CAAC;QACvC,MAAM,qBAAqB,GAAG,GAAiB,EAAE;YAChD,MAAM,MAAM,GAAG,IAAI,YAAY,CAC9B,gBAAgB,EAChB,UAAU,EACV,mBAAmB,CAAC,UAAU,CAC9B,CAAC;YACF,MAAM,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QACf,CAAC,CAAC;QACF,MAAM,uBAAuB,GAAG,GAAyC,EAAE;YAC1E,MAAM,MAAM,GAAG,IAAI,oCAAoC,CACtD,gBAAgB,EAChB,UAAU,EACV,uCAAuC,CAAC,UAAU,CAClD,CAAC;YACF,MAAM,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,OAAO,KAAK,aAAa,CAAC;QAE7C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACvC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;SAC7C;QACD,MAAM,UAAU,GAAG,MAAM,CAAC;QAE1B,IAAI,YAAY,GAAG,qBAAqB,EAAE,CAAC;QAC3C,2CAA2C;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;YAC3E,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC;SAChD;QAED,MAAM;YACL,YAAY,EAAE,GAAG,OAAO,aAAa;YACrC,QAAQ,EAAE,YAAY;YACtB,oBAAoB,EAAE,UAAU;SAChC,CAAC;QAEF,YAAY,GAAG,qBAAqB,EAAE,CAAC;QACvC,0CAA0C;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;YAC7E,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC;SAChD;QAED,MAAM;YACL,YAAY,EAAE,GAAG,OAAO,gBAAgB;YACxC,QAAQ,EAAE,YAAY;YACtB,oBAAoB,EAAE,UAAU;SAChC,CAAC;QAEF,YAAY,GAAG,qBAAqB,EAAE,CAAC;QACvC,wBAAwB;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE;YACnD,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,UAAU,IAAI,CAAC,EAAE,CAAC,CAAC;SACjD;QAED,MAAM;YACL,YAAY,EAAE,GAAG,OAAO,YAAY;YACpC,QAAQ,EAAE,YAAY;YACtB,oBAAoB,EAAE,UAAU;SAChC,CAAC;QAEF,YAAY,GAAG,qBAAqB,EAAE,CAAC;QACvC,4BAA4B;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;YAC7E,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC;SAChD;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;YACtD,YAAY,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE;gBAC/B,QAAQ,EAAE,WAAW;gBACrB,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;gBAC3B,QAAQ,EAAE,SAAS,CAAC,EAAE;gBACtB,mBAAmB,EAAE,CAAC,KAAK,CAAC;aAC5B,CAAC,CAAC;SACH;QAED,MAAM;YACL,YAAY,EAAE,GAAG,OAAO,cAAc;YACtC,QAAQ,EAAE,YAAY;YACtB,oBAAoB,EAAE,UAAU;SAChC,CAAC;QAEF,YAAY,GAAG,qBAAqB,EAAE,CAAC;QACvC,gCAAgC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;YAC7E,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC;SAChD;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;YACtD,YAAY,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;SACtD;QAED,MAAM;YACL,YAAY,EAAE,GAAG,OAAO,kBAAkB;YAC1C,QAAQ,EAAE,YAAY;YACtB,oBAAoB,EAAE,UAAU;SAChC,CAAC;QAEF,YAAY,GAAG,qBAAqB,EAAE,CAAC;QACvC,8BAA8B;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3E,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC;SAChD;QAED,eAAe,CAAC,YAAY,CAAC,CAAC;QAE9B,MAAM;YACL,YAAY,EAAE,GAAG,OAAO,gBAAgB;YACxC,QAAQ,EAAE,YAAY;YACtB,oBAAoB,EAAE,UAAU;SAChC,CAAC;QAEF,IAAI,OAAO,KAAK,aAAa,EAAE;YAC9B,YAAY,GAAG,uBAAuB,EAAE,CAAC;YACzC,iCAAiC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC3E,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC;aAChD;YACD,eAAe,CAAC,YAAY,CAAC,CAAC;YAE9B,MAAM;gBACL,YAAY,EAAE,GAAG,OAAO,kBAAkB;gBAC1C,QAAQ,EAAE,YAAY;gBACtB,oBAAoB,EAAE,UAAU;aAChC,CAAC;SACF;KACD;AACF,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// eslint-disable-next-line import/no-internal-modules\nimport { SnapshotLegacy as Snapshot } from \"@fluidframework/merge-tree/test\";\nimport * as mocks from \"@fluidframework/test-runtime-utils\";\nimport { MersenneTwister19937, Random } from \"random-js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { SharedString } from \"../sharedString.js\";\nimport {\n\tSharedStringWithV1IntervalCollection,\n\tV1IntervalCollectionSharedStringFactory,\n} from \"./v1IntervalCollectionHelpers.js\";\n\nexport const LocationBase: string = \"src/test/snapshots/\";\n\nexport const supportedVersions = new Map<string, any>([\n\t// the catchUpBlob had to be renamed.\n\t// We are now support any name for this blob.\n\t// so for legacy set it to another name to ensure\n\t// we keep support\n\t[\"legacy\", { catchUpBlobName: \"randomNameForCatchUpOps\" }],\n\t[\"legacyWithCatchUp\", {}],\n\t[\"v1\", { newMergeTreeSnapshotFormat: true }],\n\t[\"v1Intervals\", {}],\n]);\n\nfunction createIntervals(sharedString) {\n\tconst rand = new Random(MersenneTwister19937.seed(0));\n\tconst collection1 = sharedString.getIntervalCollection(\"collection1\");\n\tcollection1.add({ start: 1, end: 5, props: { intervalId: rand.uuid4() } });\n\n\tconst collection2 = sharedString.getIntervalCollection(\"collection2\");\n\tfor (let i = 0; i < sharedString.getLength() - 5; i += 100) {\n\t\tcollection2.add({ start: i, end: i + 5, props: { intervalId: rand.uuid4() } });\n\t}\n}\n\nexport function* generateStrings(): Generator<{\n\tsnapshotPath: string;\n\texpected: SharedString;\n\tsnapshotIsNormalized: boolean; // false for v1, true for new formats\n}> {\n\tfor (const [version, options] of supportedVersions) {\n\t\tconst documentId = \"fakeId\";\n\t\tconst dataStoreRuntime: mocks.MockFluidDataStoreRuntime =\n\t\t\tnew mocks.MockFluidDataStoreRuntime();\n\t\tconst createNewSharedString = (): SharedString => {\n\t\t\tconst string = new SharedString(\n\t\t\t\tdataStoreRuntime,\n\t\t\t\tdocumentId,\n\t\t\t\tSharedStringFactory.Attributes,\n\t\t\t);\n\t\t\tstring.initializeLocal();\n\t\t\treturn string;\n\t\t};\n\t\tconst createNewV1SharedString = (): SharedStringWithV1IntervalCollection => {\n\t\t\tconst string = new SharedStringWithV1IntervalCollection(\n\t\t\t\tdataStoreRuntime,\n\t\t\t\tdocumentId,\n\t\t\t\tV1IntervalCollectionSharedStringFactory.Attributes,\n\t\t\t);\n\t\t\tstring.initializeLocal();\n\t\t\treturn string;\n\t\t};\n\n\t\tconst normalized = version !== \"v1Intervals\";\n\n\t\tfor (const key of Object.keys(options)) {\n\t\t\tdataStoreRuntime.options[key] = options[key];\n\t\t}\n\t\tconst insertText = \"text\";\n\n\t\tlet sharedString = createNewSharedString();\n\t\t// Small enough so snapshot won't have body\n\t\tfor (let i = 0; i < Snapshot.sizeOfFirstChunk / insertText.length / 2; ++i) {\n\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t}\n\n\t\tyield {\n\t\t\tsnapshotPath: `${version}/headerOnly`,\n\t\t\texpected: sharedString,\n\t\t\tsnapshotIsNormalized: normalized,\n\t\t};\n\n\t\tsharedString = createNewSharedString();\n\t\t// Big enough that snapshot will have body\n\t\tfor (let i = 0; i < (Snapshot.sizeOfFirstChunk / insertText.length) * 2; ++i) {\n\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t}\n\n\t\tyield {\n\t\t\tsnapshotPath: `${version}/headerAndBody`,\n\t\t\texpected: sharedString,\n\t\t\tsnapshotIsNormalized: normalized,\n\t\t};\n\n\t\tsharedString = createNewSharedString();\n\t\t// Very big sharedString\n\t\tfor (let i = 0; i < Snapshot.sizeOfFirstChunk; ++i) {\n\t\t\tsharedString.insertText(0, `${insertText}-${i}`);\n\t\t}\n\n\t\tyield {\n\t\t\tsnapshotPath: `${version}/largeBody`,\n\t\t\texpected: sharedString,\n\t\t\tsnapshotIsNormalized: normalized,\n\t\t};\n\n\t\tsharedString = createNewSharedString();\n\t\t// SharedString with markers\n\t\tfor (let i = 0; i < (Snapshot.sizeOfFirstChunk / insertText.length) * 2; ++i) {\n\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t}\n\t\tfor (let i = 0; i < sharedString.getLength(); i += 70) {\n\t\t\tsharedString.insertMarker(i, 1, {\n\t\t\t\tItemType: \"Paragraph\",\n\t\t\t\tProperties: { Bold: false },\n\t\t\t\tmarkerId: `marker${i}`,\n\t\t\t\treferenceTileLabels: [\"Eop\"],\n\t\t\t});\n\t\t}\n\n\t\tyield {\n\t\t\tsnapshotPath: `${version}/withMarkers`,\n\t\t\texpected: sharedString,\n\t\t\tsnapshotIsNormalized: normalized,\n\t\t};\n\n\t\tsharedString = createNewSharedString();\n\t\t// SharedString with annotations\n\t\tfor (let i = 0; i < (Snapshot.sizeOfFirstChunk / insertText.length) * 2; ++i) {\n\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t}\n\t\tfor (let i = 0; i < sharedString.getLength(); i += 70) {\n\t\t\tsharedString.annotateRange(i, i + 10, { bold: true });\n\t\t}\n\n\t\tyield {\n\t\t\tsnapshotPath: `${version}/withAnnotations`,\n\t\t\texpected: sharedString,\n\t\t\tsnapshotIsNormalized: normalized,\n\t\t};\n\n\t\tsharedString = createNewSharedString();\n\t\t// SharedString with intervals\n\t\tfor (let i = 0; i < Snapshot.sizeOfFirstChunk / insertText.length / 2; i++) {\n\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t}\n\n\t\tcreateIntervals(sharedString);\n\n\t\tyield {\n\t\t\tsnapshotPath: `${version}/withIntervals`,\n\t\t\texpected: sharedString,\n\t\t\tsnapshotIsNormalized: normalized,\n\t\t};\n\n\t\tif (version === \"v1Intervals\") {\n\t\t\tsharedString = createNewV1SharedString();\n\t\t\t// SharedString with V1 intervals\n\t\t\tfor (let i = 0; i < Snapshot.sizeOfFirstChunk / insertText.length / 2; i++) {\n\t\t\t\tsharedString.insertText(0, `${insertText}${i}`);\n\t\t\t}\n\t\t\tcreateIntervals(sharedString);\n\n\t\t\tyield {\n\t\t\t\tsnapshotPath: `${version}/withV1Intervals`,\n\t\t\t\texpected: sharedString,\n\t\t\t\tsnapshotIsNormalized: normalized,\n\t\t\t};\n\t\t}\n\t}\n}\n"]}
|
|
@@ -61,9 +61,11 @@ describe("IntervalCollection detached", () => {
|
|
|
61
61
|
describe("interval changed while detached", () => {
|
|
62
62
|
it("slides immediately on segment removal", () => {
|
|
63
63
|
sharedString.insertText(0, "0123");
|
|
64
|
-
const
|
|
65
|
-
collection.change(
|
|
64
|
+
const id = collection.add({ start: 0, end: 2 }).getIntervalId();
|
|
65
|
+
collection.change(id, { start: 0, end: 0 });
|
|
66
66
|
sharedString.removeText(0, 1);
|
|
67
|
+
const interval = collection.getIntervalById(id);
|
|
68
|
+
assert(interval !== undefined, "interval should be defined");
|
|
67
69
|
assert.equal(interval.start.getSegment()?.text, "123");
|
|
68
70
|
assert.equal(interval.end.getSegment()?.text, "123");
|
|
69
71
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intervalCollection.detached.spec.js","sourceRoot":"","sources":["../../src/test/intervalCollection.detached.spec.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 { strict as assert } from \"assert\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { TextSegment } from \"@fluidframework/merge-tree\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SequenceInterval } from \"../intervals/index.js\";\nimport { IIntervalCollection } from \"../intervalCollection.js\";\nimport { assertEquivalentSharedStrings } from \"./intervalTestUtils.js\";\n\ndescribe(\"IntervalCollection detached\", () => {\n\tconst factory = SharedString.getFactory();\n\tlet dataStoreRuntime: MockFluidDataStoreRuntime;\n\tlet sharedString: SharedString;\n\tlet collection: IIntervalCollection<SequenceInterval>;\n\tbeforeEach(() => {\n\t\tdataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tsharedString = factory.create(dataStoreRuntime, \"A\");\n\t\tcollection = sharedString.getIntervalCollection(\"intervals\");\n\t});\n\n\tconst attachAndLoadSecondSharedString = async (): Promise<{\n\t\tcontainerRuntimeFactory: MockContainerRuntimeFactory;\n\t\tsharedString2: SharedString;\n\t}> => {\n\t\tassert.equal(sharedString.isAttached(), false);\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\t\tconst attachSummary = sharedString.getAttachSummary().summary;\n\t\tsharedString.connect({\n\t\t\tdeltaConnection: containerRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: new MockStorage(),\n\t\t});\n\n\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\tconst containerRuntime2 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\tconst sharedString2 = await factory.load(\n\t\t\tdataStoreRuntime2,\n\t\t\t\"B\",\n\t\t\t{\n\t\t\t\tdeltaConnection: containerRuntime2.createDeltaConnection(),\n\t\t\t\tobjectStorage: MockStorage.createFromSummary(attachSummary),\n\t\t\t},\n\t\t\tfactory.attributes,\n\t\t);\n\t\treturn { sharedString2, containerRuntimeFactory };\n\t};\n\n\tdescribe(\"interval created while detached\", () => {\n\t\tit(\"slides immediately on segment removal\", () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tsharedString.removeText(2, 3);\n\t\t\tassert.equal((interval.end.getSegment() as TextSegment)?.text, \"3\");\n\t\t});\n\n\t\tit(\"synchronizes correctly on another client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tcollection.add({ start: 0, end: 2 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tsharedString2.removeText(2, 3);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\n\t\tit(\"can be changed by another client after attaching\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tcollection2.change(interval.getIntervalId(), { start: 1, end: 1 });\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\t});\n\n\tdescribe(\"interval changed while detached\", () => {\n\t\tit(\"slides immediately on segment removal\", () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tcollection.change(interval.getIntervalId(), { start: 0, end: 0 });\n\t\t\tsharedString.removeText(0, 1);\n\t\t\tassert.equal((interval.start.getSegment() as TextSegment)?.text, \"123\");\n\t\t\tassert.equal((interval.end.getSegment() as TextSegment)?.text, \"123\");\n\t\t});\n\n\t\tit(\"synchronizes correctly on another client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tcollection.change(interval.getIntervalId(), { start: 0, end: 0 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tsharedString2.removeText(0, 1);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\n\t\tit(\"can be changed by another client after attaching\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tcollection.change(interval.getIntervalId(), { start: 0, end: 0 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tcollection2.change(interval.getIntervalId(), { start: 1, end: 1 });\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\t});\n\n\tdescribe(\"interval with properties changed while detached\", () => {\n\t\tit(\"synchronizes correctly on another client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2, props: { foo: \"a1\" } });\n\t\t\tcollection.change(interval.getIntervalId(), { props: { foo: \"a2\" } });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t\tassert.equal(\n\t\t\t\tcollection.getIntervalById(interval.getIntervalId())?.properties.foo,\n\t\t\t\t\"a2\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can be changed by another client after attaching\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2, props: { foo: \"a1\" } });\n\t\t\tcollection.change(interval.getIntervalId(), { props: { foo: \"a2\" } });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tcollection2.change(interval.getIntervalId(), { props: { foo: \"b1\" } });\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t\tassert.equal(\n\t\t\t\tcollection.getIntervalById(interval.getIntervalId())?.properties.foo,\n\t\t\t\t\"b1\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"intervals deleted while detached\", () => {\n\t\tit(\"aren't added to the remote client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tconst id = interval.getIntervalId();\n\t\t\tcollection.removeIntervalById(id);\n\t\t\tconst { sharedString2 } = await attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tassert.equal(Array.from(collection2).length, 0);\n\t\t\tassert.equal(collection2.getIntervalById(id), undefined);\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"intervalCollection.detached.spec.js","sourceRoot":"","sources":["../../src/test/intervalCollection.detached.spec.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 { strict as assert } from \"assert\";\nimport { TextSegment } from \"@fluidframework/merge-tree\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { IIntervalCollection } from \"../intervalCollection.js\";\nimport { SequenceInterval } from \"../intervals/index.js\";\nimport { SharedString } from \"../sharedString.js\";\nimport { assertEquivalentSharedStrings } from \"./intervalTestUtils.js\";\n\ndescribe(\"IntervalCollection detached\", () => {\n\tconst factory = SharedString.getFactory();\n\tlet dataStoreRuntime: MockFluidDataStoreRuntime;\n\tlet sharedString: SharedString;\n\tlet collection: IIntervalCollection<SequenceInterval>;\n\tbeforeEach(() => {\n\t\tdataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tsharedString = factory.create(dataStoreRuntime, \"A\");\n\t\tcollection = sharedString.getIntervalCollection(\"intervals\");\n\t});\n\n\tconst attachAndLoadSecondSharedString = async (): Promise<{\n\t\tcontainerRuntimeFactory: MockContainerRuntimeFactory;\n\t\tsharedString2: SharedString;\n\t}> => {\n\t\tassert.equal(sharedString.isAttached(), false);\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\t\tconst attachSummary = sharedString.getAttachSummary().summary;\n\t\tsharedString.connect({\n\t\t\tdeltaConnection: containerRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: new MockStorage(),\n\t\t});\n\n\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\tconst containerRuntime2 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\tconst sharedString2 = await factory.load(\n\t\t\tdataStoreRuntime2,\n\t\t\t\"B\",\n\t\t\t{\n\t\t\t\tdeltaConnection: containerRuntime2.createDeltaConnection(),\n\t\t\t\tobjectStorage: MockStorage.createFromSummary(attachSummary),\n\t\t\t},\n\t\t\tfactory.attributes,\n\t\t);\n\t\treturn { sharedString2, containerRuntimeFactory };\n\t};\n\n\tdescribe(\"interval created while detached\", () => {\n\t\tit(\"slides immediately on segment removal\", () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tsharedString.removeText(2, 3);\n\t\t\tassert.equal((interval.end.getSegment() as TextSegment)?.text, \"3\");\n\t\t});\n\n\t\tit(\"synchronizes correctly on another client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tcollection.add({ start: 0, end: 2 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tsharedString2.removeText(2, 3);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\n\t\tit(\"can be changed by another client after attaching\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tcollection2.change(interval.getIntervalId(), { start: 1, end: 1 });\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\t});\n\n\tdescribe(\"interval changed while detached\", () => {\n\t\tit(\"slides immediately on segment removal\", () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst id = collection.add({ start: 0, end: 2 }).getIntervalId();\n\t\t\tcollection.change(id, { start: 0, end: 0 });\n\t\t\tsharedString.removeText(0, 1);\n\t\t\tconst interval = collection.getIntervalById(id);\n\t\t\tassert(interval !== undefined, \"interval should be defined\");\n\t\t\tassert.equal((interval.start.getSegment() as TextSegment)?.text, \"123\");\n\t\t\tassert.equal((interval.end.getSegment() as TextSegment)?.text, \"123\");\n\t\t});\n\n\t\tit(\"synchronizes correctly on another client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tcollection.change(interval.getIntervalId(), { start: 0, end: 0 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tsharedString2.removeText(0, 1);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\n\t\tit(\"can be changed by another client after attaching\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tcollection.change(interval.getIntervalId(), { start: 0, end: 0 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tcollection2.change(interval.getIntervalId(), { start: 1, end: 1 });\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\t});\n\n\tdescribe(\"interval with properties changed while detached\", () => {\n\t\tit(\"synchronizes correctly on another client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2, props: { foo: \"a1\" } });\n\t\t\tcollection.change(interval.getIntervalId(), { props: { foo: \"a2\" } });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t\tassert.equal(\n\t\t\t\tcollection.getIntervalById(interval.getIntervalId())?.properties.foo,\n\t\t\t\t\"a2\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can be changed by another client after attaching\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2, props: { foo: \"a1\" } });\n\t\t\tcollection.change(interval.getIntervalId(), { props: { foo: \"a2\" } });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tcollection2.change(interval.getIntervalId(), { props: { foo: \"b1\" } });\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t\tassert.equal(\n\t\t\t\tcollection.getIntervalById(interval.getIntervalId())?.properties.foo,\n\t\t\t\t\"b1\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"intervals deleted while detached\", () => {\n\t\tit(\"aren't added to the remote client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tconst id = interval.getIntervalId();\n\t\t\tcollection.removeIntervalById(id);\n\t\t\tconst { sharedString2 } = await attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tassert.equal(Array.from(collection2).length, 0);\n\t\t\tassert.equal(collection2.getIntervalById(id), undefined);\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
6
|
-
import { toRemovalInfo } from "@fluidframework/merge-tree";
|
|
7
|
-
import { MockFluidDataStoreRuntime, MockContainerRuntimeFactory, MockStorage, } from "@fluidframework/test-runtime-utils";
|
|
5
|
+
import { strict as assert, fail } from "assert";
|
|
8
6
|
import { AttachState } from "@fluidframework/container-definitions";
|
|
9
|
-
import {
|
|
7
|
+
import { toRemovalInfo } from "@fluidframework/merge-tree";
|
|
8
|
+
import { MockContainerRuntimeFactory, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
|
|
10
9
|
import { SharedStringFactory } from "../sequenceFactory.js";
|
|
10
|
+
import { SharedString } from "../sharedString.js";
|
|
11
11
|
describe("SharedString interval collection event spec", () => {
|
|
12
12
|
let sharedString;
|
|
13
13
|
let dataStoreRuntime1;
|