@fluidframework/merge-tree 2.41.0-338401 → 2.42.0

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 (69) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/client.d.ts +6 -3
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +71 -25
  5. package/dist/client.js.map +1 -1
  6. package/dist/constants.d.ts +5 -0
  7. package/dist/constants.d.ts.map +1 -1
  8. package/dist/constants.js +6 -1
  9. package/dist/constants.js.map +1 -1
  10. package/dist/mergeTree.js +1 -1
  11. package/dist/mergeTree.js.map +1 -1
  12. package/dist/perspective.d.ts +15 -0
  13. package/dist/perspective.d.ts.map +1 -1
  14. package/dist/perspective.js +25 -1
  15. package/dist/perspective.js.map +1 -1
  16. package/dist/stamps.d.ts +1 -0
  17. package/dist/stamps.d.ts.map +1 -1
  18. package/dist/stamps.js +5 -1
  19. package/dist/stamps.js.map +1 -1
  20. package/dist/test/client.applyMsg.spec.js +4 -4
  21. package/dist/test/client.applyMsg.spec.js.map +1 -1
  22. package/dist/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
  23. package/dist/test/client.applyStashedOpFarm.spec.js +3 -3
  24. package/dist/test/client.applyStashedOpFarm.spec.js.map +1 -1
  25. package/dist/test/client.reconnectFarm.spec.js +1 -1
  26. package/dist/test/client.reconnectFarm.spec.js.map +1 -1
  27. package/dist/test/client.searchForMarker.spec.js +2 -2
  28. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  29. package/dist/test/clientTestHelper.js +1 -1
  30. package/dist/test/clientTestHelper.js.map +1 -1
  31. package/dist/test/resetPendingSegmentsToOp.spec.js +10 -10
  32. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  33. package/lib/client.d.ts +6 -3
  34. package/lib/client.d.ts.map +1 -1
  35. package/lib/client.js +73 -27
  36. package/lib/client.js.map +1 -1
  37. package/lib/constants.d.ts +5 -0
  38. package/lib/constants.d.ts.map +1 -1
  39. package/lib/constants.js +5 -0
  40. package/lib/constants.js.map +1 -1
  41. package/lib/mergeTree.js +1 -1
  42. package/lib/mergeTree.js.map +1 -1
  43. package/lib/perspective.d.ts +15 -0
  44. package/lib/perspective.d.ts.map +1 -1
  45. package/lib/perspective.js +23 -0
  46. package/lib/perspective.js.map +1 -1
  47. package/lib/stamps.d.ts +1 -0
  48. package/lib/stamps.d.ts.map +1 -1
  49. package/lib/stamps.js +4 -1
  50. package/lib/stamps.js.map +1 -1
  51. package/lib/test/client.applyMsg.spec.js +4 -4
  52. package/lib/test/client.applyMsg.spec.js.map +1 -1
  53. package/lib/test/client.applyStashedOpFarm.spec.d.ts.map +1 -1
  54. package/lib/test/client.applyStashedOpFarm.spec.js +3 -3
  55. package/lib/test/client.applyStashedOpFarm.spec.js.map +1 -1
  56. package/lib/test/client.reconnectFarm.spec.js +1 -1
  57. package/lib/test/client.reconnectFarm.spec.js.map +1 -1
  58. package/lib/test/client.searchForMarker.spec.js +2 -2
  59. package/lib/test/client.searchForMarker.spec.js.map +1 -1
  60. package/lib/test/clientTestHelper.js +1 -1
  61. package/lib/test/clientTestHelper.js.map +1 -1
  62. package/lib/test/resetPendingSegmentsToOp.spec.js +10 -10
  63. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  64. package/package.json +17 -17
  65. package/src/client.ts +95 -30
  66. package/src/constants.ts +6 -0
  67. package/src/mergeTree.ts +1 -1
  68. package/src/perspective.ts +26 -0
  69. package/src/stamps.ts +9 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.searchForMarker.spec.js","sourceRoot":"","sources":["../../src/test/client.searchForMarker.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\n\nimport { UniversalSequenceNumber } from \"../constants.js\";\nimport { MaxNodesInBlock, reservedMarkerIdKey } from \"../mergeTreeNodes.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { reservedTileLabelsKey } from \"../referencePositions.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState } from \"./testClientLogger.js\";\n\ndescribe(\"TestClient\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.mergeTree.insertSegments(\n\t\t\t0,\n\t\t\t[TextSegment.make(\"\")],\n\t\t\tclient.mergeTree.localPerspective,\n\t\t\tclient.mergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\tundefined,\n\t\t);\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tdescribe(\".searchForMarker\", () => {\n\t\tit(\"Should return marker at the search position in either direction\", () => {\n\t\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\t\tclient.insertMarkerLocal(4, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\t\t\tassert.equal(client.getLength(), 8);\n\n\t\t\tconst marker1 = client.searchForMarker(4, \"Eop\", true);\n\n\t\t\tassert(marker1, \"Returned marker undefined.\");\n\n\t\t\tlet exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker1,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 4, \"Marker with label not at expected position\");\n\n\t\t\tconst marker2 = client.searchForMarker(4, \"Eop\", false);\n\n\t\t\tassert(marker2, \"Returned marker undefined.\");\n\n\t\t\texp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker2,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 4, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should return the marker at the search position in either direction from multiple blocks\", () => {\n\t\t\tclient.insertTextLocal(0, \"abcd\");\n\t\t\tclient.insertTextLocal(4, \"efg\");\n\t\t\tclient.insertMarkerLocal(4, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\t\t\tassert.equal(client.getLength(), 8);\n\n\t\t\tconst marker1 = client.searchForMarker(4, \"Eop\", true);\n\n\t\t\tassert(marker1, \"Returned marker undefined.\");\n\n\t\t\tlet exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker1,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 4, \"Marker with label not at expected position\");\n\n\t\t\tconst marker2 = client.searchForMarker(4, \"Eop\", false);\n\n\t\t\tassert(marker2, \"Returned marker undefined.\");\n\n\t\t\texp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker2,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 4, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should be able to find forward marker position based on label\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\t\tassert.equal(client.getLength(), 4, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(0, markerLabel, true);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 3, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should be able to find forward marker position based on label from client with single marker\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tclient.insertTextLocal(0, \"abc d\");\n\n\t\t\tclient.insertMarkerLocal(1, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 6, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(0, markerLabel, true);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\t\t\tassert.equal(exp, 1, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should be able to find backward marker position based on label from client with multiple marker\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tclient.insertTextLocal(0, \"abc d\");\n\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tclient.insertTextLocal(7, \"ef\");\n\t\t\tclient.insertMarkerLocal(8, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 10, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(5, markerLabel, false);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should be able to find forward marker position from client with multiple marker\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tclient.insertTextLocal(0, \"abc d\");\n\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tclient.insertTextLocal(7, \"ef\");\n\t\t\tclient.insertMarkerLocal(8, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 10, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(5, markerLabel, true);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 6, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should be able to find forward marker position with multiple segments and markers\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tfor (const [i, _] of Array.from({ length: MaxNodesInBlock ** 3 * 2 }).entries())\n\t\t\t\tclient.insertTextLocal(0, i.toString());\n\t\t\t// pad the string with markers on both ends so we never get undefined solely for convenience of this test\n\t\t\tfor (let i = 0; i <= client.getLength(); i += 3) {\n\t\t\t\tclient.insertMarkerLocal(i, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (let index = 0; index < client.getLength(); index++) {\n\t\t\t\tconst marker = client.searchForMarker(index, markerLabel, true);\n\n\t\t\t\tassert(marker, `Returned marker undefined @ ${index}.`);\n\n\t\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\t\tmarker,\n\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\tclient.getClientId(),\n\t\t\t\t);\n\n\t\t\t\tconst offset = index % 3 === 0 ? index % 3 : 3 - (index % 3);\n\t\t\t\tassert.equal(exp, index + offset, \"Marker with label not at expected position\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"Should be able to find backward marker position with multiple segments and markers\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tfor (const [i, _] of Array.from({ length: MaxNodesInBlock ** 3 * 2 }).entries())\n\t\t\t\tclient.insertTextLocal(0, i.toString());\n\t\t\t// pad the string with markers on both ends so we never get undefined solely for convenience of this test\n\t\t\tfor (let i = 0; i <= client.getLength(); i += 3) {\n\t\t\t\tclient.insertMarkerLocal(i, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (let index = client.getLength() - 1; index >= 0; index--) {\n\t\t\t\tconst marker = client.searchForMarker(index, markerLabel, false);\n\n\t\t\t\tassert(marker, `Returned marker undefined @ ${index}.`);\n\n\t\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\t\tmarker,\n\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\tclient.getClientId(),\n\t\t\t\t);\n\n\t\t\t\tassert.equal(exp, index - (index % 3), \"Marker with label not at expected position\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"Should be able to find distant forward marker\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tfor (const [i, _] of Array.from({ length: MaxNodesInBlock ** 3 * 2 }).entries())\n\t\t\t\tclient.insertTextLocal(0, i.toString());\n\t\t\tfor (let i = 10; i > 1; i -= 2) {\n\t\t\t\tclient.insertMarkerLocal(client.getLength() - i, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfor (let index = 0; index < client.getLength(); index++) {\n\t\t\t\tconst exp = client.slowSearchForMarker(index, markerLabel, true);\n\t\t\t\tconst actual = client.searchForMarker(index, markerLabel, true);\n\n\t\t\t\tassert.equal(exp, actual, \"Marker with label not at expected position\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"Should be able to find distant backward marker\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tfor (const [i, _] of Array.from({ length: MaxNodesInBlock ** 3 * 2 }).entries())\n\t\t\t\tclient.insertTextLocal(0, i.toString());\n\t\t\tfor (let i = 10; i > 1; i -= 2) {\n\t\t\t\tclient.insertMarkerLocal(client.getLength() - i, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfor (let index = client.getLength() - 1; index >= 0; index--) {\n\t\t\t\tconst exp = client.slowSearchForMarker(index, markerLabel, false);\n\t\t\t\tconst actual = client.searchForMarker(index, markerLabel, false);\n\n\t\t\t\tassert.equal(exp, actual, \"Marker with label not at expected position\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"Should match results from forwardExcursion for many segments\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tfor (const [i, _] of Array.from({ length: MaxNodesInBlock * 3 }).entries())\n\t\t\t\tclient.insertTextLocal(0, i.toString());\n\t\t\tconst random = makeRandom(0xdeadbeef, 0xfeedbed, client.getLength());\n\t\t\tfor (let i = 0; i <= client.getLength() / 6; i++) {\n\t\t\t\tconst pos = random.integer(0, client.getLength() - 1);\n\t\t\t\tclient.insertMarkerLocal(pos, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (let index = 0; index < client.getLength(); index++) {\n\t\t\t\tconst exp = client.slowSearchForMarker(index, markerLabel, true);\n\t\t\t\tconst actual = client.searchForMarker(index, markerLabel, true);\n\n\t\t\t\tassert.equal(exp, actual, \"Marker with label not at expected position\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"Should match results from backwardExcursion for many segments\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tfor (const [i, _] of Array.from({ length: MaxNodesInBlock * 3 }).entries())\n\t\t\t\tclient.insertTextLocal(0, i.toString());\n\t\t\tconst random = makeRandom(0xdeadbeef, 0xfeedbed, client.getLength());\n\t\t\tfor (let i = 0; i <= client.getLength() / 6; i++) {\n\t\t\t\tconst pos = random.integer(0, client.getLength() - 1);\n\t\t\t\tclient.insertMarkerLocal(pos, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (let index = 0; index < client.getLength(); index++) {\n\t\t\t\tconst exp = client.slowSearchForMarker(index, markerLabel, false);\n\t\t\t\tconst actual = client.searchForMarker(index, markerLabel, false);\n\n\t\t\t\tassert.equal(exp, actual, \"Marker with label not at expected position\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"Should be able to find marker from client with text length 1\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 1, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(client.getLength() - 1, markerLabel, false);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tlet exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\n\t\t\tconst marker1 = client.searchForMarker(0, markerLabel, true);\n\n\t\t\tassert(marker1, \"Returned marker undefined.\");\n\n\t\t\texp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should not be able to find marker position with index out of bound\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\t\tassert.equal(client.getLength(), 4, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(5, markerLabel, true);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\n\t\t\tconst marker1 = client.searchForMarker(5, markerLabel, false);\n\n\t\t\tassert.equal(marker1, undefined, \"Returned marker should be undefined.\");\n\n\t\t\tconst marker2 = client.searchForMarker(-1, markerLabel, false);\n\n\t\t\tassert.equal(marker2, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should be able to find a deleted and rolled back marker\", () => {\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tclient.removeRangeLocal(0, 1);\n\n\t\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\t\tconst marker = client.searchForMarker(0, \"Eop\", true);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should not be able to find an inserted and rolled back marker\", () => {\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\t\tconst marker = client.searchForMarker(0, \"Eop\", true);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should be able to find a marker at 0 searching at 0 in both directions\", () => {\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 4);\n\n\t\t\tconst marker = client.searchForMarker(0, \"Eop\", true);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tlet exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\n\t\t\tconst marker2 = client.searchForMarker(0, \"Eop\", false);\n\n\t\t\tassert(marker2, \"Returned marker undefined.\");\n\n\t\t\texp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker2,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should be able to find a marker at length-1 searching at length-1 in both directions\", () => {\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\t\tconst length = client.getLength();\n\t\t\tassert.equal(length, 4);\n\n\t\t\tconst marker = client.searchForMarker(length - 1, \"Eop\", true);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tlet exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, length - 1, \"Marker with label not at expected position\");\n\n\t\t\tconst marker2 = client.searchForMarker(length - 1, \"Eop\", false);\n\n\t\t\tassert(marker2, \"Returned marker undefined.\");\n\n\t\t\texp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker2,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, length - 1, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should return undefined when searching past the end of a string length 1\", () => {\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 1);\n\t\t\tconst marker = client.searchForMarker(client.getLength(), \"Eop\", true);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should return undefined when searching before the start of a string length 1\", () => {\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 1);\n\n\t\t\tconst marker = client.searchForMarker(-1, \"Eop\", false);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should return undefined when searching past the end of a string length > 1\", () => {\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\t\tassert.equal(client.getLength(), 4);\n\n\t\t\tconst marker = client.searchForMarker(client.getLength(), \"Eop\", true);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should return undefined when searching before the start of a string length > 1\", () => {\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 4);\n\n\t\t\tconst marker = client.searchForMarker(-1, \"Eop\", false);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should return undefined when trying to find marker from text without the specified marker\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\t\tassert.equal(client.getLength(), 3, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(1, markerLabel);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\n\t\t\tconst marker1 = client.searchForMarker(1, markerLabel, false);\n\n\t\t\tassert.equal(marker1, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should return undefined when trying to find marker from null text\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\n\t\t\tconst marker = client.searchForMarker(1, markerLabel);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\n\t\t\tconst marker1 = client.searchForMarker(1, markerLabel, false);\n\n\t\t\tassert.equal(marker1, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should return undefined when trying to find a removed marker\", () => {\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 4, \"length not expected\");\n\n\t\t\tclient.removeRangeLocal(0, 1);\n\n\t\t\tassert.equal(client.getLength(), 3, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(0, \"Eop\", true);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined\");\n\t\t});\n\n\t\tdescribe(\"with remote client\", () => {\n\t\t\tconst remoteUserLongId = \"remoteUser\";\n\t\t\tlet client2: TestClient;\n\t\t\tbeforeEach(() => {\n\t\t\t\tclient2 = new TestClient();\n\t\t\t\tclient2.mergeTree.insertSegments(\n\t\t\t\t\t0,\n\t\t\t\t\t[TextSegment.make(\"\")],\n\t\t\t\t\tclient2.mergeTree.localPerspective,\n\t\t\t\t\tclient2.mergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tclient2.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\t});\n\n\t\t\tit(\"Should be able to find remotely inserted marker\", () => {\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst textMsg = client.makeOpMessage(client.insertTextLocal(0, \"abc\"), ++seq);\n\t\t\t\tconst markerMsg = client2.makeOpMessage(\n\t\t\t\t\tclient2.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t\t\t}),\n\t\t\t\t\t++seq,\n\t\t\t\t);\n\t\t\t\tclient.applyMsg(textMsg);\n\t\t\t\tclient2.applyMsg(textMsg);\n\t\t\t\tclient.applyMsg(markerMsg);\n\t\t\t\tclient2.applyMsg(markerMsg);\n\n\t\t\t\tassert.equal(client.getLength(), 4, \"length not expected - client\");\n\t\t\t\tassert.equal(client2.getLength(), 4, \"length not expected - client 2\");\n\n\t\t\t\tconst marker = client.searchForMarker(0, \"Eop\", true);\n\n\t\t\t\tassert(marker, \"Returned marker undefined\");\n\n\t\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\t\tmarker,\n\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\tclient.getClientId(),\n\t\t\t\t);\n\n\t\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\t\t\t});\n\n\t\t\tit(\"Should not be able to find remotely removed marker\", () => {\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst textMsg = client.makeOpMessage(client.insertTextLocal(0, \"abc\"), ++seq);\n\t\t\t\tconst mInsertMsg = client.makeOpMessage(\n\t\t\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t\t\t}),\n\t\t\t\t\t++seq,\n\t\t\t\t);\n\t\t\t\tclient.applyMsg(textMsg);\n\t\t\t\tclient2.applyMsg(textMsg);\n\t\t\t\tclient.applyMsg(mInsertMsg);\n\t\t\t\tclient2.applyMsg(mInsertMsg);\n\n\t\t\t\tassert.equal(client.getLength(), 4, \"length not expected - client\");\n\t\t\t\tassert.equal(client2.getLength(), 4, \"length not expected - client 2\");\n\n\t\t\t\tconst mRemoveMsg = client2.makeOpMessage(client2.removeRangeLocal(0, 1), ++seq);\n\t\t\t\tclient.applyMsg(mRemoveMsg);\n\t\t\t\tclient2.applyMsg(mRemoveMsg);\n\n\t\t\t\tassert.equal(client.getLength(), 3, \"length not expected - client\");\n\t\t\t\tassert.equal(client2.getLength(), 3, \"length not expected - client 2\");\n\n\t\t\t\tconst marker = client.searchForMarker(0, \"Eop\", true);\n\n\t\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\t\t\t});\n\t\t});\n\t});\n\tdescribe(\".getMarkerById\", () => {\n\t\tit(\"removed marker\", () => {\n\t\t\tconst clients = createClientsAtInitialState({ initialState: \"hello world\" }, \"A\", \"B\");\n\n\t\t\tconst randomMarkerKey = \"randomKey1\";\n\n\t\t\tassert(!clients.A.getMarkerFromId(randomMarkerKey), \"local client before insert\");\n\n\t\t\tconst ops = [\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.insertMarkerLocal(5, ReferenceType.Simple, {\n\t\t\t\t\t\t[reservedMarkerIdKey]: randomMarkerKey,\n\t\t\t\t\t}),\n\t\t\t\t\t1,\n\t\t\t\t),\n\t\t\t];\n\n\t\t\tassert(\n\t\t\t\tclients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after insert before ack\",\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) c.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\tclients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after insert after ack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tclients.B.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"remote client after insert after ack\",\n\t\t\t);\n\n\t\t\tops.push(clients.A.makeOpMessage(clients.A.removeRangeLocal(5, 6), 1));\n\n\t\t\tassert(\n\t\t\t\t!clients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after remove before ack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tclients.B.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"remote client after remove before ack\",\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) c.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\t!clients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after remove after ack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!clients.B.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"remote client after remove after ack\",\n\t\t\t);\n\t\t});\n\t\tit(\"obliterate marker\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{ initialState: \"hello world\", options: { mergeTreeEnableObliterate: true } },\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\n\t\t\tconst randomMarkerKey = \"randomKey1\";\n\n\t\t\tassert(!clients.A.getMarkerFromId(randomMarkerKey), \"local client before insert\");\n\n\t\t\tconst ops = [\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.insertMarkerLocal(5, ReferenceType.Simple, {\n\t\t\t\t\t\t[reservedMarkerIdKey]: randomMarkerKey,\n\t\t\t\t\t}),\n\t\t\t\t\t1,\n\t\t\t\t),\n\t\t\t];\n\n\t\t\tassert(\n\t\t\t\tclients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after insert before ack\",\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) c.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\tclients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after insert after ack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tclients.B.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"remote client after insert after ack\",\n\t\t\t);\n\n\t\t\tops.push(clients.A.makeOpMessage(clients.A.obliterateRangeLocal(5, 6), 1));\n\n\t\t\tassert(\n\t\t\t\t!clients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after obliterate before ack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tclients.B.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"remote client after obliterate before ack\",\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) c.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\t!clients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after obliterate after ack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!clients.B.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"remote client after obliterate after ack\",\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"client.searchForMarker.spec.js","sourceRoot":"","sources":["../../src/test/client.searchForMarker.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\n\nimport { UniversalSequenceNumber } from \"../constants.js\";\nimport { MaxNodesInBlock, reservedMarkerIdKey } from \"../mergeTreeNodes.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { reservedTileLabelsKey } from \"../referencePositions.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState } from \"./testClientLogger.js\";\n\ndescribe(\"TestClient\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.mergeTree.insertSegments(\n\t\t\t0,\n\t\t\t[TextSegment.make(\"\")],\n\t\t\tclient.mergeTree.localPerspective,\n\t\t\tclient.mergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\tundefined,\n\t\t);\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tdescribe(\".searchForMarker\", () => {\n\t\tit(\"Should return marker at the search position in either direction\", () => {\n\t\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\t\tclient.insertMarkerLocal(4, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\t\t\tassert.equal(client.getLength(), 8);\n\n\t\t\tconst marker1 = client.searchForMarker(4, \"Eop\", true);\n\n\t\t\tassert(marker1, \"Returned marker undefined.\");\n\n\t\t\tlet exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker1,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 4, \"Marker with label not at expected position\");\n\n\t\t\tconst marker2 = client.searchForMarker(4, \"Eop\", false);\n\n\t\t\tassert(marker2, \"Returned marker undefined.\");\n\n\t\t\texp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker2,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 4, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should return the marker at the search position in either direction from multiple blocks\", () => {\n\t\t\tclient.insertTextLocal(0, \"abcd\");\n\t\t\tclient.insertTextLocal(4, \"efg\");\n\t\t\tclient.insertMarkerLocal(4, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\t\t\tassert.equal(client.getLength(), 8);\n\n\t\t\tconst marker1 = client.searchForMarker(4, \"Eop\", true);\n\n\t\t\tassert(marker1, \"Returned marker undefined.\");\n\n\t\t\tlet exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker1,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 4, \"Marker with label not at expected position\");\n\n\t\t\tconst marker2 = client.searchForMarker(4, \"Eop\", false);\n\n\t\t\tassert(marker2, \"Returned marker undefined.\");\n\n\t\t\texp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker2,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 4, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should be able to find forward marker position based on label\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\t\tassert.equal(client.getLength(), 4, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(0, markerLabel, true);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 3, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should be able to find forward marker position based on label from client with single marker\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tclient.insertTextLocal(0, \"abc d\");\n\n\t\t\tclient.insertMarkerLocal(1, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 6, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(0, markerLabel, true);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\t\t\tassert.equal(exp, 1, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should be able to find backward marker position based on label from client with multiple marker\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tclient.insertTextLocal(0, \"abc d\");\n\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tclient.insertTextLocal(7, \"ef\");\n\t\t\tclient.insertMarkerLocal(8, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 10, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(5, markerLabel, false);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should be able to find forward marker position from client with multiple marker\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tclient.insertTextLocal(0, \"abc d\");\n\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tclient.insertTextLocal(7, \"ef\");\n\t\t\tclient.insertMarkerLocal(8, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 10, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(5, markerLabel, true);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 6, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should be able to find forward marker position with multiple segments and markers\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tfor (const [i, _] of Array.from({ length: MaxNodesInBlock ** 3 * 2 }).entries())\n\t\t\t\tclient.insertTextLocal(0, i.toString());\n\t\t\t// pad the string with markers on both ends so we never get undefined solely for convenience of this test\n\t\t\tfor (let i = 0; i <= client.getLength(); i += 3) {\n\t\t\t\tclient.insertMarkerLocal(i, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (let index = 0; index < client.getLength(); index++) {\n\t\t\t\tconst marker = client.searchForMarker(index, markerLabel, true);\n\n\t\t\t\tassert(marker, `Returned marker undefined @ ${index}.`);\n\n\t\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\t\tmarker,\n\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\tclient.getClientId(),\n\t\t\t\t);\n\n\t\t\t\tconst offset = index % 3 === 0 ? index % 3 : 3 - (index % 3);\n\t\t\t\tassert.equal(exp, index + offset, \"Marker with label not at expected position\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"Should be able to find backward marker position with multiple segments and markers\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tfor (const [i, _] of Array.from({ length: MaxNodesInBlock ** 3 * 2 }).entries())\n\t\t\t\tclient.insertTextLocal(0, i.toString());\n\t\t\t// pad the string with markers on both ends so we never get undefined solely for convenience of this test\n\t\t\tfor (let i = 0; i <= client.getLength(); i += 3) {\n\t\t\t\tclient.insertMarkerLocal(i, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (let index = client.getLength() - 1; index >= 0; index--) {\n\t\t\t\tconst marker = client.searchForMarker(index, markerLabel, false);\n\n\t\t\t\tassert(marker, `Returned marker undefined @ ${index}.`);\n\n\t\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\t\tmarker,\n\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\tclient.getClientId(),\n\t\t\t\t);\n\n\t\t\t\tassert.equal(exp, index - (index % 3), \"Marker with label not at expected position\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"Should be able to find distant forward marker\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tfor (const [i, _] of Array.from({ length: MaxNodesInBlock ** 3 * 2 }).entries())\n\t\t\t\tclient.insertTextLocal(0, i.toString());\n\t\t\tfor (let i = 10; i > 1; i -= 2) {\n\t\t\t\tclient.insertMarkerLocal(client.getLength() - i, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfor (let index = 0; index < client.getLength(); index++) {\n\t\t\t\tconst exp = client.slowSearchForMarker(index, markerLabel, true);\n\t\t\t\tconst actual = client.searchForMarker(index, markerLabel, true);\n\n\t\t\t\tassert.equal(exp, actual, \"Marker with label not at expected position\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"Should be able to find distant backward marker\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tfor (const [i, _] of Array.from({ length: MaxNodesInBlock ** 3 * 2 }).entries())\n\t\t\t\tclient.insertTextLocal(0, i.toString());\n\t\t\tfor (let i = 10; i > 1; i -= 2) {\n\t\t\t\tclient.insertMarkerLocal(client.getLength() - i, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfor (let index = client.getLength() - 1; index >= 0; index--) {\n\t\t\t\tconst exp = client.slowSearchForMarker(index, markerLabel, false);\n\t\t\t\tconst actual = client.searchForMarker(index, markerLabel, false);\n\n\t\t\t\tassert.equal(exp, actual, \"Marker with label not at expected position\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"Should match results from forwardExcursion for many segments\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tfor (const [i, _] of Array.from({ length: MaxNodesInBlock * 3 }).entries())\n\t\t\t\tclient.insertTextLocal(0, i.toString());\n\t\t\tconst random = makeRandom(0xdeadbeef, 0xfeedbed, client.getLength());\n\t\t\tfor (let i = 0; i <= client.getLength() / 6; i++) {\n\t\t\t\tconst pos = random.integer(0, client.getLength() - 1);\n\t\t\t\tclient.insertMarkerLocal(pos, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (let index = 0; index < client.getLength(); index++) {\n\t\t\t\tconst exp = client.slowSearchForMarker(index, markerLabel, true);\n\t\t\t\tconst actual = client.searchForMarker(index, markerLabel, true);\n\n\t\t\t\tassert.equal(exp, actual, \"Marker with label not at expected position\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"Should match results from backwardExcursion for many segments\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tfor (const [i, _] of Array.from({ length: MaxNodesInBlock * 3 }).entries())\n\t\t\t\tclient.insertTextLocal(0, i.toString());\n\t\t\tconst random = makeRandom(0xdeadbeef, 0xfeedbed, client.getLength());\n\t\t\tfor (let i = 0; i <= client.getLength() / 6; i++) {\n\t\t\t\tconst pos = random.integer(0, client.getLength() - 1);\n\t\t\t\tclient.insertMarkerLocal(pos, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (let index = 0; index < client.getLength(); index++) {\n\t\t\t\tconst exp = client.slowSearchForMarker(index, markerLabel, false);\n\t\t\t\tconst actual = client.searchForMarker(index, markerLabel, false);\n\n\t\t\t\tassert.equal(exp, actual, \"Marker with label not at expected position\");\n\t\t\t}\n\t\t});\n\n\t\tit(\"Should be able to find marker from client with text length 1\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 1, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(client.getLength() - 1, markerLabel, false);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tlet exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\n\t\t\tconst marker1 = client.searchForMarker(0, markerLabel, true);\n\n\t\t\tassert(marker1, \"Returned marker undefined.\");\n\n\t\t\texp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should not be able to find marker position with index out of bound\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedTileLabelsKey]: [markerLabel],\n\t\t\t\t[reservedMarkerIdKey]: \"some-id\",\n\t\t\t});\n\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\t\tassert.equal(client.getLength(), 4, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(5, markerLabel, true);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\n\t\t\tconst marker1 = client.searchForMarker(5, markerLabel, false);\n\n\t\t\tassert.equal(marker1, undefined, \"Returned marker should be undefined.\");\n\n\t\t\tconst marker2 = client.searchForMarker(-1, markerLabel, false);\n\n\t\t\tassert.equal(marker2, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should be able to find a deleted and rolled back marker\", () => {\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tclient.removeRangeLocal(0, 1);\n\n\t\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\t\tconst marker = client.searchForMarker(0, \"Eop\", true);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should not be able to find an inserted and rolled back marker\", () => {\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\t\tconst marker = client.searchForMarker(0, \"Eop\", true);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should be able to find a marker at 0 searching at 0 in both directions\", () => {\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 4);\n\n\t\t\tconst marker = client.searchForMarker(0, \"Eop\", true);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tlet exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\n\t\t\tconst marker2 = client.searchForMarker(0, \"Eop\", false);\n\n\t\t\tassert(marker2, \"Returned marker undefined.\");\n\n\t\t\texp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker2,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should be able to find a marker at length-1 searching at length-1 in both directions\", () => {\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\t\tconst length = client.getLength();\n\t\t\tassert.equal(length, 4);\n\n\t\t\tconst marker = client.searchForMarker(length - 1, \"Eop\", true);\n\n\t\t\tassert(marker, \"Returned marker undefined.\");\n\n\t\t\tlet exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, length - 1, \"Marker with label not at expected position\");\n\n\t\t\tconst marker2 = client.searchForMarker(length - 1, \"Eop\", false);\n\n\t\t\tassert(marker2, \"Returned marker undefined.\");\n\n\t\t\texp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\tmarker2,\n\t\t\t\tUniversalSequenceNumber,\n\t\t\t\tclient.getClientId(),\n\t\t\t);\n\n\t\t\tassert.equal(exp, length - 1, \"Marker with label not at expected position\");\n\t\t});\n\n\t\tit(\"Should return undefined when searching past the end of a string length 1\", () => {\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 1);\n\t\t\tconst marker = client.searchForMarker(client.getLength(), \"Eop\", true);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should return undefined when searching before the start of a string length 1\", () => {\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 1);\n\n\t\t\tconst marker = client.searchForMarker(-1, \"Eop\", false);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should return undefined when searching past the end of a string length > 1\", () => {\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\t\tassert.equal(client.getLength(), 4);\n\n\t\t\tconst marker = client.searchForMarker(client.getLength(), \"Eop\", true);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should return undefined when searching before the start of a string length > 1\", () => {\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 4);\n\n\t\t\tconst marker = client.searchForMarker(-1, \"Eop\", false);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should return undefined when trying to find marker from text without the specified marker\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\t\tassert.equal(client.getLength(), 3, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(1, markerLabel);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\n\t\t\tconst marker1 = client.searchForMarker(1, markerLabel, false);\n\n\t\t\tassert.equal(marker1, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should return undefined when trying to find marker from null text\", () => {\n\t\t\tconst markerLabel = \"EOP\";\n\n\t\t\tconst marker = client.searchForMarker(1, markerLabel);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\n\t\t\tconst marker1 = client.searchForMarker(1, markerLabel, false);\n\n\t\t\tassert.equal(marker1, undefined, \"Returned marker should be undefined.\");\n\t\t});\n\n\t\tit(\"Should return undefined when trying to find a removed marker\", () => {\n\t\t\tclient.insertTextLocal(0, \"abc\");\n\t\t\tclient.insertMarkerLocal(1, ReferenceType.Tile, {\n\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t});\n\n\t\t\tassert.equal(client.getLength(), 4, \"length not expected\");\n\n\t\t\tclient.removeRangeLocal(1, 2);\n\n\t\t\tassert.equal(client.getLength(), 3, \"length not expected\");\n\n\t\t\tconst marker = client.searchForMarker(0, \"Eop\", true);\n\n\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined\");\n\t\t});\n\n\t\tdescribe(\"with remote client\", () => {\n\t\t\tconst remoteUserLongId = \"remoteUser\";\n\t\t\tlet client2: TestClient;\n\t\t\tbeforeEach(() => {\n\t\t\t\tclient2 = new TestClient();\n\t\t\t\tclient2.mergeTree.insertSegments(\n\t\t\t\t\t0,\n\t\t\t\t\t[TextSegment.make(\"\")],\n\t\t\t\t\tclient2.mergeTree.localPerspective,\n\t\t\t\t\tclient2.mergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tclient2.startOrUpdateCollaboration(remoteUserLongId);\n\t\t\t});\n\n\t\t\tit(\"Should be able to find remotely inserted marker\", () => {\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst textMsg = client.makeOpMessage(client.insertTextLocal(0, \"abc\"), ++seq);\n\t\t\t\tconst markerMsg = client2.makeOpMessage(\n\t\t\t\t\tclient2.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t\t\t}),\n\t\t\t\t\t++seq,\n\t\t\t\t);\n\t\t\t\tclient.applyMsg(textMsg);\n\t\t\t\tclient2.applyMsg(textMsg);\n\t\t\t\tclient.applyMsg(markerMsg);\n\t\t\t\tclient2.applyMsg(markerMsg);\n\n\t\t\t\tassert.equal(client.getLength(), 4, \"length not expected - client\");\n\t\t\t\tassert.equal(client2.getLength(), 4, \"length not expected - client 2\");\n\n\t\t\t\tconst marker = client.searchForMarker(0, \"Eop\", true);\n\n\t\t\t\tassert(marker, \"Returned marker undefined\");\n\n\t\t\t\tconst exp = client.mergeTree.referencePositionToLocalPosition(\n\t\t\t\t\tmarker,\n\t\t\t\t\tUniversalSequenceNumber,\n\t\t\t\t\tclient.getClientId(),\n\t\t\t\t);\n\n\t\t\t\tassert.equal(exp, 0, \"Marker with label not at expected position\");\n\t\t\t});\n\n\t\t\tit(\"Should not be able to find remotely removed marker\", () => {\n\t\t\t\tlet seq = 0;\n\t\t\t\tconst textMsg = client.makeOpMessage(client.insertTextLocal(0, \"abc\"), ++seq);\n\t\t\t\tconst mInsertMsg = client.makeOpMessage(\n\t\t\t\t\tclient.insertMarkerLocal(0, ReferenceType.Tile, {\n\t\t\t\t\t\t[reservedMarkerIdKey]: \"marker\",\n\t\t\t\t\t\t[reservedTileLabelsKey]: [\"Eop\"],\n\t\t\t\t\t}),\n\t\t\t\t\t++seq,\n\t\t\t\t);\n\t\t\t\tclient.applyMsg(textMsg);\n\t\t\t\tclient2.applyMsg(textMsg);\n\t\t\t\tclient.applyMsg(mInsertMsg);\n\t\t\t\tclient2.applyMsg(mInsertMsg);\n\n\t\t\t\tassert.equal(client.getLength(), 4, \"length not expected - client\");\n\t\t\t\tassert.equal(client2.getLength(), 4, \"length not expected - client 2\");\n\n\t\t\t\tconst mRemoveMsg = client2.makeOpMessage(client2.removeRangeLocal(0, 1), ++seq);\n\t\t\t\tclient.applyMsg(mRemoveMsg);\n\t\t\t\tclient2.applyMsg(mRemoveMsg);\n\n\t\t\t\tassert.equal(client.getLength(), 3, \"length not expected - client\");\n\t\t\t\tassert.equal(client2.getLength(), 3, \"length not expected - client 2\");\n\n\t\t\t\tconst marker = client.searchForMarker(0, \"Eop\", true);\n\n\t\t\t\tassert.equal(marker, undefined, \"Returned marker should be undefined.\");\n\t\t\t});\n\t\t});\n\t});\n\tdescribe(\".getMarkerById\", () => {\n\t\tit(\"removed marker\", () => {\n\t\t\tconst clients = createClientsAtInitialState({ initialState: \"hello world\" }, \"A\", \"B\");\n\n\t\t\tconst randomMarkerKey = \"randomKey1\";\n\n\t\t\tassert(!clients.A.getMarkerFromId(randomMarkerKey), \"local client before insert\");\n\n\t\t\tconst ops = [\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.insertMarkerLocal(5, ReferenceType.Simple, {\n\t\t\t\t\t\t[reservedMarkerIdKey]: randomMarkerKey,\n\t\t\t\t\t}),\n\t\t\t\t\t1,\n\t\t\t\t),\n\t\t\t];\n\n\t\t\tassert(\n\t\t\t\tclients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after insert before ack\",\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) c.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\tclients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after insert after ack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tclients.B.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"remote client after insert after ack\",\n\t\t\t);\n\n\t\t\tops.push(clients.A.makeOpMessage(clients.A.removeRangeLocal(5, 6), 1));\n\n\t\t\tassert(\n\t\t\t\t!clients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after remove before ack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tclients.B.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"remote client after remove before ack\",\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) c.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\t!clients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after remove after ack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!clients.B.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"remote client after remove after ack\",\n\t\t\t);\n\t\t});\n\t\tit(\"obliterate marker\", () => {\n\t\t\tconst clients = createClientsAtInitialState(\n\t\t\t\t{ initialState: \"hello world\", options: { mergeTreeEnableObliterate: true } },\n\t\t\t\t\"A\",\n\t\t\t\t\"B\",\n\t\t\t);\n\n\t\t\tconst randomMarkerKey = \"randomKey1\";\n\n\t\t\tassert(!clients.A.getMarkerFromId(randomMarkerKey), \"local client before insert\");\n\n\t\t\tconst ops = [\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.insertMarkerLocal(5, ReferenceType.Simple, {\n\t\t\t\t\t\t[reservedMarkerIdKey]: randomMarkerKey,\n\t\t\t\t\t}),\n\t\t\t\t\t1,\n\t\t\t\t),\n\t\t\t];\n\n\t\t\tassert(\n\t\t\t\tclients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after insert before ack\",\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) c.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\tclients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after insert after ack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tclients.B.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"remote client after insert after ack\",\n\t\t\t);\n\n\t\t\tops.push(clients.A.makeOpMessage(clients.A.obliterateRangeLocal(5, 6), 1));\n\n\t\t\tassert(\n\t\t\t\t!clients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after obliterate before ack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tclients.B.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"remote client after obliterate before ack\",\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) c.applyMsg(op);\n\t\t\t}\n\n\t\t\tassert(\n\t\t\t\t!clients.A.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"local client after obliterate after ack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!clients.B.getMarkerFromId(randomMarkerKey),\n\t\t\t\t\"remote client after obliterate after ack\",\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
@@ -183,7 +183,7 @@ class ClientTestHelper {
183
183
  this.disconnectedClientOps.delete(clientName);
184
184
  const client = this.clients[clientName];
185
185
  for (const { op, segmentGroup } of submittedOps) {
186
- const rebasedOp = client.regeneratePendingOp(op, segmentGroup);
186
+ const rebasedOp = client.regeneratePendingOp(op, segmentGroup, false);
187
187
  this.addMessage(client, rebasedOp);
188
188
  }
189
189
  }
@@ -1 +1 @@
1
- {"version":3,"file":"clientTestHelper.js","sourceRoot":"","sources":["../../src/test/clientTestHelper.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type { IMergeTreeOp, IMergeTreeOptions, InteriorSequencePlace } from \"../index.js\";\nimport type { SegmentGroup } from \"../mergeTreeNodes.js\";\n\nimport type { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\nconst ClientIds = [\"A\", \"B\", \"C\", \"D\"] as const;\ntype ClientName = (typeof ClientIds)[number];\n\nfunction isClientId(s: unknown): s is ClientName {\n\treturn ClientIds.includes(s as ClientName);\n}\n\nfunction clientNameOf(client: TestClient): ClientName {\n\tconst { longClientId } = client;\n\tassert(isClientId(longClientId), \"Client ID is not a valid client name\");\n\treturn longClientId;\n}\n\n/**\n * Helper for authoring tests which perform operations on a number of clients.\n * This class essentially serves the role of the server in that it maintains a sequencing order of ops as well as information\n * about the latest op that each client has applied.\n *\n * When using this class, *do not* perform operations which may submit ops on clients directly: it does not currently wire up client events\n * to the server. Instead, use methods on the helper and pass the client name they should apply to as the first argument.\n *\n * It is analogous to MockContainerRuntimeFactory in the test-runtime-utils package, though the APIs are not completely equivalent\n * (see for example differences noted on disconnect and reconnect).\n *\n * This helper is also designed to support advancing only some clients to a given sequence number\n * (not all clients must be synchronized at the same time).\n *\n * This allows testing sequences of operations where clients have varying refSeqs, rather than having all clients advance refSeq\n * in lockstep.\n *\n * @remarks\n * If we wired the server up to \"delta\" events on the client, it would be reasonable to rename this to `MockServer` and the API for tests\n * would be a bit cleaner.\n */\nexport class ClientTestHelper {\n\tclients: Record<ClientName, TestClient> & { all: TestClient[] };\n\n\tidxFromName(name: ClientName): number {\n\t\treturn (name.codePointAt(0) ?? 0) - (\"A\".codePointAt(0) ?? 0);\n\t}\n\n\tlogger: TestClientLogger;\n\n\tops: ISequencedDocumentMessage[] = [];\n\tclientToLastAppliedSeq = new Map<ClientName, number>();\n\n\tperClientOps: ISequencedDocumentMessage[][];\n\tprivate readonly disconnectedClientOps = new Map<\n\t\tClientName,\n\t\t{ op: IMergeTreeOp; segmentGroup: SegmentGroup }[]\n\t>();\n\n\tprivate seq: number = 0;\n\n\tpublic constructor(options: IMergeTreeOptions = {}) {\n\t\tthis.clients = createClientsAtInitialState(\n\t\t\t{\n\t\t\t\tinitialState: \"\",\n\t\t\t\toptions: {\n\t\t\t\t\tmergeTreeEnableObliterate: true,\n\t\t\t\t\tmergeTreeEnableObliterateReconnect: true,\n\t\t\t\t\t...options,\n\t\t\t\t},\n\t\t\t},\n\t\t\t...ClientIds,\n\t\t);\n\t\tthis.logger = new TestClientLogger(this.clients.all);\n\t\tthis.perClientOps = this.clients.all.map(() => []);\n\t}\n\n\tprivate addMessage(client: TestClient, op: IMergeTreeOp): void {\n\t\tconst disconnectedQueue = this.disconnectedClientOps.get(clientNameOf(client));\n\t\tif (disconnectedQueue === undefined) {\n\t\t\tconst message = client.makeOpMessage(op, ++this.seq);\n\t\t\tthis.ops.push(message);\n\t\t\t// This implementation (specifically, that of applying ops / synchronizing clients) assumes messages\n\t\t\t// are pushed sequentially starting with seq 1.\n\t\t\tassert(\n\t\t\t\tmessage.sequenceNumber === this.ops.length,\n\t\t\t\t\"Partial sync test helper invariant violated\",\n\t\t\t);\n\t\t} else {\n\t\t\t// Client is not currently connected.\n\t\t\tconst segmentGroup = client.peekPendingSegmentGroups();\n\t\t\tassert(segmentGroup !== undefined, \"Client should have a pending segment group\");\n\t\t\tdisconnectedQueue.push({ op, segmentGroup });\n\t\t}\n\t}\n\n\tpublic insertText(clientName: ClientName, pos: number, text: string): void {\n\t\tconst client = this.clients[clientName];\n\t\tconst insertOp = client.insertTextLocal(pos, text);\n\t\tif (insertOp) {\n\t\t\tthis.addMessage(client, insertOp);\n\t\t}\n\t}\n\n\tpublic removeRange(clientName: ClientName, start: number, end: number): void {\n\t\tconst client = this.clients[clientName];\n\t\tthis.addMessage(client, client.removeRangeLocal(start, end));\n\t}\n\n\tpublic obliterateRange(\n\t\tclientName: ClientName,\n\t\tstart: number | InteriorSequencePlace,\n\t\tend: number | InteriorSequencePlace,\n\t): void {\n\t\tconst client = this.clients[clientName];\n\t\tthis.addMessage(client, client.obliterateRangeLocal(start, end));\n\t}\n\n\tpublic advanceClientToSeq(clientName: ClientName, seq: number): void {\n\t\tconst client = this.clients[clientName];\n\t\tconst lastApplied = this.clientToLastAppliedSeq.get(clientName);\n\t\tassert(seq > 0, \"Can only advance clients to sequence numbers that exist\");\n\t\tassert(\n\t\t\tthis.ops.length >= seq,\n\t\t\t\"Cannot attempt to advance clients to sequence numbers that don't yet exist\",\n\t\t);\n\t\tlet startIndex: number;\n\t\tif (lastApplied === undefined) {\n\t\t\tstartIndex = 0;\n\t\t} else {\n\t\t\tif (lastApplied >= seq) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstartIndex = lastApplied;\n\t\t}\n\t\tfor (let i = startIndex; i < seq; i++) {\n\t\t\tconst nextMessage = this.ops[i];\n\t\t\tclient.applyMsg(nextMessage);\n\t\t\tthis.clientToLastAppliedSeq.set(clientName, nextMessage.sequenceNumber);\n\t\t}\n\t}\n\n\t/**\n\t * Sends all known ops to the procieded client ids.\n\t */\n\tpublic advanceClients(...clientNames: ClientName[]): void {\n\t\tconst latestSeq = this.ops[this.ops.length - 1].sequenceNumber;\n\t\tfor (const name of clientNames) {\n\t\t\tthis.advanceClientToSeq(name, latestSeq);\n\t\t}\n\t}\n\n\tpublic processAllOps(): void {\n\t\tconst latestSeq = this.ops[this.ops.length - 1].sequenceNumber;\n\t\tfor (const name of ClientIds) {\n\t\t\tthis.advanceClientToSeq(name, latestSeq);\n\t\t}\n\t}\n\n\t/**\n\t * Causes the provided clients to \"disconnect\" by isolating their outbound queue from the op stream.\n\t * These clients will still receive ops from this helper just like all other clients.\n\t * When a client reconnects (see {@link reconnect}), the helper will rebase all of the client's pending ops (that they submitted since\n\t * `disconnect` was called) and re-add them to the op stream.\n\t *\n\t * BEWARE: This is slightly different from what the mocks in test-runtime-utils do in two ways:\n\t *\n\t * 1. Those mocks actually wipe outstanding ops submitted by the disconnected clients from the op stream and rebases those as well.\n\t * 2. Those mocks freeze the inbound queue of the disconnected clients as well as the outbound queue.\n\t *\n\t * E.g. (pseudocode; syntax is different for those mocks and these):\n\t *\n\t * ```typescript\n\t * B.submitLocalOp1()\n\t * B.submitLocalOp2()\n\t * disconnect(B)\n\t * A.submitLocalOp1()\n\t * B.submitLocalOp3()\n\t * processAllOps()\n\t * ```\n\t *\n\t * the test-runtime-mocks will...\n\t *\n\t * - have none of B's local ops be receieved by A in the processAllOps() line\n\t * - have B not receive A's local op 1\n\t *\n\t * whereas this helper will...\n\t *\n\t * - have B's local ops 1 and 2 be received by A, but not its third local op\n\t * - have B receive acks for its first two local ops as well as A's op in the processAllOps() line\n\t *\n\t * This operation is a no-op if called multiple times on the same client with no intervening reconnects.\n\t */\n\tpublic disconnect(...clientNames: ClientName[]): void {\n\t\tfor (const clientName of clientNames) {\n\t\t\tconst client = this.clients[clientName];\n\t\t\tif (this.isDisconnected(client)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.disconnectedClientOps.set(clientName, []);\n\t\t}\n\t}\n\n\t/**\n\t * Reconnects clients which have been disconnected. No-ops on any client which is already connected.\n\t * For disconnected clients, any pending ops they have will be resubmitted using the resubmit flow, see {@link disconnect} for details and an example.\n\t *\n\t * @remarks\n\t * If reconnecting multiple clients, the order that their ops will be resubmitted in will match the order in the array\n\t */\n\tpublic reconnect(...clientNames: ClientName[]): void {\n\t\tfor (const clientName of clientNames) {\n\t\t\tconst submittedOps = this.disconnectedClientOps.get(clientName);\n\t\t\tif (submittedOps === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.disconnectedClientOps.delete(clientName);\n\t\t\tconst client = this.clients[clientName];\n\t\t\tfor (const { op, segmentGroup } of submittedOps) {\n\t\t\t\tconst rebasedOp = client.regeneratePendingOp(op, segmentGroup);\n\t\t\t\tthis.addMessage(client, rebasedOp);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isDisconnected(client: TestClient): boolean {\n\t\treturn this.disconnectedClientOps.has(clientNameOf(client));\n\t}\n}\n"]}
1
+ {"version":3,"file":"clientTestHelper.js","sourceRoot":"","sources":["../../src/test/clientTestHelper.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type { IMergeTreeOp, IMergeTreeOptions, InteriorSequencePlace } from \"../index.js\";\nimport type { SegmentGroup } from \"../mergeTreeNodes.js\";\n\nimport type { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\nconst ClientIds = [\"A\", \"B\", \"C\", \"D\"] as const;\ntype ClientName = (typeof ClientIds)[number];\n\nfunction isClientId(s: unknown): s is ClientName {\n\treturn ClientIds.includes(s as ClientName);\n}\n\nfunction clientNameOf(client: TestClient): ClientName {\n\tconst { longClientId } = client;\n\tassert(isClientId(longClientId), \"Client ID is not a valid client name\");\n\treturn longClientId;\n}\n\n/**\n * Helper for authoring tests which perform operations on a number of clients.\n * This class essentially serves the role of the server in that it maintains a sequencing order of ops as well as information\n * about the latest op that each client has applied.\n *\n * When using this class, *do not* perform operations which may submit ops on clients directly: it does not currently wire up client events\n * to the server. Instead, use methods on the helper and pass the client name they should apply to as the first argument.\n *\n * It is analogous to MockContainerRuntimeFactory in the test-runtime-utils package, though the APIs are not completely equivalent\n * (see for example differences noted on disconnect and reconnect).\n *\n * This helper is also designed to support advancing only some clients to a given sequence number\n * (not all clients must be synchronized at the same time).\n *\n * This allows testing sequences of operations where clients have varying refSeqs, rather than having all clients advance refSeq\n * in lockstep.\n *\n * @remarks\n * If we wired the server up to \"delta\" events on the client, it would be reasonable to rename this to `MockServer` and the API for tests\n * would be a bit cleaner.\n */\nexport class ClientTestHelper {\n\tclients: Record<ClientName, TestClient> & { all: TestClient[] };\n\n\tidxFromName(name: ClientName): number {\n\t\treturn (name.codePointAt(0) ?? 0) - (\"A\".codePointAt(0) ?? 0);\n\t}\n\n\tlogger: TestClientLogger;\n\n\tops: ISequencedDocumentMessage[] = [];\n\tclientToLastAppliedSeq = new Map<ClientName, number>();\n\n\tperClientOps: ISequencedDocumentMessage[][];\n\tprivate readonly disconnectedClientOps = new Map<\n\t\tClientName,\n\t\t{ op: IMergeTreeOp; segmentGroup: SegmentGroup }[]\n\t>();\n\n\tprivate seq: number = 0;\n\n\tpublic constructor(options: IMergeTreeOptions = {}) {\n\t\tthis.clients = createClientsAtInitialState(\n\t\t\t{\n\t\t\t\tinitialState: \"\",\n\t\t\t\toptions: {\n\t\t\t\t\tmergeTreeEnableObliterate: true,\n\t\t\t\t\tmergeTreeEnableObliterateReconnect: true,\n\t\t\t\t\t...options,\n\t\t\t\t},\n\t\t\t},\n\t\t\t...ClientIds,\n\t\t);\n\t\tthis.logger = new TestClientLogger(this.clients.all);\n\t\tthis.perClientOps = this.clients.all.map(() => []);\n\t}\n\n\tprivate addMessage(client: TestClient, op: IMergeTreeOp): void {\n\t\tconst disconnectedQueue = this.disconnectedClientOps.get(clientNameOf(client));\n\t\tif (disconnectedQueue === undefined) {\n\t\t\tconst message = client.makeOpMessage(op, ++this.seq);\n\t\t\tthis.ops.push(message);\n\t\t\t// This implementation (specifically, that of applying ops / synchronizing clients) assumes messages\n\t\t\t// are pushed sequentially starting with seq 1.\n\t\t\tassert(\n\t\t\t\tmessage.sequenceNumber === this.ops.length,\n\t\t\t\t\"Partial sync test helper invariant violated\",\n\t\t\t);\n\t\t} else {\n\t\t\t// Client is not currently connected.\n\t\t\tconst segmentGroup = client.peekPendingSegmentGroups();\n\t\t\tassert(segmentGroup !== undefined, \"Client should have a pending segment group\");\n\t\t\tdisconnectedQueue.push({ op, segmentGroup });\n\t\t}\n\t}\n\n\tpublic insertText(clientName: ClientName, pos: number, text: string): void {\n\t\tconst client = this.clients[clientName];\n\t\tconst insertOp = client.insertTextLocal(pos, text);\n\t\tif (insertOp) {\n\t\t\tthis.addMessage(client, insertOp);\n\t\t}\n\t}\n\n\tpublic removeRange(clientName: ClientName, start: number, end: number): void {\n\t\tconst client = this.clients[clientName];\n\t\tthis.addMessage(client, client.removeRangeLocal(start, end));\n\t}\n\n\tpublic obliterateRange(\n\t\tclientName: ClientName,\n\t\tstart: number | InteriorSequencePlace,\n\t\tend: number | InteriorSequencePlace,\n\t): void {\n\t\tconst client = this.clients[clientName];\n\t\tthis.addMessage(client, client.obliterateRangeLocal(start, end));\n\t}\n\n\tpublic advanceClientToSeq(clientName: ClientName, seq: number): void {\n\t\tconst client = this.clients[clientName];\n\t\tconst lastApplied = this.clientToLastAppliedSeq.get(clientName);\n\t\tassert(seq > 0, \"Can only advance clients to sequence numbers that exist\");\n\t\tassert(\n\t\t\tthis.ops.length >= seq,\n\t\t\t\"Cannot attempt to advance clients to sequence numbers that don't yet exist\",\n\t\t);\n\t\tlet startIndex: number;\n\t\tif (lastApplied === undefined) {\n\t\t\tstartIndex = 0;\n\t\t} else {\n\t\t\tif (lastApplied >= seq) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstartIndex = lastApplied;\n\t\t}\n\t\tfor (let i = startIndex; i < seq; i++) {\n\t\t\tconst nextMessage = this.ops[i];\n\t\t\tclient.applyMsg(nextMessage);\n\t\t\tthis.clientToLastAppliedSeq.set(clientName, nextMessage.sequenceNumber);\n\t\t}\n\t}\n\n\t/**\n\t * Sends all known ops to the procieded client ids.\n\t */\n\tpublic advanceClients(...clientNames: ClientName[]): void {\n\t\tconst latestSeq = this.ops[this.ops.length - 1].sequenceNumber;\n\t\tfor (const name of clientNames) {\n\t\t\tthis.advanceClientToSeq(name, latestSeq);\n\t\t}\n\t}\n\n\tpublic processAllOps(): void {\n\t\tconst latestSeq = this.ops[this.ops.length - 1].sequenceNumber;\n\t\tfor (const name of ClientIds) {\n\t\t\tthis.advanceClientToSeq(name, latestSeq);\n\t\t}\n\t}\n\n\t/**\n\t * Causes the provided clients to \"disconnect\" by isolating their outbound queue from the op stream.\n\t * These clients will still receive ops from this helper just like all other clients.\n\t * When a client reconnects (see {@link reconnect}), the helper will rebase all of the client's pending ops (that they submitted since\n\t * `disconnect` was called) and re-add them to the op stream.\n\t *\n\t * BEWARE: This is slightly different from what the mocks in test-runtime-utils do in two ways:\n\t *\n\t * 1. Those mocks actually wipe outstanding ops submitted by the disconnected clients from the op stream and rebases those as well.\n\t * 2. Those mocks freeze the inbound queue of the disconnected clients as well as the outbound queue.\n\t *\n\t * E.g. (pseudocode; syntax is different for those mocks and these):\n\t *\n\t * ```typescript\n\t * B.submitLocalOp1()\n\t * B.submitLocalOp2()\n\t * disconnect(B)\n\t * A.submitLocalOp1()\n\t * B.submitLocalOp3()\n\t * processAllOps()\n\t * ```\n\t *\n\t * the test-runtime-mocks will...\n\t *\n\t * - have none of B's local ops be receieved by A in the processAllOps() line\n\t * - have B not receive A's local op 1\n\t *\n\t * whereas this helper will...\n\t *\n\t * - have B's local ops 1 and 2 be received by A, but not its third local op\n\t * - have B receive acks for its first two local ops as well as A's op in the processAllOps() line\n\t *\n\t * This operation is a no-op if called multiple times on the same client with no intervening reconnects.\n\t */\n\tpublic disconnect(...clientNames: ClientName[]): void {\n\t\tfor (const clientName of clientNames) {\n\t\t\tconst client = this.clients[clientName];\n\t\t\tif (this.isDisconnected(client)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.disconnectedClientOps.set(clientName, []);\n\t\t}\n\t}\n\n\t/**\n\t * Reconnects clients which have been disconnected. No-ops on any client which is already connected.\n\t * For disconnected clients, any pending ops they have will be resubmitted using the resubmit flow, see {@link disconnect} for details and an example.\n\t *\n\t * @remarks\n\t * If reconnecting multiple clients, the order that their ops will be resubmitted in will match the order in the array\n\t */\n\tpublic reconnect(...clientNames: ClientName[]): void {\n\t\tfor (const clientName of clientNames) {\n\t\t\tconst submittedOps = this.disconnectedClientOps.get(clientName);\n\t\t\tif (submittedOps === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.disconnectedClientOps.delete(clientName);\n\t\t\tconst client = this.clients[clientName];\n\t\t\tfor (const { op, segmentGroup } of submittedOps) {\n\t\t\t\tconst rebasedOp = client.regeneratePendingOp(op, segmentGroup, false);\n\t\t\t\tthis.addMessage(client, rebasedOp);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isDisconnected(client: TestClient): boolean {\n\t\treturn this.disconnectedClientOps.has(clientNameOf(client));\n\t}\n}\n"]}
@@ -72,7 +72,7 @@ describe("resetPendingSegmentsToOp", () => {
72
72
  const oldops = opList;
73
73
  const pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];
74
74
  opList = oldops.map((op) => ({
75
- op: client.regeneratePendingOp(op.op, pending.shift()),
75
+ op: client.regeneratePendingOp(op.op, pending.shift(), false),
76
76
  refSeq: client.getCurrentSeq(),
77
77
  }));
78
78
  applyOpList(client);
@@ -82,7 +82,7 @@ describe("resetPendingSegmentsToOp", () => {
82
82
  const oldops = opList;
83
83
  const pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];
84
84
  opList = oldops.map((op) => ({
85
- op: client.regeneratePendingOp(op.op, pending.shift()),
85
+ op: client.regeneratePendingOp(op.op, pending.shift(), false),
86
86
  refSeq: client.getCurrentSeq(),
87
87
  }));
88
88
  // we expect a nack op per segment since our original ops split segments
@@ -110,7 +110,7 @@ describe("resetPendingSegmentsToOp", () => {
110
110
  refSeq: client.getCurrentSeq(),
111
111
  });
112
112
  opList.push({
113
- op: client.regeneratePendingOp(opList.shift().op, client.mergeTree.pendingSegments.first.data),
113
+ op: client.regeneratePendingOp(opList.shift().op, client.mergeTree.pendingSegments.first.data, false),
114
114
  refSeq: client.getCurrentSeq(),
115
115
  });
116
116
  // we expect a nack op per segment since our original ops split segments
@@ -128,7 +128,7 @@ describe("resetPendingSegmentsToOp", () => {
128
128
  const oldops = opList;
129
129
  const pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];
130
130
  opList = oldops.map((op) => ({
131
- op: client.regeneratePendingOp(op.op, pending.shift()),
131
+ op: client.regeneratePendingOp(op.op, pending.shift(), false),
132
132
  refSeq: client.getCurrentSeq(),
133
133
  }));
134
134
  node_assert_1.strict.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount * 2);
@@ -153,7 +153,7 @@ describe("resetPendingSegmentsToOp", () => {
153
153
  refSeq: client.getCurrentSeq(),
154
154
  });
155
155
  opList.push({
156
- op: client.regeneratePendingOp(opList.shift().op, client.mergeTree.pendingSegments.first.data),
156
+ op: client.regeneratePendingOp(opList.shift().op, client.mergeTree.pendingSegments.first.data, false),
157
157
  refSeq: client.getCurrentSeq(),
158
158
  });
159
159
  // we expect a nack op per segment since our original ops split segments
@@ -171,7 +171,7 @@ describe("resetPendingSegmentsToOp", () => {
171
171
  const oldops = opList;
172
172
  const pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];
173
173
  opList = oldops.map((op) => ({
174
- op: client.regeneratePendingOp(op.op, pending.shift()),
174
+ op: client.regeneratePendingOp(op.op, pending.shift(), false),
175
175
  refSeq: client.getCurrentSeq(),
176
176
  }));
177
177
  // we expect a nack op per segment since our original ops split segments
@@ -196,7 +196,7 @@ describe("resetPendingSegmentsToOp", () => {
196
196
  client.annotateMarker(segment, { prop2: "bar" });
197
197
  const otherClient = new testClient_js_1.TestClient();
198
198
  otherClient.startOrUpdateCollaboration("other user");
199
- const regeneratedInsert = client.regeneratePendingOp(insertOp, client.mergeTree.pendingSegments.first.data);
199
+ const regeneratedInsert = client.regeneratePendingOp(insertOp, client.mergeTree.pendingSegments.first.data, false);
200
200
  otherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);
201
201
  const { segment: otherSegment } = otherClient.getContainingSegment(0);
202
202
  (0, node_assert_1.strict)(otherSegment !== undefined && mergeTreeNodes_js_1.Marker.is(otherSegment));
@@ -210,7 +210,7 @@ describe("resetPendingSegmentsToOp", () => {
210
210
  client.annotateRangeLocal(0, 3, { prop2: "bar" });
211
211
  const otherClient = new testClient_js_1.TestClient();
212
212
  otherClient.startOrUpdateCollaboration("other user");
213
- const regeneratedInsert = client.regeneratePendingOp(insertOp, client.mergeTree.pendingSegments.first.data);
213
+ const regeneratedInsert = client.regeneratePendingOp(insertOp, client.mergeTree.pendingSegments.first.data, false);
214
214
  otherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);
215
215
  const { segment: otherSegment } = otherClient.getContainingSegment(0);
216
216
  (0, node_assert_1.strict)(otherSegment !== undefined && textSegment_js_1.TextSegment.is(otherSegment));
@@ -222,7 +222,7 @@ describe("resetPendingSegmentsToOp", () => {
222
222
  client.annotateRangeLocal(0, 3, { prop2: "bar" });
223
223
  const otherClient = new testClient_js_1.TestClient();
224
224
  otherClient.startOrUpdateCollaboration("other user");
225
- const regeneratedInsert = client.regeneratePendingOp(insertOp, client.mergeTree.pendingSegments.first.data);
225
+ const regeneratedInsert = client.regeneratePendingOp(insertOp, client.mergeTree.pendingSegments.first.data, false);
226
226
  otherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);
227
227
  const { segment: otherSegment } = otherClient.getContainingSegment(0);
228
228
  (0, node_assert_1.strict)(otherSegment !== undefined && textSegment_js_1.TextSegment.is(otherSegment));
@@ -241,7 +241,7 @@ describe("resetPendingSegmentsToOp.rebase", () => {
241
241
  ops.push(...ops
242
242
  .splice(Math.floor(ops.length / 2))
243
243
  .map(([op, sg]) => [
244
- clients.A.makeOpMessage(clients.A.regeneratePendingOp(op.contents, sg), op.sequenceNumber),
244
+ clients.A.makeOpMessage(clients.A.regeneratePendingOp(op.contents, sg, false), op.sequenceNumber),
245
245
  clients.A.peekPendingSegmentGroups(),
246
246
  ]));
247
247
  for (const [op] of ops)
@@ -1 +1 @@
1
- {"version":3,"file":"resetPendingSegmentsToOp.spec.js","sourceRoot":"","sources":["../../src/test/resetPendingSegmentsToOp.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 {\n\tMarker,\n\tSegmentGroup,\n\treservedMarkerIdKey,\n\ttype ISegmentPrivate,\n} from \"../mergeTreeNodes.js\";\nimport { IMergeTreeOp, ReferenceType } from \"../ops.js\";\nimport { clone } from \"../properties.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\ndescribe(\"resetPendingSegmentsToOp\", () => {\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.startOrUpdateCollaboration(\"local user\");\n\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t});\n\n\tdescribe(\"with a number of nested inserts\", () => {\n\t\tconst insertCount = 5;\n\t\tconst expectedSegmentCount = insertCount * 2 - 1;\n\t\tlet opList: { op: IMergeTreeOp; refSeq: number }[];\n\t\tlet opCount: number = 0;\n\n\t\tfunction applyOpList(cli: TestClient): void {\n\t\t\twhile (opList.length > 0) {\n\t\t\t\tconst op = opList.shift();\n\t\t\t\tif (op) {\n\t\t\t\t\tconst seqOp = cli.makeOpMessage(op.op, ++opCount, op.refSeq);\n\t\t\t\t\tcli.applyMsg(seqOp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbeforeEach(() => {\n\t\t\topList = [];\n\t\t\topCount = 0;\n\n\t\t\tfor (let i = 0; i < insertCount; i++) {\n\t\t\t\tconst op = client.insertTextLocal(i, \"hello\")!;\n\t\t\t\topList.push({ op, refSeq: client.getCurrentSeq() });\n\t\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, i + 1);\n\t\t\t}\n\t\t});\n\n\t\tit(\"acked insertSegment\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"only computes localPartialLengths once\", () => {\n\t\t\t// This test helps verify the asymptotic correctness of rebase.\n\t\t\t// Since local partial length information is reasonably expensive to store and compute compared to how\n\t\t\t// frequently it's used (i.e. only on reconnect), mergeTree has some logic to only do so when requested,\n\t\t\t// and invalidates that info whenever a segment update occurs.\n\t\t\t// This test verifies that local partial length information only gets computed once when regenerating\n\t\t\t// a number of ops for reconnection.\n\t\t\tlet localPartialsComputeCount = 0;\n\t\t\tconst spiedMergeTree = client.mergeTree as unknown as {\n\t\t\t\tlocalPartialsComputed: boolean;\n\t\t\t\t_localPartialsComputed: boolean;\n\t\t\t};\n\t\t\tspiedMergeTree._localPartialsComputed = spiedMergeTree.localPartialsComputed;\n\t\t\tObject.defineProperty(\n\t\t\t\tclient.mergeTree as unknown as { localPartialsComputed: boolean },\n\t\t\t\t\"localPartialsComputed\",\n\t\t\t\t{\n\t\t\t\t\tget() {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\treturn this._localPartialsComputed as boolean;\n\t\t\t\t\t},\n\t\t\t\t\tset(newValue) {\n\t\t\t\t\t\tif (newValue) {\n\t\t\t\t\t\t\tlocalPartialsComputeCount++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\tthis._localPartialsComputed = newValue;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\t\t\tapplyOpList(client);\n\t\t\tassert.equal(localPartialsComputeCount, 1);\n\t\t});\n\n\t\tit(\"nacked insertSegment\", async () => {\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"acked removeRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.removeRangeLocal(0, client.getLength())!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked removeRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.removeRangeLocal(0, client.getLength())!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\n\t\t\topList.push({\n\t\t\t\top: client.regeneratePendingOp(\n\t\t\t\t\topList.shift()!.op,\n\t\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t\t),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked insertSegment and removeRange\", async () => {\n\t\t\topList.push({\n\t\t\t\top: client.removeRangeLocal(0, client.getLength())!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount * 2);\n\n\t\t\tapplyOpList(client);\n\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"acked annotateRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.annotateRangeLocal(0, client.getLength(), { foo: \"bar\" })!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked annotateRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.annotateRangeLocal(0, client.getLength(), { foo: \"bar\" })!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\n\t\t\topList.push({\n\t\t\t\top: client.regeneratePendingOp(\n\t\t\t\t\topList.shift()!.op,\n\t\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t\t),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked insertSegment and annotateRange\", async () => {\n\t\t\topList.push({\n\t\t\t\top: client.annotateRangeLocal(0, client.getLength(), { foo: \"bar\" })!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount * 2);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\t});\n\n\tdescribe(\"uses original properties on insert\", () => {\n\t\t// Regression tests for an issue where regenerated insert ops would use the properties of a segment\n\t\t// at the time of regeneration rather than its properties at insertion time.\n\t\tit(\"for markers\", () => {\n\t\t\tconst insertOp = client.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t\t[reservedMarkerIdKey]: \"id\",\n\t\t\t\tprop1: \"foo\",\n\t\t\t});\n\t\t\tassert(insertOp);\n\t\t\tconst { segment } = client.getContainingSegment<ISegmentPrivate>(0);\n\t\t\tassert(segment !== undefined && Marker.is(segment));\n\t\t\tclient.annotateMarker(segment, { prop2: \"bar\" });\n\n\t\t\tconst otherClient = new TestClient();\n\t\t\totherClient.startOrUpdateCollaboration(\"other user\");\n\t\t\tconst regeneratedInsert = client.regeneratePendingOp(\n\t\t\t\tinsertOp,\n\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } = otherClient.getContainingSegment<ISegmentPrivate>(0);\n\t\t\tassert(otherSegment !== undefined && Marker.is(otherSegment));\n\t\t\t// `clone` here is because properties use a Object.create(null); to compare strict equal the prototype chain\n\t\t\t// should therefore not include Object.\n\t\t\tassert.deepStrictEqual(\n\t\t\t\totherSegment.properties,\n\t\t\t\tclone({ [reservedMarkerIdKey]: \"id\", prop1: \"foo\" }),\n\t\t\t);\n\t\t});\n\n\t\tit(\"for text segments\", () => {\n\t\t\tconst insertOp = client.insertTextLocal(0, \"abc\", { prop1: \"foo\" });\n\t\t\tassert(insertOp);\n\t\t\tclient.annotateRangeLocal(0, 3, { prop2: \"bar\" });\n\n\t\t\tconst otherClient = new TestClient();\n\t\t\totherClient.startOrUpdateCollaboration(\"other user\");\n\t\t\tconst regeneratedInsert = client.regeneratePendingOp(\n\t\t\t\tinsertOp,\n\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } = otherClient.getContainingSegment<ISegmentPrivate>(0);\n\t\t\tassert(otherSegment !== undefined && TextSegment.is(otherSegment));\n\t\t\tassert.deepStrictEqual(otherSegment.properties, clone({ prop1: \"foo\" }));\n\t\t});\n\n\t\tit(\"for text segments with no initial properties\", () => {\n\t\t\tconst insertOp = client.insertTextLocal(0, \"abc\");\n\t\t\tassert(insertOp);\n\t\t\tclient.annotateRangeLocal(0, 3, { prop2: \"bar\" });\n\n\t\t\tconst otherClient = new TestClient();\n\t\t\totherClient.startOrUpdateCollaboration(\"other user\");\n\t\t\tconst regeneratedInsert = client.regeneratePendingOp(\n\t\t\t\tinsertOp,\n\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } = otherClient.getContainingSegment<ISegmentPrivate>(0);\n\t\t\tassert(otherSegment !== undefined && TextSegment.is(otherSegment));\n\t\t\tassert.deepStrictEqual(otherSegment.properties, undefined);\n\t\t});\n\t});\n});\n\ndescribe(\"resetPendingSegmentsToOp.rebase\", () => {\n\tit(\"rebase with oustanding ops\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"0123456789\" }, \"A\", \"B\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst ops: [ISequencedDocumentMessage, SegmentGroup][] = Array.from({ length: 10 }).map(\n\t\t\t(_, i) => [\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.annotateRangeLocal(0, clients.A.getLength(), { prop: i }),\n\t\t\t\t\ti + 1,\n\t\t\t\t),\n\t\t\t\tclients.A.peekPendingSegmentGroups()!,\n\t\t\t],\n\t\t);\n\n\t\tops.push(\n\t\t\t...ops\n\t\t\t\t.splice(Math.floor(ops.length / 2))\n\t\t\t\t.map<[ISequencedDocumentMessage, SegmentGroup]>(([op, sg]) => [\n\t\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\t\tclients.A.regeneratePendingOp(op.contents as IMergeTreeOp, sg),\n\t\t\t\t\t\top.sequenceNumber,\n\t\t\t\t\t),\n\t\t\t\t\tclients.A.peekPendingSegmentGroups()!,\n\t\t\t\t]),\n\t\t);\n\n\t\tfor (const [op] of ops) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate();\n\t});\n});\n"]}
1
+ {"version":3,"file":"resetPendingSegmentsToOp.spec.js","sourceRoot":"","sources":["../../src/test/resetPendingSegmentsToOp.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 {\n\tMarker,\n\tSegmentGroup,\n\treservedMarkerIdKey,\n\ttype ISegmentPrivate,\n} from \"../mergeTreeNodes.js\";\nimport { IMergeTreeOp, ReferenceType } from \"../ops.js\";\nimport { clone } from \"../properties.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\ndescribe(\"resetPendingSegmentsToOp\", () => {\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.startOrUpdateCollaboration(\"local user\");\n\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t});\n\n\tdescribe(\"with a number of nested inserts\", () => {\n\t\tconst insertCount = 5;\n\t\tconst expectedSegmentCount = insertCount * 2 - 1;\n\t\tlet opList: { op: IMergeTreeOp; refSeq: number }[];\n\t\tlet opCount: number = 0;\n\n\t\tfunction applyOpList(cli: TestClient): void {\n\t\t\twhile (opList.length > 0) {\n\t\t\t\tconst op = opList.shift();\n\t\t\t\tif (op) {\n\t\t\t\t\tconst seqOp = cli.makeOpMessage(op.op, ++opCount, op.refSeq);\n\t\t\t\t\tcli.applyMsg(seqOp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbeforeEach(() => {\n\t\t\topList = [];\n\t\t\topCount = 0;\n\n\t\t\tfor (let i = 0; i < insertCount; i++) {\n\t\t\t\tconst op = client.insertTextLocal(i, \"hello\")!;\n\t\t\t\topList.push({ op, refSeq: client.getCurrentSeq() });\n\t\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, i + 1);\n\t\t\t}\n\t\t});\n\n\t\tit(\"acked insertSegment\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"only computes localPartialLengths once\", () => {\n\t\t\t// This test helps verify the asymptotic correctness of rebase.\n\t\t\t// Since local partial length information is reasonably expensive to store and compute compared to how\n\t\t\t// frequently it's used (i.e. only on reconnect), mergeTree has some logic to only do so when requested,\n\t\t\t// and invalidates that info whenever a segment update occurs.\n\t\t\t// This test verifies that local partial length information only gets computed once when regenerating\n\t\t\t// a number of ops for reconnection.\n\t\t\tlet localPartialsComputeCount = 0;\n\t\t\tconst spiedMergeTree = client.mergeTree as unknown as {\n\t\t\t\tlocalPartialsComputed: boolean;\n\t\t\t\t_localPartialsComputed: boolean;\n\t\t\t};\n\t\t\tspiedMergeTree._localPartialsComputed = spiedMergeTree.localPartialsComputed;\n\t\t\tObject.defineProperty(\n\t\t\t\tclient.mergeTree as unknown as { localPartialsComputed: boolean },\n\t\t\t\t\"localPartialsComputed\",\n\t\t\t\t{\n\t\t\t\t\tget() {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\treturn this._localPartialsComputed as boolean;\n\t\t\t\t\t},\n\t\t\t\t\tset(newValue) {\n\t\t\t\t\t\tif (newValue) {\n\t\t\t\t\t\t\tlocalPartialsComputeCount++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t\tthis._localPartialsComputed = newValue;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!, false),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\t\t\tapplyOpList(client);\n\t\t\tassert.equal(localPartialsComputeCount, 1);\n\t\t});\n\n\t\tit(\"nacked insertSegment\", async () => {\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!, false),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"acked removeRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.removeRangeLocal(0, client.getLength())!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked removeRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.removeRangeLocal(0, client.getLength())!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\n\t\t\topList.push({\n\t\t\t\top: client.regeneratePendingOp(\n\t\t\t\t\topList.shift()!.op,\n\t\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t\t\tfalse,\n\t\t\t\t),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked insertSegment and removeRange\", async () => {\n\t\t\topList.push({\n\t\t\t\top: client.removeRangeLocal(0, client.getLength())!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!, false),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount * 2);\n\n\t\t\tapplyOpList(client);\n\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"acked annotateRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.annotateRangeLocal(0, client.getLength(), { foo: \"bar\" })!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked annotateRange\", async () => {\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\n\t\t\topList.push({\n\t\t\t\top: client.annotateRangeLocal(0, client.getLength(), { foo: \"bar\" })!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\n\t\t\topList.push({\n\t\t\t\top: client.regeneratePendingOp(\n\t\t\t\t\topList.shift()!.op,\n\t\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t\t\tfalse,\n\t\t\t\t),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\n\t\tit(\"nacked insertSegment and annotateRange\", async () => {\n\t\t\topList.push({\n\t\t\t\top: client.annotateRangeLocal(0, client.getLength(), { foo: \"bar\" })!,\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t});\n\t\t\tconst oldops = opList;\n\t\t\tconst pending = [...client.mergeTree.pendingSegments.map((n) => n.data)];\n\t\t\topList = oldops.map((op) => ({\n\t\t\t\top: client.regeneratePendingOp(op.op, pending.shift()!, false),\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t}));\n\t\t\t// we expect a nack op per segment since our original ops split segments\n\t\t\t// we should expect mores nack ops then original ops.\n\t\t\t// only the first op didn't split a segment, all the others did\n\t\t\tassert.equal(client.mergeTree.pendingSegments?.length, expectedSegmentCount * 2);\n\t\t\tapplyOpList(client);\n\t\t\tassert(client.mergeTree.pendingSegments?.empty);\n\t\t});\n\t});\n\n\tdescribe(\"uses original properties on insert\", () => {\n\t\t// Regression tests for an issue where regenerated insert ops would use the properties of a segment\n\t\t// at the time of regeneration rather than its properties at insertion time.\n\t\tit(\"for markers\", () => {\n\t\t\tconst insertOp = client.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t\t[reservedMarkerIdKey]: \"id\",\n\t\t\t\tprop1: \"foo\",\n\t\t\t});\n\t\t\tassert(insertOp);\n\t\t\tconst { segment } = client.getContainingSegment<ISegmentPrivate>(0);\n\t\t\tassert(segment !== undefined && Marker.is(segment));\n\t\t\tclient.annotateMarker(segment, { prop2: \"bar\" });\n\n\t\t\tconst otherClient = new TestClient();\n\t\t\totherClient.startOrUpdateCollaboration(\"other user\");\n\t\t\tconst regeneratedInsert = client.regeneratePendingOp(\n\t\t\t\tinsertOp,\n\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } = otherClient.getContainingSegment<ISegmentPrivate>(0);\n\t\t\tassert(otherSegment !== undefined && Marker.is(otherSegment));\n\t\t\t// `clone` here is because properties use a Object.create(null); to compare strict equal the prototype chain\n\t\t\t// should therefore not include Object.\n\t\t\tassert.deepStrictEqual(\n\t\t\t\totherSegment.properties,\n\t\t\t\tclone({ [reservedMarkerIdKey]: \"id\", prop1: \"foo\" }),\n\t\t\t);\n\t\t});\n\n\t\tit(\"for text segments\", () => {\n\t\t\tconst insertOp = client.insertTextLocal(0, \"abc\", { prop1: \"foo\" });\n\t\t\tassert(insertOp);\n\t\t\tclient.annotateRangeLocal(0, 3, { prop2: \"bar\" });\n\n\t\t\tconst otherClient = new TestClient();\n\t\t\totherClient.startOrUpdateCollaboration(\"other user\");\n\t\t\tconst regeneratedInsert = client.regeneratePendingOp(\n\t\t\t\tinsertOp,\n\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } = otherClient.getContainingSegment<ISegmentPrivate>(0);\n\t\t\tassert(otherSegment !== undefined && TextSegment.is(otherSegment));\n\t\t\tassert.deepStrictEqual(otherSegment.properties, clone({ prop1: \"foo\" }));\n\t\t});\n\n\t\tit(\"for text segments with no initial properties\", () => {\n\t\t\tconst insertOp = client.insertTextLocal(0, \"abc\");\n\t\t\tassert(insertOp);\n\t\t\tclient.annotateRangeLocal(0, 3, { prop2: \"bar\" });\n\n\t\t\tconst otherClient = new TestClient();\n\t\t\totherClient.startOrUpdateCollaboration(\"other user\");\n\t\t\tconst regeneratedInsert = client.regeneratePendingOp(\n\t\t\t\tinsertOp,\n\t\t\t\tclient.mergeTree.pendingSegments.first!.data,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\totherClient.applyMsg(client.makeOpMessage(regeneratedInsert, 1), false);\n\n\t\t\tconst { segment: otherSegment } = otherClient.getContainingSegment<ISegmentPrivate>(0);\n\t\t\tassert(otherSegment !== undefined && TextSegment.is(otherSegment));\n\t\t\tassert.deepStrictEqual(otherSegment.properties, undefined);\n\t\t});\n\t});\n});\n\ndescribe(\"resetPendingSegmentsToOp.rebase\", () => {\n\tit(\"rebase with oustanding ops\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"0123456789\" }, \"A\", \"B\");\n\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst ops: [ISequencedDocumentMessage, SegmentGroup][] = Array.from({ length: 10 }).map(\n\t\t\t(_, i) => [\n\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\tclients.A.annotateRangeLocal(0, clients.A.getLength(), { prop: i }),\n\t\t\t\t\ti + 1,\n\t\t\t\t),\n\t\t\t\tclients.A.peekPendingSegmentGroups()!,\n\t\t\t],\n\t\t);\n\n\t\tops.push(\n\t\t\t...ops\n\t\t\t\t.splice(Math.floor(ops.length / 2))\n\t\t\t\t.map<[ISequencedDocumentMessage, SegmentGroup]>(([op, sg]) => [\n\t\t\t\t\tclients.A.makeOpMessage(\n\t\t\t\t\t\tclients.A.regeneratePendingOp(op.contents as IMergeTreeOp, sg, false),\n\t\t\t\t\t\top.sequenceNumber,\n\t\t\t\t\t),\n\t\t\t\t\tclients.A.peekPendingSegmentGroups()!,\n\t\t\t\t]),\n\t\t);\n\n\t\tfor (const [op] of ops) for (const c of clients.all) c.applyMsg(op);\n\t\tlogger.validate();\n\t});\n});\n"]}
package/lib/client.d.ts CHANGED
@@ -124,8 +124,8 @@ export declare class Client extends TypedEventEmitter<IClientEvents> {
124
124
  * @param segment - The segment to insert
125
125
  */
126
126
  insertAtReferencePositionLocal(refPos: ReferencePosition, segment: ISegment): IMergeTreeInsertMsg | undefined;
127
- walkSegments<TClientData>(handler: ISegmentAction<TClientData>, start: number | undefined, end: number | undefined, accum: TClientData, splitRange?: boolean): void;
128
- walkSegments(handler: ISegmentAction<undefined>, start?: number, end?: number, accum?: undefined, splitRange?: boolean): void;
127
+ walkSegments<TClientData>(handler: ISegmentAction<TClientData>, start: number | undefined, end: number | undefined, accum: TClientData, splitRange?: boolean, perspective?: Pick<ISequencedDocumentMessage, "clientId" | "referenceSequenceNumber">): void;
128
+ walkSegments(handler: ISegmentAction<undefined>, start?: number, end?: number, accum?: undefined, splitRange?: boolean, perspective?: Pick<ISequencedDocumentMessage, "clientId" | "referenceSequenceNumber">): void;
129
129
  protected walkAllSegments<TClientData>(action: (segment: ISegment, accum?: TClientData) => boolean, accum?: TClientData): boolean;
130
130
  /**
131
131
  * Serializes the data required for garbage collection. The IFluidHandles stored in all segments that haven't
@@ -249,13 +249,16 @@ export declare class Client extends TypedEventEmitter<IClientEvents> {
249
249
  private lastNormalization;
250
250
  private pendingRebase;
251
251
  private readonly cachedObliterateRebases;
252
+ private squashInsertion;
252
253
  /**
253
254
  * Given a pending operation and segment group, regenerate the op, so it
254
255
  * can be resubmitted
255
256
  * @param resetOp - The op to reset
256
257
  * @param segmentGroup - The segment group associated with the op
258
+ * @param squash - whether intermediate states should be squashed. See `IDeltaHandler.reSubmit`'s squash parameter
259
+ * documentation for more details.
257
260
  */
258
- regeneratePendingOp(resetOp: IMergeTreeOp, localOpMetadata: unknown): IMergeTreeOp;
261
+ regeneratePendingOp(resetOp: IMergeTreeOp, localOpMetadata: unknown, squash: boolean): IMergeTreeOp;
259
262
  createTextHelper(): IMergeTreeTextHelper;
260
263
  summarize(runtime: IFluidDataStoreRuntime, handle: IFluidHandle, serializer: IFluidSerializer, catchUpMsgs: ISequencedDocumentMessage[]): ISummaryTreeWithStats;
261
264
  load(runtime: IFluidDataStoreRuntime, storage: IChannelStorageService, serializer: IFluidSerializer): Promise<{