@fluidframework/merge-tree 2.4.0-297385 → 2.4.0-299374
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.map +1 -1
- package/dist/client.js +3 -3
- package/dist/client.js.map +1 -1
- package/dist/collections/list.d.ts +1 -0
- package/dist/collections/list.d.ts.map +1 -1
- package/dist/collections/list.js +4 -1
- package/dist/collections/list.js.map +1 -1
- package/dist/mergeTree.d.ts +2 -2
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +8 -8
- package/dist/mergeTree.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +3 -3
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +76 -0
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.conflictFarm.spec.js +17 -4
- package/dist/test/client.conflictFarm.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +2 -2
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts +1 -0
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +22 -1
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/obliterate.partialLength.spec.js +0 -4
- package/dist/test/obliterate.partialLength.spec.js.map +1 -1
- package/dist/test/obliterate.spec.js +0 -6
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/testUtils.d.ts +2 -3
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +4 -4
- package/dist/test/testUtils.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +3 -3
- package/lib/client.js.map +1 -1
- package/lib/collections/list.d.ts +1 -0
- package/lib/collections/list.d.ts.map +1 -1
- package/lib/collections/list.js +4 -1
- package/lib/collections/list.js.map +1 -1
- package/lib/mergeTree.d.ts +2 -2
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +8 -8
- package/lib/mergeTree.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +3 -3
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +76 -0
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.conflictFarm.spec.js +18 -5
- package/lib/test/client.conflictFarm.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js +2 -2
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts +1 -0
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +20 -0
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/obliterate.partialLength.spec.js +0 -4
- package/lib/test/obliterate.partialLength.spec.js.map +1 -1
- package/lib/test/obliterate.spec.js +0 -6
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/testUtils.d.ts +2 -3
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +4 -4
- package/lib/test/testUtils.js.map +1 -1
- package/package.json +18 -19
- package/src/client.ts +0 -3
- package/src/collections/list.ts +6 -0
- package/src/mergeTree.ts +3 -9
|
@@ -8,6 +8,7 @@ import { UnassignedSequenceNumber } from "../constants.js";
|
|
|
8
8
|
import { walkAllChildSegments } from "../mergeTreeNodeWalk.js";
|
|
9
9
|
import { TrackingGroup } from "../mergeTreeTracking.js";
|
|
10
10
|
import { MergeTreeDeltaType, ReferenceType } from "../ops.js";
|
|
11
|
+
import { Side } from "../sequencePlace.js";
|
|
11
12
|
import { TestClient } from "./testClient.js";
|
|
12
13
|
import { TestClientLogger, createClientsAtInitialState } from "./testClientLogger.js";
|
|
13
14
|
describe("client.applyMsg", () => {
|
|
@@ -521,6 +522,81 @@ describe("client.applyMsg", () => {
|
|
|
521
522
|
}
|
|
522
523
|
logger.validate({ baseText: "DDDDDDcbD" });
|
|
523
524
|
});
|
|
525
|
+
describe("obliterate", () => {
|
|
526
|
+
// op types: 0) insert 1) remove 2) annotate
|
|
527
|
+
// Clients: 3 Ops: 3 Round: 86
|
|
528
|
+
// op | client A | op | client B | op | client C
|
|
529
|
+
// | BBB-C- | | BBB-C- | | BBB-C-
|
|
530
|
+
// | BBB-C- | L:558:B0@3 | BBB__-C- | | BBB-C-
|
|
531
|
+
// | | | BB | |
|
|
532
|
+
// | BBB-C- | | BBB__-C- | L:558:C4@2,4 | BB_-_-
|
|
533
|
+
// | | | BB | | - -
|
|
534
|
+
// | BBB-C- | | BBB__-C- | L:558:C4@1,2 | B__-_-
|
|
535
|
+
// | | | BB | | -- -
|
|
536
|
+
// 1:0:B0@3 | BBBBB-C- | 1:0:B0@3 | BBBBB-C- | 1:0:B0@3 | B__BB-_-
|
|
537
|
+
// | | | | | -- -
|
|
538
|
+
// 2:0:C4@2,4 | BB---- | 2:0:C4@2,4 | BB---- | 2:0:C4@2,4 | B_-BB-
|
|
539
|
+
// | | | | | -
|
|
540
|
+
// 3:0:C4@1,2 | B----- | 3:0:C4@1,2 | B----- | 3:0:C4@1,2 | B--BB-
|
|
541
|
+
it("sided obliterate regression test", () => {
|
|
542
|
+
const clients = createClientsAtInitialState({
|
|
543
|
+
initialState: "0123",
|
|
544
|
+
options: { mergeTreeEnableObliterate: true, mergeTreeEnableSidedObliterate: true },
|
|
545
|
+
}, "A", "B", "C");
|
|
546
|
+
let seq = 0;
|
|
547
|
+
const logger = new TestClientLogger(clients.all);
|
|
548
|
+
const ops = [];
|
|
549
|
+
ops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(0, clients.B.getLength()), ++seq), clients.B.makeOpMessage(clients.B.insertTextLocal(0, "BBB"), ++seq), clients.C.makeOpMessage(clients.C.insertTextLocal(2, "C"), ++seq));
|
|
550
|
+
for (const op of ops.splice(0))
|
|
551
|
+
for (const c of clients.all)
|
|
552
|
+
c.applyMsg(op);
|
|
553
|
+
ops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(3, "BB"), ++seq), clients.C.makeOpMessage(clients.C.obliterateRangeLocal({ pos: 2, side: Side.Before }, { pos: 3, side: Side.After }), ++seq), clients.C.makeOpMessage(clients.C.obliterateRangeLocal({ pos: 1, side: Side.Before }, { pos: 1, side: Side.After }), ++seq));
|
|
554
|
+
for (const op of ops.splice(0))
|
|
555
|
+
for (const c of clients.all) {
|
|
556
|
+
c.applyMsg(op);
|
|
557
|
+
}
|
|
558
|
+
logger.validate({ baseText: "B" });
|
|
559
|
+
});
|
|
560
|
+
// MergeTree insert failed:
|
|
561
|
+
// Clients: 2 Ops: 8 Round: 4
|
|
562
|
+
// op | client A | op | client B
|
|
563
|
+
// | BBBBB BBB- | | BBBBB BBB-
|
|
564
|
+
// | BBBBB BBB- | L:88:B2@1,7 | BBBBB BBB-
|
|
565
|
+
// | BBBBB BBB- | L:88:B4@6,8 | BBBBB B__-
|
|
566
|
+
// | | | --
|
|
567
|
+
// | BBBBB BBB- | L:88:B0@5 | BBBBB _B__-
|
|
568
|
+
// | | | B --
|
|
569
|
+
// | BBBBB BBB- | L:88:B0@2 | BB_BBB _B__-
|
|
570
|
+
// | | | B B --
|
|
571
|
+
// | BBBBB BBB- | L:88:B1@4,6 | BB_B__ _B__-
|
|
572
|
+
// | | | B -- B --
|
|
573
|
+
// | BBBBB BBB- | L:88:B0@4 | BB_B___ _B__-
|
|
574
|
+
// | | | B B-- B --
|
|
575
|
+
// | BBBBB BBB- | L:88:B0@4 | BB_B ____ _B__-
|
|
576
|
+
// | | | B BB-- B --
|
|
577
|
+
// | BBBBB BBB- | L:88:B2@0,7 | BB_B ____ _B__-
|
|
578
|
+
// | | | B BB-- B --
|
|
579
|
+
// 89:88:B2@1,7 | BBBBB BBB- | 89:88:B2@1,7 | BB_B ____ _B__-
|
|
580
|
+
// | | | B BB-- B --
|
|
581
|
+
// 90:88:B4@6,8 | B------- | 90:88:B4@6,8 | BB_B ____ _B--
|
|
582
|
+
// | | | B BB-- B
|
|
583
|
+
it("obliterate with mergeTree insert fails", () => {
|
|
584
|
+
const clients = createClientsAtInitialState({
|
|
585
|
+
initialState: "BBBBB BBB",
|
|
586
|
+
options: { mergeTreeEnableObliterate: true, mergeTreeEnableSidedObliterate: true },
|
|
587
|
+
}, "A", "B");
|
|
588
|
+
let seq = 0;
|
|
589
|
+
const logger = new TestClientLogger(clients.all);
|
|
590
|
+
const ops = [];
|
|
591
|
+
const b = clients.B;
|
|
592
|
+
ops.push(b.makeOpMessage(b.annotateRangeLocal(1, 7, { foo: 1 }), ++seq), b.makeOpMessage(b.obliterateRangeLocal({ pos: 6, side: Side.Before }, { pos: 8, side: Side.Before }), ++seq), b.makeOpMessage(b.insertTextLocal(5, "B"), ++seq), b.makeOpMessage(b.insertTextLocal(2, "B"), ++seq), b.makeOpMessage(b.removeRangeLocal(4, 6), ++seq), b.makeOpMessage(b.insertTextLocal(4, "B"), ++seq), b.makeOpMessage(b.annotateRangeLocal(0, 7, { bar: 2 }), ++seq));
|
|
593
|
+
for (const op of ops.splice(0))
|
|
594
|
+
for (const c of clients.all) {
|
|
595
|
+
c.applyMsg(op);
|
|
596
|
+
}
|
|
597
|
+
logger.validate({ baseText: "BBBBBB B" });
|
|
598
|
+
});
|
|
599
|
+
});
|
|
524
600
|
describe("updates minSeq", () => {
|
|
525
601
|
it("to the message's minSeq with no ops in flight", () => {
|
|
526
602
|
const localClient = new TestClient();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.applyMsg.spec.js","sourceRoot":"","sources":["../../src/test/client.applyMsg.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 { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { ISegment, ISegmentLeaf, SegmentGroup } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup } from \"../mergeTreeTracking.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\ndescribe(\"client.applyMsg\", () => {\n\tconst localUserLongId = \"localUser\";\n\tconst remoteUserLongId = \"remoteUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.insertTextLocal(0, \"hello world\");\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"Interleaved inserts, annotates, and deletes\", () => {\n\t\tconst changes = new Map<\n\t\t\tnumber,\n\t\t\t{ msg: ISequencedDocumentMessage; segmentGroup?: SegmentGroup | SegmentGroup[] }\n\t\t>();\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst len = client.getLength();\n\t\t\tconst pos1 = Math.floor(len / 2);\n\t\t\tconst imod6 = i % 6;\n\t\t\tswitch (imod6) {\n\t\t\t\tcase 0:\n\t\t\t\tcase 5: {\n\t\t\t\t\tconst pos2 = Math.max(Math.floor((len - pos1) / 4) - imod6 + pos1, pos1 + 1);\n\t\t\t\t\tconst msg = client.makeOpMessage(client.removeRangeLocal(pos1, pos2), i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 1:\n\t\t\t\tcase 4: {\n\t\t\t\t\tconst str = `${i}`.repeat(imod6 + 5);\n\t\t\t\t\tconst msg = client.makeOpMessage(client.insertTextLocal(pos1, str), i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 2:\n\t\t\t\tcase 3: {\n\t\t\t\t\tconst pos2 = Math.max(Math.floor((len - pos1) / 3) - imod6 + pos1, pos1 + 1);\n\t\t\t\t\tconst op = client.annotateRangeLocal(pos1, pos2, {\n\t\t\t\t\t\tfoo: `${i}`,\n\t\t\t\t\t});\n\t\t\t\t\tconst msg = client.makeOpMessage(op, i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tassert.fail(\"all cases should be handled\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst msg = changes.get(i)!.msg;\n\t\t\tclient.applyMsg(msg);\n\t\t\tconst segmentGroup = changes.get(i)?.segmentGroup;\n\t\t\tassert(\n\t\t\t\t!Array.isArray(segmentGroup) && segmentGroup !== undefined,\n\t\t\t\t\"segment group should be defined and not an array\",\n\t\t\t);\n\t\t\tfor (const seg of segmentGroup.segments) {\n\t\t\t\tswitch (i % 6) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\tcase 5: {\n\t\t\t\t\t\tassert.equal(\n\t\t\t\t\t\t\tseg.removedSeq,\n\t\t\t\t\t\t\tmsg.sequenceNumber,\n\t\t\t\t\t\t\t\"removed segment has unexpected id\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\tcase 4: {\n\t\t\t\t\t\tassert.equal(seg.seq, msg.sequenceNumber, \"inserted segment has unexpected id\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(i);\n\n\t\t\tassert.notEqual(\n\t\t\t\tsegmentInfo.segment?.seq,\n\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\"all segments should be acked\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsegmentInfo.segment?.segmentGroups?.empty !== false,\n\t\t\t\t\"there should be no outstanding segmentGroups\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"insertTextLocal\", () => {\n\t\tconst op = client.insertTextLocal(0, \"abc\");\n\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tassert.equal(segmentInfo.segment?.seq, UnassignedSequenceNumber);\n\n\t\tclient.applyMsg(client.makeOpMessage(op, 17));\n\n\t\tassert.equal(segmentInfo.segment?.seq, 17);\n\t});\n\n\tit(\"removeRangeLocal\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tconst removeOp = client.removeRangeLocal(0, 1);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 17));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, 17);\n\t});\n\n\tit(\"annotateSegmentLocal\", () => {\n\t\tconst props = {\n\t\t\tfoo: \"bar\",\n\t\t};\n\t\tconst op = client.annotateRangeLocal(0, 1, props);\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(op, 17));\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"annotateSegmentLocal then removeRangeLocal\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tconst start = 0;\n\t\tconst end = client.getText().length;\n\n\t\tconst props = {\n\t\t\tfoo: \"bar\",\n\t\t};\n\n\t\tconst annotateOp = client.annotateRangeLocal(start, end, props);\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tconst removeOp = client.removeRangeLocal(start, end);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 2);\n\n\t\tclient.applyMsg(client.makeOpMessage(annotateOp, 17));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 18, 0));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, 18);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"multiple interleaved annotateSegmentLocal\", () => {\n\t\tlet annotateEnd: number = client.getText().length;\n\t\tconst messages: ISequencedDocumentMessage[] = [];\n\t\tlet sequenceNumber = 0;\n\t\twhile (annotateEnd > 0) {\n\t\t\tconst props = {\n\t\t\t\tend: annotateEnd,\n\t\t\t\tfoo: \"bar\",\n\t\t\t};\n\t\t\tconst annotateOp = client.annotateRangeLocal(0, annotateEnd, props);\n\n\t\t\tmessages.push(client.makeOpMessage(annotateOp, ++sequenceNumber));\n\n\t\t\tannotateEnd = Math.floor(annotateEnd / 2);\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, messages.length);\n\n\t\tfor (const msg of messages) {\n\t\t\tclient.applyMsg(msg);\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"overlapping deletes\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tconst start = 0;\n\t\tconst end = 5;\n\t\tconst initialText = client.getText();\n\t\tconst initialLength = initialText.length;\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, undefined);\n\t\tassert(segmentInfo.segment?.segmentGroups?.empty !== false);\n\n\t\tconst removeOp = client.removeRangeLocal(start, end);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(segmentInfo.segment?.segmentGroups?.size, 1);\n\n\t\tconst remoteMessage = client.makeOpMessage(removeOp, 17);\n\t\tremoteMessage.clientId = \"remoteClient\";\n\n\t\tclient.applyMsg(remoteMessage);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, remoteMessage.sequenceNumber);\n\t\tassert.equal(segmentInfo.segment?.segmentGroups.size, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 18, 0));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, remoteMessage.sequenceNumber);\n\t\tassert(segmentInfo.segment?.segmentGroups.empty);\n\t\tassert.equal(client.getLength(), initialLength - (end - start));\n\t\tassert.equal(\n\t\t\tclient.getText(),\n\t\t\tinitialText.slice(0, Math.max(0, start)) + initialText.slice(Math.max(0, end)),\n\t\t);\n\t});\n\n\tit(\"overlapping insert and delete\", () => {\n\t\tconst remoteClient = new TestClient();\n\t\tremoteClient.insertTextLocal(0, client.getText());\n\t\tremoteClient.startOrUpdateCollaboration(\"remoteUser\");\n\t\tconst clients = [client, remoteClient];\n\t\tconst logger = new TestClientLogger(clients);\n\t\tlet seq = 0;\n\t\tconst initialMsg = client.makeOpMessage(client.insertTextLocal(0, \"-\"), ++seq);\n\n\t\tfor (const c of clients) c.applyMsg(initialMsg);\n\t\tlogger.validate({ baseText: \"-hello world\" });\n\n\t\tconst messages = [\n\t\t\tclient.makeOpMessage(client.insertTextLocal(0, \"L\"), ++seq),\n\t\t\tclient.makeOpMessage(client.removeRangeLocal(1, 2), ++seq),\n\t\t\tremoteClient.makeOpMessage(remoteClient.insertTextLocal(0, \"R\"), ++seq),\n\t\t\tremoteClient.makeOpMessage(remoteClient.removeRangeLocal(1, 2), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"RLhello world\" });\n\t});\n\n\tit(\"intersecting insert after local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\t\tlet seq = 0;\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"b\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"cb\" });\n\t});\n\n\tit(\"conflicting insert after shared delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"Z\" }, \"A\", \"B\", \"C\");\n\t\tlet seq = 0;\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst messages = [\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"B\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, clients.C.getLength()), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"local remove followed by conflicting insert\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"b\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t];\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"cb\" });\n\t});\n\n\tit(\"intersecting insert with un-acked insert and delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"bb\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t];\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"bc\" });\n\t});\n\n\tit(\"conflicting insert over local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"CCC\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(msg);\n\t\t\t}\n\t\t}\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlogger.validate({ baseText: \"CC\" });\n\n\t\tmessages.push(\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"CC\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(1, \"BBB\"), ++seq),\n\t\t);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\t\tlogger.validate({ baseText: \"CCBBBC\" });\n\t});\n\n\tit(\"Local insert after acked local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"ZZ\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\n\t\tconst op1 = clients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq);\n\t\tclients.C.applyMsg(op1);\n\n\t\tconst op2 = clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq);\n\n\t\tconst op3 = clients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq);\n\n\t\tconst op4 = clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"B\"), ++seq);\n\n\t\tclients.A.applyMsg(op1);\n\t\tclients.B.applyMsg(op1);\n\n\t\tconst messages = [op2, op3, op4];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"Remote Remove before conflicting insert\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"Z\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\n\t\tconst op1 = clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq);\n\t\tconst op2 = clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"B\"), ++seq);\n\n\t\tclients.C.applyMsg(op1);\n\n\t\tconst op3 = clients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq);\n\t\tclients.A.applyMsg(op1);\n\t\tclients.B.applyMsg(op1);\n\n\t\tconst messages = [op2, op3];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"Conflicting inserts at deleted segment position\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"a----bcd-ef\" },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(4, \"B\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(4, \"CC\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(2, 8), ++seq),\n\t\t);\n\t\tclients.B.applyMsg(ops[0]);\n\t\tclients.B.applyMsg(ops[1]);\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(5, 8), ++seq));\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < op.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"ab\" });\n\t});\n\n\tit(\"Inconsistent shared string after pausing connection #9703\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"abcd\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 3), ++seq));\n\t\tclients.B.applyMsg(ops[0]);\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"yz\"), ++seq));\n\t\tclients.B.applyMsg(ops[1]);\n\n\t\t// it's like this connection is paused, as it doesn't see the other clients' ops\n\t\t// which its own ops will be sequenced after\n\t\tops.push(clients.C.makeOpMessage(clients.C.insertTextLocal(2, \"X\"), ++seq));\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < op.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"ayzXd\" });\n\t});\n\n\tit(\"regenerate annotate op over removed range\", () => {\n\t\tconst clientA = new TestClient();\n\t\tclientA.startOrUpdateCollaboration(\"A\");\n\t\tconst clientB = new TestClient();\n\t\tclientB.startOrUpdateCollaboration(\"B\");\n\n\t\tlet seq = 0;\n\t\tconst insertOp = clientA.makeOpMessage(clientA.insertTextLocal(0, \"AAA\"), ++seq);\n\t\t[clientA, clientB].map((c) => c.applyMsg(insertOp));\n\n\t\tconst annotateOp = clientA.annotateRangeLocal(0, clientA.getLength(), { client: \"A\" })!;\n\t\tconst seg = clientA.peekPendingSegmentGroups()!;\n\n\t\tconst removeOp = clientB.makeOpMessage(\n\t\t\tclientB.removeRangeLocal(0, clientB.getLength()),\n\t\t\t++seq,\n\t\t);\n\t\t[clientA, clientB].map((c) => c.applyMsg(removeOp));\n\n\t\tconst regeneratedOp = clientA.regeneratePendingOp(annotateOp, seg);\n\t\tassert(regeneratedOp.type === MergeTreeDeltaType.GROUP);\n\t\tassert.strictEqual(regeneratedOp.ops.length, 0);\n\t});\n\n\tit(\"getContainingSegment with op\", () => {\n\t\tconst clientA = new TestClient();\n\t\tclientA.startOrUpdateCollaboration(\"A\");\n\t\tconst clientB = new TestClient();\n\t\tclientB.startOrUpdateCollaboration(\"B\");\n\n\t\tlet seq = 0;\n\t\tconst insertOp1 = clientA.makeOpMessage(clientA.insertTextLocal(0, \"ABC\"), ++seq);\n\t\t[clientA, clientB].map((c) => c.applyMsg(insertOp1));\n\n\t\tconst removeOp = clientA.removeRangeLocal(0, 2);\n\t\tconst removeSequence = ++seq;\n\t\tclientA.applyMsg(clientA.makeOpMessage(removeOp, removeSequence));\n\n\t\tconst insertOp2 = clientB.insertTextLocal(2, \"X\");\n\n\t\t// op with no reference sequence should count removed segment\n\t\tconst insertMessage2 = clientB.makeOpMessage(insertOp2, ++seq);\n\t\tlet seg = clientA.getContainingSegment<ISegmentLeaf>(2, {\n\t\t\treferenceSequenceNumber: insertMessage2.referenceSequenceNumber,\n\t\t\tclientId: insertMessage2.clientId,\n\t\t});\n\t\tassert.notStrictEqual(seg.segment, undefined);\n\t\tassert.strictEqual((seg.segment as TextSegment).text, \"C\");\n\n\t\t// op with reference sequence >= remove op sequence should not count removed segment\n\t\tconst insertMessage3 = clientB.makeOpMessage(insertOp2, seq, removeSequence);\n\t\tseg = clientA.getContainingSegment<ISegmentLeaf>(2, {\n\t\t\treferenceSequenceNumber: insertMessage3.referenceSequenceNumber,\n\t\t\tclientId: insertMessage3.clientId,\n\t\t});\n\t\tassert.strictEqual(seg.segment, undefined);\n\t});\n\n\t/**\n\t * Regression test for an issue whereby reconnected clients could have segment orders that yielded\n\t * different tiebreaking results for inserted segments. Specifically, client C's \"c\" segment\n\t * should be considered for tiebreaking against the \"b\" segment as judged by the op it submitted for \"c\",\n\t * but since client C rebased the op which inserted \"c\", its segments were in a meaningfully different order\n\t * from other clients. This issue was fixed by making client C adjust the ordering of its segments at rebase\n\t * (i.e. reconnection) time so that they align with the resubmitted op.\n\t * Condensed view of this mismatch:\n\t * ```\n\t * _: Local State\n\t * -: Deleted\n\t * *: Unacked Insert and Delete\n\t * 0: msn/offset\n\t * Op format <seq>:<ref>:<client><type>@<pos1>,<pos2>\n\t * sequence number represented as offset from msn. L means local.\n\t * op types: 0) insert 1) remove 2) annotate\n\t * op types: 0) insert 1) remove 2) annotate\n\t * op | client A | op | client C\n\t * | | L:0:C0@0 | _\n\t * | | | C\n\t * 1:0:D0@0 | DD | 1:0:D0@0 | _DD\n\t * | | | C\n\t * 2:0:C0@0 | CDD | 2:0:C0@0 | CDD\n\t * 3:2:D0@0 | DDDCDD | 3:2:D0@0 | DDDCDD\n\t * 4:2:D0@0 | DDDDCDD | 4:2:D0@0 | DDDDCDD\n\t * 5:4:D0@0 | DDDDDDDCDD | | DDDDCDD\n\t * 6:4:D1@6,9 | DDDDDD---D | | DDDDCDD\n\t * | DDDDDD---D | L:4:C0@5 | DDDDC_DD\n\t * | | | c\n\t * | DDDDDD---D | 5:4:D0@0 | DDDDDDDC_DD\n\t * | | | c\n\t * | DDDDDD---D | 6:4:D1@6,9 | DDDDDD- -_-D\n\t * | | | c\n\t * 7:6:B0@6 | DDDDDDb ---D | 7:6:B0@6 | DDDDDDb- -_-D\n\t * | | | c\n\t * 8:6:C0@6 | DDDDDDcb ---D | 8:6:C0@6 | DDDDDDb- -c-D\n\t * Client C does not match client A\n\t * ```\n\t */\n\tit(\"Concurrent insert into removed segment across block boundary\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\", \"D\");\n\n\t\tconst logger = new TestClientLogger([clients.A, clients.C]);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tconst perClientOps: ISequencedDocumentMessage[][] = clients.all.map(() => []);\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DD\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq),\n\t\t);\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DDD\"), ++seq),\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"D\"), ++seq),\n\t\t);\n\n\t\t// disconnect B(1)\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const [i, c] of clients.all.entries())\n\t\t\t\tif (i === 1) {\n\t\t\t\t\tperClientOps[i].push(op);\n\t\t\t\t} else {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DDD\"), ++seq),\n\t\t\tclients.D.makeOpMessage(clients.D.removeRangeLocal(6, 9), ++seq),\n\t\t);\n\n\t\t// disconnect B(1) and C(2)\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const [i, c] of clients.all.entries())\n\t\t\t\tif (i === 1 || i === 2) {\n\t\t\t\t\tperClientOps[i].push(op);\n\t\t\t\t} else {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\t// apply changes to disconnected clients\n\t\tconst bOp = {\n\t\t\top: clients.B.insertTextLocal(1, \"b\")!,\n\t\t\tsg: clients.B.peekPendingSegmentGroups()!,\n\t\t};\n\t\tconst cOp = {\n\t\t\top: clients.C.insertTextLocal(5, \"c\")!,\n\t\t\tsg: clients.C.peekPendingSegmentGroups()!,\n\t\t};\n\n\t\t// TODO: tracking group\n\t\tconst { segment, offset } = clients.C.getContainingSegment<ISegmentLeaf>(5);\n\t\tassert(segment !== undefined, \"expected segment\");\n\t\tconst ref = clients.C.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\n\t\tlet beforeSlides = 0;\n\t\tlet afterSlides = 0;\n\t\tref.callbacks = {\n\t\t\tbeforeSlide: (lref): void => {\n\t\t\t\tassert(lref === ref, \"wrong ref slid\");\n\t\t\t\tbeforeSlides++;\n\t\t\t},\n\t\t\tafterSlide: (lref): void => {\n\t\t\t\tassert(lref === ref, \"wrong ref slid\");\n\t\t\t\tafterSlides++;\n\t\t\t},\n\t\t};\n\n\t\t// catch up disconnected clients\n\t\tfor (const [i, clientOps] of perClientOps.entries())\n\t\t\tfor (const op of clientOps.splice(0)) clients.all[i].applyMsg(op);\n\n\t\t// rebase and resubmit disconnected client ops\n\t\tops.push(clients.B.makeOpMessage(clients.B.regeneratePendingOp(bOp.op, bOp.sg), ++seq));\n\n\t\tconst trackingGroup = new TrackingGroup();\n\t\tconst trackedSegs: ISegment[] = [];\n\t\twalkAllChildSegments(clients.C.mergeTree.root, (seg) => {\n\t\t\ttrackedSegs.push(seg);\n\t\t\ttrackingGroup.link(seg);\n\t\t});\n\n\t\tassert.equal(beforeSlides, 0, \"should be no slides\");\n\t\tassert.equal(afterSlides, 0, \"should be no slides\");\n\t\tops.push(clients.C.makeOpMessage(clients.C.regeneratePendingOp(cOp.op, cOp.sg), ++seq));\n\t\tassert.equal(beforeSlides, 1, \"should be 1 slide\");\n\t\tassert.equal(afterSlides, 1, \"should be 1 slide\");\n\n\t\tfor (const seg of trackedSegs) {\n\t\t\tassert(trackingGroup.has(seg), \"Tracking group should still have segment.\");\n\t\t}\n\t\t// process the resubmitted ops\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(op);\n\t\t\t}\n\n\t\tlogger.validate({ baseText: \"DDDDDDcbD\" });\n\t});\n\n\tdescribe(\"updates minSeq\", () => {\n\t\tit(\"to the message's minSeq with no ops in flight\", () => {\n\t\t\tconst localClient = new TestClient();\n\t\t\tconst remoteClient = new TestClient();\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tlocalClient.startOrUpdateCollaboration(localUserLongId);\n\t\t\tremoteClient.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.insertTextLocal(0, \"hello world\"),\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 0);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 0);\n\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.insertTextLocal(0, \"abc\"),\n\t\t\t\t\t/* seq */ 17,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 16);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\t\t});\n\n\t\tit(\"to the minimum of in-flight messages and the acked message's minSeq\", () => {\n\t\t\tlet localInFlightRefSeq: number | undefined;\n\t\t\tconst localClient = new TestClient(undefined, undefined, () => localInFlightRefSeq);\n\t\t\tconst remoteClient = new TestClient();\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tlocalClient.startOrUpdateCollaboration(localUserLongId);\n\t\t\tremoteClient.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\tlocalInFlightRefSeq = 0;\n\n\t\t\tconst resubmittedOp = localClient.insertTextLocal(0, \"hello world\");\n\t\t\t// Note: *don't* add this to list of sequenced ops, since if the refSeq of an in-flight op trails\n\t\t\t// behind the minSeq of an acked op, the in-flight op must eventually be nacked.\n\t\t\t// This call to make a message is unnecessary for the test purposes, but would happen in a production scenario\n\t\t\t// (it's the message that would be sent to the server and nacked).\n\t\t\tlocalClient.makeOpMessage(resubmittedOp, 1, localInFlightRefSeq, localUserLongId, 0);\n\n\t\t\tops.push(\n\t\t\t\tremoteClient.makeOpMessage(\n\t\t\t\t\tremoteClient.insertTextLocal(0, \"abc\"),\n\t\t\t\t\t/* seq */ 17,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tremoteUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 0);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.regeneratePendingOp(\n\t\t\t\t\t\tresubmittedOp!,\n\t\t\t\t\t\tlocalClient.peekPendingSegmentGroups()!,\n\t\t\t\t\t),\n\t\t\t\t\t/* seq */ 18,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\t\t\tlocalInFlightRefSeq = 16;\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 16);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\t\t});\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"client.applyMsg.spec.js","sourceRoot":"","sources":["../../src/test/client.applyMsg.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 { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { UnassignedSequenceNumber } from \"../constants.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { ISegment, ISegmentLeaf, SegmentGroup } from \"../mergeTreeNodes.js\";\nimport { TrackingGroup } from \"../mergeTreeTracking.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { Side } from \"../sequencePlace.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\ndescribe(\"client.applyMsg\", () => {\n\tconst localUserLongId = \"localUser\";\n\tconst remoteUserLongId = \"remoteUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.insertTextLocal(0, \"hello world\");\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"Interleaved inserts, annotates, and deletes\", () => {\n\t\tconst changes = new Map<\n\t\t\tnumber,\n\t\t\t{ msg: ISequencedDocumentMessage; segmentGroup?: SegmentGroup | SegmentGroup[] }\n\t\t>();\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst len = client.getLength();\n\t\t\tconst pos1 = Math.floor(len / 2);\n\t\t\tconst imod6 = i % 6;\n\t\t\tswitch (imod6) {\n\t\t\t\tcase 0:\n\t\t\t\tcase 5: {\n\t\t\t\t\tconst pos2 = Math.max(Math.floor((len - pos1) / 4) - imod6 + pos1, pos1 + 1);\n\t\t\t\t\tconst msg = client.makeOpMessage(client.removeRangeLocal(pos1, pos2), i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 1:\n\t\t\t\tcase 4: {\n\t\t\t\t\tconst str = `${i}`.repeat(imod6 + 5);\n\t\t\t\t\tconst msg = client.makeOpMessage(client.insertTextLocal(pos1, str), i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 2:\n\t\t\t\tcase 3: {\n\t\t\t\t\tconst pos2 = Math.max(Math.floor((len - pos1) / 3) - imod6 + pos1, pos1 + 1);\n\t\t\t\t\tconst op = client.annotateRangeLocal(pos1, pos2, {\n\t\t\t\t\t\tfoo: `${i}`,\n\t\t\t\t\t});\n\t\t\t\t\tconst msg = client.makeOpMessage(op, i + 1);\n\t\t\t\t\tchanges.set(i, { msg, segmentGroup: client.peekPendingSegmentGroups() });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tassert.fail(\"all cases should be handled\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst msg = changes.get(i)!.msg;\n\t\t\tclient.applyMsg(msg);\n\t\t\tconst segmentGroup = changes.get(i)?.segmentGroup;\n\t\t\tassert(\n\t\t\t\t!Array.isArray(segmentGroup) && segmentGroup !== undefined,\n\t\t\t\t\"segment group should be defined and not an array\",\n\t\t\t);\n\t\t\tfor (const seg of segmentGroup.segments) {\n\t\t\t\tswitch (i % 6) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\tcase 5: {\n\t\t\t\t\t\tassert.equal(\n\t\t\t\t\t\t\tseg.removedSeq,\n\t\t\t\t\t\t\tmsg.sequenceNumber,\n\t\t\t\t\t\t\t\"removed segment has unexpected id\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\tcase 4: {\n\t\t\t\t\t\tassert.equal(seg.seq, msg.sequenceNumber, \"inserted segment has unexpected id\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(i);\n\n\t\t\tassert.notEqual(\n\t\t\t\tsegmentInfo.segment?.seq,\n\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\"all segments should be acked\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsegmentInfo.segment?.segmentGroups?.empty !== false,\n\t\t\t\t\"there should be no outstanding segmentGroups\",\n\t\t\t);\n\t\t}\n\t});\n\n\tit(\"insertTextLocal\", () => {\n\t\tconst op = client.insertTextLocal(0, \"abc\");\n\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tassert.equal(segmentInfo.segment?.seq, UnassignedSequenceNumber);\n\n\t\tclient.applyMsg(client.makeOpMessage(op, 17));\n\n\t\tassert.equal(segmentInfo.segment?.seq, 17);\n\t});\n\n\tit(\"removeRangeLocal\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tconst removeOp = client.removeRangeLocal(0, 1);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 17));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, 17);\n\t});\n\n\tit(\"annotateSegmentLocal\", () => {\n\t\tconst props = {\n\t\t\tfoo: \"bar\",\n\t\t};\n\t\tconst op = client.annotateRangeLocal(0, 1, props);\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(op, 17));\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"annotateSegmentLocal then removeRangeLocal\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tconst start = 0;\n\t\tconst end = client.getText().length;\n\n\t\tconst props = {\n\t\t\tfoo: \"bar\",\n\t\t};\n\n\t\tconst annotateOp = client.annotateRangeLocal(start, end, props);\n\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tconst removeOp = client.removeRangeLocal(start, end);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 2);\n\n\t\tclient.applyMsg(client.makeOpMessage(annotateOp, 17));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 18, 0));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, 18);\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"multiple interleaved annotateSegmentLocal\", () => {\n\t\tlet annotateEnd: number = client.getText().length;\n\t\tconst messages: ISequencedDocumentMessage[] = [];\n\t\tlet sequenceNumber = 0;\n\t\twhile (annotateEnd > 0) {\n\t\t\tconst props = {\n\t\t\t\tend: annotateEnd,\n\t\t\t\tfoo: \"bar\",\n\t\t\t};\n\t\t\tconst annotateOp = client.annotateRangeLocal(0, annotateEnd, props);\n\n\t\t\tmessages.push(client.makeOpMessage(annotateOp, ++sequenceNumber));\n\n\t\t\tannotateEnd = Math.floor(annotateEnd / 2);\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, messages.length);\n\n\t\tfor (const msg of messages) {\n\t\t\tclient.applyMsg(msg);\n\t\t}\n\t\tassert.equal(client.mergeTree.pendingSegments?.length, 0);\n\t});\n\n\tit(\"overlapping deletes\", () => {\n\t\tconst segmentInfo = client.getContainingSegment<ISegmentLeaf>(0);\n\n\t\tconst start = 0;\n\t\tconst end = 5;\n\t\tconst initialText = client.getText();\n\t\tconst initialLength = initialText.length;\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, undefined);\n\t\tassert(segmentInfo.segment?.segmentGroups?.empty !== false);\n\n\t\tconst removeOp = client.removeRangeLocal(start, end);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);\n\t\tassert.equal(segmentInfo.segment?.segmentGroups?.size, 1);\n\n\t\tconst remoteMessage = client.makeOpMessage(removeOp, 17);\n\t\tremoteMessage.clientId = \"remoteClient\";\n\n\t\tclient.applyMsg(remoteMessage);\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, remoteMessage.sequenceNumber);\n\t\tassert.equal(segmentInfo.segment?.segmentGroups.size, 1);\n\n\t\tclient.applyMsg(client.makeOpMessage(removeOp, 18, 0));\n\n\t\tassert.equal(segmentInfo.segment?.removedSeq, remoteMessage.sequenceNumber);\n\t\tassert(segmentInfo.segment?.segmentGroups.empty);\n\t\tassert.equal(client.getLength(), initialLength - (end - start));\n\t\tassert.equal(\n\t\t\tclient.getText(),\n\t\t\tinitialText.slice(0, Math.max(0, start)) + initialText.slice(Math.max(0, end)),\n\t\t);\n\t});\n\n\tit(\"overlapping insert and delete\", () => {\n\t\tconst remoteClient = new TestClient();\n\t\tremoteClient.insertTextLocal(0, client.getText());\n\t\tremoteClient.startOrUpdateCollaboration(\"remoteUser\");\n\t\tconst clients = [client, remoteClient];\n\t\tconst logger = new TestClientLogger(clients);\n\t\tlet seq = 0;\n\t\tconst initialMsg = client.makeOpMessage(client.insertTextLocal(0, \"-\"), ++seq);\n\n\t\tfor (const c of clients) c.applyMsg(initialMsg);\n\t\tlogger.validate({ baseText: \"-hello world\" });\n\n\t\tconst messages = [\n\t\t\tclient.makeOpMessage(client.insertTextLocal(0, \"L\"), ++seq),\n\t\t\tclient.makeOpMessage(client.removeRangeLocal(1, 2), ++seq),\n\t\t\tremoteClient.makeOpMessage(remoteClient.insertTextLocal(0, \"R\"), ++seq),\n\t\t\tremoteClient.makeOpMessage(remoteClient.removeRangeLocal(1, 2), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"RLhello world\" });\n\t});\n\n\tit(\"intersecting insert after local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\t\tlet seq = 0;\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"b\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"cb\" });\n\t});\n\n\tit(\"conflicting insert after shared delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"Z\" }, \"A\", \"B\", \"C\");\n\t\tlet seq = 0;\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst messages = [\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"B\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, clients.C.getLength()), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq),\n\t\t];\n\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"local remove followed by conflicting insert\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"b\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t];\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"cb\" });\n\t});\n\n\tit(\"intersecting insert with un-acked insert and delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"c\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"bb\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq),\n\t\t];\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"bc\" });\n\t});\n\n\tit(\"conflicting insert over local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\");\n\n\t\tlet seq = 0;\n\t\tconst messages = [\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"CCC\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(msg);\n\t\t\t}\n\t\t}\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlogger.validate({ baseText: \"CC\" });\n\n\t\tmessages.push(\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"CC\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(1, \"BBB\"), ++seq),\n\t\t);\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\t\tlogger.validate({ baseText: \"CCBBBC\" });\n\t});\n\n\tit(\"Local insert after acked local delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"ZZ\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\n\t\tconst op1 = clients.C.makeOpMessage(clients.C.removeRangeLocal(0, 1), ++seq);\n\t\tclients.C.applyMsg(op1);\n\n\t\tconst op2 = clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 2), ++seq);\n\n\t\tconst op3 = clients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq);\n\n\t\tconst op4 = clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"B\"), ++seq);\n\n\t\tclients.A.applyMsg(op1);\n\t\tclients.B.applyMsg(op1);\n\n\t\tconst messages = [op2, op3, op4];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"Remote Remove before conflicting insert\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"Z\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\n\t\tconst op1 = clients.B.makeOpMessage(clients.B.removeRangeLocal(0, 1), ++seq);\n\t\tconst op2 = clients.B.makeOpMessage(clients.B.insertTextLocal(0, \"B\"), ++seq);\n\n\t\tclients.C.applyMsg(op1);\n\n\t\tconst op3 = clients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq);\n\t\tclients.A.applyMsg(op1);\n\t\tclients.B.applyMsg(op1);\n\n\t\tconst messages = [op2, op3];\n\t\twhile (messages.length > 0) {\n\t\t\tconst msg = messages.shift()!;\n\t\t\tfor (const c of clients.all) c.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"CB\" });\n\t});\n\n\tit(\"Conflicting inserts at deleted segment position\", () => {\n\t\tconst clients = createClientsAtInitialState(\n\t\t\t{ initialState: \"a----bcd-ef\" },\n\t\t\t\"A\",\n\t\t\t\"B\",\n\t\t\t\"C\",\n\t\t);\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tops.push(\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(4, \"B\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(4, \"CC\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.removeRangeLocal(2, 8), ++seq),\n\t\t);\n\t\tclients.B.applyMsg(ops[0]);\n\t\tclients.B.applyMsg(ops[1]);\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(5, 8), ++seq));\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < op.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"ab\" });\n\t});\n\n\tit(\"Inconsistent shared string after pausing connection #9703\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"abcd\" }, \"A\", \"B\", \"C\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tops.push(clients.B.makeOpMessage(clients.B.removeRangeLocal(1, 3), ++seq));\n\t\tclients.B.applyMsg(ops[0]);\n\t\tops.push(clients.B.makeOpMessage(clients.B.insertTextLocal(1, \"yz\"), ++seq));\n\t\tclients.B.applyMsg(ops[1]);\n\n\t\t// it's like this connection is paused, as it doesn't see the other clients' ops\n\t\t// which its own ops will be sequenced after\n\t\tops.push(clients.C.makeOpMessage(clients.C.insertTextLocal(2, \"X\"), ++seq));\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tif (c.getCollabWindow().currentSeq < op.sequenceNumber) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"ayzXd\" });\n\t});\n\n\tit(\"regenerate annotate op over removed range\", () => {\n\t\tconst clientA = new TestClient();\n\t\tclientA.startOrUpdateCollaboration(\"A\");\n\t\tconst clientB = new TestClient();\n\t\tclientB.startOrUpdateCollaboration(\"B\");\n\n\t\tlet seq = 0;\n\t\tconst insertOp = clientA.makeOpMessage(clientA.insertTextLocal(0, \"AAA\"), ++seq);\n\t\t[clientA, clientB].map((c) => c.applyMsg(insertOp));\n\n\t\tconst annotateOp = clientA.annotateRangeLocal(0, clientA.getLength(), { client: \"A\" })!;\n\t\tconst seg = clientA.peekPendingSegmentGroups()!;\n\n\t\tconst removeOp = clientB.makeOpMessage(\n\t\t\tclientB.removeRangeLocal(0, clientB.getLength()),\n\t\t\t++seq,\n\t\t);\n\t\t[clientA, clientB].map((c) => c.applyMsg(removeOp));\n\n\t\tconst regeneratedOp = clientA.regeneratePendingOp(annotateOp, seg);\n\t\tassert(regeneratedOp.type === MergeTreeDeltaType.GROUP);\n\t\tassert.strictEqual(regeneratedOp.ops.length, 0);\n\t});\n\n\tit(\"getContainingSegment with op\", () => {\n\t\tconst clientA = new TestClient();\n\t\tclientA.startOrUpdateCollaboration(\"A\");\n\t\tconst clientB = new TestClient();\n\t\tclientB.startOrUpdateCollaboration(\"B\");\n\n\t\tlet seq = 0;\n\t\tconst insertOp1 = clientA.makeOpMessage(clientA.insertTextLocal(0, \"ABC\"), ++seq);\n\t\t[clientA, clientB].map((c) => c.applyMsg(insertOp1));\n\n\t\tconst removeOp = clientA.removeRangeLocal(0, 2);\n\t\tconst removeSequence = ++seq;\n\t\tclientA.applyMsg(clientA.makeOpMessage(removeOp, removeSequence));\n\n\t\tconst insertOp2 = clientB.insertTextLocal(2, \"X\");\n\n\t\t// op with no reference sequence should count removed segment\n\t\tconst insertMessage2 = clientB.makeOpMessage(insertOp2, ++seq);\n\t\tlet seg = clientA.getContainingSegment<ISegmentLeaf>(2, {\n\t\t\treferenceSequenceNumber: insertMessage2.referenceSequenceNumber,\n\t\t\tclientId: insertMessage2.clientId,\n\t\t});\n\t\tassert.notStrictEqual(seg.segment, undefined);\n\t\tassert.strictEqual((seg.segment as TextSegment).text, \"C\");\n\n\t\t// op with reference sequence >= remove op sequence should not count removed segment\n\t\tconst insertMessage3 = clientB.makeOpMessage(insertOp2, seq, removeSequence);\n\t\tseg = clientA.getContainingSegment<ISegmentLeaf>(2, {\n\t\t\treferenceSequenceNumber: insertMessage3.referenceSequenceNumber,\n\t\t\tclientId: insertMessage3.clientId,\n\t\t});\n\t\tassert.strictEqual(seg.segment, undefined);\n\t});\n\n\t/**\n\t * Regression test for an issue whereby reconnected clients could have segment orders that yielded\n\t * different tiebreaking results for inserted segments. Specifically, client C's \"c\" segment\n\t * should be considered for tiebreaking against the \"b\" segment as judged by the op it submitted for \"c\",\n\t * but since client C rebased the op which inserted \"c\", its segments were in a meaningfully different order\n\t * from other clients. This issue was fixed by making client C adjust the ordering of its segments at rebase\n\t * (i.e. reconnection) time so that they align with the resubmitted op.\n\t * Condensed view of this mismatch:\n\t * ```\n\t * _: Local State\n\t * -: Deleted\n\t * *: Unacked Insert and Delete\n\t * 0: msn/offset\n\t * Op format <seq>:<ref>:<client><type>@<pos1>,<pos2>\n\t * sequence number represented as offset from msn. L means local.\n\t * op types: 0) insert 1) remove 2) annotate\n\t * op types: 0) insert 1) remove 2) annotate\n\t * op | client A | op | client C\n\t * | | L:0:C0@0 | _\n\t * | | | C\n\t * 1:0:D0@0 | DD | 1:0:D0@0 | _DD\n\t * | | | C\n\t * 2:0:C0@0 | CDD | 2:0:C0@0 | CDD\n\t * 3:2:D0@0 | DDDCDD | 3:2:D0@0 | DDDCDD\n\t * 4:2:D0@0 | DDDDCDD | 4:2:D0@0 | DDDDCDD\n\t * 5:4:D0@0 | DDDDDDDCDD | | DDDDCDD\n\t * 6:4:D1@6,9 | DDDDDD---D | | DDDDCDD\n\t * | DDDDDD---D | L:4:C0@5 | DDDDC_DD\n\t * | | | c\n\t * | DDDDDD---D | 5:4:D0@0 | DDDDDDDC_DD\n\t * | | | c\n\t * | DDDDDD---D | 6:4:D1@6,9 | DDDDDD- -_-D\n\t * | | | c\n\t * 7:6:B0@6 | DDDDDDb ---D | 7:6:B0@6 | DDDDDDb- -_-D\n\t * | | | c\n\t * 8:6:C0@6 | DDDDDDcb ---D | 8:6:C0@6 | DDDDDDb- -c-D\n\t * Client C does not match client A\n\t * ```\n\t */\n\tit(\"Concurrent insert into removed segment across block boundary\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\", \"C\", \"D\");\n\n\t\tconst logger = new TestClientLogger([clients.A, clients.C]);\n\t\tlet seq = 0;\n\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\tconst perClientOps: ISequencedDocumentMessage[][] = clients.all.map(() => []);\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DD\"), ++seq),\n\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(0, \"C\"), ++seq),\n\t\t);\n\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DDD\"), ++seq),\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"D\"), ++seq),\n\t\t);\n\n\t\t// disconnect B(1)\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const [i, c] of clients.all.entries())\n\t\t\t\tif (i === 1) {\n\t\t\t\t\tperClientOps[i].push(op);\n\t\t\t\t} else {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\tops.push(\n\t\t\tclients.D.makeOpMessage(clients.D.insertTextLocal(0, \"DDD\"), ++seq),\n\t\t\tclients.D.makeOpMessage(clients.D.removeRangeLocal(6, 9), ++seq),\n\t\t);\n\n\t\t// disconnect B(1) and C(2)\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const [i, c] of clients.all.entries())\n\t\t\t\tif (i === 1 || i === 2) {\n\t\t\t\t\tperClientOps[i].push(op);\n\t\t\t\t} else {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\t// apply changes to disconnected clients\n\t\tconst bOp = {\n\t\t\top: clients.B.insertTextLocal(1, \"b\")!,\n\t\t\tsg: clients.B.peekPendingSegmentGroups()!,\n\t\t};\n\t\tconst cOp = {\n\t\t\top: clients.C.insertTextLocal(5, \"c\")!,\n\t\t\tsg: clients.C.peekPendingSegmentGroups()!,\n\t\t};\n\n\t\t// TODO: tracking group\n\t\tconst { segment, offset } = clients.C.getContainingSegment<ISegmentLeaf>(5);\n\t\tassert(segment !== undefined, \"expected segment\");\n\t\tconst ref = clients.C.createLocalReferencePosition(\n\t\t\tsegment,\n\t\t\toffset,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\n\t\tlet beforeSlides = 0;\n\t\tlet afterSlides = 0;\n\t\tref.callbacks = {\n\t\t\tbeforeSlide: (lref): void => {\n\t\t\t\tassert(lref === ref, \"wrong ref slid\");\n\t\t\t\tbeforeSlides++;\n\t\t\t},\n\t\t\tafterSlide: (lref): void => {\n\t\t\t\tassert(lref === ref, \"wrong ref slid\");\n\t\t\t\tafterSlides++;\n\t\t\t},\n\t\t};\n\n\t\t// catch up disconnected clients\n\t\tfor (const [i, clientOps] of perClientOps.entries())\n\t\t\tfor (const op of clientOps.splice(0)) clients.all[i].applyMsg(op);\n\n\t\t// rebase and resubmit disconnected client ops\n\t\tops.push(clients.B.makeOpMessage(clients.B.regeneratePendingOp(bOp.op, bOp.sg), ++seq));\n\n\t\tconst trackingGroup = new TrackingGroup();\n\t\tconst trackedSegs: ISegment[] = [];\n\t\twalkAllChildSegments(clients.C.mergeTree.root, (seg) => {\n\t\t\ttrackedSegs.push(seg);\n\t\t\ttrackingGroup.link(seg);\n\t\t});\n\n\t\tassert.equal(beforeSlides, 0, \"should be no slides\");\n\t\tassert.equal(afterSlides, 0, \"should be no slides\");\n\t\tops.push(clients.C.makeOpMessage(clients.C.regeneratePendingOp(cOp.op, cOp.sg), ++seq));\n\t\tassert.equal(beforeSlides, 1, \"should be 1 slide\");\n\t\tassert.equal(afterSlides, 1, \"should be 1 slide\");\n\n\t\tfor (const seg of trackedSegs) {\n\t\t\tassert(trackingGroup.has(seg), \"Tracking group should still have segment.\");\n\t\t}\n\t\t// process the resubmitted ops\n\t\tfor (const op of ops.splice(0))\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(op);\n\t\t\t}\n\n\t\tlogger.validate({ baseText: \"DDDDDDcbD\" });\n\t});\n\n\tdescribe(\"obliterate\", () => {\n\t\t// \top types: 0) insert 1) remove 2) annotate\n\t\t// Clients: 3 Ops: 3 Round: 86\n\t\t// op | client A | op | client B | op | client C\n\t\t// | BBB-C- | | BBB-C- | | BBB-C-\n\t\t// | BBB-C- | L:558:B0@3 | BBB__-C- | | BBB-C-\n\t\t// | | | BB | |\n\t\t// | BBB-C- | | BBB__-C- | L:558:C4@2,4 | BB_-_-\n\t\t// | | | BB | | - -\n\t\t// | BBB-C- | | BBB__-C- | L:558:C4@1,2 | B__-_-\n\t\t// | | | BB | | -- -\n\t\t// 1:0:B0@3 | BBBBB-C- | 1:0:B0@3 | BBBBB-C- | 1:0:B0@3 | B__BB-_-\n\t\t// | | | | | -- -\n\t\t// 2:0:C4@2,4 | BB---- | 2:0:C4@2,4 | BB---- | 2:0:C4@2,4 | B_-BB-\n\t\t// | | | | | -\n\t\t// 3:0:C4@1,2 | B----- | 3:0:C4@1,2 | B----- | 3:0:C4@1,2 | B--BB-\n\t\tit(\"sided obliterate regression test\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"0123\",\n\t\t\t\t\toptions: { mergeTreeEnableObliterate: true, mergeTreeEnableSidedObliterate: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t\t\"C\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\n\t\t\tops.push(\n\t\t\t\tclients.B.makeOpMessage(clients.B.removeRangeLocal(0, clients.B.getLength()), ++seq),\n\t\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BBB\"), ++seq),\n\t\t\t\tclients.C.makeOpMessage(clients.C.insertTextLocal(2, \"C\"), ++seq),\n\t\t\t);\n\t\t\tfor (const op of ops.splice(0)) for (const c of clients.all) c.applyMsg(op);\n\n\t\t\tops.push(\n\t\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(3, \"BB\"), ++seq),\n\t\t\t\tclients.C.makeOpMessage(\n\t\t\t\t\tclients.C.obliterateRangeLocal(\n\t\t\t\t\t\t{ pos: 2, side: Side.Before },\n\t\t\t\t\t\t{ pos: 3, side: Side.After },\n\t\t\t\t\t),\n\t\t\t\t\t++seq,\n\t\t\t\t),\n\t\t\t\tclients.C.makeOpMessage(\n\t\t\t\t\tclients.C.obliterateRangeLocal(\n\t\t\t\t\t\t{ pos: 1, side: Side.Before },\n\t\t\t\t\t\t{ pos: 1, side: Side.After },\n\t\t\t\t\t),\n\t\t\t\t\t++seq,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\t\tlogger.validate({ baseText: \"B\" });\n\t\t});\n\n\t\t// MergeTree insert failed:\n\t\t// \t\tClients: 2 Ops: 8 Round: 4\n\t\t// op | client A | op | client B\n\t\t// | BBBBB BBB- | | BBBBB BBB-\n\t\t// | BBBBB BBB- | L:88:B2@1,7 | BBBBB BBB-\n\t\t// | BBBBB BBB- | L:88:B4@6,8 | BBBBB B__-\n\t\t// | | | --\n\t\t// | BBBBB BBB- | L:88:B0@5 | BBBBB _B__-\n\t\t// | | | B --\n\t\t// | BBBBB BBB- | L:88:B0@2 | BB_BBB _B__-\n\t\t// | | | B B --\n\t\t// | BBBBB BBB- | L:88:B1@4,6 | BB_B__ _B__-\n\t\t// | | | B -- B --\n\t\t// | BBBBB BBB- | L:88:B0@4 | BB_B___ _B__-\n\t\t// | | | B B-- B --\n\t\t// | BBBBB BBB- | L:88:B0@4 | BB_B ____ _B__-\n\t\t// | | | B BB-- B --\n\t\t// | BBBBB BBB- | L:88:B2@0,7 | BB_B ____ _B__-\n\t\t// | | | B BB-- B --\n\t\t// 89:88:B2@1,7 | BBBBB BBB- | 89:88:B2@1,7 | BB_B ____ _B__-\n\t\t// | | | B BB-- B --\n\t\t// 90:88:B4@6,8 | B------- | 90:88:B4@6,8 | BB_B ____ _B--\n\t\t// | | | B BB-- B\n\t\tit(\"obliterate with mergeTree insert fails\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{\n\t\t\t\t\tinitialState: \"BBBBB BBB\",\n\t\t\t\t\toptions: { mergeTreeEnableObliterate: true, mergeTreeEnableSidedObliterate: true },\n\t\t\t\t},\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\t\t\tlet seq = 0;\n\t\t\tconst logger = new TestClientLogger(clients.all);\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tconst b = clients.B;\n\n\t\t\tops.push(\n\t\t\t\tb.makeOpMessage(b.annotateRangeLocal(1, 7, { foo: 1 }), ++seq),\n\t\t\t\tb.makeOpMessage(\n\t\t\t\t\tb.obliterateRangeLocal({ pos: 6, side: Side.Before }, { pos: 8, side: Side.Before }),\n\t\t\t\t\t++seq,\n\t\t\t\t),\n\t\t\t\tb.makeOpMessage(b.insertTextLocal(5, \"B\"), ++seq),\n\t\t\t\tb.makeOpMessage(b.insertTextLocal(2, \"B\"), ++seq),\n\t\t\t\tb.makeOpMessage(b.removeRangeLocal(4, 6), ++seq),\n\t\t\t\tb.makeOpMessage(b.insertTextLocal(4, \"B\"), ++seq),\n\t\t\t\tb.makeOpMessage(b.annotateRangeLocal(0, 7, { bar: 2 }), ++seq),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0))\n\t\t\t\tfor (const c of clients.all) {\n\t\t\t\t\tc.applyMsg(op);\n\t\t\t\t}\n\n\t\t\tlogger.validate({ baseText: \"BBBBBB B\" });\n\t\t});\n\t});\n\n\tdescribe(\"updates minSeq\", () => {\n\t\tit(\"to the message's minSeq with no ops in flight\", () => {\n\t\t\tconst localClient = new TestClient();\n\t\t\tconst remoteClient = new TestClient();\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tlocalClient.startOrUpdateCollaboration(localUserLongId);\n\t\t\tremoteClient.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.insertTextLocal(0, \"hello world\"),\n\t\t\t\t\t1,\n\t\t\t\t\t0,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 0);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 0);\n\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.insertTextLocal(0, \"abc\"),\n\t\t\t\t\t/* seq */ 17,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 16);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\t\t});\n\n\t\tit(\"to the minimum of in-flight messages and the acked message's minSeq\", () => {\n\t\t\tlet localInFlightRefSeq: number | undefined;\n\t\t\tconst localClient = new TestClient(undefined, undefined, () => localInFlightRefSeq);\n\t\t\tconst remoteClient = new TestClient();\n\t\t\tconst ops: ISequencedDocumentMessage[] = [];\n\t\t\tlocalClient.startOrUpdateCollaboration(localUserLongId);\n\t\t\tremoteClient.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\tlocalInFlightRefSeq = 0;\n\n\t\t\tconst resubmittedOp = localClient.insertTextLocal(0, \"hello world\");\n\t\t\t// Note: *don't* add this to list of sequenced ops, since if the refSeq of an in-flight op trails\n\t\t\t// behind the minSeq of an acked op, the in-flight op must eventually be nacked.\n\t\t\t// This call to make a message is unnecessary for the test purposes, but would happen in a production scenario\n\t\t\t// (it's the message that would be sent to the server and nacked).\n\t\t\tlocalClient.makeOpMessage(resubmittedOp, 1, localInFlightRefSeq, localUserLongId, 0);\n\n\t\t\tops.push(\n\t\t\t\tremoteClient.makeOpMessage(\n\t\t\t\t\tremoteClient.insertTextLocal(0, \"abc\"),\n\t\t\t\t\t/* seq */ 17,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tremoteUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 0);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\n\t\t\tops.push(\n\t\t\t\tlocalClient.makeOpMessage(\n\t\t\t\t\tlocalClient.regeneratePendingOp(\n\t\t\t\t\t\tresubmittedOp!,\n\t\t\t\t\t\tlocalClient.peekPendingSegmentGroups()!,\n\t\t\t\t\t),\n\t\t\t\t\t/* seq */ 18,\n\t\t\t\t\t/* refSeq */ 16,\n\t\t\t\t\tlocalUserLongId,\n\t\t\t\t\t/* minSeq */ 16,\n\t\t\t\t),\n\t\t\t);\n\t\t\tlocalInFlightRefSeq = 16;\n\n\t\t\tfor (const op of ops.splice(0)) {\n\t\t\t\tlocalClient.applyMsg(op);\n\t\t\t\tremoteClient.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert.equal(localClient.getCollabWindow().minSeq, 16);\n\t\t\tassert.equal(remoteClient.getCollabWindow().minSeq, 16);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { describeFuzz, makeRandom } from "@fluid-private/stochastic-test-utils";
|
|
5
|
+
import { describeFuzz, makeRandom, StressMode } from "@fluid-private/stochastic-test-utils";
|
|
6
6
|
import { annotateRange, doOverRange, generateClientNames, insertAtRefPos, obliterateRange, removeRange, runMergeTreeOperationRunner, } from "./mergeTreeOperationRunner.js";
|
|
7
7
|
import { TestClient } from "./testClient.js";
|
|
8
8
|
const allOperations = [removeRange, annotateRange, insertAtRefPos];
|
|
@@ -50,16 +50,29 @@ function runConflictFarmTests(opts, extraSeed) {
|
|
|
50
50
|
config: { ...opts, applyOpDuringGeneration: true },
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
|
-
name: "with
|
|
53
|
+
name: "obliterate with number endpoints",
|
|
54
54
|
config: {
|
|
55
55
|
...opts,
|
|
56
56
|
operations: [...opts.operations, obliterateRange],
|
|
57
57
|
},
|
|
58
58
|
},
|
|
59
|
+
// TODO: AB#15630
|
|
60
|
+
// {
|
|
61
|
+
// name: "obliterate with sided endpoints",
|
|
62
|
+
// config: {
|
|
63
|
+
// ...opts,
|
|
64
|
+
// operations: [...opts.operations, obliterateRange, obliterateRangeSided],
|
|
65
|
+
// },
|
|
66
|
+
// },
|
|
59
67
|
])
|
|
60
68
|
it(`${name}: ConflictFarm_${minLength}`, async () => {
|
|
61
69
|
const random = makeRandom(0xdeadbeef, 0xfeedbed, minLength, extraSeed ?? 0);
|
|
62
|
-
const clients = [
|
|
70
|
+
const clients = [
|
|
71
|
+
new TestClient({
|
|
72
|
+
mergeTreeEnableObliterate: true,
|
|
73
|
+
mergeTreeEnableSidedObliterate: true,
|
|
74
|
+
}),
|
|
75
|
+
];
|
|
63
76
|
for (const [i, c] of clients.entries())
|
|
64
77
|
c.startOrUpdateCollaboration(clientNames[i]);
|
|
65
78
|
let seq = 0;
|
|
@@ -77,8 +90,8 @@ function runConflictFarmTests(opts, extraSeed) {
|
|
|
77
90
|
}).timeout(30 * 10000);
|
|
78
91
|
});
|
|
79
92
|
}
|
|
80
|
-
describeFuzz("MergeTree.Client", ({ testCount,
|
|
81
|
-
const opts =
|
|
93
|
+
describeFuzz("MergeTree.Client", ({ testCount, stressMode }) => {
|
|
94
|
+
const opts = stressMode === StressMode.Short ? defaultOptions : stressOptions;
|
|
82
95
|
// defaultOptions;
|
|
83
96
|
// debugOptions;
|
|
84
97
|
// longOptions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.conflictFarm.spec.js","sourceRoot":"","sources":["../../src/test/client.conflictFarm.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"client.conflictFarm.spec.js","sourceRoot":"","sources":["../../src/test/client.conflictFarm.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 { describeFuzz, makeRandom, StressMode } from \"@fluid-private/stochastic-test-utils\";\n\nimport {\n\tIConfigRange,\n\tIMergeTreeOperationRunnerConfig,\n\tTestOperation,\n\tannotateRange,\n\tdoOverRange,\n\tgenerateClientNames,\n\tinsertAtRefPos,\n\tobliterateRange,\n\tremoveRange,\n\trunMergeTreeOperationRunner,\n} from \"./mergeTreeOperationRunner.js\";\nimport { TestClient } from \"./testClient.js\";\n\ninterface IConflictFarmConfig extends IMergeTreeOperationRunnerConfig {\n\tminLength: IConfigRange;\n\tclients: IConfigRange;\n}\n\nconst allOperations: TestOperation[] = [removeRange, annotateRange, insertAtRefPos];\n\nexport const debugOptions: IConflictFarmConfig = {\n\tminLength: { min: 1, max: 512 },\n\tclients: { min: 1, max: 8 },\n\topsPerRoundRange: { min: 1, max: 128 },\n\trounds: 8,\n\toperations: allOperations,\n\tincrementalLog: true,\n\tgrowthFunc: (input: number) => input * 2,\n\t// resultsFilePostfix: `conflict-farm-with-obliterate-2.3.0.json`,\n};\n\nexport const defaultOptions: IConflictFarmConfig = {\n\tminLength: { min: 1, max: 512 },\n\tclients: { min: 1, max: 8 },\n\topsPerRoundRange: { min: 1, max: 128 },\n\trounds: 8,\n\toperations: allOperations,\n\tgrowthFunc: (input: number) => input * 2,\n};\n\nexport const longOptions: IConflictFarmConfig = {\n\tminLength: { min: 1, max: 512 },\n\tclients: { min: 1, max: 32 },\n\topsPerRoundRange: { min: 1, max: 512 },\n\trounds: 32,\n\toperations: allOperations,\n\tgrowthFunc: (input: number) => input * 2,\n};\n\nexport const stressOptions: IConflictFarmConfig = {\n\tminLength: { min: 1, max: 512 },\n\tclients: { min: 1, max: 32 },\n\topsPerRoundRange: { min: 1, max: 128 },\n\trounds: 32,\n\toperations: allOperations,\n\tgrowthFunc: (input: number) => input * 2,\n};\n\n// Generate a list of single character client names, support up to 69 clients\nconst clientNames = generateClientNames();\n\nfunction runConflictFarmTests(opts: IConflictFarmConfig, extraSeed?: number): void {\n\tdoOverRange(opts.minLength, opts.growthFunc, (minLength) => {\n\t\tfor (const { name, config } of [\n\t\t\t{\n\t\t\t\tname: \"applyOpsDuringGeneration\",\n\t\t\t\tconfig: { ...opts, applyOpDuringGeneration: true },\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"obliterate with number endpoints\",\n\t\t\t\tconfig: {\n\t\t\t\t\t...opts,\n\t\t\t\t\toperations: [...opts.operations, obliterateRange],\n\t\t\t\t},\n\t\t\t},\n\t\t\t// TODO: AB#15630\n\t\t\t// {\n\t\t\t// \tname: \"obliterate with sided endpoints\",\n\t\t\t// \tconfig: {\n\t\t\t// \t\t...opts,\n\t\t\t// \t\toperations: [...opts.operations, obliterateRange, obliterateRangeSided],\n\t\t\t// \t},\n\t\t\t// },\n\t\t])\n\t\t\tit(`${name}: ConflictFarm_${minLength}`, async () => {\n\t\t\t\tconst random = makeRandom(0xdeadbeef, 0xfeedbed, minLength, extraSeed ?? 0);\n\n\t\t\t\tconst clients: TestClient[] = [\n\t\t\t\t\tnew TestClient({\n\t\t\t\t\t\tmergeTreeEnableObliterate: true,\n\t\t\t\t\t\tmergeTreeEnableSidedObliterate: true,\n\t\t\t\t\t}),\n\t\t\t\t];\n\t\t\t\tfor (const [i, c] of clients.entries()) c.startOrUpdateCollaboration(clientNames[i]);\n\n\t\t\t\tlet seq = 0;\n\t\t\t\twhile (clients.length < config.clients.max) {\n\t\t\t\t\tfor (const c of clients) c.updateMinSeq(seq);\n\n\t\t\t\t\t// Add double the number of clients each iteration\n\t\t\t\t\tconst targetClients = Math.max(\n\t\t\t\t\t\tconfig.clients.min,\n\t\t\t\t\t\tconfig.growthFunc(clients.length),\n\t\t\t\t\t);\n\t\t\t\t\tfor (let cc = clients.length; cc < targetClients; cc++) {\n\t\t\t\t\t\tconst newClient = await TestClient.createFromClientSnapshot(\n\t\t\t\t\t\t\tclients[0],\n\t\t\t\t\t\t\tclientNames[cc],\n\t\t\t\t\t\t);\n\t\t\t\t\t\tclients.push(newClient);\n\t\t\t\t\t}\n\n\t\t\t\t\tseq = runMergeTreeOperationRunner(random, seq, clients, minLength, config);\n\t\t\t\t}\n\t\t\t}).timeout(30 * 10000);\n\t});\n}\n\ndescribeFuzz(\"MergeTree.Client\", ({ testCount, stressMode }) => {\n\tconst opts = stressMode === StressMode.Short ? defaultOptions : stressOptions;\n\t// defaultOptions;\n\t// debugOptions;\n\t// longOptions;\n\n\tif (testCount > 1) {\n\t\tdoOverRange(\n\t\t\t{ min: 0, max: testCount - 1 },\n\t\t\t(x) => x + 1,\n\t\t\t(seed) => {\n\t\t\t\tdescribe(`with seed ${seed}`, () => {\n\t\t\t\t\trunConflictFarmTests(opts, seed);\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\t} else {\n\t\trunConflictFarmTests(opts);\n\t}\n});\n"]}
|
|
@@ -119,10 +119,10 @@ const treeFactories = [
|
|
|
119
119
|
}
|
|
120
120
|
const remove = Math.round(initialText.length / 4);
|
|
121
121
|
// remove from start
|
|
122
|
-
mergeTree.markRangeRemoved(0, remove, UniversalSequenceNumber, localClientId, UniversalSequenceNumber,
|
|
122
|
+
mergeTree.markRangeRemoved(0, remove, UniversalSequenceNumber, localClientId, UniversalSequenceNumber, undefined);
|
|
123
123
|
initialText = initialText.slice(Math.max(0, remove));
|
|
124
124
|
// remove from end
|
|
125
|
-
mergeTree.markRangeRemoved(initialText.length - remove, initialText.length, UniversalSequenceNumber, localClientId, UniversalSequenceNumber,
|
|
125
|
+
mergeTree.markRangeRemoved(initialText.length - remove, initialText.length, UniversalSequenceNumber, localClientId, UniversalSequenceNumber, undefined);
|
|
126
126
|
initialText = initialText.slice(0, Math.max(0, initialText.length - remove));
|
|
127
127
|
mergeTree.startCollaboration(localClientId,
|
|
128
128
|
/* minSeq: */ UniversalSequenceNumber,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeTree.insertingWalk.spec.js","sourceRoot":"","sources":["../../src/test/mergeTree.insertingWalk.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 { MergeTreeTextHelper } from \"../MergeTreeTextHelper.js\";\nimport {\n\tLocalClientId,\n\tUnassignedSequenceNumber,\n\tUniversalSequenceNumber,\n} from \"../constants.js\";\nimport { MergeTree } from \"../mergeTree.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { MergeBlock, MaxNodesInBlock } from \"../mergeTreeNodes.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport {\n\tinsertSegments,\n\tinsertText,\n\tmarkRangeRemoved,\n\tnodeOrdinalsHaveIntegrity,\n} from \"./testUtils.js\";\n\ninterface ITestTreeFactory {\n\treadonly create: () => ITestData;\n\treadonly name: string;\n}\n\ninterface ITestData {\n\treadonly mergeTree: MergeTree;\n\treadonly textHelper: MergeTreeTextHelper;\n\treadonly initialText: string;\n\treadonly middle: number;\n\treadonly refSeq: number;\n}\n\nconst localClientId = 17;\nconst treeFactories: ITestTreeFactory[] = [\n\t{\n\t\tcreate: (): ITestData => {\n\t\t\tconst initialText = \"hello world\";\n\t\t\tconst mergeTree = new MergeTree();\n\t\t\tinsertSegments({\n\t\t\t\tmergeTree,\n\t\t\t\tpos: 0,\n\t\t\t\tsegments: [TextSegment.make(initialText)],\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\tclientId: LocalClientId,\n\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\topArgs: undefined,\n\t\t\t});\n\t\t\tmergeTree.startCollaboration(\n\t\t\t\tlocalClientId,\n\t\t\t\t/* minSeq: */ UniversalSequenceNumber,\n\t\t\t\t/* currentSeq: */ UniversalSequenceNumber,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tinitialText,\n\t\t\t\tmergeTree,\n\t\t\t\tmiddle: Math.round(initialText.length / 2),\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\ttextHelper: new MergeTreeTextHelper(mergeTree),\n\t\t\t};\n\t\t},\n\t\tname: \"single segment tree\",\n\t},\n\t{\n\t\tcreate: (): ITestData => {\n\t\t\tlet initialText = \"0\";\n\t\t\tconst mergeTree = new MergeTree();\n\t\t\tinsertSegments({\n\t\t\t\tmergeTree,\n\t\t\t\tpos: 0,\n\t\t\t\tsegments: [TextSegment.make(initialText)],\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\tclientId: LocalClientId,\n\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\topArgs: undefined,\n\t\t\t});\n\t\t\tfor (let i = 1; i < MaxNodesInBlock - 1; i++) {\n\t\t\t\tconst text = i.toString();\n\t\t\t\tinsertText({\n\t\t\t\t\tmergeTree,\n\t\t\t\t\tpos: mergeTree.getLength(UniversalSequenceNumber, localClientId),\n\t\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\t\tclientId: localClientId,\n\t\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\t\ttext,\n\t\t\t\t\tprops: undefined,\n\t\t\t\t\topArgs: undefined,\n\t\t\t\t});\n\t\t\t\tinitialText += text;\n\t\t\t}\n\n\t\t\tconst textHelper = new MergeTreeTextHelper(mergeTree);\n\t\t\tassert.equal(textHelper.getText(UniversalSequenceNumber, localClientId), initialText);\n\n\t\t\tconst nodes: MergeBlock[] = [mergeTree.root];\n\t\t\twhile (nodes.length > 0) {\n\t\t\t\tconst node = nodes.pop()!;\n\t\t\t\tassert.equal(node.childCount, MaxNodesInBlock - 1);\n\t\t\t\tconst childrenBlocks = node.children\n\t\t\t\t\t.map((v) => v as MergeBlock)\n\t\t\t\t\t.filter((v) => v === undefined);\n\t\t\t\tnodes.push(...childrenBlocks);\n\t\t\t}\n\n\t\t\tmergeTree.startCollaboration(\n\t\t\t\tlocalClientId,\n\t\t\t\t/* minSeq: */ UniversalSequenceNumber,\n\t\t\t\t/* currentSeq: */ UniversalSequenceNumber,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tinitialText,\n\t\t\t\tmergeTree,\n\t\t\t\tmiddle: Math.round(MaxNodesInBlock / 2),\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\ttextHelper,\n\t\t\t};\n\t\t},\n\t\tname: \"Full single layer tree\",\n\t},\n\t{\n\t\tcreate: (): ITestData => {\n\t\t\tlet initialText = \"0\";\n\t\t\tconst mergeTree = new MergeTree();\n\t\t\tinsertSegments({\n\t\t\t\tmergeTree,\n\t\t\t\tpos: 0,\n\t\t\t\tsegments: [TextSegment.make(initialText)],\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\tclientId: LocalClientId,\n\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\topArgs: undefined,\n\t\t\t});\n\t\t\tfor (let i = 1; i < MaxNodesInBlock * 4; i++) {\n\t\t\t\tconst text = i.toString();\n\t\t\t\tinsertText({\n\t\t\t\t\tmergeTree,\n\t\t\t\t\tpos: mergeTree.getLength(UniversalSequenceNumber, localClientId),\n\t\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\t\tclientId: localClientId,\n\t\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\t\ttext,\n\t\t\t\t\tprops: undefined,\n\t\t\t\t\topArgs: undefined,\n\t\t\t\t});\n\t\t\t\tinitialText += text;\n\t\t\t}\n\n\t\t\tconst remove = Math.round(initialText.length / 4);\n\t\t\t// remove from start\n\t\t\tmergeTree.markRangeRemoved(\n\t\t\t\t0,\n\t\t\t\tremove,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tlocalClientId,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tfalse,\n\t\t\t\tundefined as never,\n\t\t\t);\n\t\t\tinitialText = initialText.slice(Math.max(0, remove));\n\n\t\t\t// remove from end\n\t\t\tmergeTree.markRangeRemoved(\n\t\t\t\tinitialText.length - remove,\n\t\t\t\tinitialText.length,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tlocalClientId,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tfalse,\n\t\t\t\tundefined as never,\n\t\t\t);\n\t\t\tinitialText = initialText.slice(0, Math.max(0, initialText.length - remove));\n\n\t\t\tmergeTree.startCollaboration(\n\t\t\t\tlocalClientId,\n\t\t\t\t/* minSeq: */ UniversalSequenceNumber,\n\t\t\t\t/* currentSeq: */ UniversalSequenceNumber,\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tinitialText,\n\t\t\t\tmergeTree,\n\t\t\t\tmiddle: Math.round(initialText.length / 2),\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\ttextHelper: new MergeTreeTextHelper(mergeTree),\n\t\t\t};\n\t\t},\n\t\tname: \"Tree with remove segments\",\n\t},\n];\n\ndescribe(\"MergeTree.insertingWalk\", () => {\n\tfor (const tf of treeFactories) {\n\t\tdescribe(tf.name, () => {\n\t\t\tconst treeFactory = tf;\n\t\t\tlet testData: ITestData;\n\t\t\tbeforeEach(() => {\n\t\t\t\ttestData = treeFactory.create();\n\t\t\t\tassert(nodeOrdinalsHaveIntegrity(testData.mergeTree.root));\n\t\t\t});\n\t\t\tafterEach(() => {\n\t\t\t\tassert(nodeOrdinalsHaveIntegrity(testData.mergeTree.root));\n\t\t\t});\n\t\t\tdescribe(\"insertText\", () => {\n\t\t\t\tit(\"at beginning\", () => {\n\t\t\t\t\tinsertText({\n\t\t\t\t\t\tmergeTree: testData.mergeTree,\n\t\t\t\t\t\tpos: 0,\n\t\t\t\t\t\trefSeq: testData.refSeq,\n\t\t\t\t\t\tclientId: localClientId,\n\t\t\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\t\t\ttext: \"a\",\n\t\t\t\t\t\tprops: undefined,\n\t\t\t\t\t\topArgs: undefined,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\ttestData.mergeTree.getLength(testData.refSeq, localClientId),\n\t\t\t\t\t\ttestData.initialText.length + 1,\n\t\t\t\t\t);\n\t\t\t\t\tconst currentValue = testData.textHelper.getText(testData.refSeq, localClientId);\n\t\t\t\t\tassert.equal(currentValue.length, testData.initialText.length + 1);\n\t\t\t\t\tassert.equal(currentValue, `a${testData.initialText}`);\n\t\t\t\t});\n\n\t\t\t\tit(\"at end\", () => {\n\t\t\t\t\tinsertText({\n\t\t\t\t\t\tmergeTree: testData.mergeTree,\n\t\t\t\t\t\tpos: testData.initialText.length,\n\t\t\t\t\t\trefSeq: testData.refSeq,\n\t\t\t\t\t\tclientId: localClientId,\n\t\t\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\t\t\ttext: \"a\",\n\t\t\t\t\t\tprops: undefined,\n\t\t\t\t\t\topArgs: undefined,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\ttestData.mergeTree.getLength(testData.refSeq, localClientId),\n\t\t\t\t\t\ttestData.initialText.length + 1,\n\t\t\t\t\t);\n\t\t\t\t\tconst currentValue = testData.textHelper.getText(testData.refSeq, localClientId);\n\t\t\t\t\tassert.equal(currentValue.length, testData.initialText.length + 1);\n\t\t\t\t\tassert.equal(currentValue, `${testData.initialText}a`);\n\t\t\t\t});\n\n\t\t\t\tit(\"in middle\", () => {\n\t\t\t\t\tinsertText({\n\t\t\t\t\t\tmergeTree: testData.mergeTree,\n\t\t\t\t\t\tpos: testData.middle,\n\t\t\t\t\t\trefSeq: testData.refSeq,\n\t\t\t\t\t\tclientId: localClientId,\n\t\t\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\t\t\ttext: \"a\",\n\t\t\t\t\t\tprops: undefined,\n\t\t\t\t\t\topArgs: undefined,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\ttestData.mergeTree.getLength(testData.refSeq, localClientId),\n\t\t\t\t\t\ttestData.initialText.length + 1,\n\t\t\t\t\t);\n\t\t\t\t\tconst currentValue = testData.textHelper.getText(testData.refSeq, localClientId);\n\t\t\t\t\tassert.equal(currentValue.length, testData.initialText.length + 1);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t`${testData.initialText.slice(0, Math.max(0, testData.middle))}` +\n\t\t\t\t\t\t\t\"a\" +\n\t\t\t\t\t\t\t`${testData.initialText.slice(Math.max(0, testData.middle))}`,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tit(\"handles conflicts involving removed segments across block boundaries\", () => {\n\t\tlet initialText = \"0\";\n\t\tlet seq = 0;\n\t\tconst mergeTree = new MergeTree();\n\t\tmergeTree.startCollaboration(localClientId, 0, seq);\n\t\tinsertSegments({\n\t\t\tmergeTree,\n\t\t\tpos: 0,\n\t\t\tsegments: [TextSegment.make(initialText)],\n\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\tclientId: localClientId,\n\t\t\tseq: UniversalSequenceNumber,\n\t\t\topArgs: undefined,\n\t\t});\n\t\tfor (let i = 1; i < MaxNodesInBlock; i++) {\n\t\t\tconst text = String.fromCodePoint(i + 64);\n\t\t\tinsertText({\n\t\t\t\tmergeTree,\n\t\t\t\tpos: 0,\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\tclientId: localClientId,\n\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\ttext,\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: undefined,\n\t\t\t});\n\t\t\tinitialText += text;\n\t\t}\n\n\t\tconst textHelper = new MergeTreeTextHelper(mergeTree);\n\n\t\tassert.equal(mergeTree.root.childCount, 2);\n\t\tassert.equal(textHelper.getText(0, localClientId), \"GFEDCBA0\");\n\t\t// Remove \"DCBA\"\n\t\tmarkRangeRemoved({\n\t\t\tmergeTree,\n\t\t\tstart: 3,\n\t\t\tend: 7,\n\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\tclientId: localClientId,\n\t\t\tseq: UnassignedSequenceNumber,\n\t\t\toverwrite: false,\n\t\t\topArgs: undefined as never,\n\t\t});\n\t\tassert.equal(textHelper.getText(0, localClientId), \"GFE0\");\n\t\t// Simulate another client inserting concurrently with the above operations. Because\n\t\t// all segments but the 0 are unacked, this insert should place the segment directly\n\t\t// before the 0. Prior to this regression test, an issue with `rightExcursion` in the\n\t\t// merge conflict logic instead caused the segment to be placed before the removed segments.\n\t\tinsertText({\n\t\t\tmergeTree,\n\t\t\tpos: 0,\n\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\tclientId: localClientId + 1,\n\t\t\tseq: ++seq,\n\t\t\ttext: \"x\",\n\t\t});\n\n\t\tconst segments: string[] = [];\n\t\twalkAllChildSegments(mergeTree.root, (seg) => {\n\t\t\tif (TextSegment.is(seg)) {\n\t\t\t\tif (seg.localRemovedSeq !== undefined || seg.removedSeq !== undefined) {\n\t\t\t\t\tsegments.push(`(${seg.text})`);\n\t\t\t\t} else {\n\t\t\t\t\tsegments.push(seg.text);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\tassert.deepStrictEqual(segments, [\"G\", \"F\", \"E\", \"(D)\", \"(C)\", \"(B)\", \"(A)\", \"x\", \"0\"]);\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"mergeTree.insertingWalk.spec.js","sourceRoot":"","sources":["../../src/test/mergeTree.insertingWalk.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 { MergeTreeTextHelper } from \"../MergeTreeTextHelper.js\";\nimport {\n\tLocalClientId,\n\tUnassignedSequenceNumber,\n\tUniversalSequenceNumber,\n} from \"../constants.js\";\nimport { MergeTree } from \"../mergeTree.js\";\nimport { walkAllChildSegments } from \"../mergeTreeNodeWalk.js\";\nimport { MergeBlock, MaxNodesInBlock } from \"../mergeTreeNodes.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport {\n\tinsertSegments,\n\tinsertText,\n\tmarkRangeRemoved,\n\tnodeOrdinalsHaveIntegrity,\n} from \"./testUtils.js\";\n\ninterface ITestTreeFactory {\n\treadonly create: () => ITestData;\n\treadonly name: string;\n}\n\ninterface ITestData {\n\treadonly mergeTree: MergeTree;\n\treadonly textHelper: MergeTreeTextHelper;\n\treadonly initialText: string;\n\treadonly middle: number;\n\treadonly refSeq: number;\n}\n\nconst localClientId = 17;\nconst treeFactories: ITestTreeFactory[] = [\n\t{\n\t\tcreate: (): ITestData => {\n\t\t\tconst initialText = \"hello world\";\n\t\t\tconst mergeTree = new MergeTree();\n\t\t\tinsertSegments({\n\t\t\t\tmergeTree,\n\t\t\t\tpos: 0,\n\t\t\t\tsegments: [TextSegment.make(initialText)],\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\tclientId: LocalClientId,\n\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\topArgs: undefined,\n\t\t\t});\n\t\t\tmergeTree.startCollaboration(\n\t\t\t\tlocalClientId,\n\t\t\t\t/* minSeq: */ UniversalSequenceNumber,\n\t\t\t\t/* currentSeq: */ UniversalSequenceNumber,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tinitialText,\n\t\t\t\tmergeTree,\n\t\t\t\tmiddle: Math.round(initialText.length / 2),\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\ttextHelper: new MergeTreeTextHelper(mergeTree),\n\t\t\t};\n\t\t},\n\t\tname: \"single segment tree\",\n\t},\n\t{\n\t\tcreate: (): ITestData => {\n\t\t\tlet initialText = \"0\";\n\t\t\tconst mergeTree = new MergeTree();\n\t\t\tinsertSegments({\n\t\t\t\tmergeTree,\n\t\t\t\tpos: 0,\n\t\t\t\tsegments: [TextSegment.make(initialText)],\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\tclientId: LocalClientId,\n\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\topArgs: undefined,\n\t\t\t});\n\t\t\tfor (let i = 1; i < MaxNodesInBlock - 1; i++) {\n\t\t\t\tconst text = i.toString();\n\t\t\t\tinsertText({\n\t\t\t\t\tmergeTree,\n\t\t\t\t\tpos: mergeTree.getLength(UniversalSequenceNumber, localClientId),\n\t\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\t\tclientId: localClientId,\n\t\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\t\ttext,\n\t\t\t\t\tprops: undefined,\n\t\t\t\t\topArgs: undefined,\n\t\t\t\t});\n\t\t\t\tinitialText += text;\n\t\t\t}\n\n\t\t\tconst textHelper = new MergeTreeTextHelper(mergeTree);\n\t\t\tassert.equal(textHelper.getText(UniversalSequenceNumber, localClientId), initialText);\n\n\t\t\tconst nodes: MergeBlock[] = [mergeTree.root];\n\t\t\twhile (nodes.length > 0) {\n\t\t\t\tconst node = nodes.pop()!;\n\t\t\t\tassert.equal(node.childCount, MaxNodesInBlock - 1);\n\t\t\t\tconst childrenBlocks = node.children\n\t\t\t\t\t.map((v) => v as MergeBlock)\n\t\t\t\t\t.filter((v) => v === undefined);\n\t\t\t\tnodes.push(...childrenBlocks);\n\t\t\t}\n\n\t\t\tmergeTree.startCollaboration(\n\t\t\t\tlocalClientId,\n\t\t\t\t/* minSeq: */ UniversalSequenceNumber,\n\t\t\t\t/* currentSeq: */ UniversalSequenceNumber,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tinitialText,\n\t\t\t\tmergeTree,\n\t\t\t\tmiddle: Math.round(MaxNodesInBlock / 2),\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\ttextHelper,\n\t\t\t};\n\t\t},\n\t\tname: \"Full single layer tree\",\n\t},\n\t{\n\t\tcreate: (): ITestData => {\n\t\t\tlet initialText = \"0\";\n\t\t\tconst mergeTree = new MergeTree();\n\t\t\tinsertSegments({\n\t\t\t\tmergeTree,\n\t\t\t\tpos: 0,\n\t\t\t\tsegments: [TextSegment.make(initialText)],\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\tclientId: LocalClientId,\n\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\topArgs: undefined,\n\t\t\t});\n\t\t\tfor (let i = 1; i < MaxNodesInBlock * 4; i++) {\n\t\t\t\tconst text = i.toString();\n\t\t\t\tinsertText({\n\t\t\t\t\tmergeTree,\n\t\t\t\t\tpos: mergeTree.getLength(UniversalSequenceNumber, localClientId),\n\t\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\t\tclientId: localClientId,\n\t\t\t\t\tseq: UniversalSequenceNumber,\n\t\t\t\t\ttext,\n\t\t\t\t\tprops: undefined,\n\t\t\t\t\topArgs: undefined,\n\t\t\t\t});\n\t\t\t\tinitialText += text;\n\t\t\t}\n\n\t\t\tconst remove = Math.round(initialText.length / 4);\n\t\t\t// remove from start\n\t\t\tmergeTree.markRangeRemoved(\n\t\t\t\t0,\n\t\t\t\tremove,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tlocalClientId,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tundefined as never,\n\t\t\t);\n\t\t\tinitialText = initialText.slice(Math.max(0, remove));\n\n\t\t\t// remove from end\n\t\t\tmergeTree.markRangeRemoved(\n\t\t\t\tinitialText.length - remove,\n\t\t\t\tinitialText.length,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tlocalClientId,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tundefined as never,\n\t\t\t);\n\t\t\tinitialText = initialText.slice(0, Math.max(0, initialText.length - remove));\n\n\t\t\tmergeTree.startCollaboration(\n\t\t\t\tlocalClientId,\n\t\t\t\t/* minSeq: */ UniversalSequenceNumber,\n\t\t\t\t/* currentSeq: */ UniversalSequenceNumber,\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tinitialText,\n\t\t\t\tmergeTree,\n\t\t\t\tmiddle: Math.round(initialText.length / 2),\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\ttextHelper: new MergeTreeTextHelper(mergeTree),\n\t\t\t};\n\t\t},\n\t\tname: \"Tree with remove segments\",\n\t},\n];\n\ndescribe(\"MergeTree.insertingWalk\", () => {\n\tfor (const tf of treeFactories) {\n\t\tdescribe(tf.name, () => {\n\t\t\tconst treeFactory = tf;\n\t\t\tlet testData: ITestData;\n\t\t\tbeforeEach(() => {\n\t\t\t\ttestData = treeFactory.create();\n\t\t\t\tassert(nodeOrdinalsHaveIntegrity(testData.mergeTree.root));\n\t\t\t});\n\t\t\tafterEach(() => {\n\t\t\t\tassert(nodeOrdinalsHaveIntegrity(testData.mergeTree.root));\n\t\t\t});\n\t\t\tdescribe(\"insertText\", () => {\n\t\t\t\tit(\"at beginning\", () => {\n\t\t\t\t\tinsertText({\n\t\t\t\t\t\tmergeTree: testData.mergeTree,\n\t\t\t\t\t\tpos: 0,\n\t\t\t\t\t\trefSeq: testData.refSeq,\n\t\t\t\t\t\tclientId: localClientId,\n\t\t\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\t\t\ttext: \"a\",\n\t\t\t\t\t\tprops: undefined,\n\t\t\t\t\t\topArgs: undefined,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\ttestData.mergeTree.getLength(testData.refSeq, localClientId),\n\t\t\t\t\t\ttestData.initialText.length + 1,\n\t\t\t\t\t);\n\t\t\t\t\tconst currentValue = testData.textHelper.getText(testData.refSeq, localClientId);\n\t\t\t\t\tassert.equal(currentValue.length, testData.initialText.length + 1);\n\t\t\t\t\tassert.equal(currentValue, `a${testData.initialText}`);\n\t\t\t\t});\n\n\t\t\t\tit(\"at end\", () => {\n\t\t\t\t\tinsertText({\n\t\t\t\t\t\tmergeTree: testData.mergeTree,\n\t\t\t\t\t\tpos: testData.initialText.length,\n\t\t\t\t\t\trefSeq: testData.refSeq,\n\t\t\t\t\t\tclientId: localClientId,\n\t\t\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\t\t\ttext: \"a\",\n\t\t\t\t\t\tprops: undefined,\n\t\t\t\t\t\topArgs: undefined,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\ttestData.mergeTree.getLength(testData.refSeq, localClientId),\n\t\t\t\t\t\ttestData.initialText.length + 1,\n\t\t\t\t\t);\n\t\t\t\t\tconst currentValue = testData.textHelper.getText(testData.refSeq, localClientId);\n\t\t\t\t\tassert.equal(currentValue.length, testData.initialText.length + 1);\n\t\t\t\t\tassert.equal(currentValue, `${testData.initialText}a`);\n\t\t\t\t});\n\n\t\t\t\tit(\"in middle\", () => {\n\t\t\t\t\tinsertText({\n\t\t\t\t\t\tmergeTree: testData.mergeTree,\n\t\t\t\t\t\tpos: testData.middle,\n\t\t\t\t\t\trefSeq: testData.refSeq,\n\t\t\t\t\t\tclientId: localClientId,\n\t\t\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\t\t\ttext: \"a\",\n\t\t\t\t\t\tprops: undefined,\n\t\t\t\t\t\topArgs: undefined,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\ttestData.mergeTree.getLength(testData.refSeq, localClientId),\n\t\t\t\t\t\ttestData.initialText.length + 1,\n\t\t\t\t\t);\n\t\t\t\t\tconst currentValue = testData.textHelper.getText(testData.refSeq, localClientId);\n\t\t\t\t\tassert.equal(currentValue.length, testData.initialText.length + 1);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\t`${testData.initialText.slice(0, Math.max(0, testData.middle))}` +\n\t\t\t\t\t\t\t\"a\" +\n\t\t\t\t\t\t\t`${testData.initialText.slice(Math.max(0, testData.middle))}`,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tit(\"handles conflicts involving removed segments across block boundaries\", () => {\n\t\tlet initialText = \"0\";\n\t\tlet seq = 0;\n\t\tconst mergeTree = new MergeTree();\n\t\tmergeTree.startCollaboration(localClientId, 0, seq);\n\t\tinsertSegments({\n\t\t\tmergeTree,\n\t\t\tpos: 0,\n\t\t\tsegments: [TextSegment.make(initialText)],\n\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\tclientId: localClientId,\n\t\t\tseq: UniversalSequenceNumber,\n\t\t\topArgs: undefined,\n\t\t});\n\t\tfor (let i = 1; i < MaxNodesInBlock; i++) {\n\t\t\tconst text = String.fromCodePoint(i + 64);\n\t\t\tinsertText({\n\t\t\t\tmergeTree,\n\t\t\t\tpos: 0,\n\t\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\t\tclientId: localClientId,\n\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\ttext,\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: undefined,\n\t\t\t});\n\t\t\tinitialText += text;\n\t\t}\n\n\t\tconst textHelper = new MergeTreeTextHelper(mergeTree);\n\n\t\tassert.equal(mergeTree.root.childCount, 2);\n\t\tassert.equal(textHelper.getText(0, localClientId), \"GFEDCBA0\");\n\t\t// Remove \"DCBA\"\n\t\tmarkRangeRemoved({\n\t\t\tmergeTree,\n\t\t\tstart: 3,\n\t\t\tend: 7,\n\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\tclientId: localClientId,\n\t\t\tseq: UnassignedSequenceNumber,\n\t\t\toverwrite: false,\n\t\t\topArgs: undefined as never,\n\t\t});\n\t\tassert.equal(textHelper.getText(0, localClientId), \"GFE0\");\n\t\t// Simulate another client inserting concurrently with the above operations. Because\n\t\t// all segments but the 0 are unacked, this insert should place the segment directly\n\t\t// before the 0. Prior to this regression test, an issue with `rightExcursion` in the\n\t\t// merge conflict logic instead caused the segment to be placed before the removed segments.\n\t\tinsertText({\n\t\t\tmergeTree,\n\t\t\tpos: 0,\n\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\tclientId: localClientId + 1,\n\t\t\tseq: ++seq,\n\t\t\ttext: \"x\",\n\t\t});\n\n\t\tconst segments: string[] = [];\n\t\twalkAllChildSegments(mergeTree.root, (seg) => {\n\t\t\tif (TextSegment.is(seg)) {\n\t\t\t\tif (seg.localRemovedSeq !== undefined || seg.removedSeq !== undefined) {\n\t\t\t\t\tsegments.push(`(${seg.text})`);\n\t\t\t\t} else {\n\t\t\t\t\tsegments.push(seg.text);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\tassert.deepStrictEqual(segments, [\"G\", \"F\", \"E\", \"(D)\", \"(C)\", \"(B)\", \"(A)\", \"x\", \"0\"]);\n\t});\n});\n"]}
|