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