@fluidframework/merge-tree 2.4.0-297027 → 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.
Files changed (130) hide show
  1. package/api-report/merge-tree.legacy.alpha.api.md +0 -1
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +3 -3
  4. package/dist/client.js.map +1 -1
  5. package/dist/collections/list.d.ts +1 -0
  6. package/dist/collections/list.d.ts.map +1 -1
  7. package/dist/collections/list.js +4 -1
  8. package/dist/collections/list.js.map +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/localReference.d.ts +1 -1
  13. package/dist/localReference.d.ts.map +1 -1
  14. package/dist/localReference.js.map +1 -1
  15. package/dist/mergeTree.d.ts +9 -9
  16. package/dist/mergeTree.d.ts.map +1 -1
  17. package/dist/mergeTree.js +41 -13
  18. package/dist/mergeTree.js.map +1 -1
  19. package/dist/mergeTreeNodes.d.ts +27 -8
  20. package/dist/mergeTreeNodes.d.ts.map +1 -1
  21. package/dist/mergeTreeNodes.js +0 -17
  22. package/dist/mergeTreeNodes.js.map +1 -1
  23. package/dist/revertibles.d.ts.map +1 -1
  24. package/dist/revertibles.js +4 -2
  25. package/dist/revertibles.js.map +1 -1
  26. package/dist/snapshotV1.d.ts.map +1 -1
  27. package/dist/snapshotV1.js +0 -2
  28. package/dist/snapshotV1.js.map +1 -1
  29. package/dist/snapshotlegacy.d.ts.map +1 -1
  30. package/dist/snapshotlegacy.js +0 -1
  31. package/dist/snapshotlegacy.js.map +1 -1
  32. package/dist/test/beastTest.spec.d.ts.map +1 -1
  33. package/dist/test/beastTest.spec.js +3 -3
  34. package/dist/test/beastTest.spec.js.map +1 -1
  35. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  36. package/dist/test/client.applyMsg.spec.js +79 -3
  37. package/dist/test/client.applyMsg.spec.js.map +1 -1
  38. package/dist/test/client.conflictFarm.spec.js +17 -4
  39. package/dist/test/client.conflictFarm.spec.js.map +1 -1
  40. package/dist/test/client.localReference.spec.js.map +1 -1
  41. package/dist/test/client.rollback.spec.js.map +1 -1
  42. package/dist/test/mergeTree.annotate.spec.js +29 -19
  43. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  44. package/dist/test/mergeTree.insertingWalk.spec.js +2 -2
  45. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  46. package/dist/test/mergeTreeOperationRunner.d.ts +1 -0
  47. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  48. package/dist/test/mergeTreeOperationRunner.js +22 -1
  49. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  50. package/dist/test/obliterate.partialLength.spec.js +0 -4
  51. package/dist/test/obliterate.partialLength.spec.js.map +1 -1
  52. package/dist/test/obliterate.spec.js +0 -6
  53. package/dist/test/obliterate.spec.js.map +1 -1
  54. package/dist/test/revertibleFarm.spec.js.map +1 -1
  55. package/dist/test/testUtils.d.ts +2 -3
  56. package/dist/test/testUtils.d.ts.map +1 -1
  57. package/dist/test/testUtils.js +4 -4
  58. package/dist/test/testUtils.js.map +1 -1
  59. package/dist/zamboni.js +2 -1
  60. package/dist/zamboni.js.map +1 -1
  61. package/lib/client.d.ts.map +1 -1
  62. package/lib/client.js +3 -3
  63. package/lib/client.js.map +1 -1
  64. package/lib/collections/list.d.ts +1 -0
  65. package/lib/collections/list.d.ts.map +1 -1
  66. package/lib/collections/list.js +4 -1
  67. package/lib/collections/list.js.map +1 -1
  68. package/lib/index.d.ts +1 -1
  69. package/lib/index.d.ts.map +1 -1
  70. package/lib/index.js.map +1 -1
  71. package/lib/localReference.d.ts +1 -1
  72. package/lib/localReference.d.ts.map +1 -1
  73. package/lib/localReference.js.map +1 -1
  74. package/lib/mergeTree.d.ts +9 -9
  75. package/lib/mergeTree.d.ts.map +1 -1
  76. package/lib/mergeTree.js +43 -15
  77. package/lib/mergeTree.js.map +1 -1
  78. package/lib/mergeTreeNodes.d.ts +27 -8
  79. package/lib/mergeTreeNodes.d.ts.map +1 -1
  80. package/lib/mergeTreeNodes.js +0 -17
  81. package/lib/mergeTreeNodes.js.map +1 -1
  82. package/lib/revertibles.d.ts.map +1 -1
  83. package/lib/revertibles.js +5 -3
  84. package/lib/revertibles.js.map +1 -1
  85. package/lib/snapshotV1.d.ts.map +1 -1
  86. package/lib/snapshotV1.js +0 -2
  87. package/lib/snapshotV1.js.map +1 -1
  88. package/lib/snapshotlegacy.d.ts.map +1 -1
  89. package/lib/snapshotlegacy.js +0 -1
  90. package/lib/snapshotlegacy.js.map +1 -1
  91. package/lib/test/beastTest.spec.d.ts.map +1 -1
  92. package/lib/test/beastTest.spec.js +3 -3
  93. package/lib/test/beastTest.spec.js.map +1 -1
  94. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  95. package/lib/test/client.applyMsg.spec.js +79 -3
  96. package/lib/test/client.applyMsg.spec.js.map +1 -1
  97. package/lib/test/client.conflictFarm.spec.js +18 -5
  98. package/lib/test/client.conflictFarm.spec.js.map +1 -1
  99. package/lib/test/client.localReference.spec.js.map +1 -1
  100. package/lib/test/client.rollback.spec.js.map +1 -1
  101. package/lib/test/mergeTree.annotate.spec.js +29 -19
  102. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  103. package/lib/test/mergeTree.insertingWalk.spec.js +2 -2
  104. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  105. package/lib/test/mergeTreeOperationRunner.d.ts +1 -0
  106. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  107. package/lib/test/mergeTreeOperationRunner.js +20 -0
  108. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  109. package/lib/test/obliterate.partialLength.spec.js +0 -4
  110. package/lib/test/obliterate.partialLength.spec.js.map +1 -1
  111. package/lib/test/obliterate.spec.js +0 -6
  112. package/lib/test/obliterate.spec.js.map +1 -1
  113. package/lib/test/revertibleFarm.spec.js.map +1 -1
  114. package/lib/test/testUtils.d.ts +2 -3
  115. package/lib/test/testUtils.d.ts.map +1 -1
  116. package/lib/test/testUtils.js +4 -4
  117. package/lib/test/testUtils.js.map +1 -1
  118. package/lib/zamboni.js +2 -1
  119. package/lib/zamboni.js.map +1 -1
  120. package/package.json +20 -21
  121. package/src/client.ts +0 -3
  122. package/src/collections/list.ts +6 -0
  123. package/src/index.ts +1 -0
  124. package/src/localReference.ts +5 -5
  125. package/src/mergeTree.ts +95 -62
  126. package/src/mergeTreeNodes.ts +35 -29
  127. package/src/revertibles.ts +12 -5
  128. package/src/snapshotV1.ts +0 -2
  129. package/src/snapshotlegacy.ts +0 -1
  130. package/src/zamboni.ts +3 -2
@@ -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", () => {
@@ -81,7 +82,7 @@ describe("client.applyMsg", () => {
81
82
  for (let i = 0; i < client.getText().length; i++) {
82
83
  const segmentInfo = client.getContainingSegment(i);
83
84
  assert.notEqual(segmentInfo.segment?.seq, UnassignedSequenceNumber, "all segments should be acked");
84
- assert(segmentInfo.segment?.segmentGroups.empty, "there should be no outstanding segmentGroups");
85
+ assert(segmentInfo.segment?.segmentGroups?.empty !== false, "there should be no outstanding segmentGroups");
85
86
  }
86
87
  });
87
88
  it("insertTextLocal", () => {
@@ -152,10 +153,10 @@ describe("client.applyMsg", () => {
152
153
  const initialText = client.getText();
153
154
  const initialLength = initialText.length;
154
155
  assert.equal(segmentInfo.segment?.removedSeq, undefined);
155
- assert(segmentInfo.segment?.segmentGroups.empty);
156
+ assert(segmentInfo.segment?.segmentGroups?.empty !== false);
156
157
  const removeOp = client.removeRangeLocal(start, end);
157
158
  assert.equal(segmentInfo.segment?.removedSeq, UnassignedSequenceNumber);
158
- assert.equal(segmentInfo.segment?.segmentGroups.size, 1);
159
+ assert.equal(segmentInfo.segment?.segmentGroups?.size, 1);
159
160
  const remoteMessage = client.makeOpMessage(removeOp, 17);
160
161
  remoteMessage.clientId = "remoteClient";
161
162
  client.applyMsg(remoteMessage);
@@ -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, 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(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,\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(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(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(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(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);\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(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(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(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 obliterate",
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 = [new TestClient({ mergeTreeEnableObliterate: true })];
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, isStress }) => {
81
- const opts = isStress ? stressOptions : defaultOptions;
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":"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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 } 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: \"with obliterate\",\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])\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[] = [new TestClient({ mergeTreeEnableObliterate: true })];\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, isStress }) => {\n\tconst opts = isStress ? stressOptions : defaultOptions;\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"]}
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"]}