/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import {CommonModule} from '@angular/common'; import {Attribute, Component, Directive, TemplateRef, ViewChild} from '@angular/core'; import {ComponentFixture, TestBed} from '@angular/core/testing'; import {expect} from '@angular/platform-browser/testing/src/matchers'; { describe('NgSwitch', () => { let fixture: ComponentFixture; function getComponent(): TestComponent { return fixture.componentInstance; } function detectChangesAndExpectText(text: string): void { fixture.detectChanges(); expect(fixture.nativeElement).toHaveText(text); } afterEach(() => { fixture = null!; }); beforeEach(() => { TestBed.configureTestingModule({ declarations: [TestComponent, ComplexComponent], imports: [CommonModule], }); }); describe('switch value changes', () => { it('should switch amongst when values', () => { const template = ''; fixture = createTestComponent(template); detectChangesAndExpectText(''); getComponent().switchValue = 'a'; detectChangesAndExpectText('when a'); getComponent().switchValue = 'b'; detectChangesAndExpectText('when b'); }); it('should switch amongst when values with fallback to default', () => { const template = ''; fixture = createTestComponent(template); detectChangesAndExpectText('when default'); getComponent().switchValue = 'a'; detectChangesAndExpectText('when a'); getComponent().switchValue = 'b'; detectChangesAndExpectText('when default'); getComponent().switchValue = 'c'; detectChangesAndExpectText('when default'); }); it('should support multiple whens with the same value', () => { const template = ''; fixture = createTestComponent(template); detectChangesAndExpectText('when default1;when default2;'); getComponent().switchValue = 'a'; detectChangesAndExpectText('when a1;when a2;'); getComponent().switchValue = 'b'; detectChangesAndExpectText('when b1;when b2;'); }); }); describe('when values changes', () => { it('should switch amongst when values', () => { const template = ''; fixture = createTestComponent(template); getComponent().when1 = 'a'; getComponent().when2 = 'b'; getComponent().switchValue = 'a'; detectChangesAndExpectText('when 1;'); getComponent().switchValue = 'b'; detectChangesAndExpectText('when 2;'); getComponent().switchValue = 'c'; detectChangesAndExpectText('when default;'); getComponent().when1 = 'c'; detectChangesAndExpectText('when 1;'); getComponent().when1 = 'd'; detectChangesAndExpectText('when default;'); }); }); describe('corner cases', () => { it('should not create the default case if another case matches', () => { const log: string[] = []; @Directive({selector: '[test]'}) class TestDirective { constructor(@Attribute('test') test: string) { log.push(test); } } const template = '
' + '
' + '
' + '
'; TestBed.configureTestingModule({declarations: [TestDirective]}); const fixture = createTestComponent(template); fixture.componentInstance.switchValue = 'a'; fixture.detectChanges(); expect(log).toEqual(['aCase']); }); it('should create the default case if there is no other case', () => { const template = ''; fixture = createTestComponent(template); detectChangesAndExpectText('when default1;when default2;'); }); it('should allow defaults before cases', () => { const template = ''; fixture = createTestComponent(template); detectChangesAndExpectText('when default1;when default2;'); getComponent().switchValue = 'a'; detectChangesAndExpectText('when a1;when a2;'); getComponent().switchValue = 'b'; detectChangesAndExpectText('when b1;when b2;'); }); it('should support nested NgSwitch on ng-container with ngTemplateOutlet', () => { fixture = TestBed.createComponent(ComplexComponent); detectChangesAndExpectText('Foo'); fixture.componentInstance.state = 'case2'; detectChangesAndExpectText('Bar'); fixture.componentInstance.state = 'notACase'; detectChangesAndExpectText('Default'); fixture.componentInstance.state = 'case1'; detectChangesAndExpectText('Foo'); }); }); }); } @Component({selector: 'test-cmp', template: ''}) class TestComponent { switchValue: any = null; when1: any = null; when2: any = null; } @Component({ selector: 'complex-cmp', template: `
Should never render Should never render Default
Foo Bar ` }) class ComplexComponent { @ViewChild('foo', {static: true}) foo!: TemplateRef; @ViewChild('bar', {static: true}) bar!: TemplateRef; state: string = 'case1'; } function createTestComponent(template: string): ComponentFixture { return TestBed.overrideComponent(TestComponent, {set: {template: template}}) .createComponent(TestComponent); }