Skip to content

Commit d5a73d3

Browse files
authored
Add unit tests for annotating a single multi-character segment (#25901)
Ensure that single segments with more than one character do not get split when the full range is annotated. [AB#51785](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/51785)
1 parent 441f4f3 commit d5a73d3

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed

packages/dds/merge-tree/src/test/client.walkSegments.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
import { strict as assert } from "node:assert";
77

8+
import type { ISegmentInternal } from "../mergeTreeNodes.js";
9+
810
import { TestClient } from "./testClient.js";
911

1012
describe("client.applyMsg", () => {
@@ -65,4 +67,30 @@ describe("client.applyMsg", () => {
6567
assert.equal(segCount, 2);
6668
assert.equal(segLen, 4);
6769
});
70+
71+
it("Walk single multi-character segment", () => {
72+
client.removeRangeLocal(0, client.getLength());
73+
client.insertTextLocal(0, "Blocker");
74+
client.annotateRangeLocal(0, 7, { bold: true });
75+
let segCount = 0;
76+
const segLengths: number[] = [];
77+
client.walkSegments(
78+
(s: ISegmentInternal) => {
79+
segCount++;
80+
segLengths.push(s.cachedLength);
81+
return true;
82+
},
83+
0,
84+
client.getLength(),
85+
undefined,
86+
true,
87+
);
88+
assert.equal(segCount, 1, `Expected one segment, saw ${segCount} segments`);
89+
assert.equal(
90+
segLengths.length,
91+
1,
92+
`Expected one segment length, saw ${segLengths.length} lengths`,
93+
);
94+
assert.equal(segLengths[0], 7, `Expected segment length 7, saw ${segLengths[0]}`);
95+
});
6896
});

packages/dds/sequence/src/test/sharedString.spec.ts

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
reservedMarkerSimpleTypeKey,
2020
reservedTileLabelsKey,
2121
revertMergeTreeDeltaRevertibles,
22+
type ISegmentInternal,
2223
} from "@fluidframework/merge-tree/internal";
2324
import {
2425
MockContainerRuntimeFactory,
@@ -187,6 +188,35 @@ describe("SharedString", () => {
187188
}
188189
});
189190

191+
it("can annotate single multi-character segment in a local SharedString", () => {
192+
sharedString.insertText(0, "Blocker");
193+
sharedString.annotateRange(0, 7, { bold: true });
194+
let segmentCount = 0;
195+
const segmentLengths: number[] = [];
196+
sharedString.walkSegments(
197+
(segment: ISegmentInternal) => {
198+
segmentCount++;
199+
segmentLengths.push(segment.cachedLength);
200+
return true;
201+
},
202+
0,
203+
sharedString.getLength(),
204+
undefined,
205+
true,
206+
);
207+
assert.equal(segmentCount, 1, `Expected one segment, saw ${segmentCount} segments`);
208+
assert.equal(
209+
segmentLengths.length,
210+
1,
211+
`Expected one segment length, saw ${segmentLengths.length} lengths`,
212+
);
213+
assert.equal(
214+
segmentLengths[0],
215+
7,
216+
`Expected segment length 7, saw ${segmentLengths[0]}`,
217+
);
218+
});
219+
190220
it("can insert marker", () => {
191221
sharedString.insertText(0, "hello world");
192222
// Insert a simple marker.
@@ -575,6 +605,62 @@ describe("SharedString", () => {
575605
}
576606
});
577607

608+
it("can annotate single multi-character segment with a remote SharedString", () => {
609+
sharedString.insertText(0, "Blocker");
610+
sharedString.annotateRange(0, 7, { bold: true });
611+
containerRuntimeFactory.processAllMessages();
612+
613+
let segmentCount = 0;
614+
const segmentLengths: number[] = [];
615+
sharedString.walkSegments(
616+
(segment: ISegmentInternal) => {
617+
segmentCount++;
618+
segmentLengths.push(segment.cachedLength);
619+
return true;
620+
},
621+
0,
622+
sharedString.getLength(),
623+
undefined,
624+
true,
625+
);
626+
assert.equal(segmentCount, 1, `Expected one segment, saw ${segmentCount} segments`);
627+
assert.equal(
628+
segmentLengths.length,
629+
1,
630+
`Expected one segment length, saw ${segmentLengths.length} lengths`,
631+
);
632+
assert.equal(
633+
segmentLengths[0],
634+
7,
635+
`Expected segment length 7, saw ${segmentLengths[0]}`,
636+
);
637+
638+
segmentCount = 0;
639+
const segmentLengths2: number[] = [];
640+
sharedString2.walkSegments(
641+
(segment: ISegmentInternal) => {
642+
segmentCount++;
643+
segmentLengths2.push(segment.cachedLength);
644+
return true;
645+
},
646+
0,
647+
sharedString.getLength(),
648+
undefined,
649+
true,
650+
);
651+
assert.equal(segmentCount, 1, `Expected one segment, saw ${segmentCount} segments`);
652+
assert.equal(
653+
segmentLengths2.length,
654+
1,
655+
`Expected one segment length, saw ${segmentLengths2.length} lengths`,
656+
);
657+
assert.equal(
658+
segmentLengths2[0],
659+
7,
660+
`Expected segment length 7, saw ${segmentLengths2[0]}`,
661+
);
662+
});
663+
578664
it("can insert marker", () => {
579665
const label = "tileLabel";
580666
const id = "tileMarkerId";

0 commit comments

Comments
 (0)