-
Notifications
You must be signed in to change notification settings - Fork 2k
Expand file tree
/
Copy pathzoom-segments.test.ts
More file actions
75 lines (60 loc) · 2.4 KB
/
Copy pathzoom-segments.test.ts
File metadata and controls
75 lines (60 loc) · 2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import { describe, expect, it } from "vitest";
import { splitZoomSegmentAt } from "./zoom-segments";
type Segment = {
start: number;
end: number;
amount: number;
};
function segment(start: number, end: number, amount = 1.5): Segment {
return { start, end, amount };
}
describe("splitZoomSegmentAt", () => {
it("splits into left [start, start+time] and right [start+time, end]", () => {
const segments = [segment(10, 30)];
const result = splitZoomSegmentAt(segments, 0, 8);
expect(result).not.toBeNull();
expect(segments[0]).toMatchObject({ start: 10, end: 18 });
expect(segments[1]).toMatchObject({ start: 18, end: 30 });
expect(result?.newSegmentIndex).toBe(1);
});
it("tracks the new piece by identity when the sort moves it past later segments", () => {
const segments = [segment(10, 20), segment(30, 40)];
const result = splitZoomSegmentAt(segments, 0, 5);
expect(segments.map((s) => s.start)).toEqual([10, 15, 30]);
expect(segments.map((s) => s.end)).toEqual([15, 20, 40]);
expect(result?.newSegmentIndex).toBe(1);
expect(segments[result?.newSegmentIndex ?? -1]).toMatchObject({
start: 15,
end: 20,
});
});
it("preserves the segment's other properties on both halves", () => {
const segments = [segment(0, 10, 2.5)];
splitZoomSegmentAt(segments, 0, 4);
expect(segments[0].amount).toBe(2.5);
expect(segments[1].amount).toBe(2.5);
});
it("keeps the new (right) piece selectable after a re-sort around existing segments", () => {
const segments = [segment(0, 10), segment(20, 30), segment(40, 50)];
const result = splitZoomSegmentAt(segments, 1, 5);
expect(segments.map((s) => s.start)).toEqual([0, 20, 25, 40]);
expect(segments.map((s) => s.end)).toEqual([10, 25, 30, 50]);
expect(result?.newSegmentIndex).toBe(2);
expect(segments[result?.newSegmentIndex ?? -1]).toMatchObject({
start: 25,
end: 30,
});
});
it("rejects splits that would leave a piece shorter than one second", () => {
const segments = [segment(10, 30)];
expect(splitZoomSegmentAt(segments, 0, 0.5)).toBeNull();
expect(splitZoomSegmentAt(segments, 0, 20.5)).toBeNull();
expect(segments).toHaveLength(1);
expect(segments[0]).toMatchObject({ start: 10, end: 30 });
});
it("returns null for an out-of-bounds index without mutating the array", () => {
const segments = [segment(0, 10)];
expect(splitZoomSegmentAt(segments, 3, 5)).toBeNull();
expect(segments).toHaveLength(1);
});
});