@fluidframework/merge-tree 2.42.0 → 2.43.0-343119
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/dist/client.d.ts +3 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +8 -11
- package/dist/client.js.map +1 -1
- package/dist/collections/list.d.ts +95 -5
- package/dist/collections/list.d.ts.map +1 -1
- package/dist/collections/list.js +67 -5
- package/dist/collections/list.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/mergeTree.d.ts +9 -9
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +14 -6
- package/dist/mergeTree.js.map +1 -1
- package/dist/revertibles.js +1 -1
- package/dist/revertibles.js.map +1 -1
- package/dist/test/beastTest.spec.js +1 -1
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js +1 -1
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +21 -21
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.js +1 -1
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +1 -0
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +62 -48
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js +1 -0
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js +8 -6
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +25 -25
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/obliterate.spec.js +4 -4
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js +4 -4
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/snapshot.utils.js +1 -1
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +3 -3
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.js +3 -3
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/tracking.spec.js +7 -7
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/lib/client.d.ts +3 -3
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +8 -11
- package/lib/client.js.map +1 -1
- package/lib/collections/list.d.ts +95 -5
- package/lib/collections/list.d.ts.map +1 -1
- package/lib/collections/list.js +67 -5
- package/lib/collections/list.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/mergeTree.d.ts +9 -9
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +14 -6
- package/lib/mergeTree.js.map +1 -1
- package/lib/revertibles.js +1 -1
- package/lib/revertibles.js.map +1 -1
- package/lib/test/beastTest.spec.js +1 -1
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js +1 -1
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +21 -21
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.js +1 -1
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js +1 -0
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +62 -48
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js +1 -0
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +8 -6
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +25 -25
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/obliterate.spec.js +4 -4
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js +4 -4
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/snapshot.utils.js +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js +3 -3
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.js +3 -3
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/tracking.spec.js +7 -7
- package/lib/test/tracking.spec.js.map +1 -1
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/package.json +16 -16
- package/src/client.ts +22 -20
- package/src/collections/list.ts +101 -5
- package/src/index.ts +3 -0
- package/src/mergeTree.ts +29 -23
- package/src/revertibles.ts +1 -1
|
@@ -297,7 +297,9 @@ describe("client.rollback", () => {
|
|
|
297
297
|
client.insertTextLocal(0, "d");
|
|
298
298
|
client.insertTextLocal(0, "abc");
|
|
299
299
|
const segInfo1 = client.getContainingSegment(2);
|
|
300
|
+
(0, node_assert_1.strict)(segInfo1);
|
|
300
301
|
const segInfo3 = client.getContainingSegment(5);
|
|
302
|
+
(0, node_assert_1.strict)(segInfo3);
|
|
301
303
|
const ref1 = client.createLocalReferencePosition(segInfo1.segment, 0, ops_js_1.ReferenceType.Simple, undefined);
|
|
302
304
|
const refSlide = client.createLocalReferencePosition(segInfo1.segment, 2, ops_js_1.ReferenceType.SlideOnRemove, undefined);
|
|
303
305
|
const ref2 = client.createLocalReferencePosition(segInfo3.segment, 1, ops_js_1.ReferenceType.Simple, undefined);
|
|
@@ -307,14 +309,14 @@ describe("client.rollback", () => {
|
|
|
307
309
|
node_assert_1.strict.equal(client.getText(), "abcdefg");
|
|
308
310
|
const segInfo1After = client.getContainingSegment(2);
|
|
309
311
|
node_assert_1.strict.notEqual(segInfo1After, undefined);
|
|
310
|
-
node_assert_1.strict.notEqual(segInfo1After
|
|
311
|
-
(0, node_assert_1.strict)(segInfo1After
|
|
312
|
-
(0, node_assert_1.strict)(segInfo1After
|
|
312
|
+
node_assert_1.strict.notEqual(segInfo1After?.segment?.localRefs, undefined);
|
|
313
|
+
(0, node_assert_1.strict)(segInfo1After?.segment?.localRefs.has(ref1));
|
|
314
|
+
(0, node_assert_1.strict)(segInfo1After?.segment?.localRefs.has(refSlide));
|
|
313
315
|
const segInfo3After = client.getContainingSegment(5);
|
|
314
316
|
node_assert_1.strict.notEqual(segInfo3After, undefined);
|
|
315
|
-
node_assert_1.strict.notEqual(segInfo3After
|
|
316
|
-
(0, node_assert_1.strict)(segInfo3After
|
|
317
|
-
(0, node_assert_1.strict)(segInfo3After
|
|
317
|
+
node_assert_1.strict.notEqual(segInfo3After?.segment?.localRefs, undefined);
|
|
318
|
+
(0, node_assert_1.strict)(segInfo3After?.segment?.localRefs.has(ref2));
|
|
319
|
+
(0, node_assert_1.strict)(segInfo3After?.segment?.localRefs.has(refStay));
|
|
318
320
|
});
|
|
319
321
|
it("Should zamboni rolled back remove", () => {
|
|
320
322
|
client.applyMsg(client.makeOpMessage(client.insertTextLocal(0, "abcde", { color: "red" }), client.getCurrentSeq() + 1, client.getCurrentSeq(), undefined, client.getCurrentSeq()));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.rollback.spec.js","sourceRoot":"","sources":["../../src/test/client.rollback.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\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"node:assert\";\n\nimport {\n\tISegmentPrivate,\n\tMarker,\n\tSegmentGroup,\n\treservedMarkerIdKey,\n} from \"../mergeTreeNodes.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState, TestClientLogger } from \"./testClientLogger.js\";\nimport { validatePartialLengths } from \"./testUtils.js\";\n\ndescribe(\"client.rollback\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.mergeTree.insertSegments(\n\t\t\t0,\n\t\t\t[TextSegment.make(\"\")],\n\t\t\tclient.mergeTree.localPerspective,\n\t\t\tclient.mergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\tundefined,\n\t\t);\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"Should rollback insert on empty string\", () => {\n\t\tclient.insertTextLocal(0, \"abcd\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback insert marker\", () => {\n\t\tclient.insertTextLocal(0, \"abc\");\n\t\tclient.insertMarkerLocal(1, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abc\");\n\t\tconst marker = client.getMarkerFromId(\"markerId\");\n\t\tassert.equal(marker, undefined);\n\t});\n\tit(\"Should rollback insert and validate the partial lengths\", () => {\n\t\tclient.insertTextLocal(0, \"ghi\");\n\t\tclient.insertTextLocal(0, \"def\");\n\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"defghi\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"ghi\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\t});\n\tit(\"Should rollback multiple inserts with split segments\", () => {\n\t\tclient.insertTextLocal(0, \"aefg\");\n\t\tclient.insertTextLocal(1, \"bd\");\n\t\tclient.insertTextLocal(2, \"c\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"aefg\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\t});\n\tit(\"Should zamboni rolled back insert\", () => {\n\t\tclient.insertTextLocal(0, \"aefg\");\n\t\tclient.insertTextLocal(1, \"bcd\");\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback annotate marker\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, undefined);\n\t});\n\tit(\"Should rollback annotate marker overwriting property\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { foo: \"baz\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t});\n\tit(\"Should rollback annotate marker removing property\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\t// eslint-disable-next-line unicorn/no-null\n\t\tclient.annotateMarker(marker, { foo: null });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t});\n\tit(\"Should rollback annotate marker rewrite\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { [reservedMarkerIdKey]: \"markerId\", abc: \"def\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t\tassert.equal(properties?.abc, undefined);\n\t});\n\tit(\"Should rollback annotate rewrite with explicit null\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tabc: \"def\",\n\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\tfoo: null,\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t\tassert.equal(properties?.abc, undefined);\n\t});\n\tit(\"Should rollback annotate causes split string\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.annotateRangeLocal(1, 3, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate over split string\", () => {\n\t\tclient.insertTextLocal(0, \"abfg\");\n\t\tclient.insertTextLocal(1, \"cde\");\n\t\tclient.annotateRangeLocal(1, 6, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 7; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate that later gets split\", () => {\n\t\tclient.insertTextLocal(0, \"abfg\");\n\t\tclient.annotateRangeLocal(0, 4, { foo: \"bar\" });\n\t\tclient.insertTextLocal(1, \"cde\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abfg\");\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotates with multiple previous property sets\", () => {\n\t\tclient.insertTextLocal(0, \"acde\");\n\t\tclient.annotateRangeLocal(0, 3, { foo: \"one\" });\n\t\tclient.annotateRangeLocal(2, 4, { foo: \"two\" });\n\t\tclient.annotateRangeLocal(0, 3, { foo: \"three\" });\n\t\tclient.insertTextLocal(1, \"b\");\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tlet props = client.getPropertiesAtPosition(3);\n\t\tassert(props !== undefined && props.foo === \"two\");\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"three\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < 2; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"one\");\n\t\t}\n\t\tfor (let i = 2; i < 4; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"two\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tprops = client.getPropertiesAtPosition(3);\n\t\tassert(props === undefined || props.foo === undefined);\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"one\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"acde\");\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate with same prop\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tclient.annotateRangeLocal(1, 4, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i === 2) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\t});\n\tit(\"Should zamboni rolled back annotated segment\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(0, \"abcde\", { color: \"red\" }),\n\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback delete on single segment\", () => {\n\t\tclient.insertTextLocal(0, \"abcd\");\n\t\tclient.removeRangeLocal(0, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcd\");\n\t});\n\tit(\"Should rollback delete which causes split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.removeRangeLocal(1, 4);\n\t\tlet deltaEvent = false;\n\t\tclient.on(\"delta\", () => {\n\t\t\tassert.equal(client.getText(), \"abcde\");\n\t\t\tdeltaEvent = true;\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tassert.equal(deltaEvent, true);\n\t});\n\tit(\"Should rollback delete across split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tclient.removeRangeLocal(1, 4);\n\n\t\tlet deltaCount = 0;\n\t\tlet bFound = false;\n\t\tlet cFound = false;\n\t\tlet dFound = false;\n\t\tclient.on(\"delta\", (_opArgs, delta) => {\n\t\t\tdeltaCount++;\n\t\t\tassert.equal(client.getText().length, 2 + deltaCount);\n\t\t\tassert.equal(delta.deltaSegments.length, 1);\n\t\t\tassert.equal(delta.deltaSegments[0].segment.type, TextSegment.type);\n\t\t\tconst text = (delta.deltaSegments[0].segment as TextSegment).toString();\n\t\t\tswitch (text) {\n\t\t\t\tcase \"b\": {\n\t\t\t\t\tbFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"c\": {\n\t\t\t\t\tcFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"d\": {\n\t\t\t\t\tdFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tassert(false, `Unexpected text segment: ${text}`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tassert.equal(deltaCount, 3);\n\t\tassert(bFound);\n\t\tassert(cFound);\n\t\tassert(dFound);\n\t});\n\tit(\"Should rollback delete and update blocks\", () => {\n\t\tconst text = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\";\n\t\tfor (const c of text) {\n\t\t\tclient.insertTextLocal(client.getLength(), c);\n\t\t}\n\t\tclient.removeRangeLocal(1, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\t// The insertion position calculation will be wrong if the blocks aren't updated correctly\n\t\tclient.insertTextLocal(text.length - 1, \"+\");\n\n\t\tconst expectedText = `${text.slice(0, Math.max(0, text.length - 1))}+${\n\t\t\ttext[text.length - 1]\n\t\t}`;\n\t\tassert.equal(client.getText(), expectedText, client.getText());\n\t});\n\tit(\"Should rollback delete and restore local references\", () => {\n\t\tclient.insertTextLocal(0, \"efg\");\n\t\tclient.insertTextLocal(0, \"d\");\n\t\tclient.insertTextLocal(0, \"abc\");\n\t\tconst segInfo1 = client.getContainingSegment<ISegmentPrivate>(2);\n\t\tconst segInfo3 = client.getContainingSegment<ISegmentPrivate>(5);\n\t\tconst ref1 = client.createLocalReferencePosition(\n\t\t\tsegInfo1.segment!,\n\t\t\t0,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\t\tconst refSlide = client.createLocalReferencePosition(\n\t\t\tsegInfo1.segment!,\n\t\t\t2,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tconst ref2 = client.createLocalReferencePosition(\n\t\t\tsegInfo3.segment!,\n\t\t\t1,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\t\tconst refStay = client.createLocalReferencePosition(\n\t\t\tsegInfo3.segment!,\n\t\t\t1,\n\t\t\tReferenceType.StayOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tclient.removeRangeLocal(0, 7);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tconst segInfo1After = client.getContainingSegment<ISegmentPrivate>(2);\n\t\tassert.notEqual(segInfo1After, undefined);\n\t\tassert.notEqual(segInfo1After.segment?.localRefs, undefined);\n\t\tassert(segInfo1After.segment?.localRefs!.has(ref1));\n\t\tassert(segInfo1After.segment?.localRefs!.has(refSlide));\n\t\tconst segInfo3After = client.getContainingSegment<ISegmentPrivate>(5);\n\t\tassert.notEqual(segInfo3After, undefined);\n\t\tassert.notEqual(segInfo3After.segment?.localRefs, undefined);\n\t\tassert(segInfo3After.segment?.localRefs!.has(ref2));\n\t\tassert(segInfo3After.segment?.localRefs!.has(refStay));\n\t});\n\tit(\"Should zamboni rolled back remove\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(0, \"abcde\", { color: \"red\" }),\n\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tclient.removeRangeLocal(1, 4);\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback multiple overlapping edits\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.annotateRangeLocal(2, 5, { foo: \"bar\" });\n\t\tclient.removeRangeLocal(3, 7);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123defg\");\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 5) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback multiple removes across split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.insertTextLocal(4, \"xyz\");\n\t\tclient.removeRangeLocal(2, 5);\n\t\tclient.removeRangeLocal(3, 7);\n\t\tclient.removeRangeLocal(2, 4);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abye\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abyz23de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc1xyz23de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should annotate a previously removed range\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.removeRangeLocal(2, 8);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123defg\");\n\n\t\tclient.annotateRangeLocal(2, 8, { foo: \"bar\" });\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 8) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback overlapping annotates and remove\", () => {\n\t\tclient.insertTextLocal(0, \"abc123defg\");\n\t\tclient.annotateRangeLocal(0, 6, { foo: \"one\" });\n\t\tclient.annotateRangeLocal(5, 10, { foo: \"two\" });\n\t\tclient.removeRangeLocal(4, 8);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getPropertiesAtPosition(4)?.foo, \"one\");\n\t\tassert.equal(client.getPropertiesAtPosition(5)?.foo, \"two\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 0 && i < 6) {\n\t\t\t\tassert.equal(props?.foo, \"one\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should function properly after rollback with local ops\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.removeRangeLocal(1, 5);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tclient.removeRangeLocal(2, 4);\n\t\tassert.equal(client.getText(), \"abefg\");\n\n\t\tclient.annotateRangeLocal(2, 5, { foo: \"bar\" });\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 5) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.insertTextLocal(1, \"123\");\n\t\tassert.equal(client.getText(), \"a123befg\");\n\t});\n\tit(\"Should function properly after rollback with external ops\", () => {\n\t\tconst remoteClient = new TestClient();\n\t\tremoteClient.startOrUpdateCollaboration(\"remoteUser\");\n\t\tconst clients = [client, remoteClient];\n\t\tlet seq = 0;\n\t\tconst logger = new TestClientLogger(clients);\n\t\tlogger.validate();\n\n\t\tlet msg = remoteClient.makeOpMessage(remoteClient.insertTextLocal(0, \"12345\"), ++seq);\n\t\tfor (const c of clients) c.applyMsg(msg);\n\t\tlogger.validate({ baseText: \"12345\" });\n\n\t\tclient.removeRangeLocal(1, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tmsg = remoteClient.makeOpMessage(remoteClient.removeRangeLocal(2, 3), ++seq);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1245\" });\n\n\t\tmsg = remoteClient.makeOpMessage(\n\t\t\tremoteClient.annotateRangeLocal(0, 3, { foo: \"bar\" }),\n\t\t\t++seq,\n\t\t);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1245\" });\n\t\tfor (const c of clients) {\n\t\t\tfor (let i = 0; i < c.getText().length; i++) {\n\t\t\t\tconst props = c.getPropertiesAtPosition(i);\n\t\t\t\tif (i >= 0 && i < 3) {\n\t\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t\t} else {\n\t\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmsg = remoteClient.makeOpMessage(remoteClient.insertTextLocal(3, \"abc\"), ++seq);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"124abc5\" });\n\t});\n\n\tit(\"Conflicting insert with winner split by rollback\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\");\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops = [\n\t\t\tclients.A.makeOpMessage(clients.A.insertTextLocal(0, \"AAAAA\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BBBBB\"), ++seq),\n\t\t];\n\t\tconst rollbackOp = clients.B.insertTextLocal(2, \"RRRRR\");\n\t\tclients.B.rollback(rollbackOp, clients.B.peekPendingSegmentGroups());\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(op);\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"BBBBBAAAAA\" });\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"client.rollback.spec.js","sourceRoot":"","sources":["../../src/test/client.rollback.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\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"node:assert\";\n\nimport {\n\tISegmentPrivate,\n\tMarker,\n\tSegmentGroup,\n\treservedMarkerIdKey,\n} from \"../mergeTreeNodes.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState, TestClientLogger } from \"./testClientLogger.js\";\nimport { validatePartialLengths } from \"./testUtils.js\";\n\ndescribe(\"client.rollback\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.mergeTree.insertSegments(\n\t\t\t0,\n\t\t\t[TextSegment.make(\"\")],\n\t\t\tclient.mergeTree.localPerspective,\n\t\t\tclient.mergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\tundefined,\n\t\t);\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"Should rollback insert on empty string\", () => {\n\t\tclient.insertTextLocal(0, \"abcd\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback insert marker\", () => {\n\t\tclient.insertTextLocal(0, \"abc\");\n\t\tclient.insertMarkerLocal(1, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abc\");\n\t\tconst marker = client.getMarkerFromId(\"markerId\");\n\t\tassert.equal(marker, undefined);\n\t});\n\tit(\"Should rollback insert and validate the partial lengths\", () => {\n\t\tclient.insertTextLocal(0, \"ghi\");\n\t\tclient.insertTextLocal(0, \"def\");\n\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"defghi\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"ghi\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\t});\n\tit(\"Should rollback multiple inserts with split segments\", () => {\n\t\tclient.insertTextLocal(0, \"aefg\");\n\t\tclient.insertTextLocal(1, \"bd\");\n\t\tclient.insertTextLocal(2, \"c\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"aefg\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\t});\n\tit(\"Should zamboni rolled back insert\", () => {\n\t\tclient.insertTextLocal(0, \"aefg\");\n\t\tclient.insertTextLocal(1, \"bcd\");\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback annotate marker\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, undefined);\n\t});\n\tit(\"Should rollback annotate marker overwriting property\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { foo: \"baz\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t});\n\tit(\"Should rollback annotate marker removing property\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\t// eslint-disable-next-line unicorn/no-null\n\t\tclient.annotateMarker(marker, { foo: null });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t});\n\tit(\"Should rollback annotate marker rewrite\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { [reservedMarkerIdKey]: \"markerId\", abc: \"def\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t\tassert.equal(properties?.abc, undefined);\n\t});\n\tit(\"Should rollback annotate rewrite with explicit null\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tabc: \"def\",\n\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\tfoo: null,\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t\tassert.equal(properties?.abc, undefined);\n\t});\n\tit(\"Should rollback annotate causes split string\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.annotateRangeLocal(1, 3, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate over split string\", () => {\n\t\tclient.insertTextLocal(0, \"abfg\");\n\t\tclient.insertTextLocal(1, \"cde\");\n\t\tclient.annotateRangeLocal(1, 6, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 7; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate that later gets split\", () => {\n\t\tclient.insertTextLocal(0, \"abfg\");\n\t\tclient.annotateRangeLocal(0, 4, { foo: \"bar\" });\n\t\tclient.insertTextLocal(1, \"cde\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abfg\");\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotates with multiple previous property sets\", () => {\n\t\tclient.insertTextLocal(0, \"acde\");\n\t\tclient.annotateRangeLocal(0, 3, { foo: \"one\" });\n\t\tclient.annotateRangeLocal(2, 4, { foo: \"two\" });\n\t\tclient.annotateRangeLocal(0, 3, { foo: \"three\" });\n\t\tclient.insertTextLocal(1, \"b\");\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tlet props = client.getPropertiesAtPosition(3);\n\t\tassert(props !== undefined && props.foo === \"two\");\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"three\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < 2; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"one\");\n\t\t}\n\t\tfor (let i = 2; i < 4; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"two\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tprops = client.getPropertiesAtPosition(3);\n\t\tassert(props === undefined || props.foo === undefined);\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"one\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"acde\");\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate with same prop\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tclient.annotateRangeLocal(1, 4, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i === 2) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\t});\n\tit(\"Should zamboni rolled back annotated segment\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(0, \"abcde\", { color: \"red\" }),\n\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback delete on single segment\", () => {\n\t\tclient.insertTextLocal(0, \"abcd\");\n\t\tclient.removeRangeLocal(0, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcd\");\n\t});\n\tit(\"Should rollback delete which causes split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.removeRangeLocal(1, 4);\n\t\tlet deltaEvent = false;\n\t\tclient.on(\"delta\", () => {\n\t\t\tassert.equal(client.getText(), \"abcde\");\n\t\t\tdeltaEvent = true;\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tassert.equal(deltaEvent, true);\n\t});\n\tit(\"Should rollback delete across split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tclient.removeRangeLocal(1, 4);\n\n\t\tlet deltaCount = 0;\n\t\tlet bFound = false;\n\t\tlet cFound = false;\n\t\tlet dFound = false;\n\t\tclient.on(\"delta\", (_opArgs, delta) => {\n\t\t\tdeltaCount++;\n\t\t\tassert.equal(client.getText().length, 2 + deltaCount);\n\t\t\tassert.equal(delta.deltaSegments.length, 1);\n\t\t\tassert.equal(delta.deltaSegments[0].segment.type, TextSegment.type);\n\t\t\tconst text = (delta.deltaSegments[0].segment as TextSegment).toString();\n\t\t\tswitch (text) {\n\t\t\t\tcase \"b\": {\n\t\t\t\t\tbFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"c\": {\n\t\t\t\t\tcFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"d\": {\n\t\t\t\t\tdFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tassert(false, `Unexpected text segment: ${text}`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tassert.equal(deltaCount, 3);\n\t\tassert(bFound);\n\t\tassert(cFound);\n\t\tassert(dFound);\n\t});\n\tit(\"Should rollback delete and update blocks\", () => {\n\t\tconst text = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\";\n\t\tfor (const c of text) {\n\t\t\tclient.insertTextLocal(client.getLength(), c);\n\t\t}\n\t\tclient.removeRangeLocal(1, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\t// The insertion position calculation will be wrong if the blocks aren't updated correctly\n\t\tclient.insertTextLocal(text.length - 1, \"+\");\n\n\t\tconst expectedText = `${text.slice(0, Math.max(0, text.length - 1))}+${\n\t\t\ttext[text.length - 1]\n\t\t}`;\n\t\tassert.equal(client.getText(), expectedText, client.getText());\n\t});\n\tit(\"Should rollback delete and restore local references\", () => {\n\t\tclient.insertTextLocal(0, \"efg\");\n\t\tclient.insertTextLocal(0, \"d\");\n\t\tclient.insertTextLocal(0, \"abc\");\n\t\tconst segInfo1 = client.getContainingSegment<ISegmentPrivate>(2);\n\t\tassert(segInfo1);\n\n\t\tconst segInfo3 = client.getContainingSegment<ISegmentPrivate>(5);\n\t\tassert(segInfo3);\n\n\t\tconst ref1 = client.createLocalReferencePosition(\n\t\t\tsegInfo1.segment,\n\t\t\t0,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\t\tconst refSlide = client.createLocalReferencePosition(\n\t\t\tsegInfo1.segment,\n\t\t\t2,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tconst ref2 = client.createLocalReferencePosition(\n\t\t\tsegInfo3.segment,\n\t\t\t1,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\t\tconst refStay = client.createLocalReferencePosition(\n\t\t\tsegInfo3.segment,\n\t\t\t1,\n\t\t\tReferenceType.StayOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tclient.removeRangeLocal(0, 7);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tconst segInfo1After = client.getContainingSegment<ISegmentPrivate>(2);\n\t\tassert.notEqual(segInfo1After, undefined);\n\t\tassert.notEqual(segInfo1After?.segment?.localRefs, undefined);\n\t\tassert(segInfo1After?.segment?.localRefs!.has(ref1));\n\t\tassert(segInfo1After?.segment?.localRefs!.has(refSlide));\n\t\tconst segInfo3After = client.getContainingSegment<ISegmentPrivate>(5);\n\t\tassert.notEqual(segInfo3After, undefined);\n\t\tassert.notEqual(segInfo3After?.segment?.localRefs, undefined);\n\t\tassert(segInfo3After?.segment?.localRefs!.has(ref2));\n\t\tassert(segInfo3After?.segment?.localRefs!.has(refStay));\n\t});\n\tit(\"Should zamboni rolled back remove\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(0, \"abcde\", { color: \"red\" }),\n\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tclient.removeRangeLocal(1, 4);\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback multiple overlapping edits\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.annotateRangeLocal(2, 5, { foo: \"bar\" });\n\t\tclient.removeRangeLocal(3, 7);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123defg\");\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 5) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback multiple removes across split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.insertTextLocal(4, \"xyz\");\n\t\tclient.removeRangeLocal(2, 5);\n\t\tclient.removeRangeLocal(3, 7);\n\t\tclient.removeRangeLocal(2, 4);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abye\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abyz23de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc1xyz23de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should annotate a previously removed range\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.removeRangeLocal(2, 8);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123defg\");\n\n\t\tclient.annotateRangeLocal(2, 8, { foo: \"bar\" });\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 8) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback overlapping annotates and remove\", () => {\n\t\tclient.insertTextLocal(0, \"abc123defg\");\n\t\tclient.annotateRangeLocal(0, 6, { foo: \"one\" });\n\t\tclient.annotateRangeLocal(5, 10, { foo: \"two\" });\n\t\tclient.removeRangeLocal(4, 8);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getPropertiesAtPosition(4)?.foo, \"one\");\n\t\tassert.equal(client.getPropertiesAtPosition(5)?.foo, \"two\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 0 && i < 6) {\n\t\t\t\tassert.equal(props?.foo, \"one\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should function properly after rollback with local ops\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.removeRangeLocal(1, 5);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tclient.removeRangeLocal(2, 4);\n\t\tassert.equal(client.getText(), \"abefg\");\n\n\t\tclient.annotateRangeLocal(2, 5, { foo: \"bar\" });\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 5) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.insertTextLocal(1, \"123\");\n\t\tassert.equal(client.getText(), \"a123befg\");\n\t});\n\tit(\"Should function properly after rollback with external ops\", () => {\n\t\tconst remoteClient = new TestClient();\n\t\tremoteClient.startOrUpdateCollaboration(\"remoteUser\");\n\t\tconst clients = [client, remoteClient];\n\t\tlet seq = 0;\n\t\tconst logger = new TestClientLogger(clients);\n\t\tlogger.validate();\n\n\t\tlet msg = remoteClient.makeOpMessage(remoteClient.insertTextLocal(0, \"12345\"), ++seq);\n\t\tfor (const c of clients) c.applyMsg(msg);\n\t\tlogger.validate({ baseText: \"12345\" });\n\n\t\tclient.removeRangeLocal(1, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tmsg = remoteClient.makeOpMessage(remoteClient.removeRangeLocal(2, 3), ++seq);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1245\" });\n\n\t\tmsg = remoteClient.makeOpMessage(\n\t\t\tremoteClient.annotateRangeLocal(0, 3, { foo: \"bar\" }),\n\t\t\t++seq,\n\t\t);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1245\" });\n\t\tfor (const c of clients) {\n\t\t\tfor (let i = 0; i < c.getText().length; i++) {\n\t\t\t\tconst props = c.getPropertiesAtPosition(i);\n\t\t\t\tif (i >= 0 && i < 3) {\n\t\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t\t} else {\n\t\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmsg = remoteClient.makeOpMessage(remoteClient.insertTextLocal(3, \"abc\"), ++seq);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"124abc5\" });\n\t});\n\n\tit(\"Conflicting insert with winner split by rollback\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\");\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops = [\n\t\t\tclients.A.makeOpMessage(clients.A.insertTextLocal(0, \"AAAAA\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BBBBB\"), ++seq),\n\t\t];\n\t\tconst rollbackOp = clients.B.insertTextLocal(2, \"RRRRR\");\n\t\tclients.B.rollback(rollbackOp, clients.B.peekPendingSegmentGroups());\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(op);\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"BBBBBAAAAA\" });\n\t});\n});\n"]}
|
|
@@ -42,7 +42,7 @@ describe("MergeTree", () => {
|
|
|
42
42
|
props: { propertySource: "remote" },
|
|
43
43
|
}, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: currentSequenceNumber + 1 }), undefined);
|
|
44
44
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
45
|
-
const segment = segmentInfo
|
|
45
|
+
const segment = segmentInfo?.segment;
|
|
46
46
|
node_assert_1.strict.equal(segment?.properties?.propertySource, "remote");
|
|
47
47
|
});
|
|
48
48
|
it("local", () => {
|
|
@@ -50,7 +50,7 @@ describe("MergeTree", () => {
|
|
|
50
50
|
props: { propertySource: "local" },
|
|
51
51
|
}, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
|
|
52
52
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
53
|
-
const segment = segmentInfo
|
|
53
|
+
const segment = segmentInfo?.segment;
|
|
54
54
|
node_assert_1.strict.equal(segment.properties?.propertySource, "local");
|
|
55
55
|
});
|
|
56
56
|
});
|
|
@@ -69,7 +69,7 @@ describe("MergeTree", () => {
|
|
|
69
69
|
});
|
|
70
70
|
it("unsequenced local", () => {
|
|
71
71
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
72
|
-
const segment = segmentInfo
|
|
72
|
+
const segment = segmentInfo?.segment;
|
|
73
73
|
node_assert_1.strict.equal(segment.properties?.propertySource, "local");
|
|
74
74
|
});
|
|
75
75
|
it("unsequenced local after unsequenced local", () => {
|
|
@@ -77,7 +77,7 @@ describe("MergeTree", () => {
|
|
|
77
77
|
props: { secondProperty: "local" },
|
|
78
78
|
}, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
|
|
79
79
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
80
|
-
const segment = segmentInfo
|
|
80
|
+
const segment = segmentInfo?.segment;
|
|
81
81
|
node_assert_1.strict.equal(segment.properties?.secondProperty, "local");
|
|
82
82
|
});
|
|
83
83
|
it("unsequenced local split", () => {
|
|
@@ -85,7 +85,7 @@ describe("MergeTree", () => {
|
|
|
85
85
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
86
86
|
const splitSegment = splitAt(mergeTree, splitPos);
|
|
87
87
|
(0, segmentInfos_js_1.assertMergeNode)(splitSegment);
|
|
88
|
-
node_assert_1.strict.notEqual(segmentInfo
|
|
88
|
+
node_assert_1.strict.notEqual(segmentInfo?.segment?.ordinal, splitSegment.ordinal);
|
|
89
89
|
node_assert_1.strict.equal(splitSegment.properties?.propertySource, "local");
|
|
90
90
|
});
|
|
91
91
|
it("unsequenced local after unsequenced local split", () => {
|
|
@@ -102,9 +102,9 @@ describe("MergeTree", () => {
|
|
|
102
102
|
};
|
|
103
103
|
mergeTree.annotateRange(splitPos, annotateEnd, splitOnlyProps, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
|
|
104
104
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
105
|
-
const segment = segmentInfo
|
|
105
|
+
const segment = segmentInfo?.segment;
|
|
106
106
|
const splitSegmentInfo = mergeTree.getContainingSegment(splitPos, mergeTree.localPerspective);
|
|
107
|
-
const splitSegment = splitSegmentInfo
|
|
107
|
+
const splitSegment = splitSegmentInfo?.segment;
|
|
108
108
|
node_assert_1.strict.equal(segment.segmentGroups?.size, 2);
|
|
109
109
|
node_assert_1.strict.equal(segment.properties?.propertySource, "local");
|
|
110
110
|
node_assert_1.strict.equal(segment.properties?.secondChange, 1);
|
|
@@ -176,7 +176,7 @@ describe("MergeTree", () => {
|
|
|
176
176
|
props: { propertySource: "remote", remoteProperty: 1 },
|
|
177
177
|
}, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
|
|
178
178
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
179
|
-
const segment = segmentInfo
|
|
179
|
+
const segment = segmentInfo?.segment;
|
|
180
180
|
node_assert_1.strict.equal(segment.segmentGroups?.size, 1);
|
|
181
181
|
node_assert_1.strict.equal(segment.properties?.propertySource, "local");
|
|
182
182
|
node_assert_1.strict.equal(segment.properties?.remoteProperty, 1);
|
|
@@ -194,7 +194,7 @@ describe("MergeTree", () => {
|
|
|
194
194
|
},
|
|
195
195
|
});
|
|
196
196
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
197
|
-
const segment = segmentInfo
|
|
197
|
+
const segment = segmentInfo?.segment;
|
|
198
198
|
node_assert_1.strict.equal(segment.segmentGroups?.size, 0);
|
|
199
199
|
node_assert_1.strict.equal(segment.properties?.propertySource, "local");
|
|
200
200
|
});
|
|
@@ -214,14 +214,14 @@ describe("MergeTree", () => {
|
|
|
214
214
|
props: { propertySource: "remote", remoteProperty: 1 },
|
|
215
215
|
}, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
|
|
216
216
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
217
|
-
const segment = segmentInfo
|
|
217
|
+
const segment = segmentInfo?.segment;
|
|
218
218
|
node_assert_1.strict.equal(segment.segmentGroups?.size, 0);
|
|
219
219
|
node_assert_1.strict.equal(segment.properties?.propertySource, "remote");
|
|
220
220
|
node_assert_1.strict.equal(segment.properties?.remoteProperty, 1);
|
|
221
221
|
});
|
|
222
222
|
it("three local changes", () => {
|
|
223
223
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
224
|
-
const segment = segmentInfo
|
|
224
|
+
const segment = segmentInfo?.segment;
|
|
225
225
|
node_assert_1.strict.equal(segment.properties?.propertySource, "local");
|
|
226
226
|
const props2 = {
|
|
227
227
|
props: { propertySource: "local2", secondSource: 1 },
|
|
@@ -300,7 +300,7 @@ describe("MergeTree", () => {
|
|
|
300
300
|
props: { propertySource: "remote", remoteOnly: 1, secondSource: "remote" },
|
|
301
301
|
}, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
|
|
302
302
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
303
|
-
const segment = segmentInfo
|
|
303
|
+
const segment = segmentInfo?.segment;
|
|
304
304
|
node_assert_1.strict.equal(segment.properties?.remoteOnly, 1);
|
|
305
305
|
node_assert_1.strict.equal(segment.properties?.propertySource, "remote");
|
|
306
306
|
node_assert_1.strict.equal(segment.properties?.secondSource, "local2");
|
|
@@ -312,11 +312,11 @@ describe("MergeTree", () => {
|
|
|
312
312
|
props: { propertySource: "remote", remoteProperty: 1 },
|
|
313
313
|
}, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
|
|
314
314
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
315
|
-
(0, node_assert_1.strict)(segmentInfo
|
|
315
|
+
(0, node_assert_1.strict)(segmentInfo?.segment?.segmentGroups?.size !== 0);
|
|
316
316
|
});
|
|
317
317
|
it("remote only", () => {
|
|
318
318
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
319
|
-
const segment = segmentInfo
|
|
319
|
+
const segment = segmentInfo?.segment;
|
|
320
320
|
node_assert_1.strict.equal(segment.properties?.propertySource, "remote");
|
|
321
321
|
node_assert_1.strict.equal(segment.properties?.remoteProperty, 1);
|
|
322
322
|
});
|
|
@@ -325,7 +325,7 @@ describe("MergeTree", () => {
|
|
|
325
325
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
326
326
|
const splitSegment = splitAt(mergeTree, annotateStart + 1);
|
|
327
327
|
(0, segmentInfos_js_1.assertMergeNode)(splitSegment);
|
|
328
|
-
node_assert_1.strict.notEqual(segmentInfo
|
|
328
|
+
node_assert_1.strict.notEqual(segmentInfo?.segment?.ordinal, splitSegment.ordinal);
|
|
329
329
|
node_assert_1.strict.equal(splitSegment.properties?.propertySource, "remote");
|
|
330
330
|
node_assert_1.strict.equal(splitSegment.properties?.remoteProperty, 1);
|
|
331
331
|
});
|
|
@@ -334,7 +334,7 @@ describe("MergeTree", () => {
|
|
|
334
334
|
props: { propertySource: "local" },
|
|
335
335
|
}, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
|
|
336
336
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
337
|
-
const segment = segmentInfo
|
|
337
|
+
const segment = segmentInfo?.segment;
|
|
338
338
|
node_assert_1.strict.equal(segment.properties?.propertySource, "local");
|
|
339
339
|
node_assert_1.strict.equal(segment.properties?.remoteProperty, 1);
|
|
340
340
|
});
|
|
@@ -343,9 +343,9 @@ describe("MergeTree", () => {
|
|
|
343
343
|
props: { propertySource: "local" },
|
|
344
344
|
};
|
|
345
345
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
346
|
-
(0, node_assert_1.strict)(segmentInfo
|
|
346
|
+
(0, node_assert_1.strict)(segmentInfo?.segment?.segmentGroups?.empty !== false);
|
|
347
347
|
mergeTree.annotateRange(annotateStart, annotateEnd, props, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
|
|
348
|
-
node_assert_1.strict.equal(segmentInfo
|
|
348
|
+
node_assert_1.strict.equal(segmentInfo?.segment?.segmentGroups?.size, 1);
|
|
349
349
|
mergeTree.ackOp({
|
|
350
350
|
op: {
|
|
351
351
|
pos1: annotateStart,
|
|
@@ -357,9 +357,9 @@ describe("MergeTree", () => {
|
|
|
357
357
|
sequenceNumber: ++currentSequenceNumber,
|
|
358
358
|
},
|
|
359
359
|
});
|
|
360
|
-
(0, node_assert_1.strict)(segmentInfo
|
|
361
|
-
node_assert_1.strict.equal(segmentInfo
|
|
362
|
-
node_assert_1.strict.equal(segmentInfo
|
|
360
|
+
(0, node_assert_1.strict)(segmentInfo?.segment?.segmentGroups?.empty);
|
|
361
|
+
node_assert_1.strict.equal(segmentInfo?.segment?.properties?.propertySource, "local");
|
|
362
|
+
node_assert_1.strict.equal(segmentInfo?.segment?.properties?.remoteProperty, 1);
|
|
363
363
|
});
|
|
364
364
|
});
|
|
365
365
|
describe("local with rewrite first", () => {
|
|
@@ -374,7 +374,7 @@ describe("MergeTree", () => {
|
|
|
374
374
|
props: { propertySource: "local2", secondProperty: "local" },
|
|
375
375
|
}, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
|
|
376
376
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
377
|
-
const segment = segmentInfo
|
|
377
|
+
const segment = segmentInfo?.segment;
|
|
378
378
|
node_assert_1.strict.equal(segment.properties?.propertySource, "local2");
|
|
379
379
|
node_assert_1.strict.equal(segment.properties?.secondProperty, "local");
|
|
380
380
|
});
|
|
@@ -383,7 +383,7 @@ describe("MergeTree", () => {
|
|
|
383
383
|
props: { propertySource: "remote", remoteProperty: 1 },
|
|
384
384
|
}, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
|
|
385
385
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
386
|
-
const segment = segmentInfo
|
|
386
|
+
const segment = segmentInfo?.segment;
|
|
387
387
|
node_assert_1.strict.equal(segment.segmentGroups?.size, 1);
|
|
388
388
|
node_assert_1.strict.equal(segment.properties?.propertySource, "local");
|
|
389
389
|
node_assert_1.strict.equal(segment.properties?.remoteProperty, 1);
|
|
@@ -404,7 +404,7 @@ describe("MergeTree", () => {
|
|
|
404
404
|
props: { propertySource: "remote", remoteProperty: 1 },
|
|
405
405
|
}, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
|
|
406
406
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
407
|
-
const segment = segmentInfo
|
|
407
|
+
const segment = segmentInfo?.segment;
|
|
408
408
|
node_assert_1.strict.equal(segment.segmentGroups?.size, 0);
|
|
409
409
|
node_assert_1.strict.equal(segment.properties?.propertySource, "remote");
|
|
410
410
|
node_assert_1.strict.equal(segment.properties?.remoteProperty, 1);
|
|
@@ -428,7 +428,7 @@ describe("MergeTree", () => {
|
|
|
428
428
|
props: { propertySource: "remote", remoteOnly: 1, secondSource: "remote" },
|
|
429
429
|
}, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
|
|
430
430
|
const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
|
|
431
|
-
const segment = segmentInfo
|
|
431
|
+
const segment = segmentInfo?.segment;
|
|
432
432
|
node_assert_1.strict.equal(segment.properties?.remoteOnly, 1);
|
|
433
433
|
node_assert_1.strict.equal(segment.properties?.propertySource, "remote");
|
|
434
434
|
node_assert_1.strict.equal(segment.properties?.secondSource, "local2");
|