@fluidframework/merge-tree 2.115.0 → 2.116.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 (39) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +5 -3
  3. package/dist/endOfTreeSegment.js +1 -1
  4. package/dist/endOfTreeSegment.js.map +1 -1
  5. package/dist/localReference.d.ts.map +1 -1
  6. package/dist/localReference.js +4 -2
  7. package/dist/localReference.js.map +1 -1
  8. package/dist/partialLengths.js +1 -1
  9. package/dist/partialLengths.js.map +1 -1
  10. package/dist/sortedSegmentSet.d.ts.map +1 -1
  11. package/dist/sortedSegmentSet.js +5 -5
  12. package/dist/sortedSegmentSet.js.map +1 -1
  13. package/dist/test/client.rollback.spec.js +1 -1
  14. package/dist/test/client.rollback.spec.js.map +1 -1
  15. package/dist/test/localReference.spec.d.ts +6 -0
  16. package/dist/test/localReference.spec.d.ts.map +1 -0
  17. package/dist/test/localReference.spec.js +171 -0
  18. package/dist/test/localReference.spec.js.map +1 -0
  19. package/lib/endOfTreeSegment.js +2 -2
  20. package/lib/endOfTreeSegment.js.map +1 -1
  21. package/lib/localReference.d.ts.map +1 -1
  22. package/lib/localReference.js +4 -2
  23. package/lib/localReference.js.map +1 -1
  24. package/lib/partialLengths.js +2 -2
  25. package/lib/partialLengths.js.map +1 -1
  26. package/lib/sortedSegmentSet.d.ts.map +1 -1
  27. package/lib/sortedSegmentSet.js +5 -5
  28. package/lib/sortedSegmentSet.js.map +1 -1
  29. package/lib/test/client.rollback.spec.js +1 -1
  30. package/lib/test/client.rollback.spec.js.map +1 -1
  31. package/lib/test/localReference.spec.d.ts +6 -0
  32. package/lib/test/localReference.spec.d.ts.map +1 -0
  33. package/lib/test/localReference.spec.js +169 -0
  34. package/lib/test/localReference.spec.js.map +1 -0
  35. package/package.json +20 -20
  36. package/src/endOfTreeSegment.ts +2 -2
  37. package/src/localReference.ts +4 -2
  38. package/src/partialLengths.ts +2 -2
  39. package/src/sortedSegmentSet.ts +9 -5
@@ -57,16 +57,16 @@ export class SortedSegmentSet extends SortedSet {
57
57
  onFindEquivalent(item, startIndex) {
58
58
  // SortedSegmentSet may contain multiple items with the same key (e.g. a local ref at offset 0 and the segment it is on).
59
59
  // Items should compare as reference-equal, so we do a linear walk to find the actual item in this case.
60
- let index = startIndex;
61
- if (item === this.sortedItems[index]) {
62
- return { exists: true, index };
60
+ if (item === this.sortedItems[startIndex]) {
61
+ return { exists: true, index: startIndex };
63
62
  }
64
- for (let b = index - 1; b >= 0 && this.compare(item, this.sortedItems[b]) === 0; b--) {
63
+ for (let b = startIndex - 1; b >= 0 && this.compare(item, this.sortedItems[b]) === 0; b--) {
65
64
  if (this.sortedItems[b] === item) {
66
65
  return { exists: true, index: b };
67
66
  }
68
67
  }
69
- for (index + 1; index < this.sortedItems.length && this.compare(item, this.sortedItems[index]) === 0; index++) {
68
+ let index = startIndex + 1;
69
+ for (; index < this.sortedItems.length && this.compare(item, this.sortedItems[index]) === 0; index++) {
70
70
  if (this.sortedItems[index] === item) {
71
71
  return { exists: true, index };
72
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sortedSegmentSet.js","sourceRoot":"","sources":["../src/sortedSegmentSet.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 type { LocalReferencePosition } from \"./localReference.js\";\nimport type { ISegmentInternal } from \"./mergeTreeNodes.js\";\nimport { hasProp, toMergeNodeInfo } from \"./segmentInfos.js\";\nimport { SortedSet } from \"./sortedSet.js\";\n\n/**\n * @internal\n */\nexport type SortedSegmentSetItem =\n\t| ISegmentInternal\n\t| LocalReferencePosition\n\t| { readonly segment: ISegmentInternal };\n\n/**\n * Stores a unique and sorted set of segments, or objects with segments\n *\n * This differs from a normal sorted set in that the keys are not fixed.\n * The segments are sorted via their ordinals which can change as the merge tree is modified.\n * Even though the values of the ordinals can change their ordering and uniqueness cannot, so the order of a set of\n * segments ordered by their ordinals will always have the same order even if the ordinal values on\n * the segments changes. This invariant allows us to ensure the segments stay\n * ordered and unique, and that new segments can be inserted into that order.\n *\n * @internal\n */\nexport class SortedSegmentSet<\n\tT extends SortedSegmentSetItem = ISegmentInternal,\n> extends SortedSet<T> {\n\tprivate getOrdinal(item: T): string {\n\t\tconst maybeRef = item as Partial<LocalReferencePosition>;\n\t\tif (maybeRef.getSegment !== undefined && maybeRef.isLeaf?.() === false) {\n\t\t\tconst lref = maybeRef as LocalReferencePosition;\n\t\t\t// If the reference position has no associated segment, assign it a sentinel value.\n\t\t\t// The particular value for comparison doesn't matter because `findItemPosition` tolerates\n\t\t\t// elements with duplicate keys (as it must, since local references use the same key as their segment).\n\t\t\t// All that matters is that it's consistent.\n\t\t\treturn toMergeNodeInfo(lref.getSegment())?.ordinal ?? \"\";\n\t\t}\n\t\tif (hasProp(item, \"segment\", \"object\")) {\n\t\t\treturn toMergeNodeInfo(item.segment)?.ordinal ?? \"\";\n\t\t}\n\n\t\treturn toMergeNodeInfo(item)?.ordinal ?? \"\";\n\t}\n\n\tprivate getOffset(item: T): number {\n\t\tconst maybeRef = item as Partial<LocalReferencePosition>;\n\t\tif (maybeRef.getSegment !== undefined && maybeRef.isLeaf?.() === false) {\n\t\t\tconst lref = maybeRef as LocalReferencePosition;\n\t\t\treturn lref.getOffset();\n\t\t}\n\t\treturn 0;\n\t}\n\n\tpublic onSortOrderChange(): void {\n\t\tthis.sortedItems.sort((a, b) => this.compare(a, b));\n\t}\n\n\tprotected compare(a: T, b: T): number {\n\t\tconst aOrdinal = this.getOrdinal(a);\n\t\tconst bOrdinal = this.getOrdinal(b);\n\n\t\tif (aOrdinal < bOrdinal) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (aOrdinal > bOrdinal) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn this.getOffset(a) - this.getOffset(b);\n\t}\n\n\tprotected onFindEquivalent(item: T, startIndex: number): { exists: boolean; index: number } {\n\t\t// SortedSegmentSet may contain multiple items with the same key (e.g. a local ref at offset 0 and the segment it is on).\n\t\t// Items should compare as reference-equal, so we do a linear walk to find the actual item in this case.\n\t\tlet index = startIndex;\n\t\tif (item === this.sortedItems[index]) {\n\t\t\treturn { exists: true, index };\n\t\t}\n\t\tfor (let b = index - 1; b >= 0 && this.compare(item, this.sortedItems[b]) === 0; b--) {\n\t\t\tif (this.sortedItems[b] === item) {\n\t\t\t\treturn { exists: true, index: b };\n\t\t\t}\n\t\t}\n\t\tfor (\n\t\t\tindex + 1;\n\t\t\tindex < this.sortedItems.length && this.compare(item, this.sortedItems[index]) === 0;\n\t\t\tindex++\n\t\t) {\n\t\t\tif (this.sortedItems[index] === item) {\n\t\t\t\treturn { exists: true, index };\n\t\t\t}\n\t\t}\n\t\treturn { exists: false, index };\n\t}\n}\n"]}
1
+ {"version":3,"file":"sortedSegmentSet.js","sourceRoot":"","sources":["../src/sortedSegmentSet.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 type { LocalReferencePosition } from \"./localReference.js\";\nimport type { ISegmentInternal } from \"./mergeTreeNodes.js\";\nimport { hasProp, toMergeNodeInfo } from \"./segmentInfos.js\";\nimport { SortedSet } from \"./sortedSet.js\";\n\n/**\n * @internal\n */\nexport type SortedSegmentSetItem =\n\t| ISegmentInternal\n\t| LocalReferencePosition\n\t| { readonly segment: ISegmentInternal };\n\n/**\n * Stores a unique and sorted set of segments, or objects with segments\n *\n * This differs from a normal sorted set in that the keys are not fixed.\n * The segments are sorted via their ordinals which can change as the merge tree is modified.\n * Even though the values of the ordinals can change their ordering and uniqueness cannot, so the order of a set of\n * segments ordered by their ordinals will always have the same order even if the ordinal values on\n * the segments changes. This invariant allows us to ensure the segments stay\n * ordered and unique, and that new segments can be inserted into that order.\n *\n * @internal\n */\nexport class SortedSegmentSet<\n\tT extends SortedSegmentSetItem = ISegmentInternal,\n> extends SortedSet<T> {\n\tprivate getOrdinal(item: T): string {\n\t\tconst maybeRef = item as Partial<LocalReferencePosition>;\n\t\tif (maybeRef.getSegment !== undefined && maybeRef.isLeaf?.() === false) {\n\t\t\tconst lref = maybeRef as LocalReferencePosition;\n\t\t\t// If the reference position has no associated segment, assign it a sentinel value.\n\t\t\t// The particular value for comparison doesn't matter because `findItemPosition` tolerates\n\t\t\t// elements with duplicate keys (as it must, since local references use the same key as their segment).\n\t\t\t// All that matters is that it's consistent.\n\t\t\treturn toMergeNodeInfo(lref.getSegment())?.ordinal ?? \"\";\n\t\t}\n\t\tif (hasProp(item, \"segment\", \"object\")) {\n\t\t\treturn toMergeNodeInfo(item.segment)?.ordinal ?? \"\";\n\t\t}\n\n\t\treturn toMergeNodeInfo(item)?.ordinal ?? \"\";\n\t}\n\n\tprivate getOffset(item: T): number {\n\t\tconst maybeRef = item as Partial<LocalReferencePosition>;\n\t\tif (maybeRef.getSegment !== undefined && maybeRef.isLeaf?.() === false) {\n\t\t\tconst lref = maybeRef as LocalReferencePosition;\n\t\t\treturn lref.getOffset();\n\t\t}\n\t\treturn 0;\n\t}\n\n\tpublic onSortOrderChange(): void {\n\t\tthis.sortedItems.sort((a, b) => this.compare(a, b));\n\t}\n\n\tprotected compare(a: T, b: T): number {\n\t\tconst aOrdinal = this.getOrdinal(a);\n\t\tconst bOrdinal = this.getOrdinal(b);\n\n\t\tif (aOrdinal < bOrdinal) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (aOrdinal > bOrdinal) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn this.getOffset(a) - this.getOffset(b);\n\t}\n\n\tprotected onFindEquivalent(item: T, startIndex: number): { exists: boolean; index: number } {\n\t\t// SortedSegmentSet may contain multiple items with the same key (e.g. a local ref at offset 0 and the segment it is on).\n\t\t// Items should compare as reference-equal, so we do a linear walk to find the actual item in this case.\n\t\tif (item === this.sortedItems[startIndex]) {\n\t\t\treturn { exists: true, index: startIndex };\n\t\t}\n\t\tfor (\n\t\t\tlet b = startIndex - 1;\n\t\t\tb >= 0 && this.compare(item, this.sortedItems[b]) === 0;\n\t\t\tb--\n\t\t) {\n\t\t\tif (this.sortedItems[b] === item) {\n\t\t\t\treturn { exists: true, index: b };\n\t\t\t}\n\t\t}\n\t\tlet index = startIndex + 1;\n\t\tfor (\n\t\t\t;\n\t\t\tindex < this.sortedItems.length && this.compare(item, this.sortedItems[index]) === 0;\n\t\t\tindex++\n\t\t) {\n\t\t\tif (this.sortedItems[index] === item) {\n\t\t\t\treturn { exists: true, index };\n\t\t\t}\n\t\t}\n\t\treturn { exists: false, index };\n\t}\n}\n"]}
@@ -269,7 +269,7 @@ describe("client.rollback", () => {
269
269
  break;
270
270
  }
271
271
  default: {
272
- assert(false, `Unexpected text segment: ${text}`);
272
+ assert.fail(`Unexpected text segment: ${text}`);
273
273
  }
274
274
  }
275
275
  });
@@ -1 +1 @@
1
- {"version":3,"file":"client.rollback.spec.js","sourceRoot":"","sources":["../../src/test/client.rollback.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n// TODO: Fix prefer-optional-chain lint violations\n/* eslint-disable @typescript-eslint/prefer-optional-chain */\n\nimport { strict as assert } from \"node:assert\";\n\nimport {\n\ttype ISegmentPrivate,\n\ttype Marker,\n\ttype SegmentGroup,\n\treservedMarkerIdKey,\n} from \"../mergeTreeNodes.js\";\nimport { MergeTreeDeltaType, ReferenceType, type IMergeTreeOp } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState, TestClientLogger } from \"./testClientLogger.js\";\nimport { validatePartialLengths } from \"./testUtils.js\";\n\ndescribe(\"client.rollback\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.mergeTree.insertSegments(\n\t\t\t0,\n\t\t\t[TextSegment.make(\"\")],\n\t\t\tclient.mergeTree.localPerspective,\n\t\t\tclient.mergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\tundefined,\n\t\t);\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"Should rollback insert on empty string\", () => {\n\t\tclient.insertTextLocal(0, \"abcd\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback insert marker\", () => {\n\t\tclient.insertTextLocal(0, \"abc\");\n\t\tclient.insertMarkerLocal(1, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abc\");\n\t\tconst marker = client.getMarkerFromId(\"markerId\");\n\t\tassert.equal(marker, undefined);\n\t});\n\tit(\"Should rollback insert and validate the partial lengths\", () => {\n\t\tclient.insertTextLocal(0, \"ghi\");\n\t\tclient.insertTextLocal(0, \"def\");\n\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"defghi\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"ghi\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\t});\n\tit(\"Should rollback multiple inserts with split segments\", () => {\n\t\tclient.insertTextLocal(0, \"aefg\");\n\t\tclient.insertTextLocal(1, \"bd\");\n\t\tclient.insertTextLocal(2, \"c\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"aefg\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\t});\n\tit(\"Should zamboni rolled back insert\", () => {\n\t\tclient.insertTextLocal(0, \"aefg\");\n\t\tclient.insertTextLocal(1, \"bcd\");\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback annotate marker\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, undefined);\n\t});\n\tit(\"Should rollback annotate marker overwriting property\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { foo: \"baz\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t});\n\tit(\"Should rollback annotate marker removing property\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\t// eslint-disable-next-line unicorn/no-null\n\t\tclient.annotateMarker(marker, { foo: null });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t});\n\tit(\"Should rollback annotate marker rewrite\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { [reservedMarkerIdKey]: \"markerId\", abc: \"def\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t\tassert.equal(properties?.abc, undefined);\n\t});\n\tit(\"Should rollback annotate rewrite with explicit null\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tabc: \"def\",\n\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\tfoo: null,\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t\tassert.equal(properties?.abc, undefined);\n\t});\n\tit(\"Should rollback annotate causes split string\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.annotateRangeLocal(1, 3, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate over split string\", () => {\n\t\tclient.insertTextLocal(0, \"abfg\");\n\t\tclient.insertTextLocal(1, \"cde\");\n\t\tclient.annotateRangeLocal(1, 6, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 7; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate that later gets split\", () => {\n\t\tclient.insertTextLocal(0, \"abfg\");\n\t\tclient.annotateRangeLocal(0, 4, { foo: \"bar\" });\n\t\tclient.insertTextLocal(1, \"cde\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abfg\");\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotates with multiple previous property sets\", () => {\n\t\tclient.insertTextLocal(0, \"acde\");\n\t\tclient.annotateRangeLocal(0, 3, { foo: \"one\" });\n\t\tclient.annotateRangeLocal(2, 4, { foo: \"two\" });\n\t\tclient.annotateRangeLocal(0, 3, { foo: \"three\" });\n\t\tclient.insertTextLocal(1, \"b\");\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tlet props = client.getPropertiesAtPosition(3);\n\t\tassert(props !== undefined && props.foo === \"two\");\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"three\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < 2; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"one\");\n\t\t}\n\t\tfor (let i = 2; i < 4; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"two\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tprops = client.getPropertiesAtPosition(3);\n\t\tassert(props === undefined || props.foo === undefined);\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"one\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"acde\");\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate with same prop\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tclient.annotateRangeLocal(1, 4, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i === 2) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\t});\n\tit(\"Should zamboni rolled back annotated segment\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(0, \"abcde\", { color: \"red\" }),\n\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback delete on single segment\", () => {\n\t\tclient.insertTextLocal(0, \"abcd\");\n\t\tclient.removeRangeLocal(0, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcd\");\n\t});\n\tit(\"Should rollback delete which causes split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.removeRangeLocal(1, 4);\n\t\tlet deltaEvent = false;\n\t\tclient.on(\"delta\", () => {\n\t\t\tassert.equal(client.getText(), \"abcde\");\n\t\t\tdeltaEvent = true;\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tassert.equal(deltaEvent, true);\n\t});\n\tit(\"Should rollback delete across split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tclient.removeRangeLocal(1, 4);\n\n\t\tlet deltaCount = 0;\n\t\tlet bFound = false;\n\t\tlet cFound = false;\n\t\tlet dFound = false;\n\t\tclient.on(\"delta\", (_opArgs, delta) => {\n\t\t\tdeltaCount++;\n\t\t\tassert.equal(client.getText().length, 2 + deltaCount);\n\t\t\tassert.equal(delta.deltaSegments.length, 1);\n\t\t\tassert.equal(delta.deltaSegments[0].segment.type, TextSegment.type);\n\t\t\tconst text = (delta.deltaSegments[0].segment as TextSegment).toString();\n\t\t\tswitch (text) {\n\t\t\t\tcase \"b\": {\n\t\t\t\t\tbFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"c\": {\n\t\t\t\t\tcFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"d\": {\n\t\t\t\t\tdFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tassert(false, `Unexpected text segment: ${text}`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tassert.equal(deltaCount, 3);\n\t\tassert(bFound);\n\t\tassert(cFound);\n\t\tassert(dFound);\n\t});\n\tit(\"Should rollback delete and update blocks\", () => {\n\t\tconst text = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\";\n\t\tfor (const c of text) {\n\t\t\tclient.insertTextLocal(client.getLength(), c);\n\t\t}\n\t\tclient.removeRangeLocal(1, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\t// The insertion position calculation will be wrong if the blocks aren't updated correctly\n\t\tclient.insertTextLocal(text.length - 1, \"+\");\n\n\t\tconst expectedText = `${text.slice(0, Math.max(0, text.length - 1))}+${\n\t\t\ttext[text.length - 1]\n\t\t}`;\n\t\tassert.equal(client.getText(), expectedText, client.getText());\n\t});\n\tit(\"Should rollback delete and restore local references\", () => {\n\t\tclient.insertTextLocal(0, \"efg\");\n\t\tclient.insertTextLocal(0, \"d\");\n\t\tclient.insertTextLocal(0, \"abc\");\n\t\tconst segInfo1 = client.getContainingSegment<ISegmentPrivate>(2);\n\t\tassert(segInfo1);\n\n\t\tconst segInfo3 = client.getContainingSegment<ISegmentPrivate>(5);\n\t\tassert(segInfo3);\n\n\t\tconst ref1 = client.createLocalReferencePosition(\n\t\t\tsegInfo1.segment,\n\t\t\t0,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\t\tconst refSlide = client.createLocalReferencePosition(\n\t\t\tsegInfo1.segment,\n\t\t\t2,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tconst ref2 = client.createLocalReferencePosition(\n\t\t\tsegInfo3.segment,\n\t\t\t1,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\t\tconst refStay = client.createLocalReferencePosition(\n\t\t\tsegInfo3.segment,\n\t\t\t1,\n\t\t\tReferenceType.StayOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tclient.removeRangeLocal(0, 7);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tconst segInfo1After = client.getContainingSegment<ISegmentPrivate>(2);\n\t\tassert.notEqual(segInfo1After, undefined);\n\t\tassert.notEqual(segInfo1After?.segment?.localRefs, undefined);\n\t\tassert(segInfo1After?.segment?.localRefs!.has(ref1));\n\t\tassert(segInfo1After?.segment?.localRefs!.has(refSlide));\n\t\tconst segInfo3After = client.getContainingSegment<ISegmentPrivate>(5);\n\t\tassert.notEqual(segInfo3After, undefined);\n\t\tassert.notEqual(segInfo3After?.segment?.localRefs, undefined);\n\t\tassert(segInfo3After?.segment?.localRefs!.has(ref2));\n\t\tassert(segInfo3After?.segment?.localRefs!.has(refStay));\n\t});\n\tit(\"Should zamboni rolled back remove\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(0, \"abcde\", { color: \"red\" }),\n\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tclient.removeRangeLocal(1, 4);\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback multiple overlapping edits\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.annotateRangeLocal(2, 5, { foo: \"bar\" });\n\t\tclient.removeRangeLocal(3, 7);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123defg\");\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 5) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback multiple removes across split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.insertTextLocal(4, \"xyz\");\n\t\tclient.removeRangeLocal(2, 5);\n\t\tclient.removeRangeLocal(3, 7);\n\t\tclient.removeRangeLocal(2, 4);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abye\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abyz23de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc1xyz23de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should annotate a previously removed range\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.removeRangeLocal(2, 8);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123defg\");\n\n\t\tclient.annotateRangeLocal(2, 8, { foo: \"bar\" });\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 8) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback overlapping annotates and remove\", () => {\n\t\tclient.insertTextLocal(0, \"abc123defg\");\n\t\tclient.annotateRangeLocal(0, 6, { foo: \"one\" });\n\t\tclient.annotateRangeLocal(5, 10, { foo: \"two\" });\n\t\tclient.removeRangeLocal(4, 8);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getPropertiesAtPosition(4)?.foo, \"one\");\n\t\tassert.equal(client.getPropertiesAtPosition(5)?.foo, \"two\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 0 && i < 6) {\n\t\t\t\tassert.equal(props?.foo, \"one\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should function properly after rollback with local ops\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.removeRangeLocal(1, 5);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tclient.removeRangeLocal(2, 4);\n\t\tassert.equal(client.getText(), \"abefg\");\n\n\t\tclient.annotateRangeLocal(2, 5, { foo: \"bar\" });\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 5) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.insertTextLocal(1, \"123\");\n\t\tassert.equal(client.getText(), \"a123befg\");\n\t});\n\tit(\"Should function properly after rollback with external ops\", () => {\n\t\tconst remoteClient = new TestClient();\n\t\tremoteClient.startOrUpdateCollaboration(\"remoteUser\");\n\t\tconst clients = [client, remoteClient];\n\t\tlet seq = 0;\n\t\tconst logger = new TestClientLogger(clients);\n\t\tlogger.validate();\n\n\t\tlet msg = remoteClient.makeOpMessage(remoteClient.insertTextLocal(0, \"12345\"), ++seq);\n\t\tfor (const c of clients) c.applyMsg(msg);\n\t\tlogger.validate({ baseText: \"12345\" });\n\n\t\tclient.removeRangeLocal(1, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tmsg = remoteClient.makeOpMessage(remoteClient.removeRangeLocal(2, 3), ++seq);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1245\" });\n\n\t\tmsg = remoteClient.makeOpMessage(\n\t\t\tremoteClient.annotateRangeLocal(0, 3, { foo: \"bar\" }),\n\t\t\t++seq,\n\t\t);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1245\" });\n\t\tfor (const c of clients) {\n\t\t\tfor (let i = 0; i < c.getText().length; i++) {\n\t\t\t\tconst props = c.getPropertiesAtPosition(i);\n\t\t\t\tif (i >= 0 && i < 3) {\n\t\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t\t} else {\n\t\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmsg = remoteClient.makeOpMessage(remoteClient.insertTextLocal(3, \"abc\"), ++seq);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"124abc5\" });\n\t});\n\n\tit(\"Conflicting insert with winner split by rollback\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\");\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops = [\n\t\t\tclients.A.makeOpMessage(clients.A.insertTextLocal(0, \"AAAAA\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BBBBB\"), ++seq),\n\t\t];\n\t\tconst rollbackOp = clients.B.insertTextLocal(2, \"RRRRR\");\n\t\tclients.B.rollback(rollbackOp, clients.B.peekPendingSegmentGroups());\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(op);\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"BBBBBAAAAA\" });\n\t});\n\tit(\"should not restore text if both clients delete and one rolls back after remote delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"0123456789\" }, \"A\", \"B\");\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\n\t\t// Both clients delete the same range locally (not yet sequenced)\n\t\tconst delA = clients.A.removeRangeLocal(1, 4); // deletes \"123\"\n\t\tconst delB = clients.B.removeRangeLocal(1, 4); // deletes \"123\"\n\n\t\t// Client B flushes its delete (becomes sequenced)\n\t\tconst msgB = clients.B.makeOpMessage(delB, ++seq);\n\t\tfor (const c of clients.all) c.applyMsg(msgB);\n\n\t\t// Client A attempts to rollback its local delete after seeing remote delete\n\t\tclients.A.rollback(delA, clients.A.peekPendingSegmentGroups());\n\n\t\tlogger.validate({ baseText: \"0456789\" });\n\t});\n\n\tit(\"should rollback group op after re-submit split\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\");\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst ops: [IMergeTreeOp, SegmentGroup | SegmentGroup[] | undefined][] = [];\n\t\tops.push([\n\t\t\tclients.A.insertTextLocal(0, \"0123456789\")!,\n\t\t\tclients.A.peekPendingSegmentGroups(),\n\t\t]);\n\t\tops.push([\n\t\t\tclients.A.annotateRangeLocal(3, 4, { prop: \"splitTheRange\" })!,\n\t\t\tclients.A.peekPendingSegmentGroups(),\n\t\t]);\n\n\t\tfor (const [op, md] of ops.splice(0)) {\n\t\t\tconst newOp = clients.A.regeneratePendingOp(op, md, false);\n\t\t\tops.push([\n\t\t\t\tnewOp,\n\t\t\t\tclients.A.peekPendingSegmentGroups(\n\t\t\t\t\tnewOp.type === MergeTreeDeltaType.GROUP ? newOp.ops.length : 1,\n\t\t\t\t),\n\t\t\t]);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"0123456789\" });\n\n\t\tfor (const [op, md] of ops.splice(0).reverse()) {\n\t\t\tclients.A.rollback(op, md);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"\" });\n\t});\n});\n"]}
1
+ {"version":3,"file":"client.rollback.spec.js","sourceRoot":"","sources":["../../src/test/client.rollback.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n// TODO: Fix prefer-optional-chain lint violations\n/* eslint-disable @typescript-eslint/prefer-optional-chain */\n\nimport { strict as assert } from \"node:assert\";\n\nimport {\n\ttype ISegmentPrivate,\n\ttype Marker,\n\ttype SegmentGroup,\n\treservedMarkerIdKey,\n} from \"../mergeTreeNodes.js\";\nimport { MergeTreeDeltaType, ReferenceType, type IMergeTreeOp } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { createClientsAtInitialState, TestClientLogger } from \"./testClientLogger.js\";\nimport { validatePartialLengths } from \"./testUtils.js\";\n\ndescribe(\"client.rollback\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.mergeTree.insertSegments(\n\t\t\t0,\n\t\t\t[TextSegment.make(\"\")],\n\t\t\tclient.mergeTree.localPerspective,\n\t\t\tclient.mergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\tundefined,\n\t\t);\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"Should rollback insert on empty string\", () => {\n\t\tclient.insertTextLocal(0, \"abcd\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback insert marker\", () => {\n\t\tclient.insertTextLocal(0, \"abc\");\n\t\tclient.insertMarkerLocal(1, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abc\");\n\t\tconst marker = client.getMarkerFromId(\"markerId\");\n\t\tassert.equal(marker, undefined);\n\t});\n\tit(\"Should rollback insert and validate the partial lengths\", () => {\n\t\tclient.insertTextLocal(0, \"ghi\");\n\t\tclient.insertTextLocal(0, \"def\");\n\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"defghi\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"ghi\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\t});\n\tit(\"Should rollback multiple inserts with split segments\", () => {\n\t\tclient.insertTextLocal(0, \"aefg\");\n\t\tclient.insertTextLocal(1, \"bd\");\n\t\tclient.insertTextLocal(2, \"c\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"aefg\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\t});\n\tit(\"Should zamboni rolled back insert\", () => {\n\t\tclient.insertTextLocal(0, \"aefg\");\n\t\tclient.insertTextLocal(1, \"bcd\");\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback annotate marker\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, undefined);\n\t});\n\tit(\"Should rollback annotate marker overwriting property\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { foo: \"baz\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t});\n\tit(\"Should rollback annotate marker removing property\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\t// eslint-disable-next-line unicorn/no-null\n\t\tclient.annotateMarker(marker, { foo: null });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t});\n\tit(\"Should rollback annotate marker rewrite\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { [reservedMarkerIdKey]: \"markerId\", abc: \"def\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t\tassert.equal(properties?.abc, undefined);\n\t});\n\tit(\"Should rollback annotate rewrite with explicit null\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tabc: \"def\",\n\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\tfoo: null,\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t\tassert.equal(properties?.abc, undefined);\n\t});\n\tit(\"Should rollback annotate causes split string\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.annotateRangeLocal(1, 3, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate over split string\", () => {\n\t\tclient.insertTextLocal(0, \"abfg\");\n\t\tclient.insertTextLocal(1, \"cde\");\n\t\tclient.annotateRangeLocal(1, 6, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 7; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate that later gets split\", () => {\n\t\tclient.insertTextLocal(0, \"abfg\");\n\t\tclient.annotateRangeLocal(0, 4, { foo: \"bar\" });\n\t\tclient.insertTextLocal(1, \"cde\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abfg\");\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotates with multiple previous property sets\", () => {\n\t\tclient.insertTextLocal(0, \"acde\");\n\t\tclient.annotateRangeLocal(0, 3, { foo: \"one\" });\n\t\tclient.annotateRangeLocal(2, 4, { foo: \"two\" });\n\t\tclient.annotateRangeLocal(0, 3, { foo: \"three\" });\n\t\tclient.insertTextLocal(1, \"b\");\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tlet props = client.getPropertiesAtPosition(3);\n\t\tassert(props !== undefined && props.foo === \"two\");\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"three\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < 2; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"one\");\n\t\t}\n\t\tfor (let i = 2; i < 4; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"two\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tprops = client.getPropertiesAtPosition(3);\n\t\tassert(props === undefined || props.foo === undefined);\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"one\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"acde\");\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate with same prop\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tclient.annotateRangeLocal(1, 4, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i === 2) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\t});\n\tit(\"Should zamboni rolled back annotated segment\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(0, \"abcde\", { color: \"red\" }),\n\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback delete on single segment\", () => {\n\t\tclient.insertTextLocal(0, \"abcd\");\n\t\tclient.removeRangeLocal(0, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcd\");\n\t});\n\tit(\"Should rollback delete which causes split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.removeRangeLocal(1, 4);\n\t\tlet deltaEvent = false;\n\t\tclient.on(\"delta\", () => {\n\t\t\tassert.equal(client.getText(), \"abcde\");\n\t\t\tdeltaEvent = true;\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tassert.equal(deltaEvent, true);\n\t});\n\tit(\"Should rollback delete across split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tclient.removeRangeLocal(1, 4);\n\n\t\tlet deltaCount = 0;\n\t\tlet bFound = false;\n\t\tlet cFound = false;\n\t\tlet dFound = false;\n\t\tclient.on(\"delta\", (_opArgs, delta) => {\n\t\t\tdeltaCount++;\n\t\t\tassert.equal(client.getText().length, 2 + deltaCount);\n\t\t\tassert.equal(delta.deltaSegments.length, 1);\n\t\t\tassert.equal(delta.deltaSegments[0].segment.type, TextSegment.type);\n\t\t\tconst text = (delta.deltaSegments[0].segment as TextSegment).toString();\n\t\t\tswitch (text) {\n\t\t\t\tcase \"b\": {\n\t\t\t\t\tbFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"c\": {\n\t\t\t\t\tcFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"d\": {\n\t\t\t\t\tdFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tassert.fail(`Unexpected text segment: ${text}`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tassert.equal(deltaCount, 3);\n\t\tassert(bFound);\n\t\tassert(cFound);\n\t\tassert(dFound);\n\t});\n\tit(\"Should rollback delete and update blocks\", () => {\n\t\tconst text = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\";\n\t\tfor (const c of text) {\n\t\t\tclient.insertTextLocal(client.getLength(), c);\n\t\t}\n\t\tclient.removeRangeLocal(1, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\t// The insertion position calculation will be wrong if the blocks aren't updated correctly\n\t\tclient.insertTextLocal(text.length - 1, \"+\");\n\n\t\tconst expectedText = `${text.slice(0, Math.max(0, text.length - 1))}+${\n\t\t\ttext[text.length - 1]\n\t\t}`;\n\t\tassert.equal(client.getText(), expectedText, client.getText());\n\t});\n\tit(\"Should rollback delete and restore local references\", () => {\n\t\tclient.insertTextLocal(0, \"efg\");\n\t\tclient.insertTextLocal(0, \"d\");\n\t\tclient.insertTextLocal(0, \"abc\");\n\t\tconst segInfo1 = client.getContainingSegment<ISegmentPrivate>(2);\n\t\tassert(segInfo1);\n\n\t\tconst segInfo3 = client.getContainingSegment<ISegmentPrivate>(5);\n\t\tassert(segInfo3);\n\n\t\tconst ref1 = client.createLocalReferencePosition(\n\t\t\tsegInfo1.segment,\n\t\t\t0,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\t\tconst refSlide = client.createLocalReferencePosition(\n\t\t\tsegInfo1.segment,\n\t\t\t2,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tconst ref2 = client.createLocalReferencePosition(\n\t\t\tsegInfo3.segment,\n\t\t\t1,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\t\tconst refStay = client.createLocalReferencePosition(\n\t\t\tsegInfo3.segment,\n\t\t\t1,\n\t\t\tReferenceType.StayOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tclient.removeRangeLocal(0, 7);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tconst segInfo1After = client.getContainingSegment<ISegmentPrivate>(2);\n\t\tassert.notEqual(segInfo1After, undefined);\n\t\tassert.notEqual(segInfo1After?.segment?.localRefs, undefined);\n\t\tassert(segInfo1After?.segment?.localRefs!.has(ref1));\n\t\tassert(segInfo1After?.segment?.localRefs!.has(refSlide));\n\t\tconst segInfo3After = client.getContainingSegment<ISegmentPrivate>(5);\n\t\tassert.notEqual(segInfo3After, undefined);\n\t\tassert.notEqual(segInfo3After?.segment?.localRefs, undefined);\n\t\tassert(segInfo3After?.segment?.localRefs!.has(ref2));\n\t\tassert(segInfo3After?.segment?.localRefs!.has(refStay));\n\t});\n\tit(\"Should zamboni rolled back remove\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(0, \"abcde\", { color: \"red\" }),\n\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tclient.removeRangeLocal(1, 4);\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback multiple overlapping edits\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.annotateRangeLocal(2, 5, { foo: \"bar\" });\n\t\tclient.removeRangeLocal(3, 7);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123defg\");\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 5) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback multiple removes across split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.insertTextLocal(4, \"xyz\");\n\t\tclient.removeRangeLocal(2, 5);\n\t\tclient.removeRangeLocal(3, 7);\n\t\tclient.removeRangeLocal(2, 4);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abye\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abyz23de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc1xyz23de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should annotate a previously removed range\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.removeRangeLocal(2, 8);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123defg\");\n\n\t\tclient.annotateRangeLocal(2, 8, { foo: \"bar\" });\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 8) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback overlapping annotates and remove\", () => {\n\t\tclient.insertTextLocal(0, \"abc123defg\");\n\t\tclient.annotateRangeLocal(0, 6, { foo: \"one\" });\n\t\tclient.annotateRangeLocal(5, 10, { foo: \"two\" });\n\t\tclient.removeRangeLocal(4, 8);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getPropertiesAtPosition(4)?.foo, \"one\");\n\t\tassert.equal(client.getPropertiesAtPosition(5)?.foo, \"two\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 0 && i < 6) {\n\t\t\t\tassert.equal(props?.foo, \"one\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should function properly after rollback with local ops\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.removeRangeLocal(1, 5);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tclient.removeRangeLocal(2, 4);\n\t\tassert.equal(client.getText(), \"abefg\");\n\n\t\tclient.annotateRangeLocal(2, 5, { foo: \"bar\" });\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 5) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.insertTextLocal(1, \"123\");\n\t\tassert.equal(client.getText(), \"a123befg\");\n\t});\n\tit(\"Should function properly after rollback with external ops\", () => {\n\t\tconst remoteClient = new TestClient();\n\t\tremoteClient.startOrUpdateCollaboration(\"remoteUser\");\n\t\tconst clients = [client, remoteClient];\n\t\tlet seq = 0;\n\t\tconst logger = new TestClientLogger(clients);\n\t\tlogger.validate();\n\n\t\tlet msg = remoteClient.makeOpMessage(remoteClient.insertTextLocal(0, \"12345\"), ++seq);\n\t\tfor (const c of clients) c.applyMsg(msg);\n\t\tlogger.validate({ baseText: \"12345\" });\n\n\t\tclient.removeRangeLocal(1, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tmsg = remoteClient.makeOpMessage(remoteClient.removeRangeLocal(2, 3), ++seq);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1245\" });\n\n\t\tmsg = remoteClient.makeOpMessage(\n\t\t\tremoteClient.annotateRangeLocal(0, 3, { foo: \"bar\" }),\n\t\t\t++seq,\n\t\t);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1245\" });\n\t\tfor (const c of clients) {\n\t\t\tfor (let i = 0; i < c.getText().length; i++) {\n\t\t\t\tconst props = c.getPropertiesAtPosition(i);\n\t\t\t\tif (i >= 0 && i < 3) {\n\t\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t\t} else {\n\t\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmsg = remoteClient.makeOpMessage(remoteClient.insertTextLocal(3, \"abc\"), ++seq);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"124abc5\" });\n\t});\n\n\tit(\"Conflicting insert with winner split by rollback\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\", \"B\");\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\t\tconst ops = [\n\t\t\tclients.A.makeOpMessage(clients.A.insertTextLocal(0, \"AAAAA\"), ++seq),\n\t\t\tclients.B.makeOpMessage(clients.B.insertTextLocal(0, \"BBBBB\"), ++seq),\n\t\t];\n\t\tconst rollbackOp = clients.B.insertTextLocal(2, \"RRRRR\");\n\t\tclients.B.rollback(rollbackOp, clients.B.peekPendingSegmentGroups());\n\n\t\tfor (const op of ops) {\n\t\t\tfor (const c of clients.all) {\n\t\t\t\tc.applyMsg(op);\n\t\t\t}\n\t\t}\n\t\tlogger.validate({ baseText: \"BBBBBAAAAA\" });\n\t});\n\tit(\"should not restore text if both clients delete and one rolls back after remote delete\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"0123456789\" }, \"A\", \"B\");\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tlet seq = 0;\n\n\t\t// Both clients delete the same range locally (not yet sequenced)\n\t\tconst delA = clients.A.removeRangeLocal(1, 4); // deletes \"123\"\n\t\tconst delB = clients.B.removeRangeLocal(1, 4); // deletes \"123\"\n\n\t\t// Client B flushes its delete (becomes sequenced)\n\t\tconst msgB = clients.B.makeOpMessage(delB, ++seq);\n\t\tfor (const c of clients.all) c.applyMsg(msgB);\n\n\t\t// Client A attempts to rollback its local delete after seeing remote delete\n\t\tclients.A.rollback(delA, clients.A.peekPendingSegmentGroups());\n\n\t\tlogger.validate({ baseText: \"0456789\" });\n\t});\n\n\tit(\"should rollback group op after re-submit split\", () => {\n\t\tconst clients = createClientsAtInitialState({ initialState: \"\" }, \"A\");\n\t\tconst logger = new TestClientLogger(clients.all);\n\t\tconst ops: [IMergeTreeOp, SegmentGroup | SegmentGroup[] | undefined][] = [];\n\t\tops.push([\n\t\t\tclients.A.insertTextLocal(0, \"0123456789\")!,\n\t\t\tclients.A.peekPendingSegmentGroups(),\n\t\t]);\n\t\tops.push([\n\t\t\tclients.A.annotateRangeLocal(3, 4, { prop: \"splitTheRange\" })!,\n\t\t\tclients.A.peekPendingSegmentGroups(),\n\t\t]);\n\n\t\tfor (const [op, md] of ops.splice(0)) {\n\t\t\tconst newOp = clients.A.regeneratePendingOp(op, md, false);\n\t\t\tops.push([\n\t\t\t\tnewOp,\n\t\t\t\tclients.A.peekPendingSegmentGroups(\n\t\t\t\t\tnewOp.type === MergeTreeDeltaType.GROUP ? newOp.ops.length : 1,\n\t\t\t\t),\n\t\t\t]);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"0123456789\" });\n\n\t\tfor (const [op, md] of ops.splice(0).reverse()) {\n\t\t\tclients.A.rollback(op, md);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"\" });\n\t});\n});\n"]}
@@ -0,0 +1,6 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=localReference.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localReference.spec.d.ts","sourceRoot":"","sources":["../../src/test/localReference.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,169 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { strict as assert } from "node:assert";
6
+ import { LocalReferenceCollection } from "../localReference.js";
7
+ import { ReferenceType } from "../ops.js";
8
+ import { TextSegment } from "../textSegment.js";
9
+ /**
10
+ * Creates a collection over a segment of length `text.length` with `refsPerOffset`
11
+ * references at every offset. Each reference is labeled via its `id` property so
12
+ * walk order can be asserted.
13
+ */
14
+ function setup(text, refsPerOffset) {
15
+ const segment = TextSegment.make(text);
16
+ const collection = LocalReferenceCollection.setOrGet(segment);
17
+ const refs = [];
18
+ for (let offset = 0; offset < text.length; offset++) {
19
+ for (let i = 0; i < refsPerOffset; i++) {
20
+ refs.push(collection.createLocalRef(offset, ReferenceType.Simple, { id: `${offset}-${i}` }));
21
+ }
22
+ }
23
+ return { collection, refs };
24
+ }
25
+ function walk(collection, start, forward = true) {
26
+ const visited = [];
27
+ collection.walkReferences((lref) => {
28
+ visited.push(lref.properties?.id);
29
+ }, start, forward);
30
+ return visited;
31
+ }
32
+ /**
33
+ * Slides references into the `before` bucket at offset 0, or the `after` bucket at the last
34
+ * offset, of `collection`. Tombstoned references arrive from a segment that was removed, so
35
+ * they are created on a donor segment and re-linked by the collection.
36
+ */
37
+ function addTombstones(collection, position, ids) {
38
+ const donor = TextSegment.make("x");
39
+ const donorCollection = LocalReferenceCollection.setOrGet(donor);
40
+ const refs = ids.map((id) => donorCollection.createLocalRef(0, ReferenceType.SlideOnRemove, { id }));
41
+ if (position === "before") {
42
+ collection.addBeforeTombstones(refs);
43
+ }
44
+ else {
45
+ collection.addAfterTombstones(refs);
46
+ }
47
+ return refs;
48
+ }
49
+ describe("LocalReferenceCollection", () => {
50
+ describe("walkReferences", () => {
51
+ it("walks all references when no start is provided", () => {
52
+ const { collection } = setup("abc", 2);
53
+ assert.deepEqual(walk(collection), ["0-0", "0-1", "1-0", "1-1", "2-0", "2-1"]);
54
+ });
55
+ it("walks all references backward when no start is provided", () => {
56
+ const { collection } = setup("abc", 2);
57
+ assert.deepEqual(walk(collection, undefined, false), [
58
+ "2-1",
59
+ "2-0",
60
+ "1-1",
61
+ "1-0",
62
+ "0-1",
63
+ "0-0",
64
+ ]);
65
+ });
66
+ it("includes the start reference when walking forward", () => {
67
+ const { collection, refs } = setup("abc", 2);
68
+ // refs[2] is the first reference at offset 1
69
+ assert.deepEqual(walk(collection, refs[2]), ["1-0", "1-1", "2-0", "2-1"]);
70
+ });
71
+ it("includes the start reference when walking backward", () => {
72
+ const { collection, refs } = setup("abc", 2);
73
+ assert.deepEqual(walk(collection, refs[2], false), ["1-0", "0-1", "0-0"]);
74
+ });
75
+ it("resumes mid-list when start is not the first reference at its offset", () => {
76
+ const { collection, refs } = setup("abc", 3);
77
+ // refs[4] is the second reference at offset 1
78
+ assert.deepEqual(walk(collection, refs[4]), ["1-1", "1-2", "2-0", "2-1", "2-2"]);
79
+ assert.deepEqual(walk(collection, refs[4], false), ["1-1", "1-0", "0-2", "0-1", "0-0"]);
80
+ });
81
+ it("includes the start reference at the first offset", () => {
82
+ const { collection, refs } = setup("abc", 1);
83
+ assert.deepEqual(walk(collection, refs[0]), ["0-0", "1-0", "2-0"]);
84
+ assert.deepEqual(walk(collection, refs[0], false), ["0-0"]);
85
+ });
86
+ it("includes the start reference at the last offset", () => {
87
+ const { collection, refs } = setup("abc", 1);
88
+ assert.deepEqual(walk(collection, refs[2]), ["2-0"]);
89
+ assert.deepEqual(walk(collection, refs[2], false), ["2-0", "1-0", "0-0"]);
90
+ });
91
+ it("stops early when the visitor returns false", () => {
92
+ const { collection, refs } = setup("abc", 2);
93
+ const visited = [];
94
+ const completed = collection.walkReferences((lref) => {
95
+ visited.push(lref.properties?.id);
96
+ return lref.properties?.id !== "1-1";
97
+ }, refs[2]);
98
+ assert.equal(completed, false);
99
+ assert.deepEqual(visited, ["1-0", "1-1"]);
100
+ });
101
+ describe("when an offset holds multiple buckets", () => {
102
+ /**
103
+ * Builds a collection over "abc" with an `at` reference at every offset, a `before`
104
+ * bucket coexisting with `at` at offset 0, and an `after` bucket coexisting with `at`
105
+ * at offset 2.
106
+ */
107
+ function setupMultiBucket() {
108
+ const { collection, refs: at } = setup("abc", 1);
109
+ const before = addTombstones(collection, "before", ["b-0", "b-1"]);
110
+ const after = addTombstones(collection, "after", ["a-0", "a-1"]);
111
+ return { collection, at, before, after };
112
+ }
113
+ it("walks buckets in before/at/after order", () => {
114
+ const { collection } = setupMultiBucket();
115
+ assert.deepEqual(walk(collection), ["b-0", "b-1", "0-0", "1-0", "2-0", "a-0", "a-1"]);
116
+ assert.deepEqual(walk(collection, undefined, false), [
117
+ "a-1",
118
+ "a-0",
119
+ "2-0",
120
+ "1-0",
121
+ "0-0",
122
+ "b-1",
123
+ "b-0",
124
+ ]);
125
+ });
126
+ it("skips sibling buckets preceding the bucket holding start", () => {
127
+ const { collection, at } = setupMultiBucket();
128
+ // Starting at the `at` bucket must discard the `before` bucket at the same offset,
129
+ // without discarding the `at` bucket itself.
130
+ assert.deepEqual(walk(collection, at[0]), ["0-0", "1-0", "2-0", "a-0", "a-1"]);
131
+ // Starting at the `at` bucket of the last offset must discard nothing it needs,
132
+ // and still reach the trailing `after` bucket.
133
+ assert.deepEqual(walk(collection, at[2]), ["2-0", "a-0", "a-1"]);
134
+ });
135
+ it("skips sibling buckets following the bucket holding start when walking backward", () => {
136
+ const { collection, at } = setupMultiBucket();
137
+ // Walking backward from the `at` bucket must discard the trailing `after` bucket
138
+ // at the same offset, then continue into the `before` bucket.
139
+ assert.deepEqual(walk(collection, at[2], false), ["2-0", "1-0", "0-0", "b-1", "b-0"]);
140
+ assert.deepEqual(walk(collection, at[0], false), ["0-0", "b-1", "b-0"]);
141
+ });
142
+ it("starts within the before bucket", () => {
143
+ const { collection, before } = setupMultiBucket();
144
+ assert.deepEqual(walk(collection, before[1]), [
145
+ "b-1",
146
+ "0-0",
147
+ "1-0",
148
+ "2-0",
149
+ "a-0",
150
+ "a-1",
151
+ ]);
152
+ assert.deepEqual(walk(collection, before[1], false), ["b-1", "b-0"]);
153
+ });
154
+ it("starts within the after bucket", () => {
155
+ const { collection, after } = setupMultiBucket();
156
+ assert.deepEqual(walk(collection, after[0]), ["a-0", "a-1"]);
157
+ assert.deepEqual(walk(collection, after[0], false), [
158
+ "a-0",
159
+ "2-0",
160
+ "1-0",
161
+ "0-0",
162
+ "b-1",
163
+ "b-0",
164
+ ]);
165
+ });
166
+ });
167
+ });
168
+ });
169
+ //# sourceMappingURL=localReference.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localReference.spec.js","sourceRoot":"","sources":["../../src/test/localReference.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 { LocalReferenceCollection, type LocalReferencePosition } from \"../localReference.js\";\nimport type { ISegmentInternal } from \"../mergeTreeNodes.js\";\nimport { ReferenceType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\ninterface TestSetup {\n\tcollection: LocalReferenceCollection;\n\t/**\n\t * All refs in collection order (offset ascending, and insertion order within an offset).\n\t */\n\trefs: LocalReferencePosition[];\n}\n\n/**\n * Creates a collection over a segment of length `text.length` with `refsPerOffset`\n * references at every offset. Each reference is labeled via its `id` property so\n * walk order can be asserted.\n */\nfunction setup(text: string, refsPerOffset: number): TestSetup {\n\tconst segment = TextSegment.make(text) as ISegmentInternal;\n\tconst collection = LocalReferenceCollection.setOrGet(segment);\n\tconst refs: LocalReferencePosition[] = [];\n\tfor (let offset = 0; offset < text.length; offset++) {\n\t\tfor (let i = 0; i < refsPerOffset; i++) {\n\t\t\trefs.push(\n\t\t\t\tcollection.createLocalRef(offset, ReferenceType.Simple, { id: `${offset}-${i}` }),\n\t\t\t);\n\t\t}\n\t}\n\treturn { collection, refs };\n}\n\nfunction walk(\n\tcollection: LocalReferenceCollection,\n\tstart?: LocalReferencePosition,\n\tforward: boolean = true,\n): string[] {\n\tconst visited: string[] = [];\n\tcollection.walkReferences(\n\t\t(lref) => {\n\t\t\tvisited.push(lref.properties?.id as string);\n\t\t},\n\t\tstart,\n\t\tforward,\n\t);\n\treturn visited;\n}\n\n/**\n * Slides references into the `before` bucket at offset 0, or the `after` bucket at the last\n * offset, of `collection`. Tombstoned references arrive from a segment that was removed, so\n * they are created on a donor segment and re-linked by the collection.\n */\nfunction addTombstones(\n\tcollection: LocalReferenceCollection,\n\tposition: \"before\" | \"after\",\n\tids: string[],\n): LocalReferencePosition[] {\n\tconst donor = TextSegment.make(\"x\") as ISegmentInternal;\n\tconst donorCollection = LocalReferenceCollection.setOrGet(donor);\n\tconst refs = ids.map((id) =>\n\t\tdonorCollection.createLocalRef(0, ReferenceType.SlideOnRemove, { id }),\n\t);\n\tif (position === \"before\") {\n\t\tcollection.addBeforeTombstones(refs);\n\t} else {\n\t\tcollection.addAfterTombstones(refs);\n\t}\n\treturn refs;\n}\n\ndescribe(\"LocalReferenceCollection\", () => {\n\tdescribe(\"walkReferences\", () => {\n\t\tit(\"walks all references when no start is provided\", () => {\n\t\t\tconst { collection } = setup(\"abc\", 2);\n\t\t\tassert.deepEqual(walk(collection), [\"0-0\", \"0-1\", \"1-0\", \"1-1\", \"2-0\", \"2-1\"]);\n\t\t});\n\n\t\tit(\"walks all references backward when no start is provided\", () => {\n\t\t\tconst { collection } = setup(\"abc\", 2);\n\t\t\tassert.deepEqual(walk(collection, undefined, false), [\n\t\t\t\t\"2-1\",\n\t\t\t\t\"2-0\",\n\t\t\t\t\"1-1\",\n\t\t\t\t\"1-0\",\n\t\t\t\t\"0-1\",\n\t\t\t\t\"0-0\",\n\t\t\t]);\n\t\t});\n\n\t\tit(\"includes the start reference when walking forward\", () => {\n\t\t\tconst { collection, refs } = setup(\"abc\", 2);\n\t\t\t// refs[2] is the first reference at offset 1\n\t\t\tassert.deepEqual(walk(collection, refs[2]), [\"1-0\", \"1-1\", \"2-0\", \"2-1\"]);\n\t\t});\n\n\t\tit(\"includes the start reference when walking backward\", () => {\n\t\t\tconst { collection, refs } = setup(\"abc\", 2);\n\t\t\tassert.deepEqual(walk(collection, refs[2], false), [\"1-0\", \"0-1\", \"0-0\"]);\n\t\t});\n\n\t\tit(\"resumes mid-list when start is not the first reference at its offset\", () => {\n\t\t\tconst { collection, refs } = setup(\"abc\", 3);\n\t\t\t// refs[4] is the second reference at offset 1\n\t\t\tassert.deepEqual(walk(collection, refs[4]), [\"1-1\", \"1-2\", \"2-0\", \"2-1\", \"2-2\"]);\n\t\t\tassert.deepEqual(walk(collection, refs[4], false), [\"1-1\", \"1-0\", \"0-2\", \"0-1\", \"0-0\"]);\n\t\t});\n\n\t\tit(\"includes the start reference at the first offset\", () => {\n\t\t\tconst { collection, refs } = setup(\"abc\", 1);\n\t\t\tassert.deepEqual(walk(collection, refs[0]), [\"0-0\", \"1-0\", \"2-0\"]);\n\t\t\tassert.deepEqual(walk(collection, refs[0], false), [\"0-0\"]);\n\t\t});\n\n\t\tit(\"includes the start reference at the last offset\", () => {\n\t\t\tconst { collection, refs } = setup(\"abc\", 1);\n\t\t\tassert.deepEqual(walk(collection, refs[2]), [\"2-0\"]);\n\t\t\tassert.deepEqual(walk(collection, refs[2], false), [\"2-0\", \"1-0\", \"0-0\"]);\n\t\t});\n\n\t\tit(\"stops early when the visitor returns false\", () => {\n\t\t\tconst { collection, refs } = setup(\"abc\", 2);\n\t\t\tconst visited: string[] = [];\n\t\t\tconst completed = collection.walkReferences((lref) => {\n\t\t\t\tvisited.push(lref.properties?.id as string);\n\t\t\t\treturn lref.properties?.id !== \"1-1\";\n\t\t\t}, refs[2]);\n\t\t\tassert.equal(completed, false);\n\t\t\tassert.deepEqual(visited, [\"1-0\", \"1-1\"]);\n\t\t});\n\n\t\tdescribe(\"when an offset holds multiple buckets\", () => {\n\t\t\t/**\n\t\t\t * Builds a collection over \"abc\" with an `at` reference at every offset, a `before`\n\t\t\t * bucket coexisting with `at` at offset 0, and an `after` bucket coexisting with `at`\n\t\t\t * at offset 2.\n\t\t\t */\n\t\t\tfunction setupMultiBucket(): {\n\t\t\t\tcollection: LocalReferenceCollection;\n\t\t\t\tat: LocalReferencePosition[];\n\t\t\t\tbefore: LocalReferencePosition[];\n\t\t\t\tafter: LocalReferencePosition[];\n\t\t\t} {\n\t\t\t\tconst { collection, refs: at } = setup(\"abc\", 1);\n\t\t\t\tconst before = addTombstones(collection, \"before\", [\"b-0\", \"b-1\"]);\n\t\t\t\tconst after = addTombstones(collection, \"after\", [\"a-0\", \"a-1\"]);\n\t\t\t\treturn { collection, at, before, after };\n\t\t\t}\n\n\t\t\tit(\"walks buckets in before/at/after order\", () => {\n\t\t\t\tconst { collection } = setupMultiBucket();\n\t\t\t\tassert.deepEqual(walk(collection), [\"b-0\", \"b-1\", \"0-0\", \"1-0\", \"2-0\", \"a-0\", \"a-1\"]);\n\t\t\t\tassert.deepEqual(walk(collection, undefined, false), [\n\t\t\t\t\t\"a-1\",\n\t\t\t\t\t\"a-0\",\n\t\t\t\t\t\"2-0\",\n\t\t\t\t\t\"1-0\",\n\t\t\t\t\t\"0-0\",\n\t\t\t\t\t\"b-1\",\n\t\t\t\t\t\"b-0\",\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tit(\"skips sibling buckets preceding the bucket holding start\", () => {\n\t\t\t\tconst { collection, at } = setupMultiBucket();\n\t\t\t\t// Starting at the `at` bucket must discard the `before` bucket at the same offset,\n\t\t\t\t// without discarding the `at` bucket itself.\n\t\t\t\tassert.deepEqual(walk(collection, at[0]), [\"0-0\", \"1-0\", \"2-0\", \"a-0\", \"a-1\"]);\n\t\t\t\t// Starting at the `at` bucket of the last offset must discard nothing it needs,\n\t\t\t\t// and still reach the trailing `after` bucket.\n\t\t\t\tassert.deepEqual(walk(collection, at[2]), [\"2-0\", \"a-0\", \"a-1\"]);\n\t\t\t});\n\n\t\t\tit(\"skips sibling buckets following the bucket holding start when walking backward\", () => {\n\t\t\t\tconst { collection, at } = setupMultiBucket();\n\t\t\t\t// Walking backward from the `at` bucket must discard the trailing `after` bucket\n\t\t\t\t// at the same offset, then continue into the `before` bucket.\n\t\t\t\tassert.deepEqual(walk(collection, at[2], false), [\"2-0\", \"1-0\", \"0-0\", \"b-1\", \"b-0\"]);\n\t\t\t\tassert.deepEqual(walk(collection, at[0], false), [\"0-0\", \"b-1\", \"b-0\"]);\n\t\t\t});\n\n\t\t\tit(\"starts within the before bucket\", () => {\n\t\t\t\tconst { collection, before } = setupMultiBucket();\n\t\t\t\tassert.deepEqual(walk(collection, before[1]), [\n\t\t\t\t\t\"b-1\",\n\t\t\t\t\t\"0-0\",\n\t\t\t\t\t\"1-0\",\n\t\t\t\t\t\"2-0\",\n\t\t\t\t\t\"a-0\",\n\t\t\t\t\t\"a-1\",\n\t\t\t\t]);\n\t\t\t\tassert.deepEqual(walk(collection, before[1], false), [\"b-1\", \"b-0\"]);\n\t\t\t});\n\n\t\t\tit(\"starts within the after bucket\", () => {\n\t\t\t\tconst { collection, after } = setupMultiBucket();\n\t\t\t\tassert.deepEqual(walk(collection, after[0]), [\"a-0\", \"a-1\"]);\n\t\t\t\tassert.deepEqual(walk(collection, after[0], false), [\n\t\t\t\t\t\"a-0\",\n\t\t\t\t\t\"2-0\",\n\t\t\t\t\t\"1-0\",\n\t\t\t\t\t\"0-0\",\n\t\t\t\t\t\"b-1\",\n\t\t\t\t\t\"b-0\",\n\t\t\t\t]);\n\t\t\t});\n\t\t});\n\t});\n});\n"]}