1/* 2 * Copyright (C) 2022 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 */ 16import {CommonModule} from '@angular/common'; 17import {CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA} from '@angular/core'; 18import {ComponentFixture, TestBed} from '@angular/core/testing'; 19import {MatCardModule} from '@angular/material/card'; 20import {MatDividerModule} from '@angular/material/divider'; 21import {ViewerStub} from 'viewers/viewer_stub'; 22import {TraceViewComponent} from './trace_view_component'; 23 24describe('TraceViewComponent', () => { 25 let fixture: ComponentFixture<TraceViewComponent>; 26 let component: TraceViewComponent; 27 let htmlElement: HTMLElement; 28 29 beforeEach(async () => { 30 await TestBed.configureTestingModule({ 31 declarations: [TraceViewComponent], 32 imports: [CommonModule, MatCardModule, MatDividerModule], 33 schemas: [NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA], 34 }).compileComponents(); 35 fixture = TestBed.createComponent(TraceViewComponent); 36 htmlElement = fixture.nativeElement; 37 component = fixture.componentInstance; 38 component.viewers = [ 39 new ViewerStub('Title0', 'Content0'), 40 new ViewerStub('Title1', 'Content1'), 41 ]; 42 component.ngOnChanges(); 43 fixture.detectChanges(); 44 }); 45 46 it('can be created', () => { 47 fixture.detectChanges(); 48 expect(component).toBeTruthy(); 49 }); 50 51 it('creates viewer tabs', () => { 52 const tabs: NodeList = htmlElement.querySelectorAll('.tab'); 53 expect(tabs.length).toEqual(2); 54 expect(tabs.item(0)!.textContent).toContain('Title0'); 55 expect(tabs.item(1)!.textContent).toContain('Title1'); 56 }); 57 58 it('changes active view on click', () => { 59 const getVisibleTabContents = () => { 60 const contents: HTMLElement[] = []; 61 htmlElement.querySelectorAll('.trace-view-content div').forEach((content) => { 62 if ((content as HTMLElement).style.display !== 'none') { 63 contents.push(content as HTMLElement); 64 } 65 }); 66 return contents; 67 }; 68 69 const tabButtons = htmlElement.querySelectorAll('.tab'); 70 71 // Initially tab 0 72 fixture.detectChanges(); 73 let visibleTabContents = getVisibleTabContents(); 74 expect(visibleTabContents.length).toEqual(1); 75 expect(visibleTabContents[0].innerHTML).toEqual('Content0'); 76 77 // Switch to tab 1 78 tabButtons[1].dispatchEvent(new Event('click')); 79 fixture.detectChanges(); 80 visibleTabContents = getVisibleTabContents(); 81 expect(visibleTabContents.length).toEqual(1); 82 expect(visibleTabContents[0].innerHTML).toEqual('Content1'); 83 84 // Switch to tab 0 85 tabButtons[0].dispatchEvent(new Event('click')); 86 fixture.detectChanges(); 87 visibleTabContents = getVisibleTabContents(); 88 expect(visibleTabContents.length).toEqual(1); 89 expect(visibleTabContents[0].innerHTML).toEqual('Content0'); 90 }); 91 92 it('emits event on download button click', () => { 93 const spy = spyOn(component.downloadTracesButtonClick, 'emit'); 94 95 const downloadButton: null | HTMLButtonElement = htmlElement.querySelector('.save-button'); 96 expect(downloadButton).toBeInstanceOf(HTMLButtonElement); 97 98 downloadButton?.dispatchEvent(new Event('click')); 99 fixture.detectChanges(); 100 expect(spy).toHaveBeenCalledTimes(1); 101 102 downloadButton?.dispatchEvent(new Event('click')); 103 fixture.detectChanges(); 104 expect(spy).toHaveBeenCalledTimes(2); 105 }); 106}); 107