@editframe/elements 0.26.3-beta.0 → 0.26.4-beta.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.
- package/package.json +2 -2
- package/scripts/build-css.js +3 -3
- package/tsdown.config.ts +1 -1
- package/src/elements/ContextProxiesController.ts +0 -124
- package/src/elements/CrossUpdateController.ts +0 -22
- package/src/elements/EFAudio.browsertest.ts +0 -706
- package/src/elements/EFAudio.ts +0 -56
- package/src/elements/EFCaptions.browsertest.ts +0 -1960
- package/src/elements/EFCaptions.ts +0 -823
- package/src/elements/EFImage.browsertest.ts +0 -120
- package/src/elements/EFImage.ts +0 -113
- package/src/elements/EFMedia/AssetIdMediaEngine.test.ts +0 -224
- package/src/elements/EFMedia/AssetIdMediaEngine.ts +0 -110
- package/src/elements/EFMedia/AssetMediaEngine.browsertest.ts +0 -140
- package/src/elements/EFMedia/AssetMediaEngine.ts +0 -385
- package/src/elements/EFMedia/BaseMediaEngine.browsertest.ts +0 -400
- package/src/elements/EFMedia/BaseMediaEngine.ts +0 -505
- package/src/elements/EFMedia/BufferedSeekingInput.browsertest.ts +0 -386
- package/src/elements/EFMedia/BufferedSeekingInput.ts +0 -430
- package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +0 -226
- package/src/elements/EFMedia/JitMediaEngine.ts +0 -256
- package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.ts +0 -679
- package/src/elements/EFMedia/audioTasks/makeAudioBufferTask.ts +0 -117
- package/src/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.ts +0 -246
- package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.ts +0 -59
- package/src/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.ts +0 -27
- package/src/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.ts +0 -55
- package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +0 -53
- package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.ts +0 -207
- package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.ts +0 -72
- package/src/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.ts +0 -32
- package/src/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.ts +0 -29
- package/src/elements/EFMedia/audioTasks/makeAudioTasksVideoOnly.browsertest.ts +0 -95
- package/src/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.ts +0 -184
- package/src/elements/EFMedia/shared/AudioSpanUtils.ts +0 -129
- package/src/elements/EFMedia/shared/BufferUtils.ts +0 -342
- package/src/elements/EFMedia/shared/GlobalInputCache.ts +0 -77
- package/src/elements/EFMedia/shared/MediaTaskUtils.ts +0 -44
- package/src/elements/EFMedia/shared/PrecisionUtils.ts +0 -46
- package/src/elements/EFMedia/shared/RenditionHelpers.browsertest.ts +0 -246
- package/src/elements/EFMedia/shared/RenditionHelpers.ts +0 -56
- package/src/elements/EFMedia/shared/ThumbnailExtractor.ts +0 -227
- package/src/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.ts +0 -167
- package/src/elements/EFMedia/tasks/makeMediaEngineTask.ts +0 -88
- package/src/elements/EFMedia/videoTasks/MainVideoInputCache.ts +0 -76
- package/src/elements/EFMedia/videoTasks/ScrubInputCache.ts +0 -61
- package/src/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.ts +0 -114
- package/src/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.ts +0 -35
- package/src/elements/EFMedia/videoTasks/makeScrubVideoInputTask.ts +0 -52
- package/src/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.ts +0 -124
- package/src/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.ts +0 -44
- package/src/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.ts +0 -32
- package/src/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.ts +0 -370
- package/src/elements/EFMedia/videoTasks/makeVideoBufferTask.ts +0 -109
- package/src/elements/EFMedia.browsertest.ts +0 -872
- package/src/elements/EFMedia.ts +0 -341
- package/src/elements/EFSourceMixin.ts +0 -60
- package/src/elements/EFSurface.browsertest.ts +0 -151
- package/src/elements/EFSurface.ts +0 -142
- package/src/elements/EFTemporal.browsertest.ts +0 -215
- package/src/elements/EFTemporal.ts +0 -800
- package/src/elements/EFThumbnailStrip.browsertest.ts +0 -585
- package/src/elements/EFThumbnailStrip.media-engine.browsertest.ts +0 -714
- package/src/elements/EFThumbnailStrip.ts +0 -906
- package/src/elements/EFTimegroup.browsertest.ts +0 -934
- package/src/elements/EFTimegroup.ts +0 -882
- package/src/elements/EFVideo.browsertest.ts +0 -1482
- package/src/elements/EFVideo.ts +0 -564
- package/src/elements/EFWaveform.ts +0 -547
- package/src/elements/FetchContext.browsertest.ts +0 -401
- package/src/elements/FetchMixin.ts +0 -38
- package/src/elements/SampleBuffer.ts +0 -94
- package/src/elements/TargetController.browsertest.ts +0 -230
- package/src/elements/TargetController.ts +0 -224
- package/src/elements/TimegroupController.ts +0 -26
- package/src/elements/durationConverter.ts +0 -35
- package/src/elements/parseTimeToMs.ts +0 -9
- package/src/elements/printTaskStatus.ts +0 -16
- package/src/elements/renderTemporalAudio.ts +0 -108
- package/src/elements/updateAnimations.browsertest.ts +0 -1884
- package/src/elements/updateAnimations.ts +0 -217
- package/src/elements/util.ts +0 -24
- package/src/gui/ContextMixin.browsertest.ts +0 -860
- package/src/gui/ContextMixin.ts +0 -562
- package/src/gui/Controllable.browsertest.ts +0 -258
- package/src/gui/Controllable.ts +0 -41
- package/src/gui/EFConfiguration.ts +0 -40
- package/src/gui/EFControls.browsertest.ts +0 -389
- package/src/gui/EFControls.ts +0 -195
- package/src/gui/EFDial.browsertest.ts +0 -84
- package/src/gui/EFDial.ts +0 -172
- package/src/gui/EFFilmstrip.browsertest.ts +0 -712
- package/src/gui/EFFilmstrip.ts +0 -1349
- package/src/gui/EFFitScale.ts +0 -152
- package/src/gui/EFFocusOverlay.ts +0 -79
- package/src/gui/EFPause.browsertest.ts +0 -202
- package/src/gui/EFPause.ts +0 -73
- package/src/gui/EFPlay.browsertest.ts +0 -202
- package/src/gui/EFPlay.ts +0 -73
- package/src/gui/EFPreview.ts +0 -74
- package/src/gui/EFResizableBox.browsertest.ts +0 -79
- package/src/gui/EFResizableBox.ts +0 -898
- package/src/gui/EFScrubber.ts +0 -151
- package/src/gui/EFTimeDisplay.browsertest.ts +0 -237
- package/src/gui/EFTimeDisplay.ts +0 -55
- package/src/gui/EFToggleLoop.ts +0 -35
- package/src/gui/EFTogglePlay.ts +0 -70
- package/src/gui/EFWorkbench.ts +0 -115
- package/src/gui/PlaybackController.ts +0 -527
- package/src/gui/TWMixin.css +0 -6
- package/src/gui/TWMixin.ts +0 -61
- package/src/gui/TargetOrContextMixin.ts +0 -185
- package/src/gui/currentTimeContext.ts +0 -5
- package/src/gui/durationContext.ts +0 -3
- package/src/gui/efContext.ts +0 -6
- package/src/gui/fetchContext.ts +0 -5
- package/src/gui/focusContext.ts +0 -7
- package/src/gui/focusedElementContext.ts +0 -5
- package/src/gui/playingContext.ts +0 -5
- package/src/otel/BridgeSpanExporter.ts +0 -150
- package/src/otel/setupBrowserTracing.ts +0 -73
- package/src/otel/tracingHelpers.ts +0 -251
- package/src/transcoding/cache/RequestDeduplicator.test.ts +0 -170
- package/src/transcoding/cache/RequestDeduplicator.ts +0 -65
- package/src/transcoding/cache/URLTokenDeduplicator.test.ts +0 -182
- package/src/transcoding/cache/URLTokenDeduplicator.ts +0 -101
- package/src/transcoding/types/index.ts +0 -312
- package/src/transcoding/utils/MediaUtils.ts +0 -63
- package/src/transcoding/utils/UrlGenerator.ts +0 -68
- package/src/transcoding/utils/constants.ts +0 -36
- package/src/utils/LRUCache.test.ts +0 -274
- package/src/utils/LRUCache.ts +0 -696
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "vitest";
|
|
2
|
-
import { LRUCache, OrderedLRUCache } from "./LRUCache";
|
|
3
|
-
|
|
4
|
-
describe("LRUCache", () => {
|
|
5
|
-
test("basic LRU functionality", () => {
|
|
6
|
-
const cache = new LRUCache<string, number>(3);
|
|
7
|
-
|
|
8
|
-
cache.set("a", 1);
|
|
9
|
-
cache.set("b", 2);
|
|
10
|
-
cache.set("c", 3);
|
|
11
|
-
|
|
12
|
-
expect(cache.get("a")).toBe(1);
|
|
13
|
-
expect(cache.get("b")).toBe(2);
|
|
14
|
-
expect(cache.get("c")).toBe(3);
|
|
15
|
-
expect(cache.size).toBe(3);
|
|
16
|
-
|
|
17
|
-
// Should evict oldest when adding fourth item
|
|
18
|
-
cache.set("d", 4);
|
|
19
|
-
expect(cache.size).toBe(3);
|
|
20
|
-
expect(cache.has("a")).toBe(false); // 'a' was least recently used
|
|
21
|
-
expect(cache.get("d")).toBe(4);
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
describe("OrderedLRUCache", () => {
|
|
26
|
-
test("basic LRU functionality with ordered keys", () => {
|
|
27
|
-
const cache = new OrderedLRUCache<number, string>(3);
|
|
28
|
-
|
|
29
|
-
cache.set(10, "ten");
|
|
30
|
-
cache.set(5, "five");
|
|
31
|
-
cache.set(15, "fifteen");
|
|
32
|
-
|
|
33
|
-
expect(cache.get(10)).toBe("ten");
|
|
34
|
-
expect(cache.get(5)).toBe("five");
|
|
35
|
-
expect(cache.get(15)).toBe("fifteen");
|
|
36
|
-
expect(cache.size).toBe(3);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test("maintains sorted key order", () => {
|
|
40
|
-
const cache = new OrderedLRUCache<number, string>(5);
|
|
41
|
-
|
|
42
|
-
cache.set(30, "thirty");
|
|
43
|
-
cache.set(10, "ten");
|
|
44
|
-
cache.set(20, "twenty");
|
|
45
|
-
cache.set(40, "forty");
|
|
46
|
-
cache.set(15, "fifteen");
|
|
47
|
-
|
|
48
|
-
const sortedKeys = cache.getSortedKeys();
|
|
49
|
-
expect(sortedKeys).toEqual([10, 15, 20, 30, 40]);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
test("binary search exact match", () => {
|
|
53
|
-
const cache = new OrderedLRUCache<number, string>(5);
|
|
54
|
-
|
|
55
|
-
cache.set(10, "ten");
|
|
56
|
-
cache.set(20, "twenty");
|
|
57
|
-
cache.set(30, "thirty");
|
|
58
|
-
|
|
59
|
-
expect(cache.findExact(20)).toBe("twenty");
|
|
60
|
-
expect(cache.findExact(25)).toBe(undefined);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test("find nearest in range", () => {
|
|
64
|
-
const cache = new OrderedLRUCache<number, string>(5);
|
|
65
|
-
|
|
66
|
-
cache.set(10, "ten");
|
|
67
|
-
cache.set(20, "twenty");
|
|
68
|
-
cache.set(30, "thirty");
|
|
69
|
-
cache.set(40, "forty");
|
|
70
|
-
|
|
71
|
-
// Test various range scenarios
|
|
72
|
-
const range12_5 = cache.findNearestInRange(12, 5);
|
|
73
|
-
expect(range12_5.map((item) => item.key)).toEqual([10]); // 12±5 = [7,17] contains only 10
|
|
74
|
-
|
|
75
|
-
const range25_8 = cache.findNearestInRange(25, 8);
|
|
76
|
-
expect(range25_8.map((item) => item.key)).toEqual([20, 30]); // 25±8 = [17,33] contains 20,30
|
|
77
|
-
|
|
78
|
-
const range35_3 = cache.findNearestInRange(35, 3);
|
|
79
|
-
expect(range35_3.map((item) => item.key)).toEqual([]); // 35±3 = [32,38] contains nothing
|
|
80
|
-
|
|
81
|
-
const range50_15 = cache.findNearestInRange(50, 15);
|
|
82
|
-
expect(range50_15.map((item) => item.key)).toEqual([40]); // 50±15 = [35,65] contains only 40
|
|
83
|
-
|
|
84
|
-
const range25_15 = cache.findNearestInRange(25, 15);
|
|
85
|
-
expect(range25_15.map((item) => item.key)).toEqual([10, 20, 30, 40]); // 25±15 = [10,40] contains all
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
test("range search", () => {
|
|
89
|
-
const cache = new OrderedLRUCache<number, string>(10);
|
|
90
|
-
|
|
91
|
-
cache.set(10, "ten");
|
|
92
|
-
cache.set(15, "fifteen");
|
|
93
|
-
cache.set(20, "twenty");
|
|
94
|
-
cache.set(25, "twenty-five");
|
|
95
|
-
cache.set(30, "thirty");
|
|
96
|
-
cache.set(35, "thirty-five");
|
|
97
|
-
|
|
98
|
-
const range1 = cache.findRange(15, 30);
|
|
99
|
-
expect(range1.map((item) => item.key)).toEqual([15, 20, 25, 30]);
|
|
100
|
-
|
|
101
|
-
const range2 = cache.findRange(12, 23);
|
|
102
|
-
expect(range2.map((item) => item.key)).toEqual([15, 20]);
|
|
103
|
-
|
|
104
|
-
const range3 = cache.findRange(40, 50);
|
|
105
|
-
expect(range3).toEqual([]); // No keys in range
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
test("LRU eviction maintains sorted order", () => {
|
|
109
|
-
const cache = new OrderedLRUCache<number, string>(3);
|
|
110
|
-
|
|
111
|
-
cache.set(30, "thirty");
|
|
112
|
-
cache.set(10, "ten");
|
|
113
|
-
cache.set(20, "twenty");
|
|
114
|
-
|
|
115
|
-
// Access 10 to make it most recent
|
|
116
|
-
cache.get(10);
|
|
117
|
-
|
|
118
|
-
// Add new item, should evict 30 (least recently used)
|
|
119
|
-
cache.set(40, "forty");
|
|
120
|
-
|
|
121
|
-
expect(cache.has(30)).toBe(false);
|
|
122
|
-
expect(cache.getSortedKeys()).toEqual([10, 20, 40]);
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
test("works with string keys and custom comparator", () => {
|
|
126
|
-
const cache = new OrderedLRUCache<string, number>(5, (a, b) =>
|
|
127
|
-
a.localeCompare(b),
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
cache.set("banana", 2);
|
|
131
|
-
cache.set("apple", 1);
|
|
132
|
-
cache.set("cherry", 3);
|
|
133
|
-
cache.set("date", 4);
|
|
134
|
-
|
|
135
|
-
expect(cache.getSortedKeys()).toEqual([
|
|
136
|
-
"apple",
|
|
137
|
-
"banana",
|
|
138
|
-
"cherry",
|
|
139
|
-
"date",
|
|
140
|
-
]);
|
|
141
|
-
|
|
142
|
-
// For strings, findNearestInRange only works for exact matches since we can't calculate string distance
|
|
143
|
-
const nearestExact = cache.findNearestInRange("cherry", "cherry");
|
|
144
|
-
expect(nearestExact.map((item) => item.key)).toEqual(["cherry"]);
|
|
145
|
-
|
|
146
|
-
// But range searches work normally
|
|
147
|
-
const range = cache.findRange("banana", "date");
|
|
148
|
-
expect(range.map((item) => item.key)).toEqual(["banana", "cherry", "date"]);
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
test("handles empty cache gracefully", () => {
|
|
152
|
-
const cache = new OrderedLRUCache<number, string>(5);
|
|
153
|
-
|
|
154
|
-
expect(cache.findExact(10)).toBe(undefined);
|
|
155
|
-
expect(cache.findNearestInRange(10, 5)).toEqual([]);
|
|
156
|
-
expect(cache.findRange(1, 10)).toEqual([]);
|
|
157
|
-
expect(cache.getSortedKeys()).toEqual([]);
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
test("handles single item cache", () => {
|
|
161
|
-
const cache = new OrderedLRUCache<number, string>(5);
|
|
162
|
-
cache.set(10, "ten");
|
|
163
|
-
|
|
164
|
-
expect(cache.findNearestInRange(5, 10)).toEqual([
|
|
165
|
-
{ key: 10, value: "ten" },
|
|
166
|
-
]); // 5±10 = [-5,15] contains 10
|
|
167
|
-
expect(cache.findNearestInRange(15, 10)).toEqual([
|
|
168
|
-
{ key: 10, value: "ten" },
|
|
169
|
-
]); // 15±10 = [5,25] contains 10
|
|
170
|
-
expect(cache.findRange(1, 20)).toEqual([{ key: 10, value: "ten" }]);
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
test("updates existing keys without duplicating in sorted index", () => {
|
|
174
|
-
const cache = new OrderedLRUCache<number, string>(5);
|
|
175
|
-
|
|
176
|
-
cache.set(10, "ten");
|
|
177
|
-
cache.set(20, "twenty");
|
|
178
|
-
cache.set(10, "TEN"); // Update existing key
|
|
179
|
-
|
|
180
|
-
expect(cache.getSortedKeys()).toEqual([10, 20]); // No duplicates
|
|
181
|
-
expect(cache.get(10)).toBe("TEN");
|
|
182
|
-
expect(cache.size).toBe(2);
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
// Example use case: video segment caching by timestamp
|
|
186
|
-
test("video segment caching use case", () => {
|
|
187
|
-
interface VideoSegment {
|
|
188
|
-
url: string;
|
|
189
|
-
duration: number;
|
|
190
|
-
bitrate: number;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const segmentCache = new OrderedLRUCache<number, VideoSegment>(10);
|
|
194
|
-
|
|
195
|
-
// Add segments with timestamps as keys
|
|
196
|
-
segmentCache.set(0, { url: "/seg0.mp4", duration: 5000, bitrate: 1000 });
|
|
197
|
-
segmentCache.set(5000, { url: "/seg1.mp4", duration: 5000, bitrate: 1000 });
|
|
198
|
-
segmentCache.set(10000, {
|
|
199
|
-
url: "/seg2.mp4",
|
|
200
|
-
duration: 5000,
|
|
201
|
-
bitrate: 1000,
|
|
202
|
-
});
|
|
203
|
-
segmentCache.set(15000, {
|
|
204
|
-
url: "/seg3.mp4",
|
|
205
|
-
duration: 5000,
|
|
206
|
-
bitrate: 1000,
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
// Find segment at specific time
|
|
210
|
-
const segment = segmentCache.findExact(10000);
|
|
211
|
-
expect(segment?.url).toBe("/seg2.mp4");
|
|
212
|
-
|
|
213
|
-
// Find segments near seeking position 7500ms (within 3 seconds)
|
|
214
|
-
const nearSeekPoint = segmentCache.findNearestInRange(7500, 3000);
|
|
215
|
-
expect(nearSeekPoint.map((s) => s.key)).toEqual([5000, 10000]); // 7500±3000 = [4500,10500] contains these
|
|
216
|
-
|
|
217
|
-
// Get all segments in time range 5s-15s
|
|
218
|
-
const range = segmentCache.findRange(5000, 15000);
|
|
219
|
-
expect(range.length).toBe(3);
|
|
220
|
-
expect(range.map((s) => s.key)).toEqual([5000, 10000, 15000]);
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
test("findNearestInRange edge cases", () => {
|
|
224
|
-
const cache = new OrderedLRUCache<number, string>(10);
|
|
225
|
-
|
|
226
|
-
cache.set(100, "hundred");
|
|
227
|
-
cache.set(200, "two-hundred");
|
|
228
|
-
cache.set(300, "three-hundred");
|
|
229
|
-
|
|
230
|
-
// Test that it can return empty array when no items in range
|
|
231
|
-
const emptyResult = cache.findNearestInRange(50, 10);
|
|
232
|
-
expect(emptyResult).toEqual([]); // 50±10 = [40,60] contains nothing
|
|
233
|
-
|
|
234
|
-
// Test exact center match
|
|
235
|
-
const exactCenter = cache.findNearestInRange(200, 0);
|
|
236
|
-
expect(exactCenter.map((item) => item.key)).toEqual([200]); // 200±0 = [200,200] exact match
|
|
237
|
-
|
|
238
|
-
// Test asymmetric range (center closer to one side)
|
|
239
|
-
const asymmetric = cache.findNearestInRange(150, 60);
|
|
240
|
-
expect(asymmetric.map((item) => item.key)).toEqual([100, 200]); // 150±60 = [90,210] contains 100,200
|
|
241
|
-
|
|
242
|
-
// Test very large range containing all items
|
|
243
|
-
const allItems = cache.findNearestInRange(200, 500);
|
|
244
|
-
expect(allItems.map((item) => item.key)).toEqual([100, 200, 300]); // 200±500 = [-300,700] contains all
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
// This test is cute, but we can't perfectly controll wall time
|
|
248
|
-
// in CI, so it's flaky.
|
|
249
|
-
test.skip("performance characteristics with large dataset", () => {
|
|
250
|
-
const cache = new OrderedLRUCache<number, string>(1000);
|
|
251
|
-
|
|
252
|
-
// Insert many items
|
|
253
|
-
const insertStart = performance.now();
|
|
254
|
-
for (let i = 0; i < 1000; i++) {
|
|
255
|
-
cache.set(Math.random() * 10000, `value-${i}`);
|
|
256
|
-
}
|
|
257
|
-
const insertTime = performance.now() - insertStart;
|
|
258
|
-
|
|
259
|
-
// Perform searches
|
|
260
|
-
const searchStart = performance.now();
|
|
261
|
-
for (let i = 0; i < 100; i++) {
|
|
262
|
-
cache.findNearestInRange(Math.random() * 10000, 500);
|
|
263
|
-
cache.findRange(Math.random() * 5000, Math.random() * 5000 + 1000);
|
|
264
|
-
}
|
|
265
|
-
const searchTime = performance.now() - searchStart;
|
|
266
|
-
|
|
267
|
-
// These should complete quickly for O(log n) operations
|
|
268
|
-
expect(insertTime).toBeLessThan(100); // Should be very fast
|
|
269
|
-
expect(searchTime).toBeLessThan(50); // Searches should be even faster
|
|
270
|
-
|
|
271
|
-
expect(cache.size).toBe(1000);
|
|
272
|
-
expect(cache.getSortedKeys().length).toBe(1000);
|
|
273
|
-
});
|
|
274
|
-
});
|