• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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