• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17import {TraceBuilder} from 'test/unit/trace_builder';
18import {TraceUtils} from 'test/unit/trace_utils';
19import {FrameMapBuilder} from './frame_map_builder';
20import {AbsoluteFrameIndex} from './index_types';
21import {RealTimestamp} from './timestamp';
22import {Trace} from './trace';
23
24describe('Trace', () => {
25  let trace: Trace<string>;
26
27  const time9 = new RealTimestamp(9n);
28  const time10 = new RealTimestamp(10n);
29  const time11 = new RealTimestamp(11n);
30  const time12 = new RealTimestamp(12n);
31  const time13 = new RealTimestamp(13n);
32  const time14 = new RealTimestamp(14n);
33  const time15 = new RealTimestamp(15n);
34
35  beforeAll(() => {
36    // Time:       10    11                 12    13
37    // Entry:      0    1-2                 3     4
38    //             |     |                  |     |
39    // Frame:      0     1     2     3     4-5    6
40    trace = new TraceBuilder<string>()
41      .setEntries(['entry-0', 'entry-1', 'entry-2', 'entry-3', 'entry-4'])
42      .setTimestamps([time10, time11, time11, time12, time13])
43      .setFrame(0, 0)
44      .setFrame(1, 1)
45      .setFrame(2, 1)
46      .setFrame(3, 4)
47      .setFrame(3, 5)
48      .setFrame(4, 6)
49      .build();
50  });
51
52  it('getEntry()', async () => {
53    expect(await trace.getEntry(0).getValue()).toEqual('entry-0');
54    expect(await trace.getEntry(4).getValue()).toEqual('entry-4');
55    expect(() => {
56      trace.getEntry(5);
57    }).toThrow();
58
59    expect(await trace.getEntry(-1).getValue()).toEqual('entry-4');
60    expect(await trace.getEntry(-5).getValue()).toEqual('entry-0');
61    expect(() => {
62      trace.getEntry(-6);
63    }).toThrow();
64  });
65
66  it('getFrame()', async () => {
67    expect(await TraceUtils.extractFrames(trace.getFrame(0))).toEqual(
68      new Map<AbsoluteFrameIndex, string[]>([[0, ['entry-0']]])
69    );
70    expect(await TraceUtils.extractFrames(trace.getFrame(1))).toEqual(
71      new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1', 'entry-2']]])
72    );
73    expect(await TraceUtils.extractFrames(trace.getFrame(2))).toEqual(
74      new Map<AbsoluteFrameIndex, string[]>([[2, []]])
75    );
76    expect(await TraceUtils.extractFrames(trace.getFrame(3))).toEqual(
77      new Map<AbsoluteFrameIndex, string[]>([[3, []]])
78    );
79    expect(await TraceUtils.extractFrames(trace.getFrame(4))).toEqual(
80      new Map<AbsoluteFrameIndex, string[]>([[4, ['entry-3']]])
81    );
82    expect(await TraceUtils.extractFrames(trace.getFrame(5))).toEqual(
83      new Map<AbsoluteFrameIndex, string[]>([[5, ['entry-3']]])
84    );
85    expect(await TraceUtils.extractFrames(trace.getFrame(6))).toEqual(
86      new Map<AbsoluteFrameIndex, string[]>([[6, ['entry-4']]])
87    );
88  });
89
90  it('findClosestEntry()', async () => {
91    // empty
92    expect(trace.sliceEntries(0, 0).findClosestEntry(time10)).toBeUndefined();
93
94    // slice
95    const slice = trace.sliceEntries(1, -1);
96    expect(await slice.findClosestEntry(time9)?.getValue()).toEqual('entry-1');
97    expect(await slice.findClosestEntry(time10)?.getValue()).toEqual('entry-1');
98    expect(await slice.findClosestEntry(time11)?.getValue()).toEqual('entry-1');
99    expect(await slice.findClosestEntry(time12)?.getValue()).toEqual('entry-3');
100    expect(await slice.findClosestEntry(time13)?.getValue()).toEqual('entry-3');
101    expect(await slice.findClosestEntry(time14)?.getValue()).toEqual('entry-3');
102
103    // full trace
104    expect(await trace.findClosestEntry(time9)?.getValue()).toEqual('entry-0');
105    expect(await trace.findClosestEntry(time10)?.getValue()).toEqual('entry-0');
106    expect(await trace.findClosestEntry(time11)?.getValue()).toEqual('entry-1');
107    expect(await trace.findClosestEntry(time12)?.getValue()).toEqual('entry-3');
108    expect(await trace.findClosestEntry(time13)?.getValue()).toEqual('entry-4');
109    expect(await trace.findClosestEntry(time14)?.getValue()).toEqual('entry-4');
110  });
111
112  it('findFirstGreaterOrEqualEntry()', async () => {
113    // empty
114    expect(trace.sliceEntries(0, 0).findFirstGreaterOrEqualEntry(time10)).toBeUndefined();
115
116    // slice
117    const slice = trace.sliceEntries(1, -1);
118    expect(await slice.findFirstGreaterOrEqualEntry(time9)?.getValue()).toEqual('entry-1');
119    expect(await slice.findFirstGreaterOrEqualEntry(time10)?.getValue()).toEqual('entry-1');
120    expect(await slice.findFirstGreaterOrEqualEntry(time11)?.getValue()).toEqual('entry-1');
121    expect(await slice.findFirstGreaterOrEqualEntry(time12)?.getValue()).toEqual('entry-3');
122    expect(await slice.findFirstGreaterOrEqualEntry(time13)).toBeUndefined();
123
124    // full trace
125    expect(await trace.findFirstGreaterOrEqualEntry(time9)?.getValue()).toEqual('entry-0');
126    expect(await trace.findFirstGreaterOrEqualEntry(time10)?.getValue()).toEqual('entry-0');
127    expect(await trace.findFirstGreaterOrEqualEntry(time11)?.getValue()).toEqual('entry-1');
128    expect(await trace.findFirstGreaterOrEqualEntry(time12)?.getValue()).toEqual('entry-3');
129    expect(await trace.findFirstGreaterOrEqualEntry(time13)?.getValue()).toEqual('entry-4');
130    expect(await trace.findFirstGreaterOrEqualEntry(time14)).toBeUndefined();
131  });
132
133  it('findFirstGreaterEntry()', async () => {
134    // empty
135    expect(trace.sliceEntries(0, 0).findFirstGreaterEntry(time10)).toBeUndefined();
136
137    // slice
138    const slice = trace.sliceEntries(1, -1);
139    expect(await slice.findFirstGreaterEntry(time9)?.getValue()).toEqual('entry-1');
140    expect(await slice.findFirstGreaterEntry(time10)?.getValue()).toEqual('entry-1');
141    expect(await slice.findFirstGreaterEntry(time11)?.getValue()).toEqual('entry-3');
142    expect(slice.findFirstGreaterEntry(time12)).toBeUndefined();
143
144    // full trace
145    expect(await trace.findFirstGreaterEntry(time9)?.getValue()).toEqual('entry-0');
146    expect(await trace.findFirstGreaterEntry(time10)?.getValue()).toEqual('entry-1');
147    expect(await trace.findFirstGreaterEntry(time11)?.getValue()).toEqual('entry-3');
148    expect(await trace.findFirstGreaterEntry(time12)?.getValue()).toEqual('entry-4');
149    expect(trace.findFirstGreaterEntry(time13)).toBeUndefined();
150  });
151
152  it('findLastLowerOrEqualEntry()', async () => {
153    // empty
154    expect(trace.sliceEntries(0, 0).findLastLowerOrEqualEntry(time10)).toBeUndefined();
155
156    // slice
157    const slice = trace.sliceEntries(1, -1);
158    expect(slice.findLastLowerOrEqualEntry(time9)).toBeUndefined();
159    expect(slice.findLastLowerOrEqualEntry(time10)).toBeUndefined();
160    expect(await slice.findLastLowerOrEqualEntry(time11)?.getValue()).toEqual('entry-2');
161    expect(await slice.findLastLowerOrEqualEntry(time12)?.getValue()).toEqual('entry-3');
162    expect(await slice.findLastLowerOrEqualEntry(time13)?.getValue()).toEqual('entry-3');
163
164    // full trace
165    expect(trace.findLastLowerOrEqualEntry(time9)).toBeUndefined();
166    expect(await trace.findLastLowerOrEqualEntry(time10)?.getValue()).toEqual('entry-0');
167    expect(await trace.findLastLowerOrEqualEntry(time11)?.getValue()).toEqual('entry-2');
168    expect(await trace.findLastLowerOrEqualEntry(time12)?.getValue()).toEqual('entry-3');
169    expect(await trace.findLastLowerOrEqualEntry(time13)?.getValue()).toEqual('entry-4');
170    expect(await trace.findLastLowerOrEqualEntry(time14)?.getValue()).toEqual('entry-4');
171  });
172
173  it('findLastLowerEntry()', async () => {
174    // empty
175    expect(trace.sliceEntries(0, 0).findLastLowerEntry(time10)).toBeUndefined();
176
177    // slice
178    const slice = trace.sliceEntries(1, -1);
179    expect(slice.findLastLowerEntry(time9)).toBeUndefined();
180    expect(slice.findLastLowerEntry(time10)).toBeUndefined();
181    expect(slice.findLastLowerEntry(time11)).toBeUndefined();
182    expect(await slice.findLastLowerEntry(time12)?.getValue()).toEqual('entry-2');
183    expect(await slice.findLastLowerEntry(time13)?.getValue()).toEqual('entry-3');
184    expect(await slice.findLastLowerEntry(time14)?.getValue()).toEqual('entry-3');
185    expect(await slice.findLastLowerEntry(time15)?.getValue()).toEqual('entry-3');
186
187    // full trace
188    expect(trace.findLastLowerEntry(time9)).toBeUndefined();
189    expect(trace.findLastLowerEntry(time10)).toBeUndefined();
190    expect(await trace.findLastLowerEntry(time11)?.getValue()).toEqual('entry-0');
191    expect(await trace.findLastLowerEntry(time12)?.getValue()).toEqual('entry-2');
192    expect(await trace.findLastLowerEntry(time13)?.getValue()).toEqual('entry-3');
193    expect(await trace.findLastLowerEntry(time14)?.getValue()).toEqual('entry-4');
194    expect(await trace.findLastLowerEntry(time15)?.getValue()).toEqual('entry-4');
195  });
196
197  // Hint: look at frame mapping specified in test's set up to fully understand the assertions
198  it('sliceEntries()', async () => {
199    const slice = trace.sliceEntries(1, 4);
200
201    const expectedEntriesFull = ['entry-1', 'entry-2', 'entry-3'];
202    const expectedFramesEmpty = new Map<AbsoluteFrameIndex, string[]>();
203    const expectedFramesFull = new Map<AbsoluteFrameIndex, string[]>([
204      [1, ['entry-1', 'entry-2']],
205      [2, []],
206      [3, []],
207      [4, ['entry-3']],
208      [5, ['entry-3']],
209    ]);
210
211    // empty
212    {
213      expect(await TraceUtils.extractFrames(slice.sliceEntries(1, 1))).toEqual(expectedFramesEmpty);
214      expect(await TraceUtils.extractEntries(slice.sliceEntries(1, 1))).toEqual([]);
215
216      expect(await TraceUtils.extractFrames(slice.sliceEntries(-1, -1))).toEqual(
217        expectedFramesEmpty
218      );
219      expect(await TraceUtils.extractEntries(slice.sliceEntries(-1, -1))).toEqual([]);
220
221      expect(await TraceUtils.extractFrames(slice.sliceEntries(2, 1))).toEqual(expectedFramesEmpty);
222      expect(await TraceUtils.extractEntries(slice.sliceEntries(2, 1))).toEqual([]);
223
224      expect(await TraceUtils.extractFrames(slice.sliceEntries(-1, -2))).toEqual(
225        expectedFramesEmpty
226      );
227      expect(await TraceUtils.extractEntries(slice.sliceEntries(-1, -2))).toEqual([]);
228    }
229
230    // full
231    {
232      expect(await TraceUtils.extractEntries(slice.sliceEntries())).toEqual(expectedEntriesFull);
233      expect(await TraceUtils.extractFrames(slice.sliceEntries())).toEqual(expectedFramesFull);
234
235      expect(await TraceUtils.extractEntries(slice.sliceEntries(0))).toEqual(expectedEntriesFull);
236      expect(await TraceUtils.extractFrames(slice.sliceEntries(0))).toEqual(expectedFramesFull);
237
238      expect(await TraceUtils.extractEntries(slice.sliceEntries(0, 3))).toEqual(
239        expectedEntriesFull
240      );
241      expect(await TraceUtils.extractFrames(slice.sliceEntries(0, 3))).toEqual(expectedFramesFull);
242
243      expect(await TraceUtils.extractEntries(slice.sliceEntries(-3))).toEqual(expectedEntriesFull);
244      expect(await TraceUtils.extractFrames(slice.sliceEntries(-3))).toEqual(expectedFramesFull);
245
246      expect(await TraceUtils.extractEntries(slice.sliceEntries(-3, 3))).toEqual(
247        expectedEntriesFull
248      );
249      expect(await TraceUtils.extractFrames(slice.sliceEntries(-3, 3))).toEqual(expectedFramesFull);
250    }
251
252    // slice away front (positive index)
253    {
254      expect(await TraceUtils.extractEntries(slice.sliceEntries(1))).toEqual([
255        'entry-2',
256        'entry-3',
257      ]);
258      expect(await TraceUtils.extractFrames(slice.sliceEntries(1))).toEqual(
259        new Map<AbsoluteFrameIndex, string[]>([
260          [1, ['entry-2']],
261          [2, []],
262          [3, []],
263          [4, ['entry-3']],
264          [5, ['entry-3']],
265        ])
266      );
267
268      expect(await TraceUtils.extractEntries(slice.sliceEntries(2))).toEqual(['entry-3']);
269      expect(await TraceUtils.extractFrames(slice.sliceEntries(2))).toEqual(
270        new Map<AbsoluteFrameIndex, string[]>([
271          [4, ['entry-3']],
272          [5, ['entry-3']],
273        ])
274      );
275
276      expect(await TraceUtils.extractEntries(slice.sliceEntries(3))).toEqual([]);
277      expect(await TraceUtils.extractFrames(slice.sliceEntries(3))).toEqual(expectedFramesEmpty);
278
279      expect(await TraceUtils.extractEntries(slice.sliceEntries(4))).toEqual([]);
280      expect(await TraceUtils.extractFrames(slice.sliceEntries(4))).toEqual(expectedFramesEmpty);
281
282      expect(await TraceUtils.extractEntries(slice.sliceEntries(1000000))).toEqual([]);
283      expect(await TraceUtils.extractFrames(slice.sliceEntries(1000000))).toEqual(
284        expectedFramesEmpty
285      );
286    }
287
288    // slice away front (negative index)
289    {
290      expect(await TraceUtils.extractEntries(slice.sliceEntries(-3))).toEqual(expectedEntriesFull);
291      expect(await TraceUtils.extractFrames(slice.sliceEntries(-3))).toEqual(expectedFramesFull);
292
293      expect(await TraceUtils.extractEntries(slice.sliceEntries(-2))).toEqual([
294        'entry-2',
295        'entry-3',
296      ]);
297      expect(await TraceUtils.extractFrames(slice.sliceEntries(-2))).toEqual(
298        new Map<AbsoluteFrameIndex, string[]>([
299          [1, ['entry-2']],
300          [2, []],
301          [3, []],
302          [4, ['entry-3']],
303          [5, ['entry-3']],
304        ])
305      );
306
307      expect(await TraceUtils.extractEntries(slice.sliceEntries(-1))).toEqual(['entry-3']);
308      expect(await TraceUtils.extractFrames(slice.sliceEntries(-1))).toEqual(
309        new Map<AbsoluteFrameIndex, string[]>([
310          [4, ['entry-3']],
311          [5, ['entry-3']],
312        ])
313      );
314    }
315
316    // slice away back (positive index)
317    {
318      expect(await TraceUtils.extractEntries(slice.sliceEntries(undefined, 2))).toEqual([
319        'entry-1',
320        'entry-2',
321      ]);
322      expect(await TraceUtils.extractFrames(slice.sliceEntries(undefined, 2))).toEqual(
323        new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1', 'entry-2']]])
324      );
325
326      expect(await TraceUtils.extractEntries(slice.sliceEntries(undefined, 1))).toEqual([
327        'entry-1',
328      ]);
329      expect(await TraceUtils.extractFrames(slice.sliceEntries(undefined, 1))).toEqual(
330        new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1']]])
331      );
332
333      expect(await TraceUtils.extractEntries(slice.sliceEntries(undefined, 0))).toEqual([]);
334      expect(await TraceUtils.extractFrames(slice.sliceEntries(undefined, 0))).toEqual(
335        expectedFramesEmpty
336      );
337    }
338
339    // slice away back (negative index)
340    {
341      expect(await TraceUtils.extractEntries(slice.sliceEntries(undefined, -1))).toEqual([
342        'entry-1',
343        'entry-2',
344      ]);
345      expect(await TraceUtils.extractFrames(slice.sliceEntries(undefined, -1))).toEqual(
346        new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1', 'entry-2']]])
347      );
348
349      expect(await TraceUtils.extractEntries(slice.sliceEntries(undefined, -2))).toEqual([
350        'entry-1',
351      ]);
352      expect(await TraceUtils.extractFrames(slice.sliceEntries(undefined, -2))).toEqual(
353        new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1']]])
354      );
355
356      expect(await TraceUtils.extractEntries(slice.sliceEntries(undefined, -3))).toEqual([]);
357      expect(await TraceUtils.extractFrames(slice.sliceEntries(undefined, -3))).toEqual(
358        expectedFramesEmpty
359      );
360
361      expect(await TraceUtils.extractEntries(slice.sliceEntries(undefined, -4))).toEqual([]);
362      expect(await TraceUtils.extractFrames(slice.sliceEntries(undefined, -4))).toEqual(
363        expectedFramesEmpty
364      );
365
366      expect(await TraceUtils.extractEntries(slice.sliceEntries(undefined, -1000000))).toEqual([]);
367      expect(await TraceUtils.extractFrames(slice.sliceEntries(undefined, -1000000))).toEqual(
368        expectedFramesEmpty
369      );
370    }
371  });
372
373  // Hint: look at frame mapping specified in test's set up to fully understand the assertions
374  it('sliceTime()', async () => {
375    const slice = trace.sliceTime(time11, time13); // drop first + last entries
376
377    const expectedEntriesFull = ['entry-1', 'entry-2', 'entry-3'];
378    const expectedFramesEmpty = new Map<AbsoluteFrameIndex, string[]>();
379    const expectedFramesFull = new Map<AbsoluteFrameIndex, string[]>([
380      [1, ['entry-1', 'entry-2']],
381      [2, []],
382      [3, []],
383      [4, ['entry-3']],
384      [5, ['entry-3']],
385    ]);
386
387    // empty
388    {
389      expect(await TraceUtils.extractEntries(slice.sliceTime(time11, time11))).toEqual([]);
390      expect(await TraceUtils.extractFrames(slice.sliceTime(time11, time11))).toEqual(
391        expectedFramesEmpty
392      );
393
394      expect(await TraceUtils.extractEntries(slice.sliceTime(time11, time10))).toEqual([]);
395      expect(await TraceUtils.extractFrames(slice.sliceTime(time11, time10))).toEqual(
396        expectedFramesEmpty
397      );
398
399      expect(await TraceUtils.extractEntries(slice.sliceTime(time9, time10))).toEqual([]);
400      expect(await TraceUtils.extractFrames(slice.sliceTime(time9, time10))).toEqual(
401        expectedFramesEmpty
402      );
403
404      expect(await TraceUtils.extractEntries(slice.sliceTime(time10, time9))).toEqual([]);
405      expect(await TraceUtils.extractFrames(slice.sliceTime(time10, time9))).toEqual(
406        expectedFramesEmpty
407      );
408
409      expect(await TraceUtils.extractEntries(slice.sliceTime(time14, time15))).toEqual([]);
410      expect(await TraceUtils.extractFrames(slice.sliceTime(time14, time15))).toEqual(
411        expectedFramesEmpty
412      );
413
414      expect(await TraceUtils.extractEntries(slice.sliceTime(time15, time14))).toEqual([]);
415      expect(await TraceUtils.extractFrames(slice.sliceTime(time15, time14))).toEqual(
416        expectedFramesEmpty
417      );
418    }
419
420    // full
421    {
422      expect(await TraceUtils.extractEntries(slice.sliceTime())).toEqual(expectedEntriesFull);
423      expect(await TraceUtils.extractFrames(slice.sliceTime())).toEqual(expectedFramesFull);
424
425      expect(await TraceUtils.extractEntries(slice.sliceTime(time9))).toEqual(expectedEntriesFull);
426      expect(await TraceUtils.extractFrames(slice.sliceTime(time9))).toEqual(expectedFramesFull);
427
428      expect(await TraceUtils.extractEntries(slice.sliceTime(time10))).toEqual(expectedEntriesFull);
429      expect(await TraceUtils.extractFrames(slice.sliceTime(time10))).toEqual(expectedFramesFull);
430
431      expect(await TraceUtils.extractEntries(slice.sliceTime(undefined, time14))).toEqual(
432        expectedEntriesFull
433      );
434      expect(await TraceUtils.extractFrames(slice.sliceTime(undefined, time14))).toEqual(
435        expectedFramesFull
436      );
437
438      expect(await TraceUtils.extractEntries(slice.sliceTime(undefined, time15))).toEqual(
439        expectedEntriesFull
440      );
441      expect(await TraceUtils.extractFrames(slice.sliceTime(undefined, time15))).toEqual(
442        expectedFramesFull
443      );
444
445      expect(await TraceUtils.extractEntries(slice.sliceTime(time10, time14))).toEqual(
446        expectedEntriesFull
447      );
448      expect(await TraceUtils.extractFrames(slice.sliceTime(time10, time14))).toEqual(
449        expectedFramesFull
450      );
451    }
452
453    // middle
454    {
455      expect(await TraceUtils.extractEntries(slice.sliceTime(time12, time13))).toEqual(['entry-3']);
456      expect(await TraceUtils.extractFrames(slice.sliceTime(time12, time13))).toEqual(
457        new Map<AbsoluteFrameIndex, string[]>([
458          [4, ['entry-3']],
459          [5, ['entry-3']],
460        ])
461      );
462    }
463
464    // slice away front
465    {
466      expect(await TraceUtils.extractEntries(slice.sliceTime(time12))).toEqual(['entry-3']);
467      expect(await TraceUtils.extractFrames(slice.sliceTime(time12))).toEqual(
468        new Map<AbsoluteFrameIndex, string[]>([
469          [4, ['entry-3']],
470          [5, ['entry-3']],
471        ])
472      );
473
474      expect(await TraceUtils.extractEntries(slice.sliceTime(time13))).toEqual([]);
475      expect(await TraceUtils.extractFrames(slice.sliceTime(time13))).toEqual(expectedFramesEmpty);
476
477      expect(await TraceUtils.extractEntries(slice.sliceTime(time14))).toEqual([]);
478      expect(await TraceUtils.extractFrames(slice.sliceTime(time14))).toEqual(expectedFramesEmpty);
479
480      expect(await TraceUtils.extractEntries(slice.sliceTime(time15))).toEqual([]);
481      expect(await TraceUtils.extractFrames(slice.sliceTime(time15))).toEqual(expectedFramesEmpty);
482    }
483
484    // slice away back
485    {
486      expect(await TraceUtils.extractEntries(slice.sliceTime(undefined, time12))).toEqual([
487        'entry-1',
488        'entry-2',
489      ]);
490      expect(await TraceUtils.extractFrames(slice.sliceTime(undefined, time12))).toEqual(
491        new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1', 'entry-2']]])
492      );
493
494      expect(await TraceUtils.extractEntries(slice.sliceTime(undefined, time11))).toEqual([]);
495      expect(await TraceUtils.extractFrames(slice.sliceTime(undefined, time11))).toEqual(
496        expectedFramesEmpty
497      );
498
499      expect(await TraceUtils.extractEntries(slice.sliceTime(undefined, time10))).toEqual([]);
500      expect(await TraceUtils.extractFrames(slice.sliceTime(undefined, time10))).toEqual(
501        expectedFramesEmpty
502      );
503
504      expect(await TraceUtils.extractEntries(slice.sliceTime(undefined, time9))).toEqual([]);
505      expect(await TraceUtils.extractFrames(slice.sliceTime(undefined, time9))).toEqual(
506        expectedFramesEmpty
507      );
508    }
509  });
510
511  // Hint: look at frame mapping specified in test's set up to fully understand the assertions
512  it('sliceFrames()', async () => {
513    const slice = trace.sliceEntries(1, -1);
514
515    // empty
516    {
517      const expectedEntries = new Array<string>();
518      const expectedFrames = new Map<AbsoluteFrameIndex, string[]>([]);
519      expect(await TraceUtils.extractEntries(slice.sliceFrames(1, 1))).toEqual(expectedEntries);
520      expect(await TraceUtils.extractFrames(slice.sliceFrames(1, 1))).toEqual(expectedFrames);
521      expect(await TraceUtils.extractEntries(slice.sliceFrames(5, 1))).toEqual(expectedEntries);
522      expect(await TraceUtils.extractFrames(slice.sliceFrames(5, 1))).toEqual(expectedFrames);
523      expect(await TraceUtils.extractEntries(slice.sliceFrames(3, 2))).toEqual(expectedEntries);
524      expect(await TraceUtils.extractFrames(slice.sliceFrames(3, 2))).toEqual(expectedFrames);
525    }
526
527    // middle
528    {
529      expect(await TraceUtils.extractEntries(slice.sliceFrames(2, 3))).toEqual([]);
530      expect(await TraceUtils.extractFrames(slice.sliceFrames(2, 3))).toEqual(
531        new Map<AbsoluteFrameIndex, string[]>([[2, []]])
532      );
533      expect(await TraceUtils.extractEntries(slice.sliceFrames(2, 4))).toEqual([]);
534      expect(await TraceUtils.extractFrames(slice.sliceFrames(2, 4))).toEqual(
535        new Map<AbsoluteFrameIndex, string[]>([
536          [2, []],
537          [3, []],
538        ])
539      );
540      expect(await TraceUtils.extractEntries(slice.sliceFrames(2, 5))).toEqual(['entry-3']);
541      expect(await TraceUtils.extractFrames(slice.sliceFrames(2, 5))).toEqual(
542        new Map<AbsoluteFrameIndex, string[]>([
543          [2, []],
544          [3, []],
545          [4, ['entry-3']],
546        ])
547      );
548    }
549
550    // full
551    {
552      const expectedEntries = ['entry-1', 'entry-2', 'entry-3'];
553      const expectedFrames = new Map<AbsoluteFrameIndex, string[]>([
554        [1, ['entry-1', 'entry-2']],
555        [2, []],
556        [3, []],
557        [4, ['entry-3']],
558        [5, ['entry-3']],
559      ]);
560      expect(await TraceUtils.extractEntries(slice.sliceFrames())).toEqual(expectedEntries);
561      expect(await TraceUtils.extractFrames(slice.sliceFrames())).toEqual(expectedFrames);
562      expect(await TraceUtils.extractEntries(slice.sliceFrames(0))).toEqual(expectedEntries);
563      expect(await TraceUtils.extractFrames(slice.sliceFrames(0))).toEqual(expectedFrames);
564      expect(await TraceUtils.extractEntries(slice.sliceFrames(undefined, 6))).toEqual(
565        expectedEntries
566      );
567      expect(await TraceUtils.extractFrames(slice.sliceFrames(undefined, 6))).toEqual(
568        expectedFrames
569      );
570      expect(await TraceUtils.extractEntries(slice.sliceFrames(1, 6))).toEqual(expectedEntries);
571      expect(await TraceUtils.extractFrames(slice.sliceFrames(1, 6))).toEqual(expectedFrames);
572      expect(await TraceUtils.extractEntries(slice.sliceFrames(0, 7))).toEqual(expectedEntries);
573      expect(await TraceUtils.extractFrames(slice.sliceFrames(0, 7))).toEqual(expectedFrames);
574    }
575
576    // slice away front
577    {
578      expect(await TraceUtils.extractEntries(slice.sliceFrames(2))).toEqual(['entry-3']);
579      expect(await TraceUtils.extractFrames(slice.sliceFrames(2))).toEqual(
580        new Map<AbsoluteFrameIndex, string[]>([
581          [2, []],
582          [3, []],
583          [4, ['entry-3']],
584          [5, ['entry-3']],
585        ])
586      );
587      expect(await TraceUtils.extractEntries(slice.sliceFrames(4))).toEqual(['entry-3']);
588      expect(await TraceUtils.extractFrames(slice.sliceFrames(4))).toEqual(
589        new Map<AbsoluteFrameIndex, string[]>([
590          [4, ['entry-3']],
591          [5, ['entry-3']],
592        ])
593      );
594      expect(await TraceUtils.extractEntries(slice.sliceFrames(5))).toEqual(['entry-3']);
595      expect(await TraceUtils.extractFrames(slice.sliceFrames(5))).toEqual(
596        new Map<AbsoluteFrameIndex, string[]>([[5, ['entry-3']]])
597      );
598      expect(await TraceUtils.extractEntries(slice.sliceFrames(6))).toEqual([]);
599      expect(await TraceUtils.extractFrames(slice.sliceFrames(6))).toEqual(
600        new Map<AbsoluteFrameIndex, string[]>([])
601      );
602      expect(await TraceUtils.extractEntries(slice.sliceFrames(1000))).toEqual([]);
603      expect(await TraceUtils.extractFrames(slice.sliceFrames(1000))).toEqual(
604        new Map<AbsoluteFrameIndex, string[]>([])
605      );
606    }
607
608    // slice away back
609    {
610      expect(await TraceUtils.extractEntries(slice.sliceFrames(undefined, 6))).toEqual([
611        'entry-1',
612        'entry-2',
613        'entry-3',
614      ]);
615      expect(await TraceUtils.extractFrames(slice.sliceFrames(undefined, 6))).toEqual(
616        new Map<AbsoluteFrameIndex, string[]>([
617          [1, ['entry-1', 'entry-2']],
618          [2, []],
619          [3, []],
620          [4, ['entry-3']],
621          [5, ['entry-3']],
622        ])
623      );
624      expect(await TraceUtils.extractEntries(slice.sliceFrames(undefined, 5))).toEqual([
625        'entry-1',
626        'entry-2',
627        'entry-3',
628      ]);
629      expect(await TraceUtils.extractFrames(slice.sliceFrames(undefined, 5))).toEqual(
630        new Map<AbsoluteFrameIndex, string[]>([
631          [1, ['entry-1', 'entry-2']],
632          [2, []],
633          [3, []],
634          [4, ['entry-3']],
635        ])
636      );
637      expect(await TraceUtils.extractEntries(slice.sliceFrames(undefined, 4))).toEqual([
638        'entry-1',
639        'entry-2',
640      ]);
641      expect(await TraceUtils.extractFrames(slice.sliceFrames(undefined, 4))).toEqual(
642        new Map<AbsoluteFrameIndex, string[]>([
643          [1, ['entry-1', 'entry-2']],
644          [2, []],
645          [3, []],
646        ])
647      );
648      expect(await TraceUtils.extractEntries(slice.sliceFrames(undefined, 3))).toEqual([
649        'entry-1',
650        'entry-2',
651      ]);
652      expect(await TraceUtils.extractFrames(slice.sliceFrames(undefined, 3))).toEqual(
653        new Map<AbsoluteFrameIndex, string[]>([
654          [1, ['entry-1', 'entry-2']],
655          [2, []],
656        ])
657      );
658      expect(await TraceUtils.extractEntries(slice.sliceFrames(undefined, 2))).toEqual([
659        'entry-1',
660        'entry-2',
661      ]);
662      expect(await TraceUtils.extractFrames(slice.sliceFrames(undefined, 2))).toEqual(
663        new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1', 'entry-2']]])
664      );
665      expect(await TraceUtils.extractEntries(slice.sliceFrames(undefined, 1))).toEqual([]);
666      expect(await TraceUtils.extractFrames(slice.sliceFrames(undefined, 1))).toEqual(
667        new Map<AbsoluteFrameIndex, string[]>()
668      );
669      expect(await TraceUtils.extractEntries(slice.sliceFrames(undefined, 0))).toEqual([]);
670      expect(await TraceUtils.extractFrames(slice.sliceFrames(undefined, 0))).toEqual(
671        new Map<AbsoluteFrameIndex, string[]>()
672      );
673    }
674  });
675
676  it('can slice full trace', async () => {
677    // entries
678    expect(await TraceUtils.extractEntries(trace.sliceEntries(1, 1))).toEqual([]);
679    expect(await TraceUtils.extractEntries(trace.sliceEntries())).toEqual([
680      'entry-0',
681      'entry-1',
682      'entry-2',
683      'entry-3',
684      'entry-4',
685    ]);
686    expect(await TraceUtils.extractEntries(trace.sliceEntries(2))).toEqual([
687      'entry-2',
688      'entry-3',
689      'entry-4',
690    ]);
691    expect(await TraceUtils.extractEntries(trace.sliceEntries(-3))).toEqual([
692      'entry-2',
693      'entry-3',
694      'entry-4',
695    ]);
696    expect(await TraceUtils.extractEntries(trace.sliceEntries(undefined, 3))).toEqual([
697      'entry-0',
698      'entry-1',
699      'entry-2',
700    ]);
701    expect(await TraceUtils.extractEntries(trace.sliceEntries(undefined, -2))).toEqual([
702      'entry-0',
703      'entry-1',
704      'entry-2',
705    ]);
706    expect(await TraceUtils.extractEntries(trace.sliceEntries(1, 4))).toEqual([
707      'entry-1',
708      'entry-2',
709      'entry-3',
710    ]);
711
712    // time
713    const time12 = new RealTimestamp(12n);
714    const time13 = new RealTimestamp(13n);
715    expect(await TraceUtils.extractEntries(trace.sliceTime(time12, time12))).toEqual([]);
716    expect(await TraceUtils.extractEntries(trace.sliceTime())).toEqual([
717      'entry-0',
718      'entry-1',
719      'entry-2',
720      'entry-3',
721      'entry-4',
722    ]);
723    expect(await TraceUtils.extractEntries(trace.sliceTime(time12, time13))).toEqual(['entry-3']);
724    expect(await TraceUtils.extractEntries(trace.sliceTime(time12))).toEqual([
725      'entry-3',
726      'entry-4',
727    ]);
728    expect(await TraceUtils.extractEntries(trace.sliceTime(undefined, time12))).toEqual([
729      'entry-0',
730      'entry-1',
731      'entry-2',
732    ]);
733
734    // frames
735    expect(await TraceUtils.extractEntries(trace.sliceFrames(1, 1))).toEqual([]);
736    expect(await TraceUtils.extractEntries(trace.sliceFrames())).toEqual([
737      'entry-0',
738      'entry-1',
739      'entry-2',
740      'entry-3',
741      'entry-4',
742    ]);
743    expect(await TraceUtils.extractEntries(trace.sliceFrames(2))).toEqual(['entry-3', 'entry-4']);
744    expect(await TraceUtils.extractEntries(trace.sliceFrames(undefined, 5))).toEqual([
745      'entry-0',
746      'entry-1',
747      'entry-2',
748      'entry-3',
749    ]);
750    expect(await TraceUtils.extractEntries(trace.sliceFrames(2, 5))).toEqual(['entry-3']);
751  });
752
753  it('can slice empty trace', async () => {
754    const empty = trace.sliceEntries(0, 0);
755
756    // entries
757    expect(await TraceUtils.extractEntries(empty.sliceEntries())).toEqual([]);
758    expect(await TraceUtils.extractEntries(empty.sliceEntries(1))).toEqual([]);
759    expect(await TraceUtils.extractEntries(empty.sliceEntries(1, 2))).toEqual([]);
760
761    // time
762    const time12 = new RealTimestamp(12n);
763    const time13 = new RealTimestamp(13n);
764    expect(await TraceUtils.extractEntries(empty.sliceTime())).toEqual([]);
765    expect(await TraceUtils.extractEntries(empty.sliceTime(time12))).toEqual([]);
766    expect(await TraceUtils.extractEntries(empty.sliceTime(time12, time13))).toEqual([]);
767
768    // frames
769    expect(await TraceUtils.extractEntries(empty.sliceFrames())).toEqual([]);
770    expect(await TraceUtils.extractEntries(empty.sliceFrames(1))).toEqual([]);
771    expect(await TraceUtils.extractEntries(empty.sliceFrames(1, 2))).toEqual([]);
772  });
773
774  it('forEachEntry()', async () => {
775    expect(await TraceUtils.extractEntries(trace)).toEqual([
776      'entry-0',
777      'entry-1',
778      'entry-2',
779      'entry-3',
780      'entry-4',
781    ]);
782  });
783
784  it('forEachTimestamp()', () => {
785    expect(TraceUtils.extractTimestamps(trace)).toEqual([time10, time11, time11, time12, time13]);
786    expect(TraceUtils.extractTimestamps(trace.sliceEntries(1, -1))).toEqual([
787      time11,
788      time11,
789      time12,
790    ]);
791  });
792
793  // Hint: look at frame mapping specified in test's set up to fully understand the assertions
794  it('forEachFrame()', async () => {
795    // full trace
796    {
797      const expected = new Map<AbsoluteFrameIndex, string[]>([
798        [0, ['entry-0']],
799        [1, ['entry-1', 'entry-2']],
800        [2, []],
801        [3, []],
802        [4, ['entry-3']],
803        [5, ['entry-3']],
804        [6, ['entry-4']],
805      ]);
806      expect(await TraceUtils.extractFrames(trace)).toEqual(expected);
807    }
808    // slice
809    {
810      const slice = trace.sliceFrames(1, 5);
811      const expected = new Map<AbsoluteFrameIndex, string[]>([
812        [1, ['entry-1', 'entry-2']],
813        [2, []],
814        [3, []],
815        [4, ['entry-3']],
816      ]);
817      expect(await TraceUtils.extractFrames(slice)).toEqual(expected);
818    }
819  });
820
821  it('updates frames range when slicing', () => {
822    expect(trace.sliceEntries(0).getFramesRange()).toEqual({start: 0, end: 7});
823    expect(trace.sliceEntries(1).getFramesRange()).toEqual({start: 1, end: 7});
824    expect(trace.sliceEntries(2).getFramesRange()).toEqual({start: 1, end: 7});
825    expect(trace.sliceEntries(3).getFramesRange()).toEqual({start: 4, end: 7});
826    expect(trace.sliceEntries(4).getFramesRange()).toEqual({start: 6, end: 7});
827    expect(trace.sliceEntries(5).getFramesRange()).toEqual(undefined);
828
829    expect(trace.sliceEntries(undefined, 5).getFramesRange()).toEqual({start: 0, end: 7});
830    expect(trace.sliceEntries(undefined, 4).getFramesRange()).toEqual({start: 0, end: 6});
831    expect(trace.sliceEntries(undefined, 3).getFramesRange()).toEqual({start: 0, end: 2});
832    expect(trace.sliceEntries(undefined, 2).getFramesRange()).toEqual({start: 0, end: 2});
833    expect(trace.sliceEntries(undefined, 1).getFramesRange()).toEqual({start: 0, end: 1});
834    expect(trace.sliceEntries(undefined, 0).getFramesRange()).toEqual(undefined);
835  });
836
837  it('can handle some trace entries with unavailable frame info', async () => {
838    // Entry:      0     1     2     3     4
839    //                   |           |
840    // Frame:            0           2
841    // Time:       10    11    12    13    14
842    const trace = new TraceBuilder<string>()
843      .setEntries(['entry-0', 'entry-1', 'entry-2', 'entry-3', 'entry-4'])
844      .setTimestamps([time10, time11, time12, time13, time14])
845      .setFrame(1, 0)
846      .setFrame(3, 2)
847      .build();
848
849    // Slice entries
850    expect(await TraceUtils.extractEntries(trace.sliceEntries())).toEqual([
851      'entry-0',
852      'entry-1',
853      'entry-2',
854      'entry-3',
855      'entry-4',
856    ]);
857    expect(await TraceUtils.extractFrames(trace.sliceEntries())).toEqual(
858      new Map<AbsoluteFrameIndex, string[]>([
859        [0, ['entry-1']],
860        [1, []],
861        [2, ['entry-3']],
862      ])
863    );
864
865    expect(await TraceUtils.extractEntries(trace.sliceEntries(1))).toEqual([
866      'entry-1',
867      'entry-2',
868      'entry-3',
869      'entry-4',
870    ]);
871    expect(await TraceUtils.extractFrames(trace.sliceEntries(1))).toEqual(
872      new Map<AbsoluteFrameIndex, string[]>([
873        [0, ['entry-1']],
874        [1, []],
875        [2, ['entry-3']],
876      ])
877    );
878
879    expect(await TraceUtils.extractEntries(trace.sliceEntries(2))).toEqual([
880      'entry-2',
881      'entry-3',
882      'entry-4',
883    ]);
884    expect(await TraceUtils.extractFrames(trace.sliceEntries(2))).toEqual(
885      new Map<AbsoluteFrameIndex, string[]>([[2, ['entry-3']]])
886    );
887
888    expect(await TraceUtils.extractEntries(trace.sliceEntries(3))).toEqual(['entry-3', 'entry-4']);
889    expect(await TraceUtils.extractFrames(trace.sliceEntries(3))).toEqual(
890      new Map<AbsoluteFrameIndex, string[]>([[2, ['entry-3']]])
891    );
892
893    expect(await TraceUtils.extractEntries(trace.sliceEntries(4))).toEqual(['entry-4']);
894    expect(await TraceUtils.extractFrames(trace.sliceEntries(4))).toEqual(
895      new Map<AbsoluteFrameIndex, string[]>()
896    );
897
898    // Slice time
899    expect(await TraceUtils.extractEntries(trace.sliceTime())).toEqual([
900      'entry-0',
901      'entry-1',
902      'entry-2',
903      'entry-3',
904      'entry-4',
905    ]);
906    expect(await TraceUtils.extractFrames(trace.sliceTime())).toEqual(
907      new Map<AbsoluteFrameIndex, string[]>([
908        [0, ['entry-1']],
909        [1, []],
910        [2, ['entry-3']],
911      ])
912    );
913
914    expect(await TraceUtils.extractEntries(trace.sliceTime(time11))).toEqual([
915      'entry-1',
916      'entry-2',
917      'entry-3',
918      'entry-4',
919    ]);
920    expect(await TraceUtils.extractFrames(trace.sliceTime(time11))).toEqual(
921      new Map<AbsoluteFrameIndex, string[]>([
922        [0, ['entry-1']],
923        [1, []],
924        [2, ['entry-3']],
925      ])
926    );
927
928    expect(await TraceUtils.extractEntries(trace.sliceTime(time12))).toEqual([
929      'entry-2',
930      'entry-3',
931      'entry-4',
932    ]);
933    expect(await TraceUtils.extractFrames(trace.sliceTime(time12))).toEqual(
934      new Map<AbsoluteFrameIndex, string[]>([[2, ['entry-3']]])
935    );
936
937    expect(await TraceUtils.extractEntries(trace.sliceTime(time13))).toEqual([
938      'entry-3',
939      'entry-4',
940    ]);
941    expect(await TraceUtils.extractFrames(trace.sliceTime(time13))).toEqual(
942      new Map<AbsoluteFrameIndex, string[]>([[2, ['entry-3']]])
943    );
944
945    expect(await TraceUtils.extractEntries(trace.sliceTime(time14))).toEqual(['entry-4']);
946    expect(await TraceUtils.extractFrames(trace.sliceTime(time14))).toEqual(
947      new Map<AbsoluteFrameIndex, string[]>()
948    );
949
950    // Slice frames
951    expect(await TraceUtils.extractEntries(trace.sliceFrames())).toEqual([
952      'entry-1',
953      'entry-2',
954      'entry-3',
955    ]);
956    expect(await TraceUtils.extractFrames(trace.sliceFrames())).toEqual(
957      new Map<AbsoluteFrameIndex, string[]>([
958        [0, ['entry-1']],
959        [1, []],
960        [2, ['entry-3']],
961      ])
962    );
963
964    expect(await TraceUtils.extractEntries(trace.sliceFrames(1))).toEqual(['entry-3']);
965    expect(await TraceUtils.extractFrames(trace.sliceFrames(1))).toEqual(
966      new Map<AbsoluteFrameIndex, string[]>([
967        [1, []],
968        [2, ['entry-3']],
969      ])
970    );
971
972    expect(await TraceUtils.extractEntries(trace.sliceFrames(undefined, 2))).toEqual(['entry-1']);
973    expect(await TraceUtils.extractFrames(trace.sliceFrames(undefined, 2))).toEqual(
974      new Map<AbsoluteFrameIndex, string[]>([
975        [0, ['entry-1']],
976        [1, []],
977      ])
978    );
979  });
980
981  it('can handle unavailable frame info', async () => {
982    const trace = new TraceBuilder<string>()
983      .setTimestamps([time10, time11, time12])
984      .setEntries(['entry-0', 'entry-1', 'entry-2'])
985      .setFrameMap(undefined)
986      .build();
987
988    expect(await trace.getEntry(0).getValue()).toEqual('entry-0');
989    expect(await TraceUtils.extractEntries(trace)).toEqual(['entry-0', 'entry-1', 'entry-2']);
990    expect(await TraceUtils.extractEntries(trace.sliceEntries(1, 2))).toEqual(['entry-1']);
991    expect(await TraceUtils.extractEntries(trace.sliceTime(time11, time12))).toEqual(['entry-1']);
992
993    expect(() => {
994      trace.getFrame(0);
995    }).toThrow();
996    expect(() => {
997      trace.sliceFrames(0, 1000);
998    }).toThrow();
999  });
1000
1001  it('can handle empty frame info', async () => {
1002    // empty trace
1003    {
1004      const trace = new TraceBuilder<string>()
1005        .setEntries([])
1006        .setTimestamps([])
1007        .setFrameMap(new FrameMapBuilder(0, 0).build())
1008        .build();
1009
1010      expect(await TraceUtils.extractEntries(trace)).toEqual([]);
1011      expect(await TraceUtils.extractFrames(trace)).toEqual(
1012        new Map<AbsoluteFrameIndex, string[]>()
1013      );
1014
1015      expect(await TraceUtils.extractEntries(trace.sliceEntries(1))).toEqual([]);
1016      expect(await TraceUtils.extractFrames(trace.sliceEntries(1))).toEqual(
1017        new Map<AbsoluteFrameIndex, string[]>()
1018      );
1019
1020      expect(await TraceUtils.extractEntries(trace.sliceTime(time11))).toEqual([]);
1021      expect(await TraceUtils.extractFrames(trace.sliceTime(time11))).toEqual(
1022        new Map<AbsoluteFrameIndex, string[]>()
1023      );
1024
1025      expect(await TraceUtils.extractEntries(trace.sliceFrames())).toEqual([]);
1026      expect(await TraceUtils.extractFrames(trace.sliceFrames())).toEqual(
1027        new Map<AbsoluteFrameIndex, string[]>()
1028      );
1029    }
1030    // non-empty trace
1031    {
1032      const trace = new TraceBuilder<string>()
1033        .setEntries(['entry-0', 'entry-1', 'entry-2'])
1034        .setTimestamps([time10, time11, time12])
1035        .setFrameMap(new FrameMapBuilder(3, 0).build())
1036        .build();
1037
1038      expect(await TraceUtils.extractEntries(trace)).toEqual(['entry-0', 'entry-1', 'entry-2']);
1039      expect(await TraceUtils.extractFrames(trace)).toEqual(
1040        new Map<AbsoluteFrameIndex, string[]>()
1041      );
1042
1043      expect(await TraceUtils.extractEntries(trace.sliceEntries(1))).toEqual([
1044        'entry-1',
1045        'entry-2',
1046      ]);
1047      expect(await TraceUtils.extractFrames(trace.sliceEntries(1))).toEqual(
1048        new Map<AbsoluteFrameIndex, string[]>()
1049      );
1050
1051      expect(await TraceUtils.extractEntries(trace.sliceTime(time11))).toEqual([
1052        'entry-1',
1053        'entry-2',
1054      ]);
1055      expect(await TraceUtils.extractFrames(trace.sliceTime(time11))).toEqual(
1056        new Map<AbsoluteFrameIndex, string[]>()
1057      );
1058
1059      expect(await TraceUtils.extractEntries(trace.sliceFrames())).toEqual([]);
1060      expect(await TraceUtils.extractFrames(trace.sliceFrames())).toEqual(
1061        new Map<AbsoluteFrameIndex, string[]>()
1062      );
1063    }
1064  });
1065});
1066