@fluid-experimental/sequence-deprecated 2.0.0-dev-rc.3.0.0.250606 → 2.0.0-dev-rc.3.0.0.254274
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/api-report/sequence-deprecated.api.md +10 -10
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/sequence-deprecated-alpha.d.ts +10 -10
- package/dist/sequence-deprecated-beta.d.ts +10 -10
- package/dist/sequence-deprecated-public.d.ts +10 -10
- package/dist/sequence-deprecated-untrimmed.d.ts +10 -10
- package/dist/sequenceFactory.d.ts +2 -2
- package/dist/sequenceFactory.d.ts.map +1 -1
- package/dist/sequenceFactory.js +3 -3
- package/dist/sequenceFactory.js.map +1 -1
- package/dist/sharedNumberSequence.d.ts.map +1 -1
- package/dist/sharedNumberSequence.js.map +1 -1
- package/dist/sharedObjectSequence.d.ts +2 -1
- package/dist/sharedObjectSequence.d.ts.map +1 -1
- package/dist/sharedObjectSequence.js.map +1 -1
- package/dist/sharedSequence.d.ts +1 -1
- package/dist/sharedSequence.d.ts.map +1 -1
- package/dist/sharedSequence.js +3 -3
- package/dist/sharedSequence.js.map +1 -1
- package/dist/sparsematrix.d.ts +4 -3
- package/dist/sparsematrix.d.ts.map +1 -1
- package/dist/sparsematrix.js +6 -6
- package/dist/sparsematrix.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 +10 -10
- package/lib/sequence-deprecated-beta.d.ts +10 -10
- package/lib/sequence-deprecated-public.d.ts +10 -10
- package/lib/sequence-deprecated-untrimmed.d.ts +10 -10
- package/lib/sequenceFactory.d.ts +2 -2
- package/lib/sequenceFactory.d.ts.map +1 -1
- package/lib/sequenceFactory.js +1 -1
- package/lib/sequenceFactory.js.map +1 -1
- package/lib/sharedNumberSequence.d.ts.map +1 -1
- package/lib/sharedNumberSequence.js.map +1 -1
- package/lib/sharedObjectSequence.d.ts +2 -1
- package/lib/sharedObjectSequence.d.ts.map +1 -1
- package/lib/sharedObjectSequence.js.map +1 -1
- package/lib/sharedSequence.d.ts +1 -1
- package/lib/sharedSequence.d.ts.map +1 -1
- package/lib/sharedSequence.js +1 -1
- package/lib/sharedSequence.js.map +1 -1
- package/lib/sparsematrix.d.ts +4 -3
- package/lib/sparsematrix.d.ts.map +1 -1
- package/lib/sparsematrix.js +3 -3
- package/lib/sparsematrix.js.map +1 -1
- package/lib/tsdoc-metadata.json +11 -0
- package/package.json +11 -13
- package/src/packageVersion.ts +1 -1
- package/src/sequenceFactory.ts +3 -2
- package/src/sharedNumberSequence.ts +1 -0
- package/src/sharedObjectSequence.ts +3 -5
- package/src/sharedSequence.ts +1 -1
- package/src/sparsematrix.ts +10 -4
- package/lib/test/sharedNumberSequence.spec.js +0 -48
- package/lib/test/sharedNumberSequence.spec.js.map +0 -1
- package/lib/test/sharedObjectSequence.spec.js +0 -87
- package/lib/test/sharedObjectSequence.spec.js.map +0 -1
- package/lib/test/sparseMatrix.spec.js +0 -293
- package/lib/test/sparseMatrix.spec.js.map +0 -1
|
@@ -3,11 +3,9 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
Serializable,
|
|
10
|
-
} from "@fluidframework/datastore-definitions";
|
|
6
|
+
import { IChannelAttributes, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
|
|
7
|
+
import { Serializable } from "@fluidframework/datastore-definitions/internal";
|
|
8
|
+
|
|
11
9
|
import { SharedObjectSequenceFactory } from "./sequenceFactory.js";
|
|
12
10
|
import { SharedSequence } from "./sharedSequence.js";
|
|
13
11
|
|
package/src/sharedSequence.ts
CHANGED
|
@@ -9,4 +9,4 @@
|
|
|
9
9
|
* @deprecated SharedSequence is not recommended for use and will be removed in an upcoming release.
|
|
10
10
|
* For more info, please see [Github issue 8526](https://github.com/microsoft/FluidFramework/issues/8526)
|
|
11
11
|
*/
|
|
12
|
-
export { SubSequence, SharedSequence, IJSONRunSegment } from "@fluidframework/sequence";
|
|
12
|
+
export { SubSequence, SharedSequence, IJSONRunSegment } from "@fluidframework/sequence/internal";
|
package/src/sparsematrix.ts
CHANGED
|
@@ -4,17 +4,23 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { IFluidHandle } from "@fluidframework/core-interfaces";
|
|
7
|
-
import { assert } from "@fluidframework/core-utils";
|
|
7
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
8
8
|
import {
|
|
9
9
|
IChannelAttributes,
|
|
10
10
|
IChannelFactory,
|
|
11
11
|
IChannelServices,
|
|
12
12
|
IFluidDataStoreRuntime,
|
|
13
|
-
Jsonable,
|
|
14
13
|
} from "@fluidframework/datastore-definitions";
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
14
|
+
import { Jsonable } from "@fluidframework/datastore-definitions/internal";
|
|
15
|
+
import {
|
|
16
|
+
BaseSegment,
|
|
17
|
+
IJSONSegment,
|
|
18
|
+
ISegment,
|
|
19
|
+
PropertySet,
|
|
20
|
+
} from "@fluidframework/merge-tree/internal";
|
|
21
|
+
import { SharedSegmentSequence } from "@fluidframework/sequence/internal";
|
|
17
22
|
import { ISharedObject } from "@fluidframework/shared-object-base";
|
|
23
|
+
|
|
18
24
|
import { pkgVersion } from "./packageVersion.js";
|
|
19
25
|
import { SubSequence } from "./sharedSequence.js";
|
|
20
26
|
|
|
@@ -1,48 +0,0 @@
|
|
|
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 { SharedNumberSequenceFactory } from "../sequenceFactory.js";
|
|
8
|
-
import { SharedNumberSequence } from "../sharedNumberSequence.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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sharedNumberSequence.spec.js","sourceRoot":"","sources":["../../src/test/sharedNumberSequence.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 { MockFluidDataStoreRuntime } from \"@fluidframework/test-runtime-utils\";\nimport { SharedNumberSequenceFactory } from \"../sequenceFactory.js\";\nimport { SharedNumberSequence } from \"../sharedNumberSequence.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"]}
|
|
@@ -1,87 +0,0 @@
|
|
|
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 { SharedObjectSequenceFactory } from "../sequenceFactory.js";
|
|
9
|
-
import { SharedObjectSequence } from "../sharedObjectSequence.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
|
|
@@ -1 +0,0 @@
|
|
|
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 */\n\nimport { strict as assert } from \"assert\";\nimport { IGCTestProvider, runGCTests } from \"@fluid-private/test-dds-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { SharedObjectSequenceFactory } from \"../sequenceFactory.js\";\nimport { SharedObjectSequence } from \"../sharedObjectSequence.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"]}
|
|
@@ -1,293 +0,0 @@
|
|
|
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 { MockContainerRuntimeFactory, MockContainerRuntimeFactoryForReconnection, MockFluidDataStoreRuntime, 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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sparseMatrix.spec.js","sourceRoot":"","sources":["../../src/test/sparseMatrix.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 { IChannelServices } from \"@fluidframework/datastore-definitions\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockContainerRuntimeFactoryForReconnection,\n\tMockContainerRuntimeForReconnection,\n\tMockFluidDataStoreRuntime,\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"]}
|