@fluid-experimental/sequence-deprecated 2.0.0-rc.1.0.6 → 2.0.0-rc.2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{.eslintrc.js → .eslintrc.cjs} +4 -1
- package/{.mocharc.js → .mocharc.cjs} +1 -1
- package/CHANGELOG.md +4 -0
- package/api-extractor-cjs.json +8 -0
- package/api-extractor.json +1 -1
- package/api-report/sequence-deprecated.api.md +2 -3
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -22
- package/dist/index.js.map +1 -1
- package/dist/package.json +3 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/sequenceFactory.js +9 -9
- package/dist/sequenceFactory.js.map +1 -1
- package/dist/sharedNumberSequence.d.ts +2 -2
- package/dist/sharedNumberSequence.d.ts.map +1 -1
- package/dist/sharedNumberSequence.js +6 -6
- package/dist/sharedNumberSequence.js.map +1 -1
- package/dist/sharedObjectSequence.d.ts +2 -2
- package/dist/sharedObjectSequence.d.ts.map +1 -1
- package/dist/sharedObjectSequence.js +6 -6
- package/dist/sharedObjectSequence.js.map +1 -1
- package/dist/sparsematrix.d.ts +1 -1
- package/dist/sparsematrix.d.ts.map +1 -1
- package/dist/sparsematrix.js +4 -4
- package/dist/sparsematrix.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/index.d.ts +5 -5
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -5
- package/lib/index.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/sequence-deprecated-alpha.d.ts +58 -0
- package/lib/sequence-deprecated-beta.d.ts +72 -0
- package/lib/sequence-deprecated-public.d.ts +72 -0
- package/lib/sequence-deprecated-untrimmed.d.ts +371 -0
- package/lib/sequenceFactory.js +3 -3
- package/lib/sequenceFactory.js.map +1 -1
- package/lib/sharedNumberSequence.d.ts +2 -2
- package/lib/sharedNumberSequence.d.ts.map +1 -1
- package/lib/sharedNumberSequence.js +2 -2
- package/lib/sharedNumberSequence.js.map +1 -1
- package/lib/sharedObjectSequence.d.ts +2 -2
- package/lib/sharedObjectSequence.d.ts.map +1 -1
- package/lib/sharedObjectSequence.js +2 -2
- package/lib/sharedObjectSequence.js.map +1 -1
- package/lib/sparsematrix.d.ts +1 -1
- package/lib/sparsematrix.d.ts.map +1 -1
- package/lib/sparsematrix.js +2 -2
- package/lib/sparsematrix.js.map +1 -1
- package/lib/test/sharedNumberSequence.spec.js +48 -0
- package/lib/test/sharedNumberSequence.spec.js.map +1 -0
- package/lib/test/sharedObjectSequence.spec.js +87 -0
- package/lib/test/sharedObjectSequence.spec.js.map +1 -0
- package/lib/test/sparseMatrix.spec.js +293 -0
- package/lib/test/sparseMatrix.spec.js.map +1 -0
- package/package.json +75 -21
- package/src/index.ts +5 -5
- package/src/packageVersion.ts +1 -1
- package/src/sequenceFactory.ts +3 -3
- package/src/sharedNumberSequence.ts +2 -2
- package/src/sharedObjectSequence.ts +2 -2
- package/src/sparsematrix.ts +2 -2
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +3 -4
- package/tsconfig.esnext.json +0 -7
package/lib/sparsematrix.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sparsematrix.js","sourceRoot":"","sources":["../src/sparsematrix.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { BaseSegment, IJSONSegment, ISegment, PropertySet } from \"@fluidframework/merge-tree\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelServices,\n\tIChannelFactory,\n\tJsonable,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISharedObject } from \"@fluidframework/shared-object-base\";\nimport { SharedSegmentSequence } from \"@fluidframework/sequence\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { SubSequence } from \"./sharedSequence\";\n\n/**\n * An empty segment that occupies 'cachedLength' positions.\n * {@link SparseMatrix} uses `PaddingSegment` to \"pad\" a run of unoccupied cells.\n *\n * @deprecated `PaddingSegment` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport class PaddingSegment extends BaseSegment {\n\tpublic static readonly typeString = \"PaddingSegment\";\n\tpublic static is(segment: ISegment): segment is PaddingSegment {\n\t\treturn segment.type === PaddingSegment.typeString;\n\t}\n\tpublic static fromJSONObject(spec: any) {\n\t\tif (spec && typeof spec === \"object\" && \"pad\" in spec) {\n\t\t\tconst segment = new PaddingSegment(spec.pad);\n\t\t\tif (spec.props) {\n\t\t\t\tsegment.addProperties(spec.props);\n\t\t\t}\n\t\t\treturn segment;\n\t\t}\n\t\treturn undefined;\n\t}\n\tpublic readonly type = PaddingSegment.typeString;\n\n\tconstructor(size: number) {\n\t\tsuper();\n\t\tthis.cachedLength = size;\n\t}\n\n\tpublic toJSONObject() {\n\t\treturn { pad: this.cachedLength, props: this.properties };\n\t}\n\n\tpublic clone(start = 0, end?: number) {\n\t\tconst b = new PaddingSegment(this.cachedLength);\n\t\tthis.cloneInto(b);\n\t\treturn b;\n\t}\n\n\tpublic canAppend(segment: ISegment) {\n\t\treturn PaddingSegment.is(segment);\n\t}\n\n\tpublic toString() {\n\t\treturn `[padding: ${this.cachedLength}]`;\n\t}\n\n\tpublic append(segment: ISegment) {\n\t\tassert(PaddingSegment.is(segment), 0x5f7 /* can only append padding segment */);\n\t\tsuper.append(segment);\n\t}\n\n\t// Returns true if entire run removed\n\tpublic removeRange(start: number, end: number) {\n\t\tthis.cachedLength -= end - start;\n\t\treturn this.cachedLength === 0;\n\t}\n\n\tprotected createSplitSegmentAt(pos: number) {\n\t\tconst leftLength = pos;\n\t\tconst rightLength = this.cachedLength - pos;\n\n\t\tthis.cachedLength = leftLength;\n\t\treturn new PaddingSegment(rightLength);\n\t}\n}\n\n/**\n * @deprecated `SparseMatrixItem` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport type SparseMatrixItem = any;\n\n/**\n * @deprecated `RunSegment` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport class RunSegment extends SubSequence<SparseMatrixItem> {\n\tpublic static readonly typeString = \"RunSegment\";\n\tpublic static is(segment: ISegment): segment is RunSegment {\n\t\treturn segment.type === RunSegment.typeString;\n\t}\n\tpublic static fromJSONObject(spec: any) {\n\t\tif (spec && typeof spec === \"object\" && \"items\" in spec) {\n\t\t\tconst segment = new RunSegment(spec.items);\n\t\t\tif (spec.props) {\n\t\t\t\tsegment.addProperties(spec.props);\n\t\t\t}\n\t\t\treturn segment;\n\t\t}\n\t\treturn undefined;\n\t}\n\tpublic readonly type = RunSegment.typeString;\n\n\tprivate tags: any[];\n\n\tconstructor(public items: SparseMatrixItem[]) {\n\t\tsuper(items);\n\t\tthis.tags = new Array(items.length).fill(undefined);\n\t}\n\n\tpublic clone(start = 0, end?: number) {\n\t\tconst b = new RunSegment(this.items.slice(start, end));\n\t\tif (this.tags) {\n\t\t\tb.tags = this.tags.slice(start, end);\n\t\t}\n\t\tthis.cloneInto(b);\n\t\treturn b;\n\t}\n\n\tpublic append(segment: ISegment) {\n\t\tsuper.append(segment);\n\n\t\tconst asRun = segment as RunSegment;\n\t\tif (asRun.tags) {\n\t\t\tif (this.tags) {\n\t\t\t\tthis.tags.splice(this.items.length, 0, ...asRun.tags);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// TODO: retain removed items for undo\n\t// returns true if entire run removed\n\tpublic removeRange(start: number, end: number) {\n\t\tthis.tags.splice(start, end - start);\n\t\treturn super.removeRange(start, end);\n\t}\n\n\tpublic getTag(pos: number) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn this.tags[pos];\n\t}\n\n\tpublic setTag(pos: number, tag: any) {\n\t\tthis.tags[pos] = tag;\n\t}\n\n\tprotected createSplitSegmentAt(pos: number) {\n\t\tif (pos > 0) {\n\t\t\tconst remainingItems = this.items.slice(pos);\n\t\t\tthis.items = this.items.slice(0, pos);\n\t\t\tthis.cachedLength = this.items.length;\n\n\t\t\tconst leafSegment = new RunSegment(remainingItems);\n\t\t\tleafSegment.tags = this.tags.slice(pos);\n\t\t\tthis.tags.length = pos;\n\n\t\t\treturn leafSegment;\n\t\t}\n\t}\n}\n\n/**\n * @deprecated `MatrixSegment` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport type MatrixSegment = RunSegment | PaddingSegment;\n\n/**\n * @deprecated `maxCol` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport const maxCol = 0x200000; // X128 Excel maximum of 16,384 columns\n\n/**\n * @deprecated `maxCols` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport const maxCols = maxCol + 1;\n\n/**\n * @deprecated `maxRow` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport const maxRow = 0xffffffff; // X4096 Excel maximum of 1,048,576 rows\n\n/**\n * @deprecated `maxRows` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport const maxRows = maxRow + 1;\n\n/**\n * @deprecated `maxCellPosition` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport const maxCellPosition = maxCol * maxRow;\n\n/**\n * @deprecated `positionToRowCol` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport const rowColToPosition = (row: number, col: number) => row * maxCols + col;\n\n/**\n * @deprecated `positionToRowCol` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport function positionToRowCol(position: number) {\n\tconst row = Math.floor(position / maxCols);\n\tconst col = position - row * maxCols;\n\treturn { row, col };\n}\n\n/**\n * @deprecated `SparseMatrix` is an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport class SparseMatrix extends SharedSegmentSequence<MatrixSegment> {\n\t/**\n\t * Create a new sparse matrix\n\t *\n\t * @param runtime - data store runtime the new sparse matrix belongs to\n\t * @param id - optional name of the sparse matrix\n\t * @returns newly create sparse matrix (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(id, SparseMatrixFactory.Type) as SparseMatrix;\n\t}\n\n\t/**\n\t * Get a factory for SharedMap to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedMap\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new SparseMatrixFactory();\n\t}\n\n\tconstructor(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tpublic id: string,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(document, id, attributes, SparseMatrixFactory.segmentFromSpec);\n\t}\n\n\tpublic get numRows() {\n\t\treturn positionToRowCol(this.getLength()).row;\n\t}\n\n\tpublic setItems(row: number, col: number, values: SparseMatrixItem[], props?: PropertySet) {\n\t\tconst start = rowColToPosition(row, col);\n\t\tconst end = start + values.length;\n\t\tconst segment = new RunSegment(values);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tthis.replaceRange(start, end, segment);\n\t}\n\n\tpublic getItem(\n\t\trow: number,\n\t\tcol: number,\n\t): // The return type is defined explicitly here to prevent TypeScript from generating dynamic imports\n\tJsonable<string | number | boolean | IFluidHandle> | undefined {\n\t\tconst pos = rowColToPosition(row, col);\n\t\tconst { segment, offset } = this.getContainingSegment(pos);\n\t\tif (segment && RunSegment.is(segment)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\t\treturn segment.items[offset ?? 0];\n\t\t} else if (segment && PaddingSegment.is(segment)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tthrow new Error(`Unrecognized Segment type`);\n\t}\n\n\tpublic getTag(row: number, col: number) {\n\t\tconst { segment, offset } = this.getSegment(row, col);\n\t\tif (segment && RunSegment.is(segment)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\t\treturn segment.getTag(offset ?? 0);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic setTag(row: number, col: number, tag: any) {\n\t\tconst { segment, offset } = this.getSegment(row, col);\n\t\tif (segment && RunSegment.is(segment)) {\n\t\t\tsegment.setTag(offset ?? 0, tag);\n\t\t} else if (tag !== undefined) {\n\t\t\tthrow new Error(`Must not attempt to set tags on '${segment?.constructor.name}'.`);\n\t\t}\n\t}\n\n\tpublic insertRows(row: number, numRows: number) {\n\t\tconst pos = rowColToPosition(row, 0);\n\t\tconst size = maxCols * numRows;\n\t\tconst segment = new PaddingSegment(size);\n\n\t\tthis.client.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic removeRows(row: number, numRows: number) {\n\t\tconst pos = rowColToPosition(row, 0);\n\t\tconst size = maxCols * numRows;\n\t\tthis.removeRange(pos, pos + size);\n\t}\n\n\tpublic insertCols(col: number, numCols: number) {\n\t\tthis.moveAsPadding(maxCol - numCols, col, numCols);\n\t}\n\n\tpublic removeCols(col: number, numCols: number) {\n\t\tthis.moveAsPadding(col, maxCol - numCols, numCols);\n\t}\n\n\tpublic annotatePosition(row: number, col: number, props: PropertySet) {\n\t\tconst pos = rowColToPosition(row, col);\n\t\tthis.annotateRange(pos, pos + 1, props);\n\t}\n\n\tpublic getPositionProperties(row: number, col: number) {\n\t\tconst pos = rowColToPosition(row, col);\n\t\treturn this.getPropertiesAtPosition(pos);\n\t}\n\n\t// For each row, moves 'numCols' items starting from 'srcCol' and inserts 'numCols' padding\n\t// at 'destCol'. Used by insertCols and removeCols.\n\tprivate moveAsPadding(srcCol: number, destCol: number, numCols: number) {\n\t\tconst removeColStart = srcCol;\n\t\tconst removeColEnd = srcCol + numCols;\n\n\t\tfor (let r = 0, rowStart = 0; r < this.numRows; r++, rowStart += maxCols) {\n\t\t\tthis.client.removeRangeLocal(rowStart + removeColStart, rowStart + removeColEnd);\n\t\t\tconst insertPos = rowStart + destCol;\n\t\t\tconst segment = new PaddingSegment(numCols);\n\t\t\tthis.client.insertSegmentLocal(insertPos, segment);\n\t\t}\n\t}\n\n\tprivate getSegment(row: number, col: number) {\n\t\tconst pos = rowColToPosition(row, col);\n\t\treturn this.getContainingSegment(pos);\n\t}\n}\n\n/**\n * @deprecated `SparseMatrixFactory` is an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrixFactory} instead.\n * @internal\n */\nexport class SparseMatrixFactory implements IChannelFactory {\n\tpublic static Type = \"https://graph.microsoft.com/types/mergeTree/sparse-matrix\";\n\n\tpublic static Attributes: IChannelAttributes = {\n\t\ttype: SparseMatrixFactory.Type,\n\t\tsnapshotFormatVersion: \"0.1\",\n\t\tpackageVersion: pkgVersion,\n\t};\n\n\tpublic static segmentFromSpec(spec: IJSONSegment): ISegment {\n\t\tconst maybePadding = PaddingSegment.fromJSONObject(spec);\n\t\tif (maybePadding) {\n\t\t\treturn maybePadding;\n\t\t}\n\n\t\tconst maybeRun = RunSegment.fromJSONObject(spec);\n\t\tif (maybeRun) {\n\t\t\treturn maybeRun;\n\t\t}\n\n\t\tthrow new Error(`Unrecognized IJSONObject: '${JSON.stringify(spec)}'`);\n\t}\n\n\tpublic get type() {\n\t\treturn SparseMatrixFactory.Type;\n\t}\n\n\tpublic get attributes() {\n\t\treturn SparseMatrixFactory.Attributes;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<ISharedObject> {\n\t\tconst sharedObject = new SparseMatrix(runtime, id, attributes);\n\t\tawait sharedObject.load(services);\n\t\treturn sharedObject;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): ISharedObject {\n\t\tconst sharedObject = new SparseMatrix(document, id, this.attributes);\n\t\tsharedObject.initializeLocal();\n\t\treturn sharedObject;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sparsematrix.js","sourceRoot":"","sources":["../src/sparsematrix.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { BaseSegment, IJSONSegment, ISegment, PropertySet } from \"@fluidframework/merge-tree\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelServices,\n\tIChannelFactory,\n\tJsonable,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISharedObject } from \"@fluidframework/shared-object-base\";\nimport { SharedSegmentSequence } from \"@fluidframework/sequence\";\nimport { pkgVersion } from \"./packageVersion.js\";\nimport { SubSequence } from \"./sharedSequence.js\";\n\n/**\n * An empty segment that occupies 'cachedLength' positions.\n * {@link SparseMatrix} uses `PaddingSegment` to \"pad\" a run of unoccupied cells.\n *\n * @deprecated `PaddingSegment` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport class PaddingSegment extends BaseSegment {\n\tpublic static readonly typeString = \"PaddingSegment\";\n\tpublic static is(segment: ISegment): segment is PaddingSegment {\n\t\treturn segment.type === PaddingSegment.typeString;\n\t}\n\tpublic static fromJSONObject(spec: any) {\n\t\tif (spec && typeof spec === \"object\" && \"pad\" in spec) {\n\t\t\tconst segment = new PaddingSegment(spec.pad);\n\t\t\tif (spec.props) {\n\t\t\t\tsegment.addProperties(spec.props);\n\t\t\t}\n\t\t\treturn segment;\n\t\t}\n\t\treturn undefined;\n\t}\n\tpublic readonly type = PaddingSegment.typeString;\n\n\tconstructor(size: number) {\n\t\tsuper();\n\t\tthis.cachedLength = size;\n\t}\n\n\tpublic toJSONObject() {\n\t\treturn { pad: this.cachedLength, props: this.properties };\n\t}\n\n\tpublic clone(start = 0, end?: number) {\n\t\tconst b = new PaddingSegment(this.cachedLength);\n\t\tthis.cloneInto(b);\n\t\treturn b;\n\t}\n\n\tpublic canAppend(segment: ISegment) {\n\t\treturn PaddingSegment.is(segment);\n\t}\n\n\tpublic toString() {\n\t\treturn `[padding: ${this.cachedLength}]`;\n\t}\n\n\tpublic append(segment: ISegment) {\n\t\tassert(PaddingSegment.is(segment), 0x5f7 /* can only append padding segment */);\n\t\tsuper.append(segment);\n\t}\n\n\t// Returns true if entire run removed\n\tpublic removeRange(start: number, end: number) {\n\t\tthis.cachedLength -= end - start;\n\t\treturn this.cachedLength === 0;\n\t}\n\n\tprotected createSplitSegmentAt(pos: number) {\n\t\tconst leftLength = pos;\n\t\tconst rightLength = this.cachedLength - pos;\n\n\t\tthis.cachedLength = leftLength;\n\t\treturn new PaddingSegment(rightLength);\n\t}\n}\n\n/**\n * @deprecated `SparseMatrixItem` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport type SparseMatrixItem = any;\n\n/**\n * @deprecated `RunSegment` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport class RunSegment extends SubSequence<SparseMatrixItem> {\n\tpublic static readonly typeString = \"RunSegment\";\n\tpublic static is(segment: ISegment): segment is RunSegment {\n\t\treturn segment.type === RunSegment.typeString;\n\t}\n\tpublic static fromJSONObject(spec: any) {\n\t\tif (spec && typeof spec === \"object\" && \"items\" in spec) {\n\t\t\tconst segment = new RunSegment(spec.items);\n\t\t\tif (spec.props) {\n\t\t\t\tsegment.addProperties(spec.props);\n\t\t\t}\n\t\t\treturn segment;\n\t\t}\n\t\treturn undefined;\n\t}\n\tpublic readonly type = RunSegment.typeString;\n\n\tprivate tags: any[];\n\n\tconstructor(public items: SparseMatrixItem[]) {\n\t\tsuper(items);\n\t\tthis.tags = new Array(items.length).fill(undefined);\n\t}\n\n\tpublic clone(start = 0, end?: number) {\n\t\tconst b = new RunSegment(this.items.slice(start, end));\n\t\tif (this.tags) {\n\t\t\tb.tags = this.tags.slice(start, end);\n\t\t}\n\t\tthis.cloneInto(b);\n\t\treturn b;\n\t}\n\n\tpublic append(segment: ISegment) {\n\t\tsuper.append(segment);\n\n\t\tconst asRun = segment as RunSegment;\n\t\tif (asRun.tags) {\n\t\t\tif (this.tags) {\n\t\t\t\tthis.tags.splice(this.items.length, 0, ...asRun.tags);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// TODO: retain removed items for undo\n\t// returns true if entire run removed\n\tpublic removeRange(start: number, end: number) {\n\t\tthis.tags.splice(start, end - start);\n\t\treturn super.removeRange(start, end);\n\t}\n\n\tpublic getTag(pos: number) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn this.tags[pos];\n\t}\n\n\tpublic setTag(pos: number, tag: any) {\n\t\tthis.tags[pos] = tag;\n\t}\n\n\tprotected createSplitSegmentAt(pos: number) {\n\t\tif (pos > 0) {\n\t\t\tconst remainingItems = this.items.slice(pos);\n\t\t\tthis.items = this.items.slice(0, pos);\n\t\t\tthis.cachedLength = this.items.length;\n\n\t\t\tconst leafSegment = new RunSegment(remainingItems);\n\t\t\tleafSegment.tags = this.tags.slice(pos);\n\t\t\tthis.tags.length = pos;\n\n\t\t\treturn leafSegment;\n\t\t}\n\t}\n}\n\n/**\n * @deprecated `MatrixSegment` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport type MatrixSegment = RunSegment | PaddingSegment;\n\n/**\n * @deprecated `maxCol` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport const maxCol = 0x200000; // X128 Excel maximum of 16,384 columns\n\n/**\n * @deprecated `maxCols` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport const maxCols = maxCol + 1;\n\n/**\n * @deprecated `maxRow` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport const maxRow = 0xffffffff; // X4096 Excel maximum of 1,048,576 rows\n\n/**\n * @deprecated `maxRows` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport const maxRows = maxRow + 1;\n\n/**\n * @deprecated `maxCellPosition` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport const maxCellPosition = maxCol * maxRow;\n\n/**\n * @deprecated `positionToRowCol` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport const rowColToPosition = (row: number, col: number) => row * maxCols + col;\n\n/**\n * @deprecated `positionToRowCol` is part of an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport function positionToRowCol(position: number) {\n\tconst row = Math.floor(position / maxCols);\n\tconst col = position - row * maxCols;\n\treturn { row, col };\n}\n\n/**\n * @deprecated `SparseMatrix` is an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrix} instead.\n * @internal\n */\nexport class SparseMatrix extends SharedSegmentSequence<MatrixSegment> {\n\t/**\n\t * Create a new sparse matrix\n\t *\n\t * @param runtime - data store runtime the new sparse matrix belongs to\n\t * @param id - optional name of the sparse matrix\n\t * @returns newly create sparse matrix (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(id, SparseMatrixFactory.Type) as SparseMatrix;\n\t}\n\n\t/**\n\t * Get a factory for SharedMap to register with the data store.\n\t *\n\t * @returns a factory that creates and load SharedMap\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new SparseMatrixFactory();\n\t}\n\n\tconstructor(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tpublic id: string,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(document, id, attributes, SparseMatrixFactory.segmentFromSpec);\n\t}\n\n\tpublic get numRows() {\n\t\treturn positionToRowCol(this.getLength()).row;\n\t}\n\n\tpublic setItems(row: number, col: number, values: SparseMatrixItem[], props?: PropertySet) {\n\t\tconst start = rowColToPosition(row, col);\n\t\tconst end = start + values.length;\n\t\tconst segment = new RunSegment(values);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tthis.replaceRange(start, end, segment);\n\t}\n\n\tpublic getItem(\n\t\trow: number,\n\t\tcol: number,\n\t): // The return type is defined explicitly here to prevent TypeScript from generating dynamic imports\n\tJsonable<string | number | boolean | IFluidHandle> | undefined {\n\t\tconst pos = rowColToPosition(row, col);\n\t\tconst { segment, offset } = this.getContainingSegment(pos);\n\t\tif (segment && RunSegment.is(segment)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\t\treturn segment.items[offset ?? 0];\n\t\t} else if (segment && PaddingSegment.is(segment)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tthrow new Error(`Unrecognized Segment type`);\n\t}\n\n\tpublic getTag(row: number, col: number) {\n\t\tconst { segment, offset } = this.getSegment(row, col);\n\t\tif (segment && RunSegment.is(segment)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\t\treturn segment.getTag(offset ?? 0);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic setTag(row: number, col: number, tag: any) {\n\t\tconst { segment, offset } = this.getSegment(row, col);\n\t\tif (segment && RunSegment.is(segment)) {\n\t\t\tsegment.setTag(offset ?? 0, tag);\n\t\t} else if (tag !== undefined) {\n\t\t\tthrow new Error(`Must not attempt to set tags on '${segment?.constructor.name}'.`);\n\t\t}\n\t}\n\n\tpublic insertRows(row: number, numRows: number) {\n\t\tconst pos = rowColToPosition(row, 0);\n\t\tconst size = maxCols * numRows;\n\t\tconst segment = new PaddingSegment(size);\n\n\t\tthis.client.insertSegmentLocal(pos, segment);\n\t}\n\n\tpublic removeRows(row: number, numRows: number) {\n\t\tconst pos = rowColToPosition(row, 0);\n\t\tconst size = maxCols * numRows;\n\t\tthis.removeRange(pos, pos + size);\n\t}\n\n\tpublic insertCols(col: number, numCols: number) {\n\t\tthis.moveAsPadding(maxCol - numCols, col, numCols);\n\t}\n\n\tpublic removeCols(col: number, numCols: number) {\n\t\tthis.moveAsPadding(col, maxCol - numCols, numCols);\n\t}\n\n\tpublic annotatePosition(row: number, col: number, props: PropertySet) {\n\t\tconst pos = rowColToPosition(row, col);\n\t\tthis.annotateRange(pos, pos + 1, props);\n\t}\n\n\tpublic getPositionProperties(row: number, col: number) {\n\t\tconst pos = rowColToPosition(row, col);\n\t\treturn this.getPropertiesAtPosition(pos);\n\t}\n\n\t// For each row, moves 'numCols' items starting from 'srcCol' and inserts 'numCols' padding\n\t// at 'destCol'. Used by insertCols and removeCols.\n\tprivate moveAsPadding(srcCol: number, destCol: number, numCols: number) {\n\t\tconst removeColStart = srcCol;\n\t\tconst removeColEnd = srcCol + numCols;\n\n\t\tfor (let r = 0, rowStart = 0; r < this.numRows; r++, rowStart += maxCols) {\n\t\t\tthis.client.removeRangeLocal(rowStart + removeColStart, rowStart + removeColEnd);\n\t\t\tconst insertPos = rowStart + destCol;\n\t\t\tconst segment = new PaddingSegment(numCols);\n\t\t\tthis.client.insertSegmentLocal(insertPos, segment);\n\t\t}\n\t}\n\n\tprivate getSegment(row: number, col: number) {\n\t\tconst pos = rowColToPosition(row, col);\n\t\treturn this.getContainingSegment(pos);\n\t}\n}\n\n/**\n * @deprecated `SparseMatrixFactory` is an abandoned prototype.\n * Use {@link @fluidframework/matrix#SharedMatrixFactory} instead.\n * @internal\n */\nexport class SparseMatrixFactory implements IChannelFactory {\n\tpublic static Type = \"https://graph.microsoft.com/types/mergeTree/sparse-matrix\";\n\n\tpublic static Attributes: IChannelAttributes = {\n\t\ttype: SparseMatrixFactory.Type,\n\t\tsnapshotFormatVersion: \"0.1\",\n\t\tpackageVersion: pkgVersion,\n\t};\n\n\tpublic static segmentFromSpec(spec: IJSONSegment): ISegment {\n\t\tconst maybePadding = PaddingSegment.fromJSONObject(spec);\n\t\tif (maybePadding) {\n\t\t\treturn maybePadding;\n\t\t}\n\n\t\tconst maybeRun = RunSegment.fromJSONObject(spec);\n\t\tif (maybeRun) {\n\t\t\treturn maybeRun;\n\t\t}\n\n\t\tthrow new Error(`Unrecognized IJSONObject: '${JSON.stringify(spec)}'`);\n\t}\n\n\tpublic get type() {\n\t\treturn SparseMatrixFactory.Type;\n\t}\n\n\tpublic get attributes() {\n\t\treturn SparseMatrixFactory.Attributes;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<ISharedObject> {\n\t\tconst sharedObject = new SparseMatrix(runtime, id, attributes);\n\t\tawait sharedObject.load(services);\n\t\treturn sharedObject;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): ISharedObject {\n\t\tconst sharedObject = new SparseMatrix(document, id, this.attributes);\n\t\tsharedObject.initializeLocal();\n\t\treturn sharedObject;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { strict as assert } from "assert";
|
|
6
|
+
import { MockFluidDataStoreRuntime } from "@fluidframework/test-runtime-utils";
|
|
7
|
+
import { SharedNumberSequence } from "../sharedNumberSequence.js";
|
|
8
|
+
import { SharedNumberSequenceFactory } from "../sequenceFactory.js";
|
|
9
|
+
describe("SharedNumberSequence", () => {
|
|
10
|
+
const documentId = "fakeId";
|
|
11
|
+
let sharedNumberSequence;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
const dataStoreRuntime = new MockFluidDataStoreRuntime();
|
|
14
|
+
sharedNumberSequence = new SharedNumberSequence(dataStoreRuntime, documentId, SharedNumberSequenceFactory.Attributes);
|
|
15
|
+
});
|
|
16
|
+
describe("getItems", () => {
|
|
17
|
+
it("insert and get items", async () => {
|
|
18
|
+
sharedNumberSequence.insert(0, [2, 11], undefined);
|
|
19
|
+
sharedNumberSequence.insert(0, [4, 5, 6], undefined);
|
|
20
|
+
sharedNumberSequence.insert(5, [1, 5, 6, 2, 3], undefined);
|
|
21
|
+
sharedNumberSequence.insert(0, [9, 12], undefined);
|
|
22
|
+
let items = sharedNumberSequence.getItems(1, 6);
|
|
23
|
+
console.log(items);
|
|
24
|
+
assert(verifyItems(items, [12, 4, 5, 6, 2]));
|
|
25
|
+
items = sharedNumberSequence.getItems(4, 10);
|
|
26
|
+
console.log(items);
|
|
27
|
+
assert(verifyItems(items, [6, 2, 11, 1, 5, 6]));
|
|
28
|
+
items = sharedNumberSequence.getItems(0);
|
|
29
|
+
console.log(items);
|
|
30
|
+
assert(verifyItems(items, [9, 12, 4, 5, 6, 2, 11, 1, 5, 6, 2, 3]));
|
|
31
|
+
items = sharedNumberSequence.getItems(1, 1);
|
|
32
|
+
console.log(items);
|
|
33
|
+
assert(verifyItems(items, []));
|
|
34
|
+
});
|
|
35
|
+
function verifyItems(actual, expected) {
|
|
36
|
+
if (actual.length !== expected.length) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
for (let i = 0; i < expected.length; i++) {
|
|
40
|
+
if (actual[i] !== expected[i]) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=sharedNumberSequence.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharedNumberSequence.spec.js","sourceRoot":"","sources":["../../src/test/sharedNumberSequence.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAEpE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACrC,MAAM,UAAU,GAAG,QAAQ,CAAC;IAC5B,IAAI,oBAA0C,CAAC;IAC/C,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,gBAAgB,GAAG,IAAI,yBAAyB,EAAE,CAAC;QACzD,oBAAoB,GAAG,IAAI,oBAAoB,CAC9C,gBAAgB,EAChB,UAAU,EACV,2BAA2B,CAAC,UAAU,CACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACrC,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YACnD,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACrD,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC3D,oBAAoB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YAEnD,IAAI,KAAK,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAE7C,KAAK,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAEhD,KAAK,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAEnE,KAAK,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,SAAS,WAAW,CAAC,MAAgB,EAAE,QAAkB;YACxD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE;gBACtC,OAAO,KAAK,CAAC;aACb;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACzC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE;oBAC9B,OAAO,KAAK,CAAC;iBACb;aACD;YACD,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { strict as assert } from \"assert\";\nimport { MockFluidDataStoreRuntime } from \"@fluidframework/test-runtime-utils\";\nimport { SharedNumberSequence } from \"../sharedNumberSequence.js\";\nimport { SharedNumberSequenceFactory } from \"../sequenceFactory.js\";\n\ndescribe(\"SharedNumberSequence\", () => {\n\tconst documentId = \"fakeId\";\n\tlet sharedNumberSequence: SharedNumberSequence;\n\tbeforeEach(() => {\n\t\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tsharedNumberSequence = new SharedNumberSequence(\n\t\t\tdataStoreRuntime,\n\t\t\tdocumentId,\n\t\t\tSharedNumberSequenceFactory.Attributes,\n\t\t);\n\t});\n\n\tdescribe(\"getItems\", () => {\n\t\tit(\"insert and get items\", async () => {\n\t\t\tsharedNumberSequence.insert(0, [2, 11], undefined);\n\t\t\tsharedNumberSequence.insert(0, [4, 5, 6], undefined);\n\t\t\tsharedNumberSequence.insert(5, [1, 5, 6, 2, 3], undefined);\n\t\t\tsharedNumberSequence.insert(0, [9, 12], undefined);\n\n\t\t\tlet items = sharedNumberSequence.getItems(1, 6);\n\t\t\tconsole.log(items);\n\t\t\tassert(verifyItems(items, [12, 4, 5, 6, 2]));\n\n\t\t\titems = sharedNumberSequence.getItems(4, 10);\n\t\t\tconsole.log(items);\n\t\t\tassert(verifyItems(items, [6, 2, 11, 1, 5, 6]));\n\n\t\t\titems = sharedNumberSequence.getItems(0);\n\t\t\tconsole.log(items);\n\t\t\tassert(verifyItems(items, [9, 12, 4, 5, 6, 2, 11, 1, 5, 6, 2, 3]));\n\n\t\t\titems = sharedNumberSequence.getItems(1, 1);\n\t\t\tconsole.log(items);\n\t\t\tassert(verifyItems(items, []));\n\t\t});\n\n\t\tfunction verifyItems(actual: number[], expected: number[]): boolean {\n\t\t\tif (actual.length !== expected.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (let i = 0; i < expected.length; i++) {\n\t\t\t\tif (actual[i] !== expected[i]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t});\n});\n"]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { strict as assert } from "assert";
|
|
6
|
+
import { runGCTests } from "@fluid-private/test-dds-utils";
|
|
7
|
+
import { MockContainerRuntimeFactory, MockFluidDataStoreRuntime, MockStorage, } from "@fluidframework/test-runtime-utils";
|
|
8
|
+
import { SharedObjectSequence } from "../sharedObjectSequence.js";
|
|
9
|
+
import { SharedObjectSequenceFactory } from "../sequenceFactory.js";
|
|
10
|
+
function createConnectedSequence(id, runtimeFactory) {
|
|
11
|
+
const dataStoreRuntime = new MockFluidDataStoreRuntime();
|
|
12
|
+
const sequence = new SharedObjectSequence(dataStoreRuntime, id, SharedObjectSequenceFactory.Attributes);
|
|
13
|
+
runtimeFactory.createContainerRuntime(dataStoreRuntime);
|
|
14
|
+
const services = {
|
|
15
|
+
deltaConnection: dataStoreRuntime.createDeltaConnection(),
|
|
16
|
+
objectStorage: new MockStorage(undefined),
|
|
17
|
+
};
|
|
18
|
+
sequence.connect(services);
|
|
19
|
+
sequence.initializeLocal();
|
|
20
|
+
return sequence;
|
|
21
|
+
}
|
|
22
|
+
function createLocalSequence(id) {
|
|
23
|
+
const factory = new SharedObjectSequenceFactory();
|
|
24
|
+
return factory.create(new MockFluidDataStoreRuntime(), id);
|
|
25
|
+
}
|
|
26
|
+
describe("SharedObjectSequence", () => {
|
|
27
|
+
describe("Garbage Collection", () => {
|
|
28
|
+
class GCSequenceProvider {
|
|
29
|
+
constructor() {
|
|
30
|
+
this.subSequenceCount = 0;
|
|
31
|
+
this._expectedRoutes = [];
|
|
32
|
+
this.containerRuntimeFactory = new MockContainerRuntimeFactory();
|
|
33
|
+
this.sequence1 = createConnectedSequence("sequence1", this.containerRuntimeFactory);
|
|
34
|
+
this.sequence2 = createConnectedSequence("sequence2", this.containerRuntimeFactory);
|
|
35
|
+
}
|
|
36
|
+
get sharedObject() {
|
|
37
|
+
// Return the remote SharedObjectSequence because we want to verify its summary data.
|
|
38
|
+
return this.sequence2;
|
|
39
|
+
}
|
|
40
|
+
get expectedOutboundRoutes() {
|
|
41
|
+
return this._expectedRoutes;
|
|
42
|
+
}
|
|
43
|
+
async addOutboundRoutes() {
|
|
44
|
+
const subSequence1 = createLocalSequence(`subSequence-${++this.subSequenceCount}`);
|
|
45
|
+
const subSequence2 = createLocalSequence(`subSequence-${++this.subSequenceCount}`);
|
|
46
|
+
this.sequence1.insert(this.sequence1.getLength(), [
|
|
47
|
+
subSequence1.handle,
|
|
48
|
+
subSequence2.handle,
|
|
49
|
+
]);
|
|
50
|
+
this._expectedRoutes.push(subSequence1.handle.absolutePath, subSequence2.handle.absolutePath);
|
|
51
|
+
this.containerRuntimeFactory.processAllMessages();
|
|
52
|
+
}
|
|
53
|
+
async deleteOutboundRoutes() {
|
|
54
|
+
assert(this.sequence1.getLength() > 0, "Route must be added before deleting");
|
|
55
|
+
const lastElementIndex = this.sequence1.getLength() - 1;
|
|
56
|
+
// Get the handles that were last added.
|
|
57
|
+
const deletedHandles = this.sequence1.getRange(lastElementIndex);
|
|
58
|
+
// Get the routes of the handles.
|
|
59
|
+
const deletedHandleRoutes = Array.from(deletedHandles, (handle) => handle.absolutePath);
|
|
60
|
+
// Remove the last added handles.
|
|
61
|
+
this.sequence1.remove(lastElementIndex, lastElementIndex + 1);
|
|
62
|
+
// Remove the deleted routes from expected routes.
|
|
63
|
+
this._expectedRoutes = this._expectedRoutes.filter((route) => !deletedHandleRoutes.includes(route));
|
|
64
|
+
this.containerRuntimeFactory.processAllMessages();
|
|
65
|
+
// Send an op so the minimum sequence number moves past the segment which got removed.
|
|
66
|
+
// This will ensure that the segment is not part of the summary anymore.
|
|
67
|
+
this.sequence1.insert(this.sequence1.getLength(), ["nonHandleValue"]);
|
|
68
|
+
this.containerRuntimeFactory.processAllMessages();
|
|
69
|
+
}
|
|
70
|
+
async addNestedHandles() {
|
|
71
|
+
const subSequence1 = createLocalSequence(`subSequence-${++this.subSequenceCount}`);
|
|
72
|
+
const subSequence2 = createLocalSequence(`subSequence-${++this.subSequenceCount}`);
|
|
73
|
+
const containingObject = {
|
|
74
|
+
subSequence1Handle: subSequence1.handle,
|
|
75
|
+
nestedObj: {
|
|
76
|
+
subSequence2Handle: subSequence2.handle,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
this.sequence1.insert(this.sequence1.getLength(), [containingObject]);
|
|
80
|
+
this._expectedRoutes.push(subSequence1.handle.absolutePath, subSequence2.handle.absolutePath);
|
|
81
|
+
this.containerRuntimeFactory.processAllMessages();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
runGCTests(GCSequenceProvider);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=sharedObjectSequence.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharedObjectSequence.spec.js","sourceRoot":"","sources":["../../src/test/sharedObjectSequence.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 */\nimport { strict as assert } from \"assert\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IGCTestProvider, runGCTests } from \"@fluid-private/test-dds-utils\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { SharedObjectSequence } from \"../sharedObjectSequence.js\";\nimport { SharedObjectSequenceFactory } from \"../sequenceFactory.js\";\n\nfunction createConnectedSequence(id: string, runtimeFactory: MockContainerRuntimeFactory) {\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\tconst sequence = new SharedObjectSequence(\n\t\tdataStoreRuntime,\n\t\tid,\n\t\tSharedObjectSequenceFactory.Attributes,\n\t);\n\truntimeFactory.createContainerRuntime(dataStoreRuntime);\n\tconst services = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(undefined),\n\t};\n\tsequence.connect(services);\n\tsequence.initializeLocal();\n\treturn sequence;\n}\n\nfunction createLocalSequence(id: string) {\n\tconst factory = new SharedObjectSequenceFactory();\n\treturn factory.create(new MockFluidDataStoreRuntime(), id);\n}\n\ndescribe(\"SharedObjectSequence\", () => {\n\tdescribe(\"Garbage Collection\", () => {\n\t\tclass GCSequenceProvider implements IGCTestProvider {\n\t\t\tprivate subSequenceCount = 0;\n\t\t\tprivate _expectedRoutes: string[] = [];\n\t\t\tprivate readonly containerRuntimeFactory: MockContainerRuntimeFactory;\n\t\t\tprivate readonly sequence1: SharedObjectSequence<any>;\n\t\t\tprivate readonly sequence2: SharedObjectSequence<any>;\n\n\t\t\tconstructor() {\n\t\t\t\tthis.containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\t\t\tthis.sequence1 = createConnectedSequence(\"sequence1\", this.containerRuntimeFactory);\n\t\t\t\tthis.sequence2 = createConnectedSequence(\"sequence2\", this.containerRuntimeFactory);\n\t\t\t}\n\n\t\t\tpublic get sharedObject() {\n\t\t\t\t// Return the remote SharedObjectSequence because we want to verify its summary data.\n\t\t\t\treturn this.sequence2;\n\t\t\t}\n\n\t\t\tpublic get expectedOutboundRoutes() {\n\t\t\t\treturn this._expectedRoutes;\n\t\t\t}\n\n\t\t\tpublic async addOutboundRoutes() {\n\t\t\t\tconst subSequence1 = createLocalSequence(`subSequence-${++this.subSequenceCount}`);\n\t\t\t\tconst subSequence2 = createLocalSequence(`subSequence-${++this.subSequenceCount}`);\n\t\t\t\tthis.sequence1.insert(this.sequence1.getLength(), [\n\t\t\t\t\tsubSequence1.handle,\n\t\t\t\t\tsubSequence2.handle,\n\t\t\t\t]);\n\t\t\t\tthis._expectedRoutes.push(\n\t\t\t\t\tsubSequence1.handle.absolutePath,\n\t\t\t\t\tsubSequence2.handle.absolutePath,\n\t\t\t\t);\n\t\t\t\tthis.containerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\tpublic async deleteOutboundRoutes() {\n\t\t\t\tassert(this.sequence1.getLength() > 0, \"Route must be added before deleting\");\n\t\t\t\tconst lastElementIndex = this.sequence1.getLength() - 1;\n\t\t\t\t// Get the handles that were last added.\n\t\t\t\tconst deletedHandles = this.sequence1.getRange(lastElementIndex) as IFluidHandle[];\n\t\t\t\t// Get the routes of the handles.\n\t\t\t\tconst deletedHandleRoutes = Array.from(\n\t\t\t\t\tdeletedHandles,\n\t\t\t\t\t(handle) => handle.absolutePath,\n\t\t\t\t);\n\n\t\t\t\t// Remove the last added handles.\n\t\t\t\tthis.sequence1.remove(lastElementIndex, lastElementIndex + 1);\n\n\t\t\t\t// Remove the deleted routes from expected routes.\n\t\t\t\tthis._expectedRoutes = this._expectedRoutes.filter(\n\t\t\t\t\t(route) => !deletedHandleRoutes.includes(route),\n\t\t\t\t);\n\t\t\t\tthis.containerRuntimeFactory.processAllMessages();\n\n\t\t\t\t// Send an op so the minimum sequence number moves past the segment which got removed.\n\t\t\t\t// This will ensure that the segment is not part of the summary anymore.\n\t\t\t\tthis.sequence1.insert(this.sequence1.getLength(), [\"nonHandleValue\"]);\n\t\t\t\tthis.containerRuntimeFactory.processAllMessages();\n\t\t\t}\n\n\t\t\tpublic async addNestedHandles() {\n\t\t\t\tconst subSequence1 = createLocalSequence(`subSequence-${++this.subSequenceCount}`);\n\t\t\t\tconst subSequence2 = createLocalSequence(`subSequence-${++this.subSequenceCount}`);\n\t\t\t\tconst containingObject = {\n\t\t\t\t\tsubSequence1Handle: subSequence1.handle,\n\t\t\t\t\tnestedObj: {\n\t\t\t\t\t\tsubSequence2Handle: subSequence2.handle,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tthis.sequence1.insert(this.sequence1.getLength(), [containingObject]);\n\t\t\t\tthis._expectedRoutes.push(\n\t\t\t\t\tsubSequence1.handle.absolutePath,\n\t\t\t\t\tsubSequence2.handle.absolutePath,\n\t\t\t\t);\n\t\t\t\tthis.containerRuntimeFactory.processAllMessages();\n\t\t\t}\n\t\t}\n\n\t\trunGCTests(GCSequenceProvider);\n\t});\n});\n"]}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { strict as assert } from "assert";
|
|
6
|
+
import { MockFluidDataStoreRuntime, MockContainerRuntimeFactory, MockContainerRuntimeFactoryForReconnection, MockStorage, } from "@fluidframework/test-runtime-utils";
|
|
7
|
+
import { SparseMatrix, SparseMatrixFactory } from "../sparsematrix.js";
|
|
8
|
+
describe("SparseMatrix", () => {
|
|
9
|
+
const extract = (matrix, numCols) => {
|
|
10
|
+
const rows = [];
|
|
11
|
+
for (let r = 0; r < matrix.numRows; r++) {
|
|
12
|
+
const cols = [];
|
|
13
|
+
for (let c = 0; c < numCols; c++) {
|
|
14
|
+
cols.push(matrix.getItem(r, c));
|
|
15
|
+
}
|
|
16
|
+
rows.push(cols);
|
|
17
|
+
}
|
|
18
|
+
return rows;
|
|
19
|
+
};
|
|
20
|
+
describe("local state", () => {
|
|
21
|
+
let dataStoreRuntime;
|
|
22
|
+
let matrix;
|
|
23
|
+
before(async () => {
|
|
24
|
+
dataStoreRuntime = new MockFluidDataStoreRuntime();
|
|
25
|
+
matrix = new SparseMatrix(dataStoreRuntime, "matrix", SparseMatrixFactory.Attributes);
|
|
26
|
+
});
|
|
27
|
+
const expect = async (expected) => {
|
|
28
|
+
const expectedCols = expected.length > 0 ? expected[0].length : 0;
|
|
29
|
+
assert.strictEqual(matrix.numRows, expected.length);
|
|
30
|
+
assert.deepStrictEqual(extract(matrix, expectedCols), expected);
|
|
31
|
+
assert.strictEqual(matrix.numRows, expected.length);
|
|
32
|
+
assert.deepStrictEqual(extract(matrix, expectedCols), expected);
|
|
33
|
+
};
|
|
34
|
+
it("initially empty", async () => {
|
|
35
|
+
await expect([]);
|
|
36
|
+
});
|
|
37
|
+
it("append row", async () => {
|
|
38
|
+
matrix.insertRows(0, 1);
|
|
39
|
+
await expect([[undefined]]);
|
|
40
|
+
});
|
|
41
|
+
it("set(0,0)", async () => {
|
|
42
|
+
matrix.setItems(0, 0, ["BL"]);
|
|
43
|
+
await expect([["BL", undefined]]);
|
|
44
|
+
});
|
|
45
|
+
it("insert 1 row", async () => {
|
|
46
|
+
matrix.insertRows(0, 1);
|
|
47
|
+
await expect([
|
|
48
|
+
[undefined, undefined],
|
|
49
|
+
["BL", undefined],
|
|
50
|
+
]);
|
|
51
|
+
});
|
|
52
|
+
it("set(0,0..1),set(1,1)", async () => {
|
|
53
|
+
matrix.setItems(0, 0, ["TL", "TR"]);
|
|
54
|
+
matrix.setItems(1, 1, ["BR"]);
|
|
55
|
+
await expect([
|
|
56
|
+
["TL", "TR", undefined],
|
|
57
|
+
["BL", "BR", undefined],
|
|
58
|
+
]);
|
|
59
|
+
});
|
|
60
|
+
it("insert 1 col", async () => {
|
|
61
|
+
matrix.insertCols(1, 1);
|
|
62
|
+
await expect([
|
|
63
|
+
["TL", undefined, "TR", undefined],
|
|
64
|
+
["BL", undefined, "BR", undefined],
|
|
65
|
+
]);
|
|
66
|
+
});
|
|
67
|
+
it("remove 1 col", async () => {
|
|
68
|
+
matrix.removeCols(1, 1);
|
|
69
|
+
await expect([
|
|
70
|
+
["TL", "TR", undefined],
|
|
71
|
+
["BL", "BR", undefined],
|
|
72
|
+
]);
|
|
73
|
+
});
|
|
74
|
+
it("remove 1 row", async () => {
|
|
75
|
+
matrix.removeRows(0, 1);
|
|
76
|
+
await expect([["BL", "BR"]]);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe("connected state", () => {
|
|
80
|
+
let matrix1;
|
|
81
|
+
let matrix2;
|
|
82
|
+
let containerRuntimeFactory;
|
|
83
|
+
const print = (matrix) => {
|
|
84
|
+
for (const row of extract(matrix, 10)) {
|
|
85
|
+
console.log(`[${row.join(",")}]`);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const assertMatrices = async (expected) => {
|
|
89
|
+
containerRuntimeFactory.processAllMessages();
|
|
90
|
+
print(matrix1);
|
|
91
|
+
assert.deepStrictEqual(extract(matrix1, 10), extract(matrix2, 10));
|
|
92
|
+
const expectedCols = expected.length > 0 ? expected[0].length : 0;
|
|
93
|
+
assert.strictEqual(matrix1.numRows, expected.length);
|
|
94
|
+
assert.deepStrictEqual(extract(matrix1, expectedCols), expected);
|
|
95
|
+
};
|
|
96
|
+
describe("two clients", () => {
|
|
97
|
+
beforeEach(async () => {
|
|
98
|
+
containerRuntimeFactory = new MockContainerRuntimeFactory();
|
|
99
|
+
// Create and connect the first SparseMatrix.
|
|
100
|
+
const dataStoreRuntime1 = new MockFluidDataStoreRuntime();
|
|
101
|
+
containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);
|
|
102
|
+
const services1 = {
|
|
103
|
+
deltaConnection: dataStoreRuntime1.createDeltaConnection(),
|
|
104
|
+
objectStorage: new MockStorage(),
|
|
105
|
+
};
|
|
106
|
+
matrix1 = new SparseMatrix(dataStoreRuntime1, "matrix1", SparseMatrixFactory.Attributes);
|
|
107
|
+
matrix1.initializeLocal();
|
|
108
|
+
matrix1.connect(services1);
|
|
109
|
+
// Create and connect the second SparseMatrix.
|
|
110
|
+
const dataStoreRuntime2 = new MockFluidDataStoreRuntime();
|
|
111
|
+
containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);
|
|
112
|
+
const services2 = {
|
|
113
|
+
deltaConnection: dataStoreRuntime2.createDeltaConnection(),
|
|
114
|
+
objectStorage: new MockStorage(),
|
|
115
|
+
};
|
|
116
|
+
matrix2 = new SparseMatrix(dataStoreRuntime2, "matrix2", SparseMatrixFactory.Attributes);
|
|
117
|
+
matrix2.initializeLocal();
|
|
118
|
+
matrix2.connect(services2);
|
|
119
|
+
});
|
|
120
|
+
it("row insertion conflict", async () => {
|
|
121
|
+
matrix1.insertRows(0, 1);
|
|
122
|
+
matrix1.setItems(0, 1, [1, 2]);
|
|
123
|
+
matrix2.insertRows(0, 1);
|
|
124
|
+
matrix2.setItems(0, 1, ["A", "B"]);
|
|
125
|
+
await assertMatrices([
|
|
126
|
+
[undefined, "A", "B", undefined],
|
|
127
|
+
[undefined, 1, 2, undefined],
|
|
128
|
+
]);
|
|
129
|
+
});
|
|
130
|
+
it("col insertion conflict", async () => {
|
|
131
|
+
matrix1.insertRows(0, 1);
|
|
132
|
+
matrix1.setItems(0, 0, [">", "<"]);
|
|
133
|
+
await assertMatrices([[">", "<", undefined]]);
|
|
134
|
+
matrix1.insertCols(1, 1);
|
|
135
|
+
matrix1.setItems(0, 1, [1]);
|
|
136
|
+
matrix2.insertCols(1, 1);
|
|
137
|
+
matrix2.setItems(0, 1, [2]);
|
|
138
|
+
await assertMatrices([[">", 2, 1, "<", undefined]]);
|
|
139
|
+
});
|
|
140
|
+
it("row/col insertion conflict", async () => {
|
|
141
|
+
matrix1.insertRows(0, 1);
|
|
142
|
+
matrix1.setItems(0, 0, [">", "<"]);
|
|
143
|
+
await assertMatrices([[">", "<", undefined]]);
|
|
144
|
+
matrix1.insertCols(1, 1);
|
|
145
|
+
matrix1.setItems(0, 1, [1]);
|
|
146
|
+
matrix2.insertRows(0, 1);
|
|
147
|
+
matrix2.setItems(0, 1, [2]);
|
|
148
|
+
await assertMatrices([
|
|
149
|
+
[undefined, 2, undefined, undefined],
|
|
150
|
+
[">", 1, "<", undefined],
|
|
151
|
+
]);
|
|
152
|
+
});
|
|
153
|
+
it("marshalls JSON", async () => {
|
|
154
|
+
// The nesting is mostly a test of the recursive Json<T> type declaration.
|
|
155
|
+
const json = {
|
|
156
|
+
z: null,
|
|
157
|
+
b: true,
|
|
158
|
+
n: 0,
|
|
159
|
+
s: "s0",
|
|
160
|
+
a: [
|
|
161
|
+
null,
|
|
162
|
+
false,
|
|
163
|
+
1,
|
|
164
|
+
"s1",
|
|
165
|
+
{
|
|
166
|
+
b: true,
|
|
167
|
+
n: 1,
|
|
168
|
+
s: "s2",
|
|
169
|
+
a: [
|
|
170
|
+
{
|
|
171
|
+
b: false,
|
|
172
|
+
n: 2,
|
|
173
|
+
s: "s2",
|
|
174
|
+
a: [],
|
|
175
|
+
o: {},
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
o: {},
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
o: {
|
|
182
|
+
b: false,
|
|
183
|
+
n: 3,
|
|
184
|
+
s: "s3",
|
|
185
|
+
a: [
|
|
186
|
+
null,
|
|
187
|
+
false,
|
|
188
|
+
1,
|
|
189
|
+
"s1",
|
|
190
|
+
{
|
|
191
|
+
b: false,
|
|
192
|
+
n: -1,
|
|
193
|
+
s: "s2",
|
|
194
|
+
a: [
|
|
195
|
+
{
|
|
196
|
+
b: false,
|
|
197
|
+
n: -1,
|
|
198
|
+
s: "s2",
|
|
199
|
+
a: [],
|
|
200
|
+
o: {},
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
o: {},
|
|
204
|
+
},
|
|
205
|
+
],
|
|
206
|
+
o: {},
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
const items = [null, true, -1, "s", [null, true, -1, "s"], json];
|
|
210
|
+
matrix1.insertRows(0, 1);
|
|
211
|
+
matrix1.insertCols(0, items.length);
|
|
212
|
+
matrix1.setItems(0, 0, items);
|
|
213
|
+
await assertMatrices([items]);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
describe("reconnection with two clients", () => {
|
|
217
|
+
let containerRuntime1;
|
|
218
|
+
let containerRuntime2;
|
|
219
|
+
beforeEach(async () => {
|
|
220
|
+
containerRuntimeFactory = new MockContainerRuntimeFactoryForReconnection();
|
|
221
|
+
// Create and connect the first SharedMatrix.
|
|
222
|
+
const dataStoreRuntime1 = new MockFluidDataStoreRuntime();
|
|
223
|
+
containerRuntime1 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);
|
|
224
|
+
const services1 = {
|
|
225
|
+
deltaConnection: dataStoreRuntime1.createDeltaConnection(),
|
|
226
|
+
objectStorage: new MockStorage(),
|
|
227
|
+
};
|
|
228
|
+
matrix1 = new SparseMatrix(dataStoreRuntime1, "matrix", SparseMatrixFactory.Attributes);
|
|
229
|
+
matrix1.initializeLocal();
|
|
230
|
+
matrix1.connect(services1);
|
|
231
|
+
// Create and connect the second SharedMatrix.
|
|
232
|
+
const dataStoreRuntime2 = new MockFluidDataStoreRuntime();
|
|
233
|
+
containerRuntime2 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);
|
|
234
|
+
const services2 = {
|
|
235
|
+
deltaConnection: dataStoreRuntime2.createDeltaConnection(),
|
|
236
|
+
objectStorage: new MockStorage(),
|
|
237
|
+
};
|
|
238
|
+
matrix2 = new SparseMatrix(dataStoreRuntime2, "matrix2", SparseMatrixFactory.Attributes);
|
|
239
|
+
matrix2.initializeLocal();
|
|
240
|
+
matrix2.connect(services2);
|
|
241
|
+
});
|
|
242
|
+
it("can resend unacked ops on reconnection", async () => {
|
|
243
|
+
// Insert a row and set items in the first sparse matrix.
|
|
244
|
+
matrix1.insertRows(0, 1);
|
|
245
|
+
matrix1.setItems(0, 0, [">", "<"]);
|
|
246
|
+
// Disconnect and reconnect the first client.
|
|
247
|
+
containerRuntime1.connected = false;
|
|
248
|
+
containerRuntime1.connected = true;
|
|
249
|
+
// Verify that both the matrices have expected content.
|
|
250
|
+
await assertMatrices([[">", "<", undefined]]);
|
|
251
|
+
// Perform a few operations on the second sparse matrix.
|
|
252
|
+
matrix2.insertCols(1, 1);
|
|
253
|
+
matrix2.setItems(0, 1, [1]);
|
|
254
|
+
matrix2.insertRows(0, 1);
|
|
255
|
+
matrix2.setItems(0, 1, [2]);
|
|
256
|
+
// Disconnect and reconnect the second client.
|
|
257
|
+
containerRuntime2.connected = false;
|
|
258
|
+
containerRuntime2.connected = true;
|
|
259
|
+
// Verify that both the matrices have expected content.
|
|
260
|
+
await assertMatrices([
|
|
261
|
+
[undefined, 2, undefined, undefined],
|
|
262
|
+
[">", 1, "<", undefined],
|
|
263
|
+
]);
|
|
264
|
+
});
|
|
265
|
+
it("can store ops in disconnected state and resend them on reconnection", async () => {
|
|
266
|
+
// Disconnect the first client.
|
|
267
|
+
containerRuntime1.connected = false;
|
|
268
|
+
// Insert a row and set items in the first sparse matrix.
|
|
269
|
+
matrix1.insertRows(0, 1);
|
|
270
|
+
matrix1.setItems(0, 0, [">", "<"]);
|
|
271
|
+
// Reconnect the first client.
|
|
272
|
+
containerRuntime1.connected = true;
|
|
273
|
+
// Verify that both the matrices have expected content.
|
|
274
|
+
await assertMatrices([[">", "<", undefined]]);
|
|
275
|
+
// Disconnect the second client.
|
|
276
|
+
containerRuntime2.connected = false;
|
|
277
|
+
// Perform a few operations on the second sparse matrix.
|
|
278
|
+
matrix2.insertCols(1, 1);
|
|
279
|
+
matrix2.setItems(0, 1, [1]);
|
|
280
|
+
matrix2.insertRows(0, 1);
|
|
281
|
+
matrix2.setItems(0, 1, [2]);
|
|
282
|
+
// Reconnect the second client.
|
|
283
|
+
containerRuntime2.connected = true;
|
|
284
|
+
// Verify that both the matrices have expected content.
|
|
285
|
+
await assertMatrices([
|
|
286
|
+
[undefined, 2, undefined, undefined],
|
|
287
|
+
[">", 1, "<", undefined],
|
|
288
|
+
]);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
//# sourceMappingURL=sparseMatrix.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparseMatrix.spec.js","sourceRoot":"","sources":["../../src/test/sparseMatrix.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE1C,OAAO,EACN,yBAAyB,EACzB,2BAA2B,EAC3B,0CAA0C,EAE1C,WAAW,GACX,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAoB,MAAM,oBAAoB,CAAC;AAEzF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,MAAM,OAAO,GAAG,CAAC,MAAoB,EAAE,OAAe,EAAE,EAAE;QACzD,MAAM,IAAI,GAAyB,EAAE,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;YACxC,MAAM,IAAI,GAAuB,EAAE,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;gBACjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAChC;YACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAChB;QACD,OAAO,IAAI,CAAC;IACb,CAAC,CAAC;IAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC5B,IAAI,gBAA2C,CAAC;QAChD,IAAI,MAAoB,CAAC;QAEzB,MAAM,CAAC,KAAK,IAAI,EAAE;YACjB,gBAAgB,GAAG,IAAI,yBAAyB,EAAE,CAAC;YACnD,MAAM,GAAG,IAAI,YAAY,CAAC,gBAAgB,EAAE,QAAQ,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,KAAK,EAAE,QAAqC,EAAE,EAAE;YAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAElE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;YAEhE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjE,CAAC,CAAC;QAEF,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;YAChC,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;YAC3B,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;YACzB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9B,MAAM,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;YAC7B,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,CAAC;gBACZ,CAAC,SAAS,EAAE,SAAS,CAAC;gBACtB,CAAC,IAAI,EAAE,SAAS,CAAC;aACjB,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9B,MAAM,MAAM,CAAC;gBACZ,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC;gBACvB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC;aACvB,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;YAC7B,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,CAAC;gBACZ,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC;gBAClC,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC;aAClC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;YAC7B,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,CAAC;gBACZ,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC;gBACvB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC;aACvB,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;YAC7B,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAChC,IAAI,OAAqB,CAAC;QAC1B,IAAI,OAAqB,CAAC;QAC1B,IAAI,uBAAoD,CAAC;QAEzD,MAAM,KAAK,GAAG,CAAC,MAAoB,EAAE,EAAE;YACtC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBACtC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAClC;QACF,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,KAAK,EAAE,QAAqC,EAAE,EAAE;YACtE,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,KAAK,CAAC,OAAO,CAAC,CAAC;YACf,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YAEnE,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAElE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACrD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClE,CAAC,CAAC;QAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;YAC5B,UAAU,CAAC,KAAK,IAAI,EAAE;gBACrB,uBAAuB,GAAG,IAAI,2BAA2B,EAAE,CAAC;gBAE5D,6CAA6C;gBAC7C,MAAM,iBAAiB,GAAG,IAAI,yBAAyB,EAAE,CAAC;gBAC1D,uBAAuB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;gBAClE,MAAM,SAAS,GAAqB;oBACnC,eAAe,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;oBAC1D,aAAa,EAAE,IAAI,WAAW,EAAE;iBAChC,CAAC;gBACF,OAAO,GAAG,IAAI,YAAY,CACzB,iBAAiB,EACjB,SAAS,EACT,mBAAmB,CAAC,UAAU,CAC9B,CAAC;gBACF,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC1B,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAE3B,8CAA8C;gBAC9C,MAAM,iBAAiB,GAAG,IAAI,yBAAyB,EAAE,CAAC;gBAC1D,uBAAuB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;gBAClE,MAAM,SAAS,GAAqB;oBACnC,eAAe,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;oBAC1D,aAAa,EAAE,IAAI,WAAW,EAAE;iBAChC,CAAC;gBACF,OAAO,GAAG,IAAI,YAAY,CACzB,iBAAiB,EACjB,SAAS,EACT,mBAAmB,CAAC,UAAU,CAC9B,CAAC;gBACF,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC1B,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;gBACvC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAE/B,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;gBAEnC,MAAM,cAAc,CAAC;oBACpB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC;oBAChC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;iBAC5B,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;gBACvC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;gBACnC,MAAM,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;gBAE9C,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE5B,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5B,MAAM,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;gBAC3C,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;gBACnC,MAAM,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;gBAE9C,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE5B,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5B,MAAM,cAAc,CAAC;oBACpB,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC;oBACpC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC;iBACxB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;gBAC/B,0EAA0E;gBAC1E,MAAM,IAAI,GAAG;oBACZ,CAAC,EAAE,IAAI;oBACP,CAAC,EAAE,IAAI;oBACP,CAAC,EAAE,CAAC;oBACJ,CAAC,EAAE,IAAI;oBACP,CAAC,EAAE;wBACF,IAAI;wBACJ,KAAK;wBACL,CAAC;wBACD,IAAI;wBACJ;4BACC,CAAC,EAAE,IAAI;4BACP,CAAC,EAAE,CAAC;4BACJ,CAAC,EAAE,IAAI;4BACP,CAAC,EAAE;gCACF;oCACC,CAAC,EAAE,KAAK;oCACR,CAAC,EAAE,CAAC;oCACJ,CAAC,EAAE,IAAI;oCACP,CAAC,EAAE,EAAE;oCACL,CAAC,EAAE,EAAE;iCACL;6BACD;4BACD,CAAC,EAAE,EAAE;yBACL;qBACD;oBACD,CAAC,EAAE;wBACF,CAAC,EAAE,KAAK;wBACR,CAAC,EAAE,CAAC;wBACJ,CAAC,EAAE,IAAI;wBACP,CAAC,EAAE;4BACF,IAAI;4BACJ,KAAK;4BACL,CAAC;4BACD,IAAI;4BACJ;gCACC,CAAC,EAAE,KAAK;gCACR,CAAC,EAAE,CAAC,CAAC;gCACL,CAAC,EAAE,IAAI;gCACP,CAAC,EAAE;oCACF;wCACC,CAAC,EAAE,KAAK;wCACR,CAAC,EAAE,CAAC,CAAC;wCACL,CAAC,EAAE,IAAI;wCACP,CAAC,EAAE,EAAE;wCACL,CAAC,EAAE,EAAE;qCACL;iCACD;gCACD,CAAC,EAAE,EAAE;6BACL;yBACD;wBACD,CAAC,EAAE,EAAE;qBACL;iBACD,CAAC;gBAEF,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;gBAEjE,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBACpC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBAE9B,MAAM,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;YAC9C,IAAI,iBAAsD,CAAC;YAC3D,IAAI,iBAAsD,CAAC;YAE3D,UAAU,CAAC,KAAK,IAAI,EAAE;gBACrB,uBAAuB,GAAG,IAAI,0CAA0C,EAAE,CAAC;gBAE3E,6CAA6C;gBAC7C,MAAM,iBAAiB,GAAG,IAAI,yBAAyB,EAAE,CAAC;gBAC1D,iBAAiB,GAChB,uBACA,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;gBAC5C,MAAM,SAAS,GAAqB;oBACnC,eAAe,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;oBAC1D,aAAa,EAAE,IAAI,WAAW,EAAE;iBAChC,CAAC;gBACF,OAAO,GAAG,IAAI,YAAY,CACzB,iBAAiB,EACjB,QAAQ,EACR,mBAAmB,CAAC,UAAU,CAC9B,CAAC;gBACF,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC1B,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAE3B,8CAA8C;gBAC9C,MAAM,iBAAiB,GAAG,IAAI,yBAAyB,EAAE,CAAC;gBAC1D,iBAAiB,GAChB,uBACA,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;gBAC5C,MAAM,SAAS,GAAqB;oBACnC,eAAe,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;oBAC1D,aAAa,EAAE,IAAI,WAAW,EAAE;iBAChC,CAAC;gBACF,OAAO,GAAG,IAAI,YAAY,CACzB,iBAAiB,EACjB,SAAS,EACT,mBAAmB,CAAC,UAAU,CAC9B,CAAC;gBACF,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC1B,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;gBACvD,yDAAyD;gBACzD,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;gBAEnC,6CAA6C;gBAC7C,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;gBACpC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;gBAEnC,uDAAuD;gBACvD,MAAM,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;gBAE9C,wDAAwD;gBACxD,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE5B,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE5B,8CAA8C;gBAC9C,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;gBACpC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;gBAEnC,uDAAuD;gBACvD,MAAM,cAAc,CAAC;oBACpB,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC;oBACpC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC;iBACxB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;gBACpF,+BAA+B;gBAC/B,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;gBAEpC,yDAAyD;gBACzD,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;gBAEnC,8BAA8B;gBAC9B,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;gBAEnC,uDAAuD;gBACvD,MAAM,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;gBAE9C,gCAAgC;gBAChC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;gBAEpC,wDAAwD;gBACxD,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE5B,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE5B,+BAA+B;gBAC/B,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;gBAEnC,uDAAuD;gBACvD,MAAM,cAAc,CAAC;oBACpB,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC;oBACpC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC;iBACxB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { IChannelServices } from \"@fluidframework/datastore-definitions\";\nimport {\n\tMockFluidDataStoreRuntime,\n\tMockContainerRuntimeFactory,\n\tMockContainerRuntimeFactoryForReconnection,\n\tMockContainerRuntimeForReconnection,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { SparseMatrix, SparseMatrixFactory, SparseMatrixItem } from \"../sparsematrix.js\";\n\ndescribe(\"SparseMatrix\", () => {\n\tconst extract = (matrix: SparseMatrix, numCols: number) => {\n\t\tconst rows: SparseMatrixItem[][] = [];\n\t\tfor (let r = 0; r < matrix.numRows; r++) {\n\t\t\tconst cols: SparseMatrixItem[] = [];\n\t\t\tfor (let c = 0; c < numCols; c++) {\n\t\t\t\tcols.push(matrix.getItem(r, c));\n\t\t\t}\n\t\t\trows.push(cols);\n\t\t}\n\t\treturn rows;\n\t};\n\n\tdescribe(\"local state\", () => {\n\t\tlet dataStoreRuntime: MockFluidDataStoreRuntime;\n\t\tlet matrix: SparseMatrix;\n\n\t\tbefore(async () => {\n\t\t\tdataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\t\tmatrix = new SparseMatrix(dataStoreRuntime, \"matrix\", SparseMatrixFactory.Attributes);\n\t\t});\n\n\t\tconst expect = async (expected: readonly (readonly any[])[]) => {\n\t\t\tconst expectedCols = expected.length > 0 ? expected[0].length : 0;\n\n\t\t\tassert.strictEqual(matrix.numRows, expected.length);\n\t\t\tassert.deepStrictEqual(extract(matrix, expectedCols), expected);\n\n\t\t\tassert.strictEqual(matrix.numRows, expected.length);\n\t\t\tassert.deepStrictEqual(extract(matrix, expectedCols), expected);\n\t\t};\n\n\t\tit(\"initially empty\", async () => {\n\t\t\tawait expect([]);\n\t\t});\n\n\t\tit(\"append row\", async () => {\n\t\t\tmatrix.insertRows(0, 1);\n\t\t\tawait expect([[undefined]]);\n\t\t});\n\n\t\tit(\"set(0,0)\", async () => {\n\t\t\tmatrix.setItems(0, 0, [\"BL\"]);\n\t\t\tawait expect([[\"BL\", undefined]]);\n\t\t});\n\n\t\tit(\"insert 1 row\", async () => {\n\t\t\tmatrix.insertRows(0, 1);\n\t\t\tawait expect([\n\t\t\t\t[undefined, undefined],\n\t\t\t\t[\"BL\", undefined],\n\t\t\t]);\n\t\t});\n\n\t\tit(\"set(0,0..1),set(1,1)\", async () => {\n\t\t\tmatrix.setItems(0, 0, [\"TL\", \"TR\"]);\n\t\t\tmatrix.setItems(1, 1, [\"BR\"]);\n\t\t\tawait expect([\n\t\t\t\t[\"TL\", \"TR\", undefined],\n\t\t\t\t[\"BL\", \"BR\", undefined],\n\t\t\t]);\n\t\t});\n\n\t\tit(\"insert 1 col\", async () => {\n\t\t\tmatrix.insertCols(1, 1);\n\t\t\tawait expect([\n\t\t\t\t[\"TL\", undefined, \"TR\", undefined],\n\t\t\t\t[\"BL\", undefined, \"BR\", undefined],\n\t\t\t]);\n\t\t});\n\n\t\tit(\"remove 1 col\", async () => {\n\t\t\tmatrix.removeCols(1, 1);\n\t\t\tawait expect([\n\t\t\t\t[\"TL\", \"TR\", undefined],\n\t\t\t\t[\"BL\", \"BR\", undefined],\n\t\t\t]);\n\t\t});\n\n\t\tit(\"remove 1 row\", async () => {\n\t\t\tmatrix.removeRows(0, 1);\n\t\t\tawait expect([[\"BL\", \"BR\"]]);\n\t\t});\n\t});\n\n\tdescribe(\"connected state\", () => {\n\t\tlet matrix1: SparseMatrix;\n\t\tlet matrix2: SparseMatrix;\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\n\t\tconst print = (matrix: SparseMatrix) => {\n\t\t\tfor (const row of extract(matrix, 10)) {\n\t\t\t\tconsole.log(`[${row.join(\",\")}]`);\n\t\t\t}\n\t\t};\n\n\t\tconst assertMatrices = async (expected: readonly (readonly any[])[]) => {\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tprint(matrix1);\n\t\t\tassert.deepStrictEqual(extract(matrix1, 10), extract(matrix2, 10));\n\n\t\t\tconst expectedCols = expected.length > 0 ? expected[0].length : 0;\n\n\t\t\tassert.strictEqual(matrix1.numRows, expected.length);\n\t\t\tassert.deepStrictEqual(extract(matrix1, expectedCols), expected);\n\t\t};\n\n\t\tdescribe(\"two clients\", () => {\n\t\t\tbeforeEach(async () => {\n\t\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactory();\n\n\t\t\t\t// Create and connect the first SparseMatrix.\n\t\t\t\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime();\n\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime1);\n\t\t\t\tconst services1: IChannelServices = {\n\t\t\t\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t\t};\n\t\t\t\tmatrix1 = new SparseMatrix(\n\t\t\t\t\tdataStoreRuntime1,\n\t\t\t\t\t\"matrix1\",\n\t\t\t\t\tSparseMatrixFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tmatrix1.initializeLocal();\n\t\t\t\tmatrix1.connect(services1);\n\n\t\t\t\t// Create and connect the second SparseMatrix.\n\t\t\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\t\t\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\t\t\tconst services2: IChannelServices = {\n\t\t\t\t\tdeltaConnection: dataStoreRuntime2.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t\t};\n\t\t\t\tmatrix2 = new SparseMatrix(\n\t\t\t\t\tdataStoreRuntime2,\n\t\t\t\t\t\"matrix2\",\n\t\t\t\t\tSparseMatrixFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tmatrix2.initializeLocal();\n\t\t\t\tmatrix2.connect(services2);\n\t\t\t});\n\n\t\t\tit(\"row insertion conflict\", async () => {\n\t\t\t\tmatrix1.insertRows(0, 1);\n\t\t\t\tmatrix1.setItems(0, 1, [1, 2]);\n\n\t\t\t\tmatrix2.insertRows(0, 1);\n\t\t\t\tmatrix2.setItems(0, 1, [\"A\", \"B\"]);\n\n\t\t\t\tawait assertMatrices([\n\t\t\t\t\t[undefined, \"A\", \"B\", undefined],\n\t\t\t\t\t[undefined, 1, 2, undefined],\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tit(\"col insertion conflict\", async () => {\n\t\t\t\tmatrix1.insertRows(0, 1);\n\t\t\t\tmatrix1.setItems(0, 0, [\">\", \"<\"]);\n\t\t\t\tawait assertMatrices([[\">\", \"<\", undefined]]);\n\n\t\t\t\tmatrix1.insertCols(1, 1);\n\t\t\t\tmatrix1.setItems(0, 1, [1]);\n\n\t\t\t\tmatrix2.insertCols(1, 1);\n\t\t\t\tmatrix2.setItems(0, 1, [2]);\n\t\t\t\tawait assertMatrices([[\">\", 2, 1, \"<\", undefined]]);\n\t\t\t});\n\n\t\t\tit(\"row/col insertion conflict\", async () => {\n\t\t\t\tmatrix1.insertRows(0, 1);\n\t\t\t\tmatrix1.setItems(0, 0, [\">\", \"<\"]);\n\t\t\t\tawait assertMatrices([[\">\", \"<\", undefined]]);\n\n\t\t\t\tmatrix1.insertCols(1, 1);\n\t\t\t\tmatrix1.setItems(0, 1, [1]);\n\n\t\t\t\tmatrix2.insertRows(0, 1);\n\t\t\t\tmatrix2.setItems(0, 1, [2]);\n\t\t\t\tawait assertMatrices([\n\t\t\t\t\t[undefined, 2, undefined, undefined],\n\t\t\t\t\t[\">\", 1, \"<\", undefined],\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tit(\"marshalls JSON\", async () => {\n\t\t\t\t// The nesting is mostly a test of the recursive Json<T> type declaration.\n\t\t\t\tconst json = {\n\t\t\t\t\tz: null,\n\t\t\t\t\tb: true,\n\t\t\t\t\tn: 0,\n\t\t\t\t\ts: \"s0\",\n\t\t\t\t\ta: [\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"s1\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tb: true,\n\t\t\t\t\t\t\tn: 1,\n\t\t\t\t\t\t\ts: \"s2\",\n\t\t\t\t\t\t\ta: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tb: false,\n\t\t\t\t\t\t\t\t\tn: 2,\n\t\t\t\t\t\t\t\t\ts: \"s2\",\n\t\t\t\t\t\t\t\t\ta: [],\n\t\t\t\t\t\t\t\t\to: {},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\to: {},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\to: {\n\t\t\t\t\t\tb: false,\n\t\t\t\t\t\tn: 3,\n\t\t\t\t\t\ts: \"s3\",\n\t\t\t\t\t\ta: [\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t\"s1\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tb: false,\n\t\t\t\t\t\t\t\tn: -1,\n\t\t\t\t\t\t\t\ts: \"s2\",\n\t\t\t\t\t\t\t\ta: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tb: false,\n\t\t\t\t\t\t\t\t\t\tn: -1,\n\t\t\t\t\t\t\t\t\t\ts: \"s2\",\n\t\t\t\t\t\t\t\t\t\ta: [],\n\t\t\t\t\t\t\t\t\t\to: {},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\to: {},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\to: {},\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst items = [null, true, -1, \"s\", [null, true, -1, \"s\"], json];\n\n\t\t\t\tmatrix1.insertRows(0, 1);\n\t\t\t\tmatrix1.insertCols(0, items.length);\n\t\t\t\tmatrix1.setItems(0, 0, items);\n\n\t\t\t\tawait assertMatrices([items]);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"reconnection with two clients\", () => {\n\t\t\tlet containerRuntime1: MockContainerRuntimeForReconnection;\n\t\t\tlet containerRuntime2: MockContainerRuntimeForReconnection;\n\n\t\t\tbeforeEach(async () => {\n\t\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactoryForReconnection();\n\n\t\t\t\t// Create and connect the first SharedMatrix.\n\t\t\t\tconst dataStoreRuntime1 = new MockFluidDataStoreRuntime();\n\t\t\t\tcontainerRuntime1 = (\n\t\t\t\t\tcontainerRuntimeFactory as MockContainerRuntimeFactoryForReconnection\n\t\t\t\t).createContainerRuntime(dataStoreRuntime1);\n\t\t\t\tconst services1: IChannelServices = {\n\t\t\t\t\tdeltaConnection: dataStoreRuntime1.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t\t};\n\t\t\t\tmatrix1 = new SparseMatrix(\n\t\t\t\t\tdataStoreRuntime1,\n\t\t\t\t\t\"matrix\",\n\t\t\t\t\tSparseMatrixFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tmatrix1.initializeLocal();\n\t\t\t\tmatrix1.connect(services1);\n\n\t\t\t\t// Create and connect the second SharedMatrix.\n\t\t\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\t\t\tcontainerRuntime2 = (\n\t\t\t\t\tcontainerRuntimeFactory as MockContainerRuntimeFactoryForReconnection\n\t\t\t\t).createContainerRuntime(dataStoreRuntime2);\n\t\t\t\tconst services2: IChannelServices = {\n\t\t\t\t\tdeltaConnection: dataStoreRuntime2.createDeltaConnection(),\n\t\t\t\t\tobjectStorage: new MockStorage(),\n\t\t\t\t};\n\t\t\t\tmatrix2 = new SparseMatrix(\n\t\t\t\t\tdataStoreRuntime2,\n\t\t\t\t\t\"matrix2\",\n\t\t\t\t\tSparseMatrixFactory.Attributes,\n\t\t\t\t);\n\t\t\t\tmatrix2.initializeLocal();\n\t\t\t\tmatrix2.connect(services2);\n\t\t\t});\n\n\t\t\tit(\"can resend unacked ops on reconnection\", async () => {\n\t\t\t\t// Insert a row and set items in the first sparse matrix.\n\t\t\t\tmatrix1.insertRows(0, 1);\n\t\t\t\tmatrix1.setItems(0, 0, [\">\", \"<\"]);\n\n\t\t\t\t// Disconnect and reconnect the first client.\n\t\t\t\tcontainerRuntime1.connected = false;\n\t\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t\t// Verify that both the matrices have expected content.\n\t\t\t\tawait assertMatrices([[\">\", \"<\", undefined]]);\n\n\t\t\t\t// Perform a few operations on the second sparse matrix.\n\t\t\t\tmatrix2.insertCols(1, 1);\n\t\t\t\tmatrix2.setItems(0, 1, [1]);\n\n\t\t\t\tmatrix2.insertRows(0, 1);\n\t\t\t\tmatrix2.setItems(0, 1, [2]);\n\n\t\t\t\t// Disconnect and reconnect the second client.\n\t\t\t\tcontainerRuntime2.connected = false;\n\t\t\t\tcontainerRuntime2.connected = true;\n\n\t\t\t\t// Verify that both the matrices have expected content.\n\t\t\t\tawait assertMatrices([\n\t\t\t\t\t[undefined, 2, undefined, undefined],\n\t\t\t\t\t[\">\", 1, \"<\", undefined],\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tit(\"can store ops in disconnected state and resend them on reconnection\", async () => {\n\t\t\t\t// Disconnect the first client.\n\t\t\t\tcontainerRuntime1.connected = false;\n\n\t\t\t\t// Insert a row and set items in the first sparse matrix.\n\t\t\t\tmatrix1.insertRows(0, 1);\n\t\t\t\tmatrix1.setItems(0, 0, [\">\", \"<\"]);\n\n\t\t\t\t// Reconnect the first client.\n\t\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t\t// Verify that both the matrices have expected content.\n\t\t\t\tawait assertMatrices([[\">\", \"<\", undefined]]);\n\n\t\t\t\t// Disconnect the second client.\n\t\t\t\tcontainerRuntime2.connected = false;\n\n\t\t\t\t// Perform a few operations on the second sparse matrix.\n\t\t\t\tmatrix2.insertCols(1, 1);\n\t\t\t\tmatrix2.setItems(0, 1, [1]);\n\n\t\t\t\tmatrix2.insertRows(0, 1);\n\t\t\t\tmatrix2.setItems(0, 1, [2]);\n\n\t\t\t\t// Reconnect the second client.\n\t\t\t\tcontainerRuntime2.connected = true;\n\n\t\t\t\t// Verify that both the matrices have expected content.\n\t\t\t\tawait assertMatrices([\n\t\t\t\t\t[undefined, 2, undefined, undefined],\n\t\t\t\t\t[\">\", 1, \"<\", undefined],\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
|