xref: /aosp_15_r20/development/tools/winscope/src/trace/trace_test.ts (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker/*
2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker *
4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker *
8*90c8c64dSAndroid Build Coastguard Worker *      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker *
10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker */
16*90c8c64dSAndroid Build Coastguard Worker
17*90c8c64dSAndroid Build Coastguard Workerimport {TIME_UNIT_TO_NANO} from 'common/time_units';
18*90c8c64dSAndroid Build Coastguard Workerimport {ParserBuilder} from 'test/unit/parser_builder';
19*90c8c64dSAndroid Build Coastguard Workerimport {TimestampConverterUtils} from 'test/unit/timestamp_converter_utils';
20*90c8c64dSAndroid Build Coastguard Workerimport {TraceBuilder} from 'test/unit/trace_builder';
21*90c8c64dSAndroid Build Coastguard Workerimport {TraceUtils} from 'test/unit/trace_utils';
22*90c8c64dSAndroid Build Coastguard Workerimport {UnitTestUtils} from 'test/unit/utils';
23*90c8c64dSAndroid Build Coastguard Workerimport {FrameMapBuilder} from './frame_map_builder';
24*90c8c64dSAndroid Build Coastguard Workerimport {AbsoluteFrameIndex} from './index_types';
25*90c8c64dSAndroid Build Coastguard Workerimport {Trace} from './trace';
26*90c8c64dSAndroid Build Coastguard Workerimport {TraceType} from './trace_type';
27*90c8c64dSAndroid Build Coastguard Worker
28*90c8c64dSAndroid Build Coastguard Workerdescribe('Trace', () => {
29*90c8c64dSAndroid Build Coastguard Worker  let trace: Trace<string>;
30*90c8c64dSAndroid Build Coastguard Worker
31*90c8c64dSAndroid Build Coastguard Worker  const time9 = TimestampConverterUtils.makeRealTimestamp(9n);
32*90c8c64dSAndroid Build Coastguard Worker  const time10 = TimestampConverterUtils.makeRealTimestamp(10n);
33*90c8c64dSAndroid Build Coastguard Worker  const time11 = TimestampConverterUtils.makeRealTimestamp(11n);
34*90c8c64dSAndroid Build Coastguard Worker  const time12 = TimestampConverterUtils.makeRealTimestamp(12n);
35*90c8c64dSAndroid Build Coastguard Worker  const time13 = TimestampConverterUtils.makeRealTimestamp(13n);
36*90c8c64dSAndroid Build Coastguard Worker  const time14 = TimestampConverterUtils.makeRealTimestamp(14n);
37*90c8c64dSAndroid Build Coastguard Worker  const time15 = TimestampConverterUtils.makeRealTimestamp(15n);
38*90c8c64dSAndroid Build Coastguard Worker
39*90c8c64dSAndroid Build Coastguard Worker  beforeAll(() => {
40*90c8c64dSAndroid Build Coastguard Worker    // Time:       10    11                 12    13
41*90c8c64dSAndroid Build Coastguard Worker    // Entry:      0    1-2                 3     4
42*90c8c64dSAndroid Build Coastguard Worker    //             |     |                  |     |
43*90c8c64dSAndroid Build Coastguard Worker    // Frame:      0     1     2     3     4-5    6
44*90c8c64dSAndroid Build Coastguard Worker    trace = new TraceBuilder<string>()
45*90c8c64dSAndroid Build Coastguard Worker      .setEntries(['entry-0', 'entry-1', 'entry-2', 'entry-3', 'entry-4'])
46*90c8c64dSAndroid Build Coastguard Worker      .setTimestamps([time10, time11, time11, time12, time13])
47*90c8c64dSAndroid Build Coastguard Worker      .setFrame(0, 0)
48*90c8c64dSAndroid Build Coastguard Worker      .setFrame(1, 1)
49*90c8c64dSAndroid Build Coastguard Worker      .setFrame(2, 1)
50*90c8c64dSAndroid Build Coastguard Worker      .setFrame(3, 4)
51*90c8c64dSAndroid Build Coastguard Worker      .setFrame(3, 5)
52*90c8c64dSAndroid Build Coastguard Worker      .setFrame(4, 6)
53*90c8c64dSAndroid Build Coastguard Worker      .build();
54*90c8c64dSAndroid Build Coastguard Worker  });
55*90c8c64dSAndroid Build Coastguard Worker
56*90c8c64dSAndroid Build Coastguard Worker  it('getEntry()', async () => {
57*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.getEntry(0).getValue()).toEqual('entry-0');
58*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.getEntry(4).getValue()).toEqual('entry-4');
59*90c8c64dSAndroid Build Coastguard Worker    expect(() => {
60*90c8c64dSAndroid Build Coastguard Worker      trace.getEntry(5);
61*90c8c64dSAndroid Build Coastguard Worker    }).toThrow();
62*90c8c64dSAndroid Build Coastguard Worker
63*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.getEntry(-1).getValue()).toEqual('entry-4');
64*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.getEntry(-5).getValue()).toEqual('entry-0');
65*90c8c64dSAndroid Build Coastguard Worker    expect(() => {
66*90c8c64dSAndroid Build Coastguard Worker      trace.getEntry(-6);
67*90c8c64dSAndroid Build Coastguard Worker    }).toThrow();
68*90c8c64dSAndroid Build Coastguard Worker  });
69*90c8c64dSAndroid Build Coastguard Worker
70*90c8c64dSAndroid Build Coastguard Worker  it('getFrame()', async () => {
71*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.getFrame(0))).toEqual(
72*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([[0, ['entry-0']]]),
73*90c8c64dSAndroid Build Coastguard Worker    );
74*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.getFrame(1))).toEqual(
75*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1', 'entry-2']]]),
76*90c8c64dSAndroid Build Coastguard Worker    );
77*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.getFrame(2))).toEqual(
78*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([[2, []]]),
79*90c8c64dSAndroid Build Coastguard Worker    );
80*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.getFrame(3))).toEqual(
81*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([[3, []]]),
82*90c8c64dSAndroid Build Coastguard Worker    );
83*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.getFrame(4))).toEqual(
84*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([[4, ['entry-3']]]),
85*90c8c64dSAndroid Build Coastguard Worker    );
86*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.getFrame(5))).toEqual(
87*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([[5, ['entry-3']]]),
88*90c8c64dSAndroid Build Coastguard Worker    );
89*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.getFrame(6))).toEqual(
90*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([[6, ['entry-4']]]),
91*90c8c64dSAndroid Build Coastguard Worker    );
92*90c8c64dSAndroid Build Coastguard Worker  });
93*90c8c64dSAndroid Build Coastguard Worker
94*90c8c64dSAndroid Build Coastguard Worker  it('findClosestEntry()', async () => {
95*90c8c64dSAndroid Build Coastguard Worker    // empty
96*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(0, 0).findClosestEntry(time10)).toBeUndefined();
97*90c8c64dSAndroid Build Coastguard Worker
98*90c8c64dSAndroid Build Coastguard Worker    // slice
99*90c8c64dSAndroid Build Coastguard Worker    const slice = trace.sliceEntries(1, -1);
100*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findClosestEntry(time9)?.getValue()).toEqual('entry-1');
101*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findClosestEntry(time10)?.getValue()).toEqual('entry-1');
102*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findClosestEntry(time11)?.getValue()).toEqual('entry-1');
103*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findClosestEntry(time12)?.getValue()).toEqual('entry-3');
104*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findClosestEntry(time13)?.getValue()).toEqual('entry-3');
105*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findClosestEntry(time14)?.getValue()).toEqual('entry-3');
106*90c8c64dSAndroid Build Coastguard Worker
107*90c8c64dSAndroid Build Coastguard Worker    // full trace
108*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findClosestEntry(time9)?.getValue()).toEqual('entry-0');
109*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findClosestEntry(time10)?.getValue()).toEqual('entry-0');
110*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findClosestEntry(time11)?.getValue()).toEqual('entry-1');
111*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findClosestEntry(time12)?.getValue()).toEqual('entry-3');
112*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findClosestEntry(time13)?.getValue()).toEqual('entry-4');
113*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findClosestEntry(time14)?.getValue()).toEqual('entry-4');
114*90c8c64dSAndroid Build Coastguard Worker  });
115*90c8c64dSAndroid Build Coastguard Worker
116*90c8c64dSAndroid Build Coastguard Worker  it('findFirstGreaterOrEqualEntry()', async () => {
117*90c8c64dSAndroid Build Coastguard Worker    // empty
118*90c8c64dSAndroid Build Coastguard Worker    expect(
119*90c8c64dSAndroid Build Coastguard Worker      trace.sliceEntries(0, 0).findFirstGreaterOrEqualEntry(time10),
120*90c8c64dSAndroid Build Coastguard Worker    ).toBeUndefined();
121*90c8c64dSAndroid Build Coastguard Worker
122*90c8c64dSAndroid Build Coastguard Worker    // slice
123*90c8c64dSAndroid Build Coastguard Worker    const slice = trace.sliceEntries(1, -1);
124*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findFirstGreaterOrEqualEntry(time9)?.getValue()).toEqual(
125*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
126*90c8c64dSAndroid Build Coastguard Worker    );
127*90c8c64dSAndroid Build Coastguard Worker    expect(
128*90c8c64dSAndroid Build Coastguard Worker      await slice.findFirstGreaterOrEqualEntry(time10)?.getValue(),
129*90c8c64dSAndroid Build Coastguard Worker    ).toEqual('entry-1');
130*90c8c64dSAndroid Build Coastguard Worker    expect(
131*90c8c64dSAndroid Build Coastguard Worker      await slice.findFirstGreaterOrEqualEntry(time11)?.getValue(),
132*90c8c64dSAndroid Build Coastguard Worker    ).toEqual('entry-1');
133*90c8c64dSAndroid Build Coastguard Worker    expect(
134*90c8c64dSAndroid Build Coastguard Worker      await slice.findFirstGreaterOrEqualEntry(time12)?.getValue(),
135*90c8c64dSAndroid Build Coastguard Worker    ).toEqual('entry-3');
136*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findFirstGreaterOrEqualEntry(time13)).toBeUndefined();
137*90c8c64dSAndroid Build Coastguard Worker
138*90c8c64dSAndroid Build Coastguard Worker    // full trace
139*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findFirstGreaterOrEqualEntry(time9)?.getValue()).toEqual(
140*90c8c64dSAndroid Build Coastguard Worker      'entry-0',
141*90c8c64dSAndroid Build Coastguard Worker    );
142*90c8c64dSAndroid Build Coastguard Worker    expect(
143*90c8c64dSAndroid Build Coastguard Worker      await trace.findFirstGreaterOrEqualEntry(time10)?.getValue(),
144*90c8c64dSAndroid Build Coastguard Worker    ).toEqual('entry-0');
145*90c8c64dSAndroid Build Coastguard Worker    expect(
146*90c8c64dSAndroid Build Coastguard Worker      await trace.findFirstGreaterOrEqualEntry(time11)?.getValue(),
147*90c8c64dSAndroid Build Coastguard Worker    ).toEqual('entry-1');
148*90c8c64dSAndroid Build Coastguard Worker    expect(
149*90c8c64dSAndroid Build Coastguard Worker      await trace.findFirstGreaterOrEqualEntry(time12)?.getValue(),
150*90c8c64dSAndroid Build Coastguard Worker    ).toEqual('entry-3');
151*90c8c64dSAndroid Build Coastguard Worker    expect(
152*90c8c64dSAndroid Build Coastguard Worker      await trace.findFirstGreaterOrEqualEntry(time13)?.getValue(),
153*90c8c64dSAndroid Build Coastguard Worker    ).toEqual('entry-4');
154*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findFirstGreaterOrEqualEntry(time14)).toBeUndefined();
155*90c8c64dSAndroid Build Coastguard Worker  });
156*90c8c64dSAndroid Build Coastguard Worker
157*90c8c64dSAndroid Build Coastguard Worker  it('findFirstGreaterEntry()', async () => {
158*90c8c64dSAndroid Build Coastguard Worker    // empty
159*90c8c64dSAndroid Build Coastguard Worker    expect(
160*90c8c64dSAndroid Build Coastguard Worker      trace.sliceEntries(0, 0).findFirstGreaterEntry(time10),
161*90c8c64dSAndroid Build Coastguard Worker    ).toBeUndefined();
162*90c8c64dSAndroid Build Coastguard Worker
163*90c8c64dSAndroid Build Coastguard Worker    // slice
164*90c8c64dSAndroid Build Coastguard Worker    const slice = trace.sliceEntries(1, -1);
165*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findFirstGreaterEntry(time9)?.getValue()).toEqual(
166*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
167*90c8c64dSAndroid Build Coastguard Worker    );
168*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findFirstGreaterEntry(time10)?.getValue()).toEqual(
169*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
170*90c8c64dSAndroid Build Coastguard Worker    );
171*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findFirstGreaterEntry(time11)?.getValue()).toEqual(
172*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
173*90c8c64dSAndroid Build Coastguard Worker    );
174*90c8c64dSAndroid Build Coastguard Worker    expect(slice.findFirstGreaterEntry(time12)).toBeUndefined();
175*90c8c64dSAndroid Build Coastguard Worker
176*90c8c64dSAndroid Build Coastguard Worker    // full trace
177*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findFirstGreaterEntry(time9)?.getValue()).toEqual(
178*90c8c64dSAndroid Build Coastguard Worker      'entry-0',
179*90c8c64dSAndroid Build Coastguard Worker    );
180*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findFirstGreaterEntry(time10)?.getValue()).toEqual(
181*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
182*90c8c64dSAndroid Build Coastguard Worker    );
183*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findFirstGreaterEntry(time11)?.getValue()).toEqual(
184*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
185*90c8c64dSAndroid Build Coastguard Worker    );
186*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findFirstGreaterEntry(time12)?.getValue()).toEqual(
187*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
188*90c8c64dSAndroid Build Coastguard Worker    );
189*90c8c64dSAndroid Build Coastguard Worker    expect(trace.findFirstGreaterEntry(time13)).toBeUndefined();
190*90c8c64dSAndroid Build Coastguard Worker  });
191*90c8c64dSAndroid Build Coastguard Worker
192*90c8c64dSAndroid Build Coastguard Worker  it('findLastLowerOrEqualEntry()', async () => {
193*90c8c64dSAndroid Build Coastguard Worker    // empty
194*90c8c64dSAndroid Build Coastguard Worker    expect(
195*90c8c64dSAndroid Build Coastguard Worker      trace.sliceEntries(0, 0).findLastLowerOrEqualEntry(time10),
196*90c8c64dSAndroid Build Coastguard Worker    ).toBeUndefined();
197*90c8c64dSAndroid Build Coastguard Worker
198*90c8c64dSAndroid Build Coastguard Worker    // slice
199*90c8c64dSAndroid Build Coastguard Worker    const slice = trace.sliceEntries(1, -1);
200*90c8c64dSAndroid Build Coastguard Worker    expect(slice.findLastLowerOrEqualEntry(time9)).toBeUndefined();
201*90c8c64dSAndroid Build Coastguard Worker    expect(slice.findLastLowerOrEqualEntry(time10)).toBeUndefined();
202*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findLastLowerOrEqualEntry(time11)?.getValue()).toEqual(
203*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
204*90c8c64dSAndroid Build Coastguard Worker    );
205*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findLastLowerOrEqualEntry(time12)?.getValue()).toEqual(
206*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
207*90c8c64dSAndroid Build Coastguard Worker    );
208*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findLastLowerOrEqualEntry(time13)?.getValue()).toEqual(
209*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
210*90c8c64dSAndroid Build Coastguard Worker    );
211*90c8c64dSAndroid Build Coastguard Worker
212*90c8c64dSAndroid Build Coastguard Worker    // full trace
213*90c8c64dSAndroid Build Coastguard Worker    expect(trace.findLastLowerOrEqualEntry(time9)).toBeUndefined();
214*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findLastLowerOrEqualEntry(time10)?.getValue()).toEqual(
215*90c8c64dSAndroid Build Coastguard Worker      'entry-0',
216*90c8c64dSAndroid Build Coastguard Worker    );
217*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findLastLowerOrEqualEntry(time11)?.getValue()).toEqual(
218*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
219*90c8c64dSAndroid Build Coastguard Worker    );
220*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findLastLowerOrEqualEntry(time12)?.getValue()).toEqual(
221*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
222*90c8c64dSAndroid Build Coastguard Worker    );
223*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findLastLowerOrEqualEntry(time13)?.getValue()).toEqual(
224*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
225*90c8c64dSAndroid Build Coastguard Worker    );
226*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findLastLowerOrEqualEntry(time14)?.getValue()).toEqual(
227*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
228*90c8c64dSAndroid Build Coastguard Worker    );
229*90c8c64dSAndroid Build Coastguard Worker  });
230*90c8c64dSAndroid Build Coastguard Worker
231*90c8c64dSAndroid Build Coastguard Worker  it('findLastLowerEntry()', async () => {
232*90c8c64dSAndroid Build Coastguard Worker    // empty
233*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(0, 0).findLastLowerEntry(time10)).toBeUndefined();
234*90c8c64dSAndroid Build Coastguard Worker
235*90c8c64dSAndroid Build Coastguard Worker    // slice
236*90c8c64dSAndroid Build Coastguard Worker    const slice = trace.sliceEntries(1, -1);
237*90c8c64dSAndroid Build Coastguard Worker    expect(slice.findLastLowerEntry(time9)).toBeUndefined();
238*90c8c64dSAndroid Build Coastguard Worker    expect(slice.findLastLowerEntry(time10)).toBeUndefined();
239*90c8c64dSAndroid Build Coastguard Worker    expect(slice.findLastLowerEntry(time11)).toBeUndefined();
240*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findLastLowerEntry(time12)?.getValue()).toEqual(
241*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
242*90c8c64dSAndroid Build Coastguard Worker    );
243*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findLastLowerEntry(time13)?.getValue()).toEqual(
244*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
245*90c8c64dSAndroid Build Coastguard Worker    );
246*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findLastLowerEntry(time14)?.getValue()).toEqual(
247*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
248*90c8c64dSAndroid Build Coastguard Worker    );
249*90c8c64dSAndroid Build Coastguard Worker    expect(await slice.findLastLowerEntry(time15)?.getValue()).toEqual(
250*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
251*90c8c64dSAndroid Build Coastguard Worker    );
252*90c8c64dSAndroid Build Coastguard Worker
253*90c8c64dSAndroid Build Coastguard Worker    // full trace
254*90c8c64dSAndroid Build Coastguard Worker    expect(trace.findLastLowerEntry(time9)).toBeUndefined();
255*90c8c64dSAndroid Build Coastguard Worker    expect(trace.findLastLowerEntry(time10)).toBeUndefined();
256*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findLastLowerEntry(time11)?.getValue()).toEqual(
257*90c8c64dSAndroid Build Coastguard Worker      'entry-0',
258*90c8c64dSAndroid Build Coastguard Worker    );
259*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findLastLowerEntry(time12)?.getValue()).toEqual(
260*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
261*90c8c64dSAndroid Build Coastguard Worker    );
262*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findLastLowerEntry(time13)?.getValue()).toEqual(
263*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
264*90c8c64dSAndroid Build Coastguard Worker    );
265*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findLastLowerEntry(time14)?.getValue()).toEqual(
266*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
267*90c8c64dSAndroid Build Coastguard Worker    );
268*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.findLastLowerEntry(time15)?.getValue()).toEqual(
269*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
270*90c8c64dSAndroid Build Coastguard Worker    );
271*90c8c64dSAndroid Build Coastguard Worker  });
272*90c8c64dSAndroid Build Coastguard Worker
273*90c8c64dSAndroid Build Coastguard Worker  // Hint: look at frame mapping specified in test's set up to fully understand the assertions
274*90c8c64dSAndroid Build Coastguard Worker  it('sliceEntries()', async () => {
275*90c8c64dSAndroid Build Coastguard Worker    const slice = trace.sliceEntries(1, 4);
276*90c8c64dSAndroid Build Coastguard Worker
277*90c8c64dSAndroid Build Coastguard Worker    const expectedEntriesFull = ['entry-1', 'entry-2', 'entry-3'];
278*90c8c64dSAndroid Build Coastguard Worker    const expectedFramesEmpty = new Map<AbsoluteFrameIndex, string[]>();
279*90c8c64dSAndroid Build Coastguard Worker    const expectedFramesFull = new Map<AbsoluteFrameIndex, string[]>([
280*90c8c64dSAndroid Build Coastguard Worker      [1, ['entry-1', 'entry-2']],
281*90c8c64dSAndroid Build Coastguard Worker      [2, []],
282*90c8c64dSAndroid Build Coastguard Worker      [3, []],
283*90c8c64dSAndroid Build Coastguard Worker      [4, ['entry-3']],
284*90c8c64dSAndroid Build Coastguard Worker      [5, ['entry-3']],
285*90c8c64dSAndroid Build Coastguard Worker    ]);
286*90c8c64dSAndroid Build Coastguard Worker
287*90c8c64dSAndroid Build Coastguard Worker    // empty
288*90c8c64dSAndroid Build Coastguard Worker    {
289*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(1, 1))).toEqual(
290*90c8c64dSAndroid Build Coastguard Worker        expectedFramesEmpty,
291*90c8c64dSAndroid Build Coastguard Worker      );
292*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries(1, 1))).toEqual(
293*90c8c64dSAndroid Build Coastguard Worker        [],
294*90c8c64dSAndroid Build Coastguard Worker      );
295*90c8c64dSAndroid Build Coastguard Worker
296*90c8c64dSAndroid Build Coastguard Worker      expect(
297*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceEntries(-1, -1)),
298*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
299*90c8c64dSAndroid Build Coastguard Worker      expect(
300*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceEntries(-1, -1)),
301*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
302*90c8c64dSAndroid Build Coastguard Worker
303*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(2, 1))).toEqual(
304*90c8c64dSAndroid Build Coastguard Worker        expectedFramesEmpty,
305*90c8c64dSAndroid Build Coastguard Worker      );
306*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries(2, 1))).toEqual(
307*90c8c64dSAndroid Build Coastguard Worker        [],
308*90c8c64dSAndroid Build Coastguard Worker      );
309*90c8c64dSAndroid Build Coastguard Worker
310*90c8c64dSAndroid Build Coastguard Worker      expect(
311*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceEntries(-1, -2)),
312*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
313*90c8c64dSAndroid Build Coastguard Worker      expect(
314*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceEntries(-1, -2)),
315*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
316*90c8c64dSAndroid Build Coastguard Worker    }
317*90c8c64dSAndroid Build Coastguard Worker
318*90c8c64dSAndroid Build Coastguard Worker    // full
319*90c8c64dSAndroid Build Coastguard Worker    {
320*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries())).toEqual(
321*90c8c64dSAndroid Build Coastguard Worker        expectedEntriesFull,
322*90c8c64dSAndroid Build Coastguard Worker      );
323*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries())).toEqual(
324*90c8c64dSAndroid Build Coastguard Worker        expectedFramesFull,
325*90c8c64dSAndroid Build Coastguard Worker      );
326*90c8c64dSAndroid Build Coastguard Worker
327*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries(0))).toEqual(
328*90c8c64dSAndroid Build Coastguard Worker        expectedEntriesFull,
329*90c8c64dSAndroid Build Coastguard Worker      );
330*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(0))).toEqual(
331*90c8c64dSAndroid Build Coastguard Worker        expectedFramesFull,
332*90c8c64dSAndroid Build Coastguard Worker      );
333*90c8c64dSAndroid Build Coastguard Worker
334*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries(0, 3))).toEqual(
335*90c8c64dSAndroid Build Coastguard Worker        expectedEntriesFull,
336*90c8c64dSAndroid Build Coastguard Worker      );
337*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(0, 3))).toEqual(
338*90c8c64dSAndroid Build Coastguard Worker        expectedFramesFull,
339*90c8c64dSAndroid Build Coastguard Worker      );
340*90c8c64dSAndroid Build Coastguard Worker
341*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries(-3))).toEqual(
342*90c8c64dSAndroid Build Coastguard Worker        expectedEntriesFull,
343*90c8c64dSAndroid Build Coastguard Worker      );
344*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(-3))).toEqual(
345*90c8c64dSAndroid Build Coastguard Worker        expectedFramesFull,
346*90c8c64dSAndroid Build Coastguard Worker      );
347*90c8c64dSAndroid Build Coastguard Worker
348*90c8c64dSAndroid Build Coastguard Worker      expect(
349*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceEntries(-3, 3)),
350*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedEntriesFull);
351*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(-3, 3))).toEqual(
352*90c8c64dSAndroid Build Coastguard Worker        expectedFramesFull,
353*90c8c64dSAndroid Build Coastguard Worker      );
354*90c8c64dSAndroid Build Coastguard Worker    }
355*90c8c64dSAndroid Build Coastguard Worker
356*90c8c64dSAndroid Build Coastguard Worker    // slice away front (positive index)
357*90c8c64dSAndroid Build Coastguard Worker    {
358*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries(1))).toEqual([
359*90c8c64dSAndroid Build Coastguard Worker        'entry-2',
360*90c8c64dSAndroid Build Coastguard Worker        'entry-3',
361*90c8c64dSAndroid Build Coastguard Worker      ]);
362*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(1))).toEqual(
363*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
364*90c8c64dSAndroid Build Coastguard Worker          [1, ['entry-2']],
365*90c8c64dSAndroid Build Coastguard Worker          [2, []],
366*90c8c64dSAndroid Build Coastguard Worker          [3, []],
367*90c8c64dSAndroid Build Coastguard Worker          [4, ['entry-3']],
368*90c8c64dSAndroid Build Coastguard Worker          [5, ['entry-3']],
369*90c8c64dSAndroid Build Coastguard Worker        ]),
370*90c8c64dSAndroid Build Coastguard Worker      );
371*90c8c64dSAndroid Build Coastguard Worker
372*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries(2))).toEqual([
373*90c8c64dSAndroid Build Coastguard Worker        'entry-3',
374*90c8c64dSAndroid Build Coastguard Worker      ]);
375*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(2))).toEqual(
376*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
377*90c8c64dSAndroid Build Coastguard Worker          [4, ['entry-3']],
378*90c8c64dSAndroid Build Coastguard Worker          [5, ['entry-3']],
379*90c8c64dSAndroid Build Coastguard Worker        ]),
380*90c8c64dSAndroid Build Coastguard Worker      );
381*90c8c64dSAndroid Build Coastguard Worker
382*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries(3))).toEqual(
383*90c8c64dSAndroid Build Coastguard Worker        [],
384*90c8c64dSAndroid Build Coastguard Worker      );
385*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(3))).toEqual(
386*90c8c64dSAndroid Build Coastguard Worker        expectedFramesEmpty,
387*90c8c64dSAndroid Build Coastguard Worker      );
388*90c8c64dSAndroid Build Coastguard Worker
389*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries(4))).toEqual(
390*90c8c64dSAndroid Build Coastguard Worker        [],
391*90c8c64dSAndroid Build Coastguard Worker      );
392*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(4))).toEqual(
393*90c8c64dSAndroid Build Coastguard Worker        expectedFramesEmpty,
394*90c8c64dSAndroid Build Coastguard Worker      );
395*90c8c64dSAndroid Build Coastguard Worker
396*90c8c64dSAndroid Build Coastguard Worker      expect(
397*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceEntries(1000000)),
398*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
399*90c8c64dSAndroid Build Coastguard Worker      expect(
400*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceEntries(1000000)),
401*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
402*90c8c64dSAndroid Build Coastguard Worker    }
403*90c8c64dSAndroid Build Coastguard Worker
404*90c8c64dSAndroid Build Coastguard Worker    // slice away front (negative index)
405*90c8c64dSAndroid Build Coastguard Worker    {
406*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries(-3))).toEqual(
407*90c8c64dSAndroid Build Coastguard Worker        expectedEntriesFull,
408*90c8c64dSAndroid Build Coastguard Worker      );
409*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(-3))).toEqual(
410*90c8c64dSAndroid Build Coastguard Worker        expectedFramesFull,
411*90c8c64dSAndroid Build Coastguard Worker      );
412*90c8c64dSAndroid Build Coastguard Worker
413*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries(-2))).toEqual([
414*90c8c64dSAndroid Build Coastguard Worker        'entry-2',
415*90c8c64dSAndroid Build Coastguard Worker        'entry-3',
416*90c8c64dSAndroid Build Coastguard Worker      ]);
417*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(-2))).toEqual(
418*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
419*90c8c64dSAndroid Build Coastguard Worker          [1, ['entry-2']],
420*90c8c64dSAndroid Build Coastguard Worker          [2, []],
421*90c8c64dSAndroid Build Coastguard Worker          [3, []],
422*90c8c64dSAndroid Build Coastguard Worker          [4, ['entry-3']],
423*90c8c64dSAndroid Build Coastguard Worker          [5, ['entry-3']],
424*90c8c64dSAndroid Build Coastguard Worker        ]),
425*90c8c64dSAndroid Build Coastguard Worker      );
426*90c8c64dSAndroid Build Coastguard Worker
427*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceEntries(-1))).toEqual([
428*90c8c64dSAndroid Build Coastguard Worker        'entry-3',
429*90c8c64dSAndroid Build Coastguard Worker      ]);
430*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceEntries(-1))).toEqual(
431*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
432*90c8c64dSAndroid Build Coastguard Worker          [4, ['entry-3']],
433*90c8c64dSAndroid Build Coastguard Worker          [5, ['entry-3']],
434*90c8c64dSAndroid Build Coastguard Worker        ]),
435*90c8c64dSAndroid Build Coastguard Worker      );
436*90c8c64dSAndroid Build Coastguard Worker    }
437*90c8c64dSAndroid Build Coastguard Worker
438*90c8c64dSAndroid Build Coastguard Worker    // slice away back (positive index)
439*90c8c64dSAndroid Build Coastguard Worker    {
440*90c8c64dSAndroid Build Coastguard Worker      expect(
441*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceEntries(undefined, 2)),
442*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(['entry-1', 'entry-2']);
443*90c8c64dSAndroid Build Coastguard Worker      expect(
444*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceEntries(undefined, 2)),
445*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(
446*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1', 'entry-2']]]),
447*90c8c64dSAndroid Build Coastguard Worker      );
448*90c8c64dSAndroid Build Coastguard Worker
449*90c8c64dSAndroid Build Coastguard Worker      expect(
450*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceEntries(undefined, 1)),
451*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(['entry-1']);
452*90c8c64dSAndroid Build Coastguard Worker      expect(
453*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceEntries(undefined, 1)),
454*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1']]]));
455*90c8c64dSAndroid Build Coastguard Worker
456*90c8c64dSAndroid Build Coastguard Worker      expect(
457*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceEntries(undefined, 0)),
458*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
459*90c8c64dSAndroid Build Coastguard Worker      expect(
460*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceEntries(undefined, 0)),
461*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
462*90c8c64dSAndroid Build Coastguard Worker    }
463*90c8c64dSAndroid Build Coastguard Worker
464*90c8c64dSAndroid Build Coastguard Worker    // slice away back (negative index)
465*90c8c64dSAndroid Build Coastguard Worker    {
466*90c8c64dSAndroid Build Coastguard Worker      expect(
467*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceEntries(undefined, -1)),
468*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(['entry-1', 'entry-2']);
469*90c8c64dSAndroid Build Coastguard Worker      expect(
470*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceEntries(undefined, -1)),
471*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(
472*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1', 'entry-2']]]),
473*90c8c64dSAndroid Build Coastguard Worker      );
474*90c8c64dSAndroid Build Coastguard Worker
475*90c8c64dSAndroid Build Coastguard Worker      expect(
476*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceEntries(undefined, -2)),
477*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(['entry-1']);
478*90c8c64dSAndroid Build Coastguard Worker      expect(
479*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceEntries(undefined, -2)),
480*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1']]]));
481*90c8c64dSAndroid Build Coastguard Worker
482*90c8c64dSAndroid Build Coastguard Worker      expect(
483*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceEntries(undefined, -3)),
484*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
485*90c8c64dSAndroid Build Coastguard Worker      expect(
486*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceEntries(undefined, -3)),
487*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
488*90c8c64dSAndroid Build Coastguard Worker
489*90c8c64dSAndroid Build Coastguard Worker      expect(
490*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceEntries(undefined, -4)),
491*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
492*90c8c64dSAndroid Build Coastguard Worker      expect(
493*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceEntries(undefined, -4)),
494*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
495*90c8c64dSAndroid Build Coastguard Worker
496*90c8c64dSAndroid Build Coastguard Worker      expect(
497*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(
498*90c8c64dSAndroid Build Coastguard Worker          slice.sliceEntries(undefined, -1000000),
499*90c8c64dSAndroid Build Coastguard Worker        ),
500*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
501*90c8c64dSAndroid Build Coastguard Worker      expect(
502*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceEntries(undefined, -1000000)),
503*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
504*90c8c64dSAndroid Build Coastguard Worker    }
505*90c8c64dSAndroid Build Coastguard Worker  });
506*90c8c64dSAndroid Build Coastguard Worker
507*90c8c64dSAndroid Build Coastguard Worker  // Hint: look at frame mapping specified in test's set up to fully understand the assertions
508*90c8c64dSAndroid Build Coastguard Worker  it('sliceTime()', async () => {
509*90c8c64dSAndroid Build Coastguard Worker    const slice = trace.sliceTime(time11, time13); // drop first + last entries
510*90c8c64dSAndroid Build Coastguard Worker
511*90c8c64dSAndroid Build Coastguard Worker    const expectedEntriesFull = ['entry-1', 'entry-2', 'entry-3'];
512*90c8c64dSAndroid Build Coastguard Worker    const expectedFramesEmpty = new Map<AbsoluteFrameIndex, string[]>();
513*90c8c64dSAndroid Build Coastguard Worker    const expectedFramesFull = new Map<AbsoluteFrameIndex, string[]>([
514*90c8c64dSAndroid Build Coastguard Worker      [1, ['entry-1', 'entry-2']],
515*90c8c64dSAndroid Build Coastguard Worker      [2, []],
516*90c8c64dSAndroid Build Coastguard Worker      [3, []],
517*90c8c64dSAndroid Build Coastguard Worker      [4, ['entry-3']],
518*90c8c64dSAndroid Build Coastguard Worker      [5, ['entry-3']],
519*90c8c64dSAndroid Build Coastguard Worker    ]);
520*90c8c64dSAndroid Build Coastguard Worker
521*90c8c64dSAndroid Build Coastguard Worker    // empty
522*90c8c64dSAndroid Build Coastguard Worker    {
523*90c8c64dSAndroid Build Coastguard Worker      expect(
524*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(time11, time11)),
525*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
526*90c8c64dSAndroid Build Coastguard Worker      expect(
527*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(time11, time11)),
528*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
529*90c8c64dSAndroid Build Coastguard Worker
530*90c8c64dSAndroid Build Coastguard Worker      expect(
531*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(time11, time10)),
532*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
533*90c8c64dSAndroid Build Coastguard Worker      expect(
534*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(time11, time10)),
535*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
536*90c8c64dSAndroid Build Coastguard Worker
537*90c8c64dSAndroid Build Coastguard Worker      expect(
538*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(time9, time10)),
539*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
540*90c8c64dSAndroid Build Coastguard Worker      expect(
541*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(time9, time10)),
542*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
543*90c8c64dSAndroid Build Coastguard Worker
544*90c8c64dSAndroid Build Coastguard Worker      expect(
545*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(time10, time9)),
546*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
547*90c8c64dSAndroid Build Coastguard Worker      expect(
548*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(time10, time9)),
549*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
550*90c8c64dSAndroid Build Coastguard Worker
551*90c8c64dSAndroid Build Coastguard Worker      expect(
552*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(time14, time15)),
553*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
554*90c8c64dSAndroid Build Coastguard Worker      expect(
555*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(time14, time15)),
556*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
557*90c8c64dSAndroid Build Coastguard Worker
558*90c8c64dSAndroid Build Coastguard Worker      expect(
559*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(time15, time14)),
560*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
561*90c8c64dSAndroid Build Coastguard Worker      expect(
562*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(time15, time14)),
563*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
564*90c8c64dSAndroid Build Coastguard Worker    }
565*90c8c64dSAndroid Build Coastguard Worker
566*90c8c64dSAndroid Build Coastguard Worker    // full
567*90c8c64dSAndroid Build Coastguard Worker    {
568*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceTime())).toEqual(
569*90c8c64dSAndroid Build Coastguard Worker        expectedEntriesFull,
570*90c8c64dSAndroid Build Coastguard Worker      );
571*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceTime())).toEqual(
572*90c8c64dSAndroid Build Coastguard Worker        expectedFramesFull,
573*90c8c64dSAndroid Build Coastguard Worker      );
574*90c8c64dSAndroid Build Coastguard Worker
575*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceTime(time9))).toEqual(
576*90c8c64dSAndroid Build Coastguard Worker        expectedEntriesFull,
577*90c8c64dSAndroid Build Coastguard Worker      );
578*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceTime(time9))).toEqual(
579*90c8c64dSAndroid Build Coastguard Worker        expectedFramesFull,
580*90c8c64dSAndroid Build Coastguard Worker      );
581*90c8c64dSAndroid Build Coastguard Worker
582*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceTime(time10))).toEqual(
583*90c8c64dSAndroid Build Coastguard Worker        expectedEntriesFull,
584*90c8c64dSAndroid Build Coastguard Worker      );
585*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceTime(time10))).toEqual(
586*90c8c64dSAndroid Build Coastguard Worker        expectedFramesFull,
587*90c8c64dSAndroid Build Coastguard Worker      );
588*90c8c64dSAndroid Build Coastguard Worker
589*90c8c64dSAndroid Build Coastguard Worker      expect(
590*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(undefined, time14)),
591*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedEntriesFull);
592*90c8c64dSAndroid Build Coastguard Worker      expect(
593*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(undefined, time14)),
594*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesFull);
595*90c8c64dSAndroid Build Coastguard Worker
596*90c8c64dSAndroid Build Coastguard Worker      expect(
597*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(undefined, time15)),
598*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedEntriesFull);
599*90c8c64dSAndroid Build Coastguard Worker      expect(
600*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(undefined, time15)),
601*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesFull);
602*90c8c64dSAndroid Build Coastguard Worker
603*90c8c64dSAndroid Build Coastguard Worker      expect(
604*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(time10, time14)),
605*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedEntriesFull);
606*90c8c64dSAndroid Build Coastguard Worker      expect(
607*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(time10, time14)),
608*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesFull);
609*90c8c64dSAndroid Build Coastguard Worker    }
610*90c8c64dSAndroid Build Coastguard Worker
611*90c8c64dSAndroid Build Coastguard Worker    // middle
612*90c8c64dSAndroid Build Coastguard Worker    {
613*90c8c64dSAndroid Build Coastguard Worker      expect(
614*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(time12, time13)),
615*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(['entry-3']);
616*90c8c64dSAndroid Build Coastguard Worker      expect(
617*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(time12, time13)),
618*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(
619*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
620*90c8c64dSAndroid Build Coastguard Worker          [4, ['entry-3']],
621*90c8c64dSAndroid Build Coastguard Worker          [5, ['entry-3']],
622*90c8c64dSAndroid Build Coastguard Worker        ]),
623*90c8c64dSAndroid Build Coastguard Worker      );
624*90c8c64dSAndroid Build Coastguard Worker    }
625*90c8c64dSAndroid Build Coastguard Worker
626*90c8c64dSAndroid Build Coastguard Worker    // slice away front
627*90c8c64dSAndroid Build Coastguard Worker    {
628*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceTime(time12))).toEqual([
629*90c8c64dSAndroid Build Coastguard Worker        'entry-3',
630*90c8c64dSAndroid Build Coastguard Worker      ]);
631*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceTime(time12))).toEqual(
632*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
633*90c8c64dSAndroid Build Coastguard Worker          [4, ['entry-3']],
634*90c8c64dSAndroid Build Coastguard Worker          [5, ['entry-3']],
635*90c8c64dSAndroid Build Coastguard Worker        ]),
636*90c8c64dSAndroid Build Coastguard Worker      );
637*90c8c64dSAndroid Build Coastguard Worker
638*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceTime(time13))).toEqual(
639*90c8c64dSAndroid Build Coastguard Worker        [],
640*90c8c64dSAndroid Build Coastguard Worker      );
641*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceTime(time13))).toEqual(
642*90c8c64dSAndroid Build Coastguard Worker        expectedFramesEmpty,
643*90c8c64dSAndroid Build Coastguard Worker      );
644*90c8c64dSAndroid Build Coastguard Worker
645*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceTime(time14))).toEqual(
646*90c8c64dSAndroid Build Coastguard Worker        [],
647*90c8c64dSAndroid Build Coastguard Worker      );
648*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceTime(time14))).toEqual(
649*90c8c64dSAndroid Build Coastguard Worker        expectedFramesEmpty,
650*90c8c64dSAndroid Build Coastguard Worker      );
651*90c8c64dSAndroid Build Coastguard Worker
652*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceTime(time15))).toEqual(
653*90c8c64dSAndroid Build Coastguard Worker        [],
654*90c8c64dSAndroid Build Coastguard Worker      );
655*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceTime(time15))).toEqual(
656*90c8c64dSAndroid Build Coastguard Worker        expectedFramesEmpty,
657*90c8c64dSAndroid Build Coastguard Worker      );
658*90c8c64dSAndroid Build Coastguard Worker    }
659*90c8c64dSAndroid Build Coastguard Worker
660*90c8c64dSAndroid Build Coastguard Worker    // slice away back
661*90c8c64dSAndroid Build Coastguard Worker    {
662*90c8c64dSAndroid Build Coastguard Worker      expect(
663*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(undefined, time12)),
664*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(['entry-1', 'entry-2']);
665*90c8c64dSAndroid Build Coastguard Worker      expect(
666*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(undefined, time12)),
667*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(
668*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1', 'entry-2']]]),
669*90c8c64dSAndroid Build Coastguard Worker      );
670*90c8c64dSAndroid Build Coastguard Worker
671*90c8c64dSAndroid Build Coastguard Worker      expect(
672*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(undefined, time11)),
673*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
674*90c8c64dSAndroid Build Coastguard Worker      expect(
675*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(undefined, time11)),
676*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
677*90c8c64dSAndroid Build Coastguard Worker
678*90c8c64dSAndroid Build Coastguard Worker      expect(
679*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(undefined, time10)),
680*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
681*90c8c64dSAndroid Build Coastguard Worker      expect(
682*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(undefined, time10)),
683*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
684*90c8c64dSAndroid Build Coastguard Worker
685*90c8c64dSAndroid Build Coastguard Worker      expect(
686*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceTime(undefined, time9)),
687*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
688*90c8c64dSAndroid Build Coastguard Worker      expect(
689*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceTime(undefined, time9)),
690*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFramesEmpty);
691*90c8c64dSAndroid Build Coastguard Worker    }
692*90c8c64dSAndroid Build Coastguard Worker  });
693*90c8c64dSAndroid Build Coastguard Worker
694*90c8c64dSAndroid Build Coastguard Worker  // Hint: look at frame mapping specified in test's set up to fully understand the assertions
695*90c8c64dSAndroid Build Coastguard Worker  it('sliceFrames()', async () => {
696*90c8c64dSAndroid Build Coastguard Worker    const slice = trace.sliceEntries(1, -1);
697*90c8c64dSAndroid Build Coastguard Worker
698*90c8c64dSAndroid Build Coastguard Worker    // empty
699*90c8c64dSAndroid Build Coastguard Worker    {
700*90c8c64dSAndroid Build Coastguard Worker      const expectedEntries = new Array<string>();
701*90c8c64dSAndroid Build Coastguard Worker      const expectedFrames = new Map<AbsoluteFrameIndex, string[]>([]);
702*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(1, 1))).toEqual(
703*90c8c64dSAndroid Build Coastguard Worker        expectedEntries,
704*90c8c64dSAndroid Build Coastguard Worker      );
705*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(1, 1))).toEqual(
706*90c8c64dSAndroid Build Coastguard Worker        expectedFrames,
707*90c8c64dSAndroid Build Coastguard Worker      );
708*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(5, 1))).toEqual(
709*90c8c64dSAndroid Build Coastguard Worker        expectedEntries,
710*90c8c64dSAndroid Build Coastguard Worker      );
711*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(5, 1))).toEqual(
712*90c8c64dSAndroid Build Coastguard Worker        expectedFrames,
713*90c8c64dSAndroid Build Coastguard Worker      );
714*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(3, 2))).toEqual(
715*90c8c64dSAndroid Build Coastguard Worker        expectedEntries,
716*90c8c64dSAndroid Build Coastguard Worker      );
717*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(3, 2))).toEqual(
718*90c8c64dSAndroid Build Coastguard Worker        expectedFrames,
719*90c8c64dSAndroid Build Coastguard Worker      );
720*90c8c64dSAndroid Build Coastguard Worker    }
721*90c8c64dSAndroid Build Coastguard Worker
722*90c8c64dSAndroid Build Coastguard Worker    // middle
723*90c8c64dSAndroid Build Coastguard Worker    {
724*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(2, 3))).toEqual(
725*90c8c64dSAndroid Build Coastguard Worker        [],
726*90c8c64dSAndroid Build Coastguard Worker      );
727*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(2, 3))).toEqual(
728*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([[2, []]]),
729*90c8c64dSAndroid Build Coastguard Worker      );
730*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(2, 4))).toEqual(
731*90c8c64dSAndroid Build Coastguard Worker        [],
732*90c8c64dSAndroid Build Coastguard Worker      );
733*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(2, 4))).toEqual(
734*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
735*90c8c64dSAndroid Build Coastguard Worker          [2, []],
736*90c8c64dSAndroid Build Coastguard Worker          [3, []],
737*90c8c64dSAndroid Build Coastguard Worker        ]),
738*90c8c64dSAndroid Build Coastguard Worker      );
739*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(2, 5))).toEqual([
740*90c8c64dSAndroid Build Coastguard Worker        'entry-3',
741*90c8c64dSAndroid Build Coastguard Worker      ]);
742*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(2, 5))).toEqual(
743*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
744*90c8c64dSAndroid Build Coastguard Worker          [2, []],
745*90c8c64dSAndroid Build Coastguard Worker          [3, []],
746*90c8c64dSAndroid Build Coastguard Worker          [4, ['entry-3']],
747*90c8c64dSAndroid Build Coastguard Worker        ]),
748*90c8c64dSAndroid Build Coastguard Worker      );
749*90c8c64dSAndroid Build Coastguard Worker    }
750*90c8c64dSAndroid Build Coastguard Worker
751*90c8c64dSAndroid Build Coastguard Worker    // full
752*90c8c64dSAndroid Build Coastguard Worker    {
753*90c8c64dSAndroid Build Coastguard Worker      const expectedEntries = ['entry-1', 'entry-2', 'entry-3'];
754*90c8c64dSAndroid Build Coastguard Worker      const expectedFrames = new Map<AbsoluteFrameIndex, string[]>([
755*90c8c64dSAndroid Build Coastguard Worker        [1, ['entry-1', 'entry-2']],
756*90c8c64dSAndroid Build Coastguard Worker        [2, []],
757*90c8c64dSAndroid Build Coastguard Worker        [3, []],
758*90c8c64dSAndroid Build Coastguard Worker        [4, ['entry-3']],
759*90c8c64dSAndroid Build Coastguard Worker        [5, ['entry-3']],
760*90c8c64dSAndroid Build Coastguard Worker      ]);
761*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames())).toEqual(
762*90c8c64dSAndroid Build Coastguard Worker        expectedEntries,
763*90c8c64dSAndroid Build Coastguard Worker      );
764*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames())).toEqual(
765*90c8c64dSAndroid Build Coastguard Worker        expectedFrames,
766*90c8c64dSAndroid Build Coastguard Worker      );
767*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(0))).toEqual(
768*90c8c64dSAndroid Build Coastguard Worker        expectedEntries,
769*90c8c64dSAndroid Build Coastguard Worker      );
770*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(0))).toEqual(
771*90c8c64dSAndroid Build Coastguard Worker        expectedFrames,
772*90c8c64dSAndroid Build Coastguard Worker      );
773*90c8c64dSAndroid Build Coastguard Worker      expect(
774*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceFrames(undefined, 6)),
775*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedEntries);
776*90c8c64dSAndroid Build Coastguard Worker      expect(
777*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceFrames(undefined, 6)),
778*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(expectedFrames);
779*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(1, 6))).toEqual(
780*90c8c64dSAndroid Build Coastguard Worker        expectedEntries,
781*90c8c64dSAndroid Build Coastguard Worker      );
782*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(1, 6))).toEqual(
783*90c8c64dSAndroid Build Coastguard Worker        expectedFrames,
784*90c8c64dSAndroid Build Coastguard Worker      );
785*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(0, 7))).toEqual(
786*90c8c64dSAndroid Build Coastguard Worker        expectedEntries,
787*90c8c64dSAndroid Build Coastguard Worker      );
788*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(0, 7))).toEqual(
789*90c8c64dSAndroid Build Coastguard Worker        expectedFrames,
790*90c8c64dSAndroid Build Coastguard Worker      );
791*90c8c64dSAndroid Build Coastguard Worker    }
792*90c8c64dSAndroid Build Coastguard Worker
793*90c8c64dSAndroid Build Coastguard Worker    // slice away front
794*90c8c64dSAndroid Build Coastguard Worker    {
795*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(2))).toEqual([
796*90c8c64dSAndroid Build Coastguard Worker        'entry-3',
797*90c8c64dSAndroid Build Coastguard Worker      ]);
798*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(2))).toEqual(
799*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
800*90c8c64dSAndroid Build Coastguard Worker          [2, []],
801*90c8c64dSAndroid Build Coastguard Worker          [3, []],
802*90c8c64dSAndroid Build Coastguard Worker          [4, ['entry-3']],
803*90c8c64dSAndroid Build Coastguard Worker          [5, ['entry-3']],
804*90c8c64dSAndroid Build Coastguard Worker        ]),
805*90c8c64dSAndroid Build Coastguard Worker      );
806*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(4))).toEqual([
807*90c8c64dSAndroid Build Coastguard Worker        'entry-3',
808*90c8c64dSAndroid Build Coastguard Worker      ]);
809*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(4))).toEqual(
810*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
811*90c8c64dSAndroid Build Coastguard Worker          [4, ['entry-3']],
812*90c8c64dSAndroid Build Coastguard Worker          [5, ['entry-3']],
813*90c8c64dSAndroid Build Coastguard Worker        ]),
814*90c8c64dSAndroid Build Coastguard Worker      );
815*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(5))).toEqual([
816*90c8c64dSAndroid Build Coastguard Worker        'entry-3',
817*90c8c64dSAndroid Build Coastguard Worker      ]);
818*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(5))).toEqual(
819*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([[5, ['entry-3']]]),
820*90c8c64dSAndroid Build Coastguard Worker      );
821*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(6))).toEqual([]);
822*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(6))).toEqual(
823*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([]),
824*90c8c64dSAndroid Build Coastguard Worker      );
825*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(slice.sliceFrames(1000))).toEqual(
826*90c8c64dSAndroid Build Coastguard Worker        [],
827*90c8c64dSAndroid Build Coastguard Worker      );
828*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice.sliceFrames(1000))).toEqual(
829*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([]),
830*90c8c64dSAndroid Build Coastguard Worker      );
831*90c8c64dSAndroid Build Coastguard Worker    }
832*90c8c64dSAndroid Build Coastguard Worker
833*90c8c64dSAndroid Build Coastguard Worker    // slice away back
834*90c8c64dSAndroid Build Coastguard Worker    {
835*90c8c64dSAndroid Build Coastguard Worker      expect(
836*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceFrames(undefined, 6)),
837*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(['entry-1', 'entry-2', 'entry-3']);
838*90c8c64dSAndroid Build Coastguard Worker      expect(
839*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceFrames(undefined, 6)),
840*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(
841*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
842*90c8c64dSAndroid Build Coastguard Worker          [1, ['entry-1', 'entry-2']],
843*90c8c64dSAndroid Build Coastguard Worker          [2, []],
844*90c8c64dSAndroid Build Coastguard Worker          [3, []],
845*90c8c64dSAndroid Build Coastguard Worker          [4, ['entry-3']],
846*90c8c64dSAndroid Build Coastguard Worker          [5, ['entry-3']],
847*90c8c64dSAndroid Build Coastguard Worker        ]),
848*90c8c64dSAndroid Build Coastguard Worker      );
849*90c8c64dSAndroid Build Coastguard Worker      expect(
850*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceFrames(undefined, 5)),
851*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(['entry-1', 'entry-2', 'entry-3']);
852*90c8c64dSAndroid Build Coastguard Worker      expect(
853*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceFrames(undefined, 5)),
854*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(
855*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
856*90c8c64dSAndroid Build Coastguard Worker          [1, ['entry-1', 'entry-2']],
857*90c8c64dSAndroid Build Coastguard Worker          [2, []],
858*90c8c64dSAndroid Build Coastguard Worker          [3, []],
859*90c8c64dSAndroid Build Coastguard Worker          [4, ['entry-3']],
860*90c8c64dSAndroid Build Coastguard Worker        ]),
861*90c8c64dSAndroid Build Coastguard Worker      );
862*90c8c64dSAndroid Build Coastguard Worker      expect(
863*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceFrames(undefined, 4)),
864*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(['entry-1', 'entry-2']);
865*90c8c64dSAndroid Build Coastguard Worker      expect(
866*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceFrames(undefined, 4)),
867*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(
868*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
869*90c8c64dSAndroid Build Coastguard Worker          [1, ['entry-1', 'entry-2']],
870*90c8c64dSAndroid Build Coastguard Worker          [2, []],
871*90c8c64dSAndroid Build Coastguard Worker          [3, []],
872*90c8c64dSAndroid Build Coastguard Worker        ]),
873*90c8c64dSAndroid Build Coastguard Worker      );
874*90c8c64dSAndroid Build Coastguard Worker      expect(
875*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceFrames(undefined, 3)),
876*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(['entry-1', 'entry-2']);
877*90c8c64dSAndroid Build Coastguard Worker      expect(
878*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceFrames(undefined, 3)),
879*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(
880*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([
881*90c8c64dSAndroid Build Coastguard Worker          [1, ['entry-1', 'entry-2']],
882*90c8c64dSAndroid Build Coastguard Worker          [2, []],
883*90c8c64dSAndroid Build Coastguard Worker        ]),
884*90c8c64dSAndroid Build Coastguard Worker      );
885*90c8c64dSAndroid Build Coastguard Worker      expect(
886*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceFrames(undefined, 2)),
887*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(['entry-1', 'entry-2']);
888*90c8c64dSAndroid Build Coastguard Worker      expect(
889*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceFrames(undefined, 2)),
890*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(
891*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>([[1, ['entry-1', 'entry-2']]]),
892*90c8c64dSAndroid Build Coastguard Worker      );
893*90c8c64dSAndroid Build Coastguard Worker      expect(
894*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceFrames(undefined, 1)),
895*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
896*90c8c64dSAndroid Build Coastguard Worker      expect(
897*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceFrames(undefined, 1)),
898*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(new Map<AbsoluteFrameIndex, string[]>());
899*90c8c64dSAndroid Build Coastguard Worker      expect(
900*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractEntries(slice.sliceFrames(undefined, 0)),
901*90c8c64dSAndroid Build Coastguard Worker      ).toEqual([]);
902*90c8c64dSAndroid Build Coastguard Worker      expect(
903*90c8c64dSAndroid Build Coastguard Worker        await TraceUtils.extractFrames(slice.sliceFrames(undefined, 0)),
904*90c8c64dSAndroid Build Coastguard Worker      ).toEqual(new Map<AbsoluteFrameIndex, string[]>());
905*90c8c64dSAndroid Build Coastguard Worker    }
906*90c8c64dSAndroid Build Coastguard Worker  });
907*90c8c64dSAndroid Build Coastguard Worker
908*90c8c64dSAndroid Build Coastguard Worker  it('can slice full trace', async () => {
909*90c8c64dSAndroid Build Coastguard Worker    // entries
910*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceEntries(1, 1))).toEqual(
911*90c8c64dSAndroid Build Coastguard Worker      [],
912*90c8c64dSAndroid Build Coastguard Worker    );
913*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceEntries())).toEqual([
914*90c8c64dSAndroid Build Coastguard Worker      'entry-0',
915*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
916*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
917*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
918*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
919*90c8c64dSAndroid Build Coastguard Worker    ]);
920*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceEntries(2))).toEqual([
921*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
922*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
923*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
924*90c8c64dSAndroid Build Coastguard Worker    ]);
925*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceEntries(-3))).toEqual([
926*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
927*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
928*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
929*90c8c64dSAndroid Build Coastguard Worker    ]);
930*90c8c64dSAndroid Build Coastguard Worker    expect(
931*90c8c64dSAndroid Build Coastguard Worker      await TraceUtils.extractEntries(trace.sliceEntries(undefined, 3)),
932*90c8c64dSAndroid Build Coastguard Worker    ).toEqual(['entry-0', 'entry-1', 'entry-2']);
933*90c8c64dSAndroid Build Coastguard Worker    expect(
934*90c8c64dSAndroid Build Coastguard Worker      await TraceUtils.extractEntries(trace.sliceEntries(undefined, -2)),
935*90c8c64dSAndroid Build Coastguard Worker    ).toEqual(['entry-0', 'entry-1', 'entry-2']);
936*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceEntries(1, 4))).toEqual([
937*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
938*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
939*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
940*90c8c64dSAndroid Build Coastguard Worker    ]);
941*90c8c64dSAndroid Build Coastguard Worker
942*90c8c64dSAndroid Build Coastguard Worker    // time
943*90c8c64dSAndroid Build Coastguard Worker    const time12 = TimestampConverterUtils.makeRealTimestamp(12n);
944*90c8c64dSAndroid Build Coastguard Worker    const time13 = TimestampConverterUtils.makeRealTimestamp(13n);
945*90c8c64dSAndroid Build Coastguard Worker    expect(
946*90c8c64dSAndroid Build Coastguard Worker      await TraceUtils.extractEntries(trace.sliceTime(time12, time12)),
947*90c8c64dSAndroid Build Coastguard Worker    ).toEqual([]);
948*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceTime())).toEqual([
949*90c8c64dSAndroid Build Coastguard Worker      'entry-0',
950*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
951*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
952*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
953*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
954*90c8c64dSAndroid Build Coastguard Worker    ]);
955*90c8c64dSAndroid Build Coastguard Worker    expect(
956*90c8c64dSAndroid Build Coastguard Worker      await TraceUtils.extractEntries(trace.sliceTime(time12, time13)),
957*90c8c64dSAndroid Build Coastguard Worker    ).toEqual(['entry-3']);
958*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceTime(time12))).toEqual([
959*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
960*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
961*90c8c64dSAndroid Build Coastguard Worker    ]);
962*90c8c64dSAndroid Build Coastguard Worker    expect(
963*90c8c64dSAndroid Build Coastguard Worker      await TraceUtils.extractEntries(trace.sliceTime(undefined, time12)),
964*90c8c64dSAndroid Build Coastguard Worker    ).toEqual(['entry-0', 'entry-1', 'entry-2']);
965*90c8c64dSAndroid Build Coastguard Worker
966*90c8c64dSAndroid Build Coastguard Worker    // frames
967*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceFrames(1, 1))).toEqual(
968*90c8c64dSAndroid Build Coastguard Worker      [],
969*90c8c64dSAndroid Build Coastguard Worker    );
970*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceFrames())).toEqual([
971*90c8c64dSAndroid Build Coastguard Worker      'entry-0',
972*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
973*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
974*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
975*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
976*90c8c64dSAndroid Build Coastguard Worker    ]);
977*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceFrames(2))).toEqual([
978*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
979*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
980*90c8c64dSAndroid Build Coastguard Worker    ]);
981*90c8c64dSAndroid Build Coastguard Worker    expect(
982*90c8c64dSAndroid Build Coastguard Worker      await TraceUtils.extractEntries(trace.sliceFrames(undefined, 5)),
983*90c8c64dSAndroid Build Coastguard Worker    ).toEqual(['entry-0', 'entry-1', 'entry-2', 'entry-3']);
984*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceFrames(2, 5))).toEqual([
985*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
986*90c8c64dSAndroid Build Coastguard Worker    ]);
987*90c8c64dSAndroid Build Coastguard Worker  });
988*90c8c64dSAndroid Build Coastguard Worker
989*90c8c64dSAndroid Build Coastguard Worker  it('can slice empty trace', async () => {
990*90c8c64dSAndroid Build Coastguard Worker    const empty = trace.sliceEntries(0, 0);
991*90c8c64dSAndroid Build Coastguard Worker
992*90c8c64dSAndroid Build Coastguard Worker    // entries
993*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(empty.sliceEntries())).toEqual([]);
994*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(empty.sliceEntries(1))).toEqual([]);
995*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(empty.sliceEntries(1, 2))).toEqual(
996*90c8c64dSAndroid Build Coastguard Worker      [],
997*90c8c64dSAndroid Build Coastguard Worker    );
998*90c8c64dSAndroid Build Coastguard Worker
999*90c8c64dSAndroid Build Coastguard Worker    // time
1000*90c8c64dSAndroid Build Coastguard Worker    const time12 = TimestampConverterUtils.makeRealTimestamp(12n);
1001*90c8c64dSAndroid Build Coastguard Worker    const time13 = TimestampConverterUtils.makeRealTimestamp(13n);
1002*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(empty.sliceTime())).toEqual([]);
1003*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(empty.sliceTime(time12))).toEqual(
1004*90c8c64dSAndroid Build Coastguard Worker      [],
1005*90c8c64dSAndroid Build Coastguard Worker    );
1006*90c8c64dSAndroid Build Coastguard Worker    expect(
1007*90c8c64dSAndroid Build Coastguard Worker      await TraceUtils.extractEntries(empty.sliceTime(time12, time13)),
1008*90c8c64dSAndroid Build Coastguard Worker    ).toEqual([]);
1009*90c8c64dSAndroid Build Coastguard Worker
1010*90c8c64dSAndroid Build Coastguard Worker    // frames
1011*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(empty.sliceFrames())).toEqual([]);
1012*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(empty.sliceFrames(1))).toEqual([]);
1013*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(empty.sliceFrames(1, 2))).toEqual(
1014*90c8c64dSAndroid Build Coastguard Worker      [],
1015*90c8c64dSAndroid Build Coastguard Worker    );
1016*90c8c64dSAndroid Build Coastguard Worker  });
1017*90c8c64dSAndroid Build Coastguard Worker
1018*90c8c64dSAndroid Build Coastguard Worker  it('forEachEntry()', async () => {
1019*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace)).toEqual([
1020*90c8c64dSAndroid Build Coastguard Worker      'entry-0',
1021*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
1022*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
1023*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
1024*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
1025*90c8c64dSAndroid Build Coastguard Worker    ]);
1026*90c8c64dSAndroid Build Coastguard Worker  });
1027*90c8c64dSAndroid Build Coastguard Worker
1028*90c8c64dSAndroid Build Coastguard Worker  it('forEachTimestamp()', () => {
1029*90c8c64dSAndroid Build Coastguard Worker    expect(TraceUtils.extractTimestamps(trace)).toEqual([
1030*90c8c64dSAndroid Build Coastguard Worker      time10,
1031*90c8c64dSAndroid Build Coastguard Worker      time11,
1032*90c8c64dSAndroid Build Coastguard Worker      time11,
1033*90c8c64dSAndroid Build Coastguard Worker      time12,
1034*90c8c64dSAndroid Build Coastguard Worker      time13,
1035*90c8c64dSAndroid Build Coastguard Worker    ]);
1036*90c8c64dSAndroid Build Coastguard Worker    expect(TraceUtils.extractTimestamps(trace.sliceEntries(1, -1))).toEqual([
1037*90c8c64dSAndroid Build Coastguard Worker      time11,
1038*90c8c64dSAndroid Build Coastguard Worker      time11,
1039*90c8c64dSAndroid Build Coastguard Worker      time12,
1040*90c8c64dSAndroid Build Coastguard Worker    ]);
1041*90c8c64dSAndroid Build Coastguard Worker  });
1042*90c8c64dSAndroid Build Coastguard Worker
1043*90c8c64dSAndroid Build Coastguard Worker  // Hint: look at frame mapping specified in test's set up to fully understand the assertions
1044*90c8c64dSAndroid Build Coastguard Worker  it('forEachFrame()', async () => {
1045*90c8c64dSAndroid Build Coastguard Worker    // full trace
1046*90c8c64dSAndroid Build Coastguard Worker    {
1047*90c8c64dSAndroid Build Coastguard Worker      const expected = new Map<AbsoluteFrameIndex, string[]>([
1048*90c8c64dSAndroid Build Coastguard Worker        [0, ['entry-0']],
1049*90c8c64dSAndroid Build Coastguard Worker        [1, ['entry-1', 'entry-2']],
1050*90c8c64dSAndroid Build Coastguard Worker        [2, []],
1051*90c8c64dSAndroid Build Coastguard Worker        [3, []],
1052*90c8c64dSAndroid Build Coastguard Worker        [4, ['entry-3']],
1053*90c8c64dSAndroid Build Coastguard Worker        [5, ['entry-3']],
1054*90c8c64dSAndroid Build Coastguard Worker        [6, ['entry-4']],
1055*90c8c64dSAndroid Build Coastguard Worker      ]);
1056*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(trace)).toEqual(expected);
1057*90c8c64dSAndroid Build Coastguard Worker    }
1058*90c8c64dSAndroid Build Coastguard Worker    // slice
1059*90c8c64dSAndroid Build Coastguard Worker    {
1060*90c8c64dSAndroid Build Coastguard Worker      const slice = trace.sliceFrames(1, 5);
1061*90c8c64dSAndroid Build Coastguard Worker      const expected = new Map<AbsoluteFrameIndex, string[]>([
1062*90c8c64dSAndroid Build Coastguard Worker        [1, ['entry-1', 'entry-2']],
1063*90c8c64dSAndroid Build Coastguard Worker        [2, []],
1064*90c8c64dSAndroid Build Coastguard Worker        [3, []],
1065*90c8c64dSAndroid Build Coastguard Worker        [4, ['entry-3']],
1066*90c8c64dSAndroid Build Coastguard Worker      ]);
1067*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(slice)).toEqual(expected);
1068*90c8c64dSAndroid Build Coastguard Worker    }
1069*90c8c64dSAndroid Build Coastguard Worker  });
1070*90c8c64dSAndroid Build Coastguard Worker
1071*90c8c64dSAndroid Build Coastguard Worker  it('updates frames range when slicing', () => {
1072*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(0).getFramesRange()).toEqual({start: 0, end: 7});
1073*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(1).getFramesRange()).toEqual({start: 1, end: 7});
1074*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(2).getFramesRange()).toEqual({start: 1, end: 7});
1075*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(3).getFramesRange()).toEqual({start: 4, end: 7});
1076*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(4).getFramesRange()).toEqual({start: 6, end: 7});
1077*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(5).getFramesRange()).toEqual(undefined);
1078*90c8c64dSAndroid Build Coastguard Worker
1079*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(undefined, 5).getFramesRange()).toEqual({
1080*90c8c64dSAndroid Build Coastguard Worker      start: 0,
1081*90c8c64dSAndroid Build Coastguard Worker      end: 7,
1082*90c8c64dSAndroid Build Coastguard Worker    });
1083*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(undefined, 4).getFramesRange()).toEqual({
1084*90c8c64dSAndroid Build Coastguard Worker      start: 0,
1085*90c8c64dSAndroid Build Coastguard Worker      end: 6,
1086*90c8c64dSAndroid Build Coastguard Worker    });
1087*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(undefined, 3).getFramesRange()).toEqual({
1088*90c8c64dSAndroid Build Coastguard Worker      start: 0,
1089*90c8c64dSAndroid Build Coastguard Worker      end: 2,
1090*90c8c64dSAndroid Build Coastguard Worker    });
1091*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(undefined, 2).getFramesRange()).toEqual({
1092*90c8c64dSAndroid Build Coastguard Worker      start: 0,
1093*90c8c64dSAndroid Build Coastguard Worker      end: 2,
1094*90c8c64dSAndroid Build Coastguard Worker    });
1095*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(undefined, 1).getFramesRange()).toEqual({
1096*90c8c64dSAndroid Build Coastguard Worker      start: 0,
1097*90c8c64dSAndroid Build Coastguard Worker      end: 1,
1098*90c8c64dSAndroid Build Coastguard Worker    });
1099*90c8c64dSAndroid Build Coastguard Worker    expect(trace.sliceEntries(undefined, 0).getFramesRange()).toEqual(
1100*90c8c64dSAndroid Build Coastguard Worker      undefined,
1101*90c8c64dSAndroid Build Coastguard Worker    );
1102*90c8c64dSAndroid Build Coastguard Worker  });
1103*90c8c64dSAndroid Build Coastguard Worker
1104*90c8c64dSAndroid Build Coastguard Worker  it('can handle some trace entries with unavailable frame info', async () => {
1105*90c8c64dSAndroid Build Coastguard Worker    // Entry:      0     1     2     3     4
1106*90c8c64dSAndroid Build Coastguard Worker    //                   |           |
1107*90c8c64dSAndroid Build Coastguard Worker    // Frame:            0           2
1108*90c8c64dSAndroid Build Coastguard Worker    // Time:       10    11    12    13    14
1109*90c8c64dSAndroid Build Coastguard Worker    const trace = new TraceBuilder<string>()
1110*90c8c64dSAndroid Build Coastguard Worker      .setEntries(['entry-0', 'entry-1', 'entry-2', 'entry-3', 'entry-4'])
1111*90c8c64dSAndroid Build Coastguard Worker      .setTimestamps([time10, time11, time12, time13, time14])
1112*90c8c64dSAndroid Build Coastguard Worker      .setFrame(1, 0)
1113*90c8c64dSAndroid Build Coastguard Worker      .setFrame(3, 2)
1114*90c8c64dSAndroid Build Coastguard Worker      .build();
1115*90c8c64dSAndroid Build Coastguard Worker
1116*90c8c64dSAndroid Build Coastguard Worker    // Slice entries
1117*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceEntries())).toEqual([
1118*90c8c64dSAndroid Build Coastguard Worker      'entry-0',
1119*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
1120*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
1121*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
1122*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
1123*90c8c64dSAndroid Build Coastguard Worker    ]);
1124*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.sliceEntries())).toEqual(
1125*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([
1126*90c8c64dSAndroid Build Coastguard Worker        [0, ['entry-1']],
1127*90c8c64dSAndroid Build Coastguard Worker        [1, []],
1128*90c8c64dSAndroid Build Coastguard Worker        [2, ['entry-3']],
1129*90c8c64dSAndroid Build Coastguard Worker      ]),
1130*90c8c64dSAndroid Build Coastguard Worker    );
1131*90c8c64dSAndroid Build Coastguard Worker
1132*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceEntries(1))).toEqual([
1133*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
1134*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
1135*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
1136*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
1137*90c8c64dSAndroid Build Coastguard Worker    ]);
1138*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.sliceEntries(1))).toEqual(
1139*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([
1140*90c8c64dSAndroid Build Coastguard Worker        [0, ['entry-1']],
1141*90c8c64dSAndroid Build Coastguard Worker        [1, []],
1142*90c8c64dSAndroid Build Coastguard Worker        [2, ['entry-3']],
1143*90c8c64dSAndroid Build Coastguard Worker      ]),
1144*90c8c64dSAndroid Build Coastguard Worker    );
1145*90c8c64dSAndroid Build Coastguard Worker
1146*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceEntries(2))).toEqual([
1147*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
1148*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
1149*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
1150*90c8c64dSAndroid Build Coastguard Worker    ]);
1151*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.sliceEntries(2))).toEqual(
1152*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([[2, ['entry-3']]]),
1153*90c8c64dSAndroid Build Coastguard Worker    );
1154*90c8c64dSAndroid Build Coastguard Worker
1155*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceEntries(3))).toEqual([
1156*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
1157*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
1158*90c8c64dSAndroid Build Coastguard Worker    ]);
1159*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.sliceEntries(3))).toEqual(
1160*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([[2, ['entry-3']]]),
1161*90c8c64dSAndroid Build Coastguard Worker    );
1162*90c8c64dSAndroid Build Coastguard Worker
1163*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceEntries(4))).toEqual([
1164*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
1165*90c8c64dSAndroid Build Coastguard Worker    ]);
1166*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.sliceEntries(4))).toEqual(
1167*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>(),
1168*90c8c64dSAndroid Build Coastguard Worker    );
1169*90c8c64dSAndroid Build Coastguard Worker
1170*90c8c64dSAndroid Build Coastguard Worker    // Slice time
1171*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceTime())).toEqual([
1172*90c8c64dSAndroid Build Coastguard Worker      'entry-0',
1173*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
1174*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
1175*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
1176*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
1177*90c8c64dSAndroid Build Coastguard Worker    ]);
1178*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.sliceTime())).toEqual(
1179*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([
1180*90c8c64dSAndroid Build Coastguard Worker        [0, ['entry-1']],
1181*90c8c64dSAndroid Build Coastguard Worker        [1, []],
1182*90c8c64dSAndroid Build Coastguard Worker        [2, ['entry-3']],
1183*90c8c64dSAndroid Build Coastguard Worker      ]),
1184*90c8c64dSAndroid Build Coastguard Worker    );
1185*90c8c64dSAndroid Build Coastguard Worker
1186*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceTime(time11))).toEqual([
1187*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
1188*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
1189*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
1190*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
1191*90c8c64dSAndroid Build Coastguard Worker    ]);
1192*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.sliceTime(time11))).toEqual(
1193*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([
1194*90c8c64dSAndroid Build Coastguard Worker        [0, ['entry-1']],
1195*90c8c64dSAndroid Build Coastguard Worker        [1, []],
1196*90c8c64dSAndroid Build Coastguard Worker        [2, ['entry-3']],
1197*90c8c64dSAndroid Build Coastguard Worker      ]),
1198*90c8c64dSAndroid Build Coastguard Worker    );
1199*90c8c64dSAndroid Build Coastguard Worker
1200*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceTime(time12))).toEqual([
1201*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
1202*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
1203*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
1204*90c8c64dSAndroid Build Coastguard Worker    ]);
1205*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.sliceTime(time12))).toEqual(
1206*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([[2, ['entry-3']]]),
1207*90c8c64dSAndroid Build Coastguard Worker    );
1208*90c8c64dSAndroid Build Coastguard Worker
1209*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceTime(time13))).toEqual([
1210*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
1211*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
1212*90c8c64dSAndroid Build Coastguard Worker    ]);
1213*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.sliceTime(time13))).toEqual(
1214*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([[2, ['entry-3']]]),
1215*90c8c64dSAndroid Build Coastguard Worker    );
1216*90c8c64dSAndroid Build Coastguard Worker
1217*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceTime(time14))).toEqual([
1218*90c8c64dSAndroid Build Coastguard Worker      'entry-4',
1219*90c8c64dSAndroid Build Coastguard Worker    ]);
1220*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.sliceTime(time14))).toEqual(
1221*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>(),
1222*90c8c64dSAndroid Build Coastguard Worker    );
1223*90c8c64dSAndroid Build Coastguard Worker
1224*90c8c64dSAndroid Build Coastguard Worker    // Slice frames
1225*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceFrames())).toEqual([
1226*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
1227*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
1228*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
1229*90c8c64dSAndroid Build Coastguard Worker    ]);
1230*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.sliceFrames())).toEqual(
1231*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([
1232*90c8c64dSAndroid Build Coastguard Worker        [0, ['entry-1']],
1233*90c8c64dSAndroid Build Coastguard Worker        [1, []],
1234*90c8c64dSAndroid Build Coastguard Worker        [2, ['entry-3']],
1235*90c8c64dSAndroid Build Coastguard Worker      ]),
1236*90c8c64dSAndroid Build Coastguard Worker    );
1237*90c8c64dSAndroid Build Coastguard Worker
1238*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceFrames(1))).toEqual([
1239*90c8c64dSAndroid Build Coastguard Worker      'entry-3',
1240*90c8c64dSAndroid Build Coastguard Worker    ]);
1241*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractFrames(trace.sliceFrames(1))).toEqual(
1242*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([
1243*90c8c64dSAndroid Build Coastguard Worker        [1, []],
1244*90c8c64dSAndroid Build Coastguard Worker        [2, ['entry-3']],
1245*90c8c64dSAndroid Build Coastguard Worker      ]),
1246*90c8c64dSAndroid Build Coastguard Worker    );
1247*90c8c64dSAndroid Build Coastguard Worker
1248*90c8c64dSAndroid Build Coastguard Worker    expect(
1249*90c8c64dSAndroid Build Coastguard Worker      await TraceUtils.extractEntries(trace.sliceFrames(undefined, 2)),
1250*90c8c64dSAndroid Build Coastguard Worker    ).toEqual(['entry-1']);
1251*90c8c64dSAndroid Build Coastguard Worker    expect(
1252*90c8c64dSAndroid Build Coastguard Worker      await TraceUtils.extractFrames(trace.sliceFrames(undefined, 2)),
1253*90c8c64dSAndroid Build Coastguard Worker    ).toEqual(
1254*90c8c64dSAndroid Build Coastguard Worker      new Map<AbsoluteFrameIndex, string[]>([
1255*90c8c64dSAndroid Build Coastguard Worker        [0, ['entry-1']],
1256*90c8c64dSAndroid Build Coastguard Worker        [1, []],
1257*90c8c64dSAndroid Build Coastguard Worker      ]),
1258*90c8c64dSAndroid Build Coastguard Worker    );
1259*90c8c64dSAndroid Build Coastguard Worker  });
1260*90c8c64dSAndroid Build Coastguard Worker
1261*90c8c64dSAndroid Build Coastguard Worker  it('can handle unavailable frame info', async () => {
1262*90c8c64dSAndroid Build Coastguard Worker    const trace = new TraceBuilder<string>()
1263*90c8c64dSAndroid Build Coastguard Worker      .setTimestamps([time10, time11, time12])
1264*90c8c64dSAndroid Build Coastguard Worker      .setEntries(['entry-0', 'entry-1', 'entry-2'])
1265*90c8c64dSAndroid Build Coastguard Worker      .setFrameMap(undefined)
1266*90c8c64dSAndroid Build Coastguard Worker      .build();
1267*90c8c64dSAndroid Build Coastguard Worker
1268*90c8c64dSAndroid Build Coastguard Worker    expect(await trace.getEntry(0).getValue()).toEqual('entry-0');
1269*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace)).toEqual([
1270*90c8c64dSAndroid Build Coastguard Worker      'entry-0',
1271*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
1272*90c8c64dSAndroid Build Coastguard Worker      'entry-2',
1273*90c8c64dSAndroid Build Coastguard Worker    ]);
1274*90c8c64dSAndroid Build Coastguard Worker    expect(await TraceUtils.extractEntries(trace.sliceEntries(1, 2))).toEqual([
1275*90c8c64dSAndroid Build Coastguard Worker      'entry-1',
1276*90c8c64dSAndroid Build Coastguard Worker    ]);
1277*90c8c64dSAndroid Build Coastguard Worker    expect(
1278*90c8c64dSAndroid Build Coastguard Worker      await TraceUtils.extractEntries(trace.sliceTime(time11, time12)),
1279*90c8c64dSAndroid Build Coastguard Worker    ).toEqual(['entry-1']);
1280*90c8c64dSAndroid Build Coastguard Worker
1281*90c8c64dSAndroid Build Coastguard Worker    expect(() => {
1282*90c8c64dSAndroid Build Coastguard Worker      trace.getFrame(0);
1283*90c8c64dSAndroid Build Coastguard Worker    }).toThrow();
1284*90c8c64dSAndroid Build Coastguard Worker    expect(() => {
1285*90c8c64dSAndroid Build Coastguard Worker      trace.sliceFrames(0, 1000);
1286*90c8c64dSAndroid Build Coastguard Worker    }).toThrow();
1287*90c8c64dSAndroid Build Coastguard Worker  });
1288*90c8c64dSAndroid Build Coastguard Worker
1289*90c8c64dSAndroid Build Coastguard Worker  it('can handle empty frame info', async () => {
1290*90c8c64dSAndroid Build Coastguard Worker    // empty trace
1291*90c8c64dSAndroid Build Coastguard Worker    {
1292*90c8c64dSAndroid Build Coastguard Worker      const trace = new TraceBuilder<string>()
1293*90c8c64dSAndroid Build Coastguard Worker        .setEntries([])
1294*90c8c64dSAndroid Build Coastguard Worker        .setTimestamps([])
1295*90c8c64dSAndroid Build Coastguard Worker        .setFrameMap(new FrameMapBuilder(0, 0).build())
1296*90c8c64dSAndroid Build Coastguard Worker        .build();
1297*90c8c64dSAndroid Build Coastguard Worker
1298*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(trace)).toEqual([]);
1299*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(trace)).toEqual(
1300*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>(),
1301*90c8c64dSAndroid Build Coastguard Worker      );
1302*90c8c64dSAndroid Build Coastguard Worker
1303*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(trace.sliceEntries(1))).toEqual(
1304*90c8c64dSAndroid Build Coastguard Worker        [],
1305*90c8c64dSAndroid Build Coastguard Worker      );
1306*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(trace.sliceEntries(1))).toEqual(
1307*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>(),
1308*90c8c64dSAndroid Build Coastguard Worker      );
1309*90c8c64dSAndroid Build Coastguard Worker
1310*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(trace.sliceTime(time11))).toEqual(
1311*90c8c64dSAndroid Build Coastguard Worker        [],
1312*90c8c64dSAndroid Build Coastguard Worker      );
1313*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(trace.sliceTime(time11))).toEqual(
1314*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>(),
1315*90c8c64dSAndroid Build Coastguard Worker      );
1316*90c8c64dSAndroid Build Coastguard Worker
1317*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(trace.sliceFrames())).toEqual([]);
1318*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(trace.sliceFrames())).toEqual(
1319*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>(),
1320*90c8c64dSAndroid Build Coastguard Worker      );
1321*90c8c64dSAndroid Build Coastguard Worker    }
1322*90c8c64dSAndroid Build Coastguard Worker    // non-empty trace
1323*90c8c64dSAndroid Build Coastguard Worker    {
1324*90c8c64dSAndroid Build Coastguard Worker      const trace = new TraceBuilder<string>()
1325*90c8c64dSAndroid Build Coastguard Worker        .setEntries(['entry-0', 'entry-1', 'entry-2'])
1326*90c8c64dSAndroid Build Coastguard Worker        .setTimestamps([time10, time11, time12])
1327*90c8c64dSAndroid Build Coastguard Worker        .setFrameMap(new FrameMapBuilder(3, 0).build())
1328*90c8c64dSAndroid Build Coastguard Worker        .build();
1329*90c8c64dSAndroid Build Coastguard Worker
1330*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(trace)).toEqual([
1331*90c8c64dSAndroid Build Coastguard Worker        'entry-0',
1332*90c8c64dSAndroid Build Coastguard Worker        'entry-1',
1333*90c8c64dSAndroid Build Coastguard Worker        'entry-2',
1334*90c8c64dSAndroid Build Coastguard Worker      ]);
1335*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(trace)).toEqual(
1336*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>(),
1337*90c8c64dSAndroid Build Coastguard Worker      );
1338*90c8c64dSAndroid Build Coastguard Worker
1339*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(trace.sliceEntries(1))).toEqual([
1340*90c8c64dSAndroid Build Coastguard Worker        'entry-1',
1341*90c8c64dSAndroid Build Coastguard Worker        'entry-2',
1342*90c8c64dSAndroid Build Coastguard Worker      ]);
1343*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(trace.sliceEntries(1))).toEqual(
1344*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>(),
1345*90c8c64dSAndroid Build Coastguard Worker      );
1346*90c8c64dSAndroid Build Coastguard Worker
1347*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(trace.sliceTime(time11))).toEqual([
1348*90c8c64dSAndroid Build Coastguard Worker        'entry-1',
1349*90c8c64dSAndroid Build Coastguard Worker        'entry-2',
1350*90c8c64dSAndroid Build Coastguard Worker      ]);
1351*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(trace.sliceTime(time11))).toEqual(
1352*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>(),
1353*90c8c64dSAndroid Build Coastguard Worker      );
1354*90c8c64dSAndroid Build Coastguard Worker
1355*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractEntries(trace.sliceFrames())).toEqual([]);
1356*90c8c64dSAndroid Build Coastguard Worker      expect(await TraceUtils.extractFrames(trace.sliceFrames())).toEqual(
1357*90c8c64dSAndroid Build Coastguard Worker        new Map<AbsoluteFrameIndex, string[]>(),
1358*90c8c64dSAndroid Build Coastguard Worker      );
1359*90c8c64dSAndroid Build Coastguard Worker    }
1360*90c8c64dSAndroid Build Coastguard Worker  });
1361*90c8c64dSAndroid Build Coastguard Worker
1362*90c8c64dSAndroid Build Coastguard Worker  it('isDump()', () => {
1363*90c8c64dSAndroid Build Coastguard Worker    const trace = new TraceBuilder<string>()
1364*90c8c64dSAndroid Build Coastguard Worker      .setEntries(['entry-0'])
1365*90c8c64dSAndroid Build Coastguard Worker      .setTimestamps([time10])
1366*90c8c64dSAndroid Build Coastguard Worker      .build();
1367*90c8c64dSAndroid Build Coastguard Worker    expect(trace.isDump()).toBeTrue();
1368*90c8c64dSAndroid Build Coastguard Worker    expect(trace.isDumpWithoutTimestamp()).toBeFalse();
1369*90c8c64dSAndroid Build Coastguard Worker  });
1370*90c8c64dSAndroid Build Coastguard Worker
1371*90c8c64dSAndroid Build Coastguard Worker  it('isDumpWithoutTimestamp()', () => {
1372*90c8c64dSAndroid Build Coastguard Worker    const trace = new TraceBuilder<string>()
1373*90c8c64dSAndroid Build Coastguard Worker      .setEntries(['entry-0'])
1374*90c8c64dSAndroid Build Coastguard Worker      .setTimestamps([TimestampConverterUtils.makeZeroTimestamp()])
1375*90c8c64dSAndroid Build Coastguard Worker      .build();
1376*90c8c64dSAndroid Build Coastguard Worker    expect(trace.isDumpWithoutTimestamp()).toBeTrue();
1377*90c8c64dSAndroid Build Coastguard Worker  });
1378*90c8c64dSAndroid Build Coastguard Worker
1379*90c8c64dSAndroid Build Coastguard Worker  it('updates corruptedState on failure to parse entry', async () => {
1380*90c8c64dSAndroid Build Coastguard Worker    const trace = new TraceBuilder<string>()
1381*90c8c64dSAndroid Build Coastguard Worker      .setParser(
1382*90c8c64dSAndroid Build Coastguard Worker        new ParserBuilder<string>()
1383*90c8c64dSAndroid Build Coastguard Worker          .setIsCorrupted(true)
1384*90c8c64dSAndroid Build Coastguard Worker          .setEntries(['entry-0'])
1385*90c8c64dSAndroid Build Coastguard Worker          .setTimestamps([TimestampConverterUtils.makeZeroTimestamp()])
1386*90c8c64dSAndroid Build Coastguard Worker          .build(),
1387*90c8c64dSAndroid Build Coastguard Worker      )
1388*90c8c64dSAndroid Build Coastguard Worker      .build();
1389*90c8c64dSAndroid Build Coastguard Worker    expect(trace.isCorrupted()).toBeFalse();
1390*90c8c64dSAndroid Build Coastguard Worker    expect(trace.getCorruptedReason()).toBeUndefined();
1391*90c8c64dSAndroid Build Coastguard Worker
1392*90c8c64dSAndroid Build Coastguard Worker    expectAsync(trace.getEntry(0).getValue()).toBeRejected();
1393*90c8c64dSAndroid Build Coastguard Worker    try {
1394*90c8c64dSAndroid Build Coastguard Worker      await trace.getEntry(0).getValue();
1395*90c8c64dSAndroid Build Coastguard Worker    } catch (e) {
1396*90c8c64dSAndroid Build Coastguard Worker      expect(trace.isCorrupted()).toBeTrue();
1397*90c8c64dSAndroid Build Coastguard Worker      expect(trace.getCorruptedReason()).toEqual(
1398*90c8c64dSAndroid Build Coastguard Worker        'Cannot parse entry at index 0',
1399*90c8c64dSAndroid Build Coastguard Worker      );
1400*90c8c64dSAndroid Build Coastguard Worker    }
1401*90c8c64dSAndroid Build Coastguard Worker  });
1402*90c8c64dSAndroid Build Coastguard Worker
1403*90c8c64dSAndroid Build Coastguard Worker  it('spansMultipleDates()', () => {
1404*90c8c64dSAndroid Build Coastguard Worker    const emptyTrace = UnitTestUtils.makeEmptyTrace(
1405*90c8c64dSAndroid Build Coastguard Worker      TraceType.TEST_TRACE_STRING,
1406*90c8c64dSAndroid Build Coastguard Worker    );
1407*90c8c64dSAndroid Build Coastguard Worker    expect(emptyTrace.spansMultipleDates()).toBeFalse();
1408*90c8c64dSAndroid Build Coastguard Worker
1409*90c8c64dSAndroid Build Coastguard Worker    const traceWithElapsedTimestamps = new TraceBuilder<string>()
1410*90c8c64dSAndroid Build Coastguard Worker      .setEntries(['entry-0', 'entry-1'])
1411*90c8c64dSAndroid Build Coastguard Worker      .setTimestamps([
1412*90c8c64dSAndroid Build Coastguard Worker        TimestampConverterUtils.makeElapsedTimestamp(0n),
1413*90c8c64dSAndroid Build Coastguard Worker        TimestampConverterUtils.makeElapsedTimestamp(
1414*90c8c64dSAndroid Build Coastguard Worker          BigInt(TIME_UNIT_TO_NANO.d),
1415*90c8c64dSAndroid Build Coastguard Worker        ),
1416*90c8c64dSAndroid Build Coastguard Worker      ])
1417*90c8c64dSAndroid Build Coastguard Worker      .build();
1418*90c8c64dSAndroid Build Coastguard Worker    expect(traceWithElapsedTimestamps.spansMultipleDates()).toBeFalse();
1419*90c8c64dSAndroid Build Coastguard Worker
1420*90c8c64dSAndroid Build Coastguard Worker    const traceWithRealTimestampsOneDate = new TraceBuilder<string>()
1421*90c8c64dSAndroid Build Coastguard Worker      .setEntries(['entry-0', 'entry-1'])
1422*90c8c64dSAndroid Build Coastguard Worker      .setTimestamps([time10, time15])
1423*90c8c64dSAndroid Build Coastguard Worker      .build();
1424*90c8c64dSAndroid Build Coastguard Worker    expect(traceWithRealTimestampsOneDate.spansMultipleDates()).toBeFalse();
1425*90c8c64dSAndroid Build Coastguard Worker
1426*90c8c64dSAndroid Build Coastguard Worker    const traceWitMultipleDates = new TraceBuilder<string>()
1427*90c8c64dSAndroid Build Coastguard Worker      .setEntries(['entry-0', 'entry-1'])
1428*90c8c64dSAndroid Build Coastguard Worker      .setTimestamps([
1429*90c8c64dSAndroid Build Coastguard Worker        TimestampConverterUtils.makeRealTimestamp(
1430*90c8c64dSAndroid Build Coastguard Worker          BigInt(TIME_UNIT_TO_NANO.h * 23),
1431*90c8c64dSAndroid Build Coastguard Worker        ),
1432*90c8c64dSAndroid Build Coastguard Worker        TimestampConverterUtils.makeRealTimestamp(
1433*90c8c64dSAndroid Build Coastguard Worker          BigInt(TIME_UNIT_TO_NANO.h * 25),
1434*90c8c64dSAndroid Build Coastguard Worker        ),
1435*90c8c64dSAndroid Build Coastguard Worker      ])
1436*90c8c64dSAndroid Build Coastguard Worker      .build();
1437*90c8c64dSAndroid Build Coastguard Worker    expect(traceWitMultipleDates.spansMultipleDates()).toBeTrue();
1438*90c8c64dSAndroid Build Coastguard Worker  });
1439*90c8c64dSAndroid Build Coastguard Worker});
1440