| 
									
										
										
										
											2016-06-23 09:47:54 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 12:51:01 -07:00
										 |  |  | import {CommonModule} from '@angular/common'; | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  | import {Component} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  | import {ComponentFixture, TestBed, async} from '@angular/core/testing'; | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  | import {By} from '@angular/platform-browser/src/dom/debug/by'; | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter'; | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  | import {expect} from '@angular/platform-browser/testing/matchers'; | 
					
						
							| 
									
										
										
										
											2015-05-26 14:22:35 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							| 
									
										
										
										
											2015-11-23 16:02:19 -08:00
										 |  |  |   describe('ngIf directive', () => { | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |     let fixture: ComponentFixture<any>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function getComponent(): TestComponent { return fixture.componentInstance; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     afterEach(() => { fixture = null; }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |     beforeEach(() => { | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |       TestBed.configureTestingModule({ | 
					
						
							|  |  |  |         declarations: [TestComponent], | 
					
						
							|  |  |  |         imports: [CommonModule], | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should work in a template attribute', async(() => { | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          const template = '<span *ngIf="booleanCondition">hello</span>'; | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          fixture = createTestComponent(template); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText('hello'); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |        })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |     it('should work on a template element', async(() => { | 
					
						
							|  |  |  |          const template = '<template [ngIf]="booleanCondition">hello2</template>'; | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          fixture = createTestComponent(template); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText('hello2'); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |        })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should toggle node when condition changes', async(() => { | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          const template = '<span *ngIf="booleanCondition">hello</span>'; | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          fixture = createTestComponent(template); | 
					
						
							|  |  |  |          getComponent().booleanCondition = false; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(0); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText(''); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          getComponent().booleanCondition = true; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText('hello'); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          getComponent().booleanCondition = false; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(0); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText(''); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |        })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should handle nested if correctly', async(() => { | 
					
						
							|  |  |  |          const template = | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |              '<div *ngIf="booleanCondition"><span *ngIf="nestedBooleanCondition">hello</span></div>'; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          fixture = createTestComponent(template); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          getComponent().booleanCondition = false; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(0); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText(''); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          getComponent().booleanCondition = true; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText('hello'); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          getComponent().nestedBooleanCondition = false; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(0); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText(''); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          getComponent().nestedBooleanCondition = true; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText('hello'); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          getComponent().booleanCondition = false; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(0); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText(''); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |        })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should update several nodes with if', async(() => { | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          const template = '<span *ngIf="numberCondition + 1 >= 2">helloNumber</span>' + | 
					
						
							|  |  |  |              '<span *ngIf="stringCondition == \'foo\'">helloString</span>' + | 
					
						
							|  |  |  |              '<span *ngIf="functionCondition(stringCondition, numberCondition)">helloFunction</span>'; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          fixture = createTestComponent(template); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(3); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(getDOM().getText(fixture.nativeElement)) | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |              .toEqual('helloNumberhelloStringhelloFunction'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          getComponent().numberCondition = 0; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText('helloString'); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          getComponent().numberCondition = 1; | 
					
						
							|  |  |  |          getComponent().stringCondition = 'bar'; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.debugElement.queryAll(By.css('span')).length).toEqual(1); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText('helloNumber'); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |        })); | 
					
						
							| 
									
										
										
										
											2015-05-26 14:22:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |     it('should not add the element twice if the condition goes from truthy to truthy', async(() => { | 
					
						
							|  |  |  |          const template = '<span *ngIf="numberCondition">hello</span>'; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          fixture = createTestComponent(template); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          let els = fixture.debugElement.queryAll(By.css('span')); | 
					
						
							|  |  |  |          expect(els.length).toEqual(1); | 
					
						
							|  |  |  |          getDOM().addClass(els[0].nativeElement, 'marker'); | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          expect(fixture.nativeElement).toHaveText('hello'); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |          getComponent().numberCondition = 2; | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          els = fixture.debugElement.queryAll(By.css('span')); | 
					
						
							|  |  |  |          expect(els.length).toEqual(1); | 
					
						
							|  |  |  |          expect(getDOM().hasClass(els[0].nativeElement, 'marker')).toBe(true); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |          expect(fixture.nativeElement).toHaveText('hello'); | 
					
						
							| 
									
										
										
										
											2016-08-15 13:52:57 -07:00
										 |  |  |        })); | 
					
						
							| 
									
										
										
										
											2016-12-07 21:41:27 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe('else', () => { | 
					
						
							|  |  |  |       it('should support else', async(() => { | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |            const template = '<span *ngIf="booleanCondition; else elseBlock">TRUE</span>' + | 
					
						
							|  |  |  |                '<template #elseBlock>FALSE</template>'; | 
					
						
							| 
									
										
										
										
											2016-12-07 21:41:27 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |            fixture = createTestComponent(template); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            expect(fixture.nativeElement).toHaveText('TRUE'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            getComponent().booleanCondition = false; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            expect(fixture.nativeElement).toHaveText('FALSE'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should support then and else', async(() => { | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |            const template = | 
					
						
							| 
									
										
										
										
											2016-12-07 21:41:27 -08:00
										 |  |  |                '<span *ngIf="booleanCondition; then thenBlock; else elseBlock">IGNORE</span>' + | 
					
						
							|  |  |  |                '<template #thenBlock>THEN</template>' + | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |                '<template #elseBlock>ELSE</template>'; | 
					
						
							| 
									
										
										
										
											2016-12-07 21:41:27 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |            fixture = createTestComponent(template); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            expect(fixture.nativeElement).toHaveText('THEN'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            getComponent().booleanCondition = false; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            expect(fixture.nativeElement).toHaveText('ELSE'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should support dynamic else', async(() => { | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |            const template = | 
					
						
							| 
									
										
										
										
											2016-12-07 21:41:27 -08:00
										 |  |  |                '<span *ngIf="booleanCondition; else nestedBooleanCondition ? b1 : b2">TRUE</span>' + | 
					
						
							|  |  |  |                '<template #b1>FALSE1</template>' + | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |                '<template #b2>FALSE2</template>'; | 
					
						
							| 
									
										
										
										
											2016-12-07 21:41:27 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |            fixture = createTestComponent(template); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            expect(fixture.nativeElement).toHaveText('TRUE'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            getComponent().booleanCondition = false; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            expect(fixture.nativeElement).toHaveText('FALSE1'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            getComponent().nestedBooleanCondition = false; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            expect(fixture.nativeElement).toHaveText('FALSE2'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should support binding to variable', async(() => { | 
					
						
							| 
									
										
										
										
											2017-01-06 14:18:17 -08:00
										 |  |  |            const template = '<span *ngIf="booleanCondition; else elseBlock; let v">{{v}}</span>' + | 
					
						
							|  |  |  |                '<template #elseBlock let-v>{{v}}</template>'; | 
					
						
							| 
									
										
										
										
											2016-12-07 21:41:27 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |            fixture = createTestComponent(template); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            expect(fixture.nativeElement).toHaveText('true'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            getComponent().booleanCondition = false; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            expect(fixture.nativeElement).toHaveText('false'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-05-26 14:22:35 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 12:51:01 -07:00
										 |  |  | @Component({selector: 'test-cmp', template: ''}) | 
					
						
							| 
									
										
										
										
											2015-05-26 14:22:35 -07:00
										 |  |  | class TestComponent { | 
					
						
							| 
									
										
										
										
											2016-09-08 20:37:20 -07:00
										 |  |  |   booleanCondition: boolean = true; | 
					
						
							|  |  |  |   nestedBooleanCondition: boolean = true; | 
					
						
							|  |  |  |   numberCondition: number = 1; | 
					
						
							|  |  |  |   stringCondition: string = 'foo'; | 
					
						
							|  |  |  |   functionCondition: Function = (s: any, n: any): boolean => s == 'foo' && n == 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function createTestComponent(template: string): ComponentFixture<TestComponent> { | 
					
						
							|  |  |  |   return TestBed.overrideComponent(TestComponent, {set: {template: template}}) | 
					
						
							|  |  |  |       .createComponent(TestComponent); | 
					
						
							| 
									
										
										
										
											2015-05-26 14:22:35 -07:00
										 |  |  | } |