| 
									
										
										
										
											2016-06-10 10:09:50 -07:00
										 |  |  | import {NgFor, NgIf} from '@angular/common'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | import {TestComponentBuilder} from '@angular/compiler/testing'; | 
					
						
							|  |  |  | import {ComponentFixture} from '@angular/compiler/testing'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | import {Component, Directive, EventEmitter, Output} from '@angular/core'; | 
					
						
							|  |  |  | import {Input, Provider, forwardRef} from '@angular/core'; | 
					
						
							|  |  |  | import {fakeAsync, flushMicrotasks, tick} from '@angular/core/testing'; | 
					
						
							| 
									
										
										
										
											2016-06-10 17:28:19 -07:00
										 |  |  | import {afterEach, beforeEach, ddescribe, describe, expect, iit, inject, it, xdescribe, xit} from '@angular/core/testing/testing_internal'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | import {AsyncTestCompleter} from '@angular/core/testing/testing_internal'; | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  | import {ControlValueAccessor, FORM_DIRECTIVES, FORM_PROVIDERS, FormControl, FormGroup, NG_ASYNC_VALIDATORS, NG_VALIDATORS, NgControl, NgForm, NgModel, REACTIVE_FORM_DIRECTIVES, Validator, Validators, disableDeprecatedForms, provideForms} from '@angular/forms'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | import {By} from '@angular/platform-browser/src/dom/debug/by'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter'; | 
					
						
							|  |  |  | import {dispatchEvent} from '@angular/platform-browser/testing'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  | import {ObservableWrapper, TimerWrapper} from '../src/facade/async'; | 
					
						
							|  |  |  | import {ListWrapper} from '../src/facade/collection'; | 
					
						
							|  |  |  | import {PromiseWrapper} from '../src/facade/promise'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |   describe('integration tests', () => { | 
					
						
							|  |  |  |     let providerArr: any[]; | 
					
						
							|  |  |  |     beforeEach(() => { providerArr = [disableDeprecatedForms(), provideForms()]; }); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     it('should initialize DOM elements with the given form object', | 
					
						
							|  |  |  |        inject( | 
					
						
							|  |  |  |            [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |            (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |              const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                 <input type="text" formControlName="login"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |              tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                  .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                  .createAsync(MyComp8) | 
					
						
							|  |  |  |                  .then((fixture) => { | 
					
						
							|  |  |  |                    fixture.debugElement.componentInstance.form = | 
					
						
							|  |  |  |                        new FormGroup({'login': new FormControl('loginValue')}); | 
					
						
							|  |  |  |                    fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                    expect(input.nativeElement.value).toEqual('loginValue'); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |     it('should throw if a form isn\'t passed into formGroup', | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |        inject( | 
					
						
							|  |  |  |            [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |            (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |              const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                 <input type="text" formControlName="login"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |              tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                  .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                  .createAsync(MyComp8) | 
					
						
							|  |  |  |                  .then((fixture) => { | 
					
						
							|  |  |  |                    expect(() => fixture.detectChanges()) | 
					
						
							|  |  |  |                        .toThrowError(new RegExp(`formGroup expects a FormGroup instance`)); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     it('should update the control group values on DOM change', | 
					
						
							|  |  |  |        inject( | 
					
						
							|  |  |  |            [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |            (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |              var form = new FormGroup({'login': new FormControl('oldValue')}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |              const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                 <input type="text" formControlName="login"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |               </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |              tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                  .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                  .createAsync(MyComp8) | 
					
						
							|  |  |  |                  .then((fixture) => { | 
					
						
							|  |  |  |                    fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |                    fixture.detectChanges(); | 
					
						
							|  |  |  |                    var input = fixture.debugElement.query(By.css('input')); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    input.nativeElement.value = 'updatedValue'; | 
					
						
							|  |  |  |                    dispatchEvent(input.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    expect(form.value).toEqual({'login': 'updatedValue'}); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     it('should ignore the change event for <input type=text>', | 
					
						
							|  |  |  |        inject( | 
					
						
							|  |  |  |            [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |            (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |              var form = new FormGroup({'login': new FormControl('oldValue')}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |              const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                 <input type="text" formControlName="login"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |               </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |              tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                  .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                  .createAsync(MyComp8) | 
					
						
							|  |  |  |                  .then((fixture) => { | 
					
						
							|  |  |  |                    fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |                    fixture.detectChanges(); | 
					
						
							|  |  |  |                    var input = fixture.debugElement.query(By.css('input')); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    input.nativeElement.value = 'updatedValue'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    ObservableWrapper.subscribe( | 
					
						
							|  |  |  |                        form.valueChanges, (value) => { throw 'Should not happen'; }); | 
					
						
							|  |  |  |                    dispatchEvent(input.nativeElement, 'change'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     it('should emit ngSubmit event on submit', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |        fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |          const t = `<div>
 | 
					
						
							|  |  |  |                       <form [formGroup]="form" (ngSubmit)="name='updated'"></form> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <span>{{name}}</span> | 
					
						
							|  |  |  |                     </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |          tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |          fixture.debugElement.componentInstance.form = new FormGroup({}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fixture.debugElement.componentInstance.name = 'old'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          var form = fixture.debugElement.query(By.css('form')); | 
					
						
							|  |  |  |          dispatchEvent(form.nativeElement, 'submit'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |          tick(); | 
					
						
							|  |  |  |          expect(fixture.debugElement.componentInstance.name).toEqual('updated'); | 
					
						
							|  |  |  |        }))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     it('should mark NgForm as submitted on submit event', | 
					
						
							|  |  |  |        inject([TestComponentBuilder], fakeAsync((tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                 const t = `<div>
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <form #f="ngForm" (ngSubmit)="data=f.submitted"></form> | 
					
						
							|  |  |  |                       <span>{{data}}</span> | 
					
						
							|  |  |  |                     </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                 var fixture: ComponentFixture<MyComp8>; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                 tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((root) => { | 
					
						
							|  |  |  |                   fixture = root; | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |                 tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                 fixture.debugElement.componentInstance.data = false; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                 tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                 var form = fixture.debugElement.query(By.css('form')); | 
					
						
							|  |  |  |                 dispatchEvent(form.nativeElement, 'submit'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                 tick(); | 
					
						
							|  |  |  |                 expect(fixture.debugElement.componentInstance.data).toEqual(true); | 
					
						
							|  |  |  |               }))); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |     it('should mark formGroup as submitted on submit event', | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |        inject([TestComponentBuilder], fakeAsync((tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                 const t = `<div>
 | 
					
						
							|  |  |  |                       <form #f="ngForm" [formGroup]="form" (ngSubmit)="data=f.submitted"></form> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <span>{{data}}</span> | 
					
						
							|  |  |  |                     </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                 var fixture: ComponentFixture<MyComp8>; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                 tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((root) => { | 
					
						
							|  |  |  |                   fixture = root; | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |                 tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |                 fixture.debugElement.componentInstance.form = new FormGroup({}); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                 fixture.debugElement.componentInstance.data = false; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                 tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                 var form = fixture.debugElement.query(By.css('form')); | 
					
						
							|  |  |  |                 dispatchEvent(form.nativeElement, 'submit'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                 tick(); | 
					
						
							|  |  |  |                 expect(fixture.debugElement.componentInstance.data).toEqual(true); | 
					
						
							|  |  |  |               }))); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     it('should work with single controls', | 
					
						
							|  |  |  |        inject( | 
					
						
							|  |  |  |            [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |            (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |              var control = new FormControl('loginValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 17:28:19 -07:00
										 |  |  |              const t = `<div><input type="text" [formControl]="form"></div>`; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |              tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                  .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                  .createAsync(MyComp8) | 
					
						
							|  |  |  |                  .then((fixture) => { | 
					
						
							|  |  |  |                    fixture.debugElement.componentInstance.form = control; | 
					
						
							|  |  |  |                    fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                    expect(input.nativeElement.value).toEqual('loginValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    input.nativeElement.value = 'updatedValue'; | 
					
						
							|  |  |  |                    dispatchEvent(input.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    expect(control.value).toEqual('updatedValue'); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     it('should update DOM elements when rebinding the control group', | 
					
						
							|  |  |  |        inject( | 
					
						
							|  |  |  |            [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |            (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |              const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                 <input type="text" formControlName="login"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |              tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                  .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                  .createAsync(MyComp8) | 
					
						
							|  |  |  |                  .then((fixture) => { | 
					
						
							|  |  |  |                    fixture.debugElement.componentInstance.form = | 
					
						
							|  |  |  |                        new FormGroup({'login': new FormControl('oldValue')}); | 
					
						
							|  |  |  |                    fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    fixture.debugElement.componentInstance.form = | 
					
						
							|  |  |  |                        new FormGroup({'login': new FormControl('newValue')}); | 
					
						
							|  |  |  |                    fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                    expect(input.nativeElement.value).toEqual('newValue'); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     it('should update DOM elements when updating the value of a control', | 
					
						
							|  |  |  |        inject( | 
					
						
							|  |  |  |            [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |            (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |              var login = new FormControl('oldValue'); | 
					
						
							|  |  |  |              var form = new FormGroup({'login': login}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |              const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                 <input type="text" formControlName="login"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |              tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                  .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                  .createAsync(MyComp8) | 
					
						
							|  |  |  |                  .then((fixture) => { | 
					
						
							|  |  |  |                    fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |                    fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    login.updateValue('newValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                    expect(input.nativeElement.value).toEqual('newValue'); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     it('should mark controls as touched after interacting with the DOM control', | 
					
						
							|  |  |  |        inject( | 
					
						
							|  |  |  |            [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |            (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |              var login = new FormControl('oldValue'); | 
					
						
							|  |  |  |              var form = new FormGroup({'login': login}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |              const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                 <input type="text" formControlName="login"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |              tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                  .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                  .createAsync(MyComp8) | 
					
						
							|  |  |  |                  .then((fixture) => { | 
					
						
							|  |  |  |                    fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |                    fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    var loginEl = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                    expect(login.touched).toBe(false); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    dispatchEvent(loginEl.nativeElement, 'blur'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    expect(login.touched).toBe(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('different control types', () => { | 
					
						
							|  |  |  |       it('should support <input type=text>', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                   <input type="text" formControlName="text"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                 </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = | 
					
						
							|  |  |  |                          new FormGroup({'text': new FormControl('old')}); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                      expect(input.nativeElement.value).toEqual('old'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      input.nativeElement.value = 'new'; | 
					
						
							|  |  |  |                      dispatchEvent(input.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(fixture.debugElement.componentInstance.form.value).toEqual({ | 
					
						
							|  |  |  |                        'text': 'new' | 
					
						
							|  |  |  |                      }); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support <input> without type', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                   <input formControlName="text"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                 </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = | 
					
						
							|  |  |  |                          new FormGroup({'text': new FormControl('old')}); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							|  |  |  |                      var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                      expect(input.nativeElement.value).toEqual('old'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                      input.nativeElement.value = 'new'; | 
					
						
							|  |  |  |                      dispatchEvent(input.nativeElement, 'input'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                      expect(fixture.debugElement.componentInstance.form.value).toEqual({ | 
					
						
							|  |  |  |                        'text': 'new' | 
					
						
							|  |  |  |                      }); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support <textarea>', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                   <textarea formControlName="text"></textarea> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                 </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = | 
					
						
							|  |  |  |                          new FormGroup({'text': new FormControl('old')}); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      var textarea = fixture.debugElement.query(By.css('textarea')); | 
					
						
							|  |  |  |                      expect(textarea.nativeElement.value).toEqual('old'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      textarea.nativeElement.value = 'new'; | 
					
						
							|  |  |  |                      dispatchEvent(textarea.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(fixture.debugElement.componentInstance.form.value).toEqual({ | 
					
						
							|  |  |  |                        'text': 'new' | 
					
						
							|  |  |  |                      }); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support <type=checkbox>', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                   <input type="checkbox" formControlName="checkbox"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                 </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = | 
					
						
							|  |  |  |                          new FormGroup({'checkbox': new FormControl(true)}); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                      expect(input.nativeElement.checked).toBe(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      input.nativeElement.checked = false; | 
					
						
							|  |  |  |                      dispatchEvent(input.nativeElement, 'change'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(fixture.debugElement.componentInstance.form.value).toEqual({ | 
					
						
							|  |  |  |                        'checkbox': false | 
					
						
							|  |  |  |                      }); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support <type=number>', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                   <input type="number" formControlName="num"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                 </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = | 
					
						
							|  |  |  |                          new FormGroup({'num': new FormControl(10)}); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                      expect(input.nativeElement.value).toEqual('10'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      input.nativeElement.value = '20'; | 
					
						
							|  |  |  |                      dispatchEvent(input.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(fixture.debugElement.componentInstance.form.value).toEqual({'num': 20}); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support <type=number> when value is cleared in the UI', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                   <input type="number" formControlName="num" required> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                 </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = | 
					
						
							|  |  |  |                          new FormGroup({'num': new FormControl(10)}); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                      input.nativeElement.value = ''; | 
					
						
							|  |  |  |                      dispatchEvent(input.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(fixture.debugElement.componentInstance.form.valid).toBe(false); | 
					
						
							|  |  |  |                      expect(fixture.debugElement.componentInstance.form.value).toEqual({ | 
					
						
							|  |  |  |                        'num': null | 
					
						
							|  |  |  |                      }); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      input.nativeElement.value = '0'; | 
					
						
							|  |  |  |                      dispatchEvent(input.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(fixture.debugElement.componentInstance.form.valid).toBe(true); | 
					
						
							|  |  |  |                      expect(fixture.debugElement.componentInstance.form.value).toEqual({'num': 0}); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support <type=number> when value is cleared programmatically', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |                var form = new FormGroup({'num': new FormControl(10)}); | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                   <input type="number" formControlName="num" [(ngModel)]="data"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                 </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.data = null; | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                      expect(input.nativeElement.value).toEqual(''); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support <type=radio>', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<form [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |                   <input type="radio" formControlName="food" value="chicken"> | 
					
						
							|  |  |  |                   <input type="radio" formControlName="food" value="fish"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                 </form>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |                const ctrl = new FormControl('fish'); | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |                      fixture.debugElement.componentInstance.form = new FormGroup({'food': ctrl}); | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |                      var inputs = fixture.debugElement.queryAll(By.css('input')); | 
					
						
							|  |  |  |                      expect(inputs[0].nativeElement.checked).toEqual(false); | 
					
						
							|  |  |  |                      expect(inputs[1].nativeElement.checked).toEqual(true); | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |                      dispatchEvent(inputs[0].nativeElement, 'change'); | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                      let value = fixture.debugElement.componentInstance.form.value; | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |                      expect(value.food).toEqual('chicken'); | 
					
						
							|  |  |  |                      expect(inputs[1].nativeElement.checked).toEqual(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                      ctrl.updateValue('fish'); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                      expect(inputs[0].nativeElement.checked).toEqual(false); | 
					
						
							|  |  |  |                      expect(inputs[1].nativeElement.checked).toEqual(true); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe('should support <select>', () => { | 
					
						
							|  |  |  |         it('with basic selection', | 
					
						
							|  |  |  |            inject( | 
					
						
							|  |  |  |                [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |                (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                  const t = `<select>
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <option value="SF"></option> | 
					
						
							|  |  |  |                       <option value="NYC"></option> | 
					
						
							|  |  |  |                     </select>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                  tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                      .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                      .createAsync(MyComp8) | 
					
						
							|  |  |  |                      .then((fixture) => { | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        var select = fixture.debugElement.query(By.css('select')); | 
					
						
							|  |  |  |                        var sfOption = fixture.debugElement.query(By.css('option')); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        expect(select.nativeElement.value).toEqual('SF'); | 
					
						
							|  |  |  |                        expect(sfOption.nativeElement.selected).toBe(true); | 
					
						
							|  |  |  |                        async.done(); | 
					
						
							|  |  |  |                      }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('with basic selection and value bindings', | 
					
						
							|  |  |  |            inject( | 
					
						
							|  |  |  |                [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |                (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                  const t = `<select>
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <option *ngFor="let city of list" [value]="city['id']"> | 
					
						
							|  |  |  |                         {{ city['name'] }} | 
					
						
							|  |  |  |                       </option> | 
					
						
							|  |  |  |                     </select>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                  tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                      .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                      .createAsync(MyComp8) | 
					
						
							|  |  |  |                      .then((fixture) => { | 
					
						
							|  |  |  |                        var testComp = fixture.debugElement.componentInstance; | 
					
						
							|  |  |  |                        testComp.list = [{'id': '0', 'name': 'SF'}, {'id': '1', 'name': 'NYC'}]; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                        var sfOption = fixture.debugElement.query(By.css('option')); | 
					
						
							|  |  |  |                        expect(sfOption.nativeElement.value).toEqual('0'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                        testComp.list[0]['id'] = '2'; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							|  |  |  |                        expect(sfOption.nativeElement.value).toEqual('2'); | 
					
						
							|  |  |  |                        async.done(); | 
					
						
							|  |  |  |                      }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('with ngControl', | 
					
						
							|  |  |  |            inject( | 
					
						
							|  |  |  |                [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |                (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                  const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                     <select formControlName="city"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <option value="SF"></option> | 
					
						
							|  |  |  |                       <option value="NYC"></option> | 
					
						
							|  |  |  |                     </select> | 
					
						
							|  |  |  |                   </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                  tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                      .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                      .createAsync(MyComp8) | 
					
						
							|  |  |  |                      .then((fixture) => { | 
					
						
							|  |  |  |                        fixture.debugElement.componentInstance.form = | 
					
						
							|  |  |  |                            new FormGroup({'city': new FormControl('SF')}); | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        var select = fixture.debugElement.query(By.css('select')); | 
					
						
							|  |  |  |                        var sfOption = fixture.debugElement.query(By.css('option')); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        expect(select.nativeElement.value).toEqual('SF'); | 
					
						
							|  |  |  |                        expect(sfOption.nativeElement.selected).toBe(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        select.nativeElement.value = 'NYC'; | 
					
						
							|  |  |  |                        dispatchEvent(select.nativeElement, 'change'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        expect(fixture.debugElement.componentInstance.form.value).toEqual({ | 
					
						
							|  |  |  |                          'city': 'NYC' | 
					
						
							|  |  |  |                        }); | 
					
						
							|  |  |  |                        expect(sfOption.nativeElement.selected).toBe(false); | 
					
						
							|  |  |  |                        async.done(); | 
					
						
							|  |  |  |                      }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('with a dynamic list of options', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |              const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                       <select formControlName="city"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                         <option *ngFor="let c of data" [value]="c"></option> | 
					
						
							|  |  |  |                       </select> | 
					
						
							|  |  |  |                   </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |              var fixture: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |              tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                  .createAsync(MyComp8) | 
					
						
							|  |  |  |                  .then((compFixture) => fixture = compFixture); | 
					
						
							|  |  |  |              tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              fixture.debugElement.componentInstance.form = | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |                  new FormGroup({'city': new FormControl('NYC')}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |              fixture.debugElement.componentInstance.data = ['SF', 'NYC']; | 
					
						
							|  |  |  |              fixture.detectChanges(); | 
					
						
							|  |  |  |              tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              var select = fixture.debugElement.query(By.css('select')); | 
					
						
							|  |  |  |              expect(select.nativeElement.value).toEqual('NYC'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            }))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('with option values that are objects', | 
					
						
							|  |  |  |            inject( | 
					
						
							|  |  |  |                [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |                (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                  const t = `<div>
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <select [(ngModel)]="selectedCity"> | 
					
						
							|  |  |  |                         <option *ngFor="let c of list" [ngValue]="c">{{c['name']}}</option> | 
					
						
							|  |  |  |                       </select> | 
					
						
							|  |  |  |                   </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                  tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                      .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                      .createAsync(MyComp8) | 
					
						
							|  |  |  |                      .then((fixture) => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                        var testComp = fixture.debugElement.componentInstance; | 
					
						
							|  |  |  |                        testComp.list = [{'name': 'SF'}, {'name': 'NYC'}, {'name': 'Buffalo'}]; | 
					
						
							|  |  |  |                        testComp.selectedCity = testComp.list[1]; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                        var select = fixture.debugElement.query(By.css('select')); | 
					
						
							|  |  |  |                        var nycOption = fixture.debugElement.queryAll(By.css('option'))[1]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                        expect(select.nativeElement.value).toEqual('1: Object'); | 
					
						
							|  |  |  |                        expect(nycOption.nativeElement.selected).toBe(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                        select.nativeElement.value = '2: Object'; | 
					
						
							|  |  |  |                        dispatchEvent(select.nativeElement, 'change'); | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							|  |  |  |                        TimerWrapper.setTimeout(() => { | 
					
						
							|  |  |  |                          expect(testComp.selectedCity['name']).toEqual('Buffalo'); | 
					
						
							|  |  |  |                          async.done(); | 
					
						
							|  |  |  |                        }, 0); | 
					
						
							|  |  |  |                      }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('when new options are added (selection through the model)', | 
					
						
							|  |  |  |            inject( | 
					
						
							|  |  |  |                [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |                (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                  const t = `<div>
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <select [(ngModel)]="selectedCity"> | 
					
						
							|  |  |  |                         <option *ngFor="let c of list" [ngValue]="c">{{c['name']}}</option> | 
					
						
							|  |  |  |                       </select> | 
					
						
							|  |  |  |                   </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                  tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                      .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                      .createAsync(MyComp8) | 
					
						
							|  |  |  |                      .then((fixture) => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                        var testComp: MyComp8 = fixture.debugElement.componentInstance; | 
					
						
							|  |  |  |                        testComp.list = [{'name': 'SF'}, {'name': 'NYC'}]; | 
					
						
							|  |  |  |                        testComp.selectedCity = testComp.list[1]; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                        testComp.list.push({'name': 'Buffalo'}); | 
					
						
							|  |  |  |                        testComp.selectedCity = testComp.list[2]; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                        var select = fixture.debugElement.query(By.css('select')); | 
					
						
							|  |  |  |                        var buffalo = fixture.debugElement.queryAll(By.css('option'))[2]; | 
					
						
							|  |  |  |                        expect(select.nativeElement.value).toEqual('2: Object'); | 
					
						
							|  |  |  |                        expect(buffalo.nativeElement.selected).toBe(true); | 
					
						
							|  |  |  |                        async.done(); | 
					
						
							|  |  |  |                      }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('when new options are added (selection through the UI)', | 
					
						
							|  |  |  |            inject( | 
					
						
							|  |  |  |                [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |                (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                  const t = `<div>
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <select [(ngModel)]="selectedCity"> | 
					
						
							|  |  |  |                         <option *ngFor="let c of list" [ngValue]="c">{{c['name']}}</option> | 
					
						
							|  |  |  |                       </select> | 
					
						
							|  |  |  |                   </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                  tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                      .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                      .createAsync(MyComp8) | 
					
						
							|  |  |  |                      .then((fixture) => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        var testComp: MyComp8 = fixture.debugElement.componentInstance; | 
					
						
							|  |  |  |                        testComp.list = [{'name': 'SF'}, {'name': 'NYC'}]; | 
					
						
							|  |  |  |                        testComp.selectedCity = testComp.list[0]; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        var select = fixture.debugElement.query(By.css('select')); | 
					
						
							|  |  |  |                        var ny = fixture.debugElement.queryAll(By.css('option'))[1]; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        select.nativeElement.value = '1: Object'; | 
					
						
							|  |  |  |                        dispatchEvent(select.nativeElement, 'change'); | 
					
						
							|  |  |  |                        testComp.list.push({'name': 'Buffalo'}); | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        expect(select.nativeElement.value).toEqual('1: Object'); | 
					
						
							|  |  |  |                        expect(ny.nativeElement.selected).toBe(true); | 
					
						
							|  |  |  |                        async.done(); | 
					
						
							|  |  |  |                      }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('when options are removed', | 
					
						
							|  |  |  |            inject( | 
					
						
							|  |  |  |                [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |                (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                  const t = `<div>
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <select [(ngModel)]="selectedCity"> | 
					
						
							|  |  |  |                         <option *ngFor="let c of list" [ngValue]="c">{{c}}</option> | 
					
						
							|  |  |  |                       </select> | 
					
						
							|  |  |  |                   </div>`;
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                  tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                      .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                      .createAsync(MyComp8) | 
					
						
							|  |  |  |                      .then((fixture) => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        var testComp: MyComp8 = fixture.debugElement.componentInstance; | 
					
						
							|  |  |  |                        testComp.list = [{'name': 'SF'}, {'name': 'NYC'}]; | 
					
						
							|  |  |  |                        testComp.selectedCity = testComp.list[1]; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        var select = fixture.debugElement.query(By.css('select')); | 
					
						
							|  |  |  |                        expect(select.nativeElement.value).toEqual('1: Object'); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        testComp.list.pop(); | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        expect(select.nativeElement.value).not.toEqual('1: Object'); | 
					
						
							|  |  |  |                        async.done(); | 
					
						
							|  |  |  |                      }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('when option values change identity while tracking by index', | 
					
						
							|  |  |  |            inject( | 
					
						
							|  |  |  |                [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |                (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                  const t = `<div>
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <select [(ngModel)]="selectedCity"> | 
					
						
							|  |  |  |                         <option *ngFor="let c of list; trackBy:customTrackBy" [ngValue]="c">{{c}}</option> | 
					
						
							|  |  |  |                       </select> | 
					
						
							|  |  |  |                   </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                  tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                      .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                      .createAsync(MyComp8) | 
					
						
							|  |  |  |                      .then((fixture) => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        var testComp = fixture.debugElement.componentInstance; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        testComp.list = [{'name': 'SF'}, {'name': 'NYC'}]; | 
					
						
							|  |  |  |                        testComp.selectedCity = testComp.list[0]; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        testComp.list[1] = 'Buffalo'; | 
					
						
							|  |  |  |                        testComp.selectedCity = testComp.list[1]; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        var select = fixture.debugElement.query(By.css('select')); | 
					
						
							|  |  |  |                        var buffalo = fixture.debugElement.queryAll(By.css('option'))[1]; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        expect(select.nativeElement.value).toEqual('1: Buffalo'); | 
					
						
							|  |  |  |                        expect(buffalo.nativeElement.selected).toBe(true); | 
					
						
							|  |  |  |                        async.done(); | 
					
						
							|  |  |  |                      }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('with duplicate option values', | 
					
						
							|  |  |  |            inject( | 
					
						
							|  |  |  |                [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |                (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                  const t = `<div>
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <select [(ngModel)]="selectedCity"> | 
					
						
							|  |  |  |                         <option *ngFor="let c of list" [ngValue]="c">{{c}}</option> | 
					
						
							|  |  |  |                       </select> | 
					
						
							|  |  |  |                   </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                  tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                      .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                      .createAsync(MyComp8) | 
					
						
							|  |  |  |                      .then((fixture) => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        var testComp = fixture.debugElement.componentInstance; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        testComp.list = [{'name': 'NYC'}, {'name': 'SF'}, {'name': 'SF'}]; | 
					
						
							|  |  |  |                        testComp.selectedCity = testComp.list[0]; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        testComp.selectedCity = testComp.list[1]; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        var select = fixture.debugElement.query(By.css('select')); | 
					
						
							|  |  |  |                        var firstSF = fixture.debugElement.queryAll(By.css('option'))[1]; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        expect(select.nativeElement.value).toEqual('1: Object'); | 
					
						
							|  |  |  |                        expect(firstSF.nativeElement.selected).toBe(true); | 
					
						
							|  |  |  |                        async.done(); | 
					
						
							|  |  |  |                      }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('when option values have same content, but different identities', | 
					
						
							|  |  |  |            inject( | 
					
						
							|  |  |  |                [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |                (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                  const t = `<div>
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                       <select [(ngModel)]="selectedCity"> | 
					
						
							|  |  |  |                         <option *ngFor="let c of list" [ngValue]="c">{{c['name']}}</option> | 
					
						
							|  |  |  |                       </select> | 
					
						
							|  |  |  |                   </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                  tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                      .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                      .createAsync(MyComp8) | 
					
						
							|  |  |  |                      .then((fixture) => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        var testComp = fixture.debugElement.componentInstance; | 
					
						
							|  |  |  |                        testComp.list = [{'name': 'SF'}, {'name': 'NYC'}, {'name': 'NYC'}]; | 
					
						
							|  |  |  |                        testComp.selectedCity = testComp.list[0]; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        testComp.selectedCity = testComp.list[2]; | 
					
						
							|  |  |  |                        fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        var select = fixture.debugElement.query(By.css('select')); | 
					
						
							|  |  |  |                        var secondNYC = fixture.debugElement.queryAll(By.css('option'))[2]; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                        expect(select.nativeElement.value).toEqual('2: Object'); | 
					
						
							|  |  |  |                        expect(secondNYC.nativeElement.selected).toBe(true); | 
					
						
							|  |  |  |                        async.done(); | 
					
						
							|  |  |  |                      }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support custom value accessors', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                   <input type="text" formControlName="name" wrapped-value> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                 </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = | 
					
						
							|  |  |  |                          new FormGroup({'name': new FormControl('aa')}); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							|  |  |  |                      var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                      expect(input.nativeElement.value).toEqual('!aa!'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                      input.nativeElement.value = '!bb!'; | 
					
						
							|  |  |  |                      dispatchEvent(input.nativeElement, 'input'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                      expect(fixture.debugElement.componentInstance.form.value).toEqual({ | 
					
						
							|  |  |  |                        'name': 'bb' | 
					
						
							|  |  |  |                      }); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |       it('should support custom value accessors on non builtin input elements that fire a change event without a \'target\' property', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							|  |  |  |                const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                   <my-input formControlName="name"></my-input> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                 </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = | 
					
						
							|  |  |  |                          new FormGroup({'name': new FormControl('aa')}); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							|  |  |  |                      var input = fixture.debugElement.query(By.css('my-input')); | 
					
						
							|  |  |  |                      expect(input.componentInstance.value).toEqual('!aa!'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                      input.componentInstance.value = '!bb!'; | 
					
						
							|  |  |  |                      ObservableWrapper.subscribe(input.componentInstance.onInput, (value) => { | 
					
						
							|  |  |  |                        expect(fixture.debugElement.componentInstance.form.value).toEqual({ | 
					
						
							|  |  |  |                          'name': 'bb' | 
					
						
							|  |  |  |                        }); | 
					
						
							|  |  |  |                        async.done(); | 
					
						
							|  |  |  |                      }); | 
					
						
							|  |  |  |                      input.componentInstance.dispatchChangeEvent(); | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                    }); | 
					
						
							|  |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     describe('validations', () => { | 
					
						
							|  |  |  |       it('should use sync validators defined in html', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |                var form = new FormGroup({ | 
					
						
							|  |  |  |                  'login': new FormControl(''), | 
					
						
							|  |  |  |                  'min': new FormControl(''), | 
					
						
							|  |  |  |                  'max': new FormControl('') | 
					
						
							|  |  |  |                }); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div [formGroup]="form" login-is-empty-validator>
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                     <input type="text" formControlName="login" required> | 
					
						
							|  |  |  |                     <input type="text" formControlName="min" minlength="3"> | 
					
						
							|  |  |  |                     <input type="text" formControlName="max" maxlength="3"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                  </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      var required = fixture.debugElement.query(By.css('[required]')); | 
					
						
							|  |  |  |                      var minLength = fixture.debugElement.query(By.css('[minlength]')); | 
					
						
							|  |  |  |                      var maxLength = fixture.debugElement.query(By.css('[maxlength]')); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      required.nativeElement.value = ''; | 
					
						
							|  |  |  |                      minLength.nativeElement.value = '1'; | 
					
						
							|  |  |  |                      maxLength.nativeElement.value = '1234'; | 
					
						
							|  |  |  |                      dispatchEvent(required.nativeElement, 'input'); | 
					
						
							|  |  |  |                      dispatchEvent(minLength.nativeElement, 'input'); | 
					
						
							|  |  |  |                      dispatchEvent(maxLength.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(form.hasError('required', ['login'])).toEqual(true); | 
					
						
							|  |  |  |                      expect(form.hasError('minlength', ['min'])).toEqual(true); | 
					
						
							|  |  |  |                      expect(form.hasError('maxlength', ['max'])).toEqual(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(form.hasError('loginIsEmpty')).toEqual(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      required.nativeElement.value = '1'; | 
					
						
							|  |  |  |                      minLength.nativeElement.value = '123'; | 
					
						
							|  |  |  |                      maxLength.nativeElement.value = '123'; | 
					
						
							|  |  |  |                      dispatchEvent(required.nativeElement, 'input'); | 
					
						
							|  |  |  |                      dispatchEvent(minLength.nativeElement, 'input'); | 
					
						
							|  |  |  |                      dispatchEvent(maxLength.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(form.valid).toEqual(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should use async validators defined in the html', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |            var form = new FormGroup({'login': new FormControl('')}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |            const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                     <input type="text" formControlName="login" uniq-login-validator="expected"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                  </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |            var rootTC: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((root) => rootTC = root); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            rootTC.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |            rootTC.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            expect(form.pending).toEqual(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            tick(100); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(form.hasError('uniqLogin', ['login'])).toEqual(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var input = rootTC.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |            input.nativeElement.value = 'expected'; | 
					
						
							|  |  |  |            dispatchEvent(input.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            tick(100); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            expect(form.valid).toEqual(true); | 
					
						
							|  |  |  |          }))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should use sync validators defined in the model', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |                var form = new FormGroup({'login': new FormControl('aa', Validators.required)}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                   <input type="text" formControlName="login"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                  </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							|  |  |  |                      expect(form.valid).toEqual(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      var input = fixture.debugElement.query(By.css('input')); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      input.nativeElement.value = ''; | 
					
						
							|  |  |  |                      dispatchEvent(input.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(form.valid).toEqual(false); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should use async validators defined in the model', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |            var control = | 
					
						
							|  |  |  |                new FormControl('', Validators.required, uniqLoginAsyncValidator('expected')); | 
					
						
							|  |  |  |            var form = new FormGroup({'login': control}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |            const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                   <input type="text" formControlName="login"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                  </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |            var fixture: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            tcb.overrideTemplate(MyComp8, t).createAsync(MyComp8).then((root) => fixture = root); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(form.hasError('required', ['login'])).toEqual(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |            input.nativeElement.value = 'wrong value'; | 
					
						
							|  |  |  |            dispatchEvent(input.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            expect(form.pending).toEqual(true); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(form.hasError('uniqLogin', ['login'])).toEqual(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            input.nativeElement.value = 'expected'; | 
					
						
							|  |  |  |            dispatchEvent(input.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            expect(form.valid).toEqual(true); | 
					
						
							|  |  |  |          }))); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     describe('nested forms', () => { | 
					
						
							|  |  |  |       it('should init DOM with the given form object', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							|  |  |  |                var form = | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |                    new FormGroup({'nested': new FormGroup({'login': new FormControl('value')})}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 16:37:42 -07:00
										 |  |  |                   <div formGroupName="nested"> | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                     <input type="text" formControlName="login"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                   </div> | 
					
						
							|  |  |  |               </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      var input = fixture.debugElement.query(By.css('input')); | 
					
						
							|  |  |  |                      expect(input.nativeElement.value).toEqual('value'); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should update the control group values on DOM change', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							|  |  |  |                var form = | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |                    new FormGroup({'nested': new FormGroup({'login': new FormControl('value')})}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div [formGroup]="form">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 16:37:42 -07:00
										 |  |  |                     <div formGroupName="nested"> | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                       <input type="text" formControlName="login"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                     </div> | 
					
						
							|  |  |  |                 </div>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							|  |  |  |                      var input = fixture.debugElement.query(By.css('input')); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      input.nativeElement.value = 'updatedValue'; | 
					
						
							|  |  |  |                      dispatchEvent(input.nativeElement, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(form.value).toEqual({'nested': {'login': 'updatedValue'}}); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     it('should support ngModel for complex forms', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |        fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |          var form = new FormGroup({'name': new FormControl('')}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |          const t = | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |              `<div [formGroup]="form"><input type="text" formControlName="name" [(ngModel)]="name"></div>`; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |          let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |          tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          fixture.debugElement.componentInstance.name = 'oldValue'; | 
					
						
							|  |  |  |          fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |          fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          var input = fixture.debugElement.query(By.css('input')).nativeElement; | 
					
						
							|  |  |  |          expect(input.value).toEqual('oldValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          input.value = 'updatedValue'; | 
					
						
							|  |  |  |          dispatchEvent(input, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |          tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          expect(fixture.debugElement.componentInstance.name).toEqual('updatedValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |        }))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     it('should support ngModel for single fields', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |        fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |          var form = new FormControl(''); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 17:28:19 -07:00
										 |  |  |          const t = `<div><input type="text" [formControl]="form" [(ngModel)]="name"></div>`; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |          let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |          tick(); | 
					
						
							|  |  |  |          fixture.debugElement.componentInstance.form = form; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          fixture.debugElement.componentInstance.name = 'oldValue'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          var input = fixture.debugElement.query(By.css('input')).nativeElement; | 
					
						
							|  |  |  |          expect(input.value).toEqual('oldValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          input.value = 'updatedValue'; | 
					
						
							|  |  |  |          dispatchEvent(input, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |          expect(fixture.debugElement.componentInstance.name).toEqual('updatedValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |        }))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     describe('template-driven forms', () => { | 
					
						
							|  |  |  |       it('should add new controls and control groups', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |            const t = `<form>
 | 
					
						
							| 
									
										
										
										
											2016-06-12 16:37:42 -07:00
										 |  |  |                      <div ngModelGroup="user"> | 
					
						
							|  |  |  |                       <input type="text" name="login" ngModel> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                      </div> | 
					
						
							|  |  |  |                </form>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            fixture.debugElement.componentInstance.name = null; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 14:53:01 -07:00
										 |  |  |            var form = fixture.debugElement.children[0].injector.get(NgForm); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            expect(form.controls['user']).not.toBeDefined(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            expect(form.controls['user']).toBeDefined(); | 
					
						
							|  |  |  |            expect(form.controls['user'].controls['login']).toBeDefined(); | 
					
						
							|  |  |  |          }))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should emit ngSubmit event on submit', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |            const t = `<div><form (ngSubmit)="name='updated'"></form></div>`; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            fixture.debugElement.componentInstance.name = 'old'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var form = fixture.debugElement.query(By.css('form')); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            dispatchEvent(form.nativeElement, 'submit'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(fixture.debugElement.componentInstance.name).toEqual('updated'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          }))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should not create a template-driven form when ngNoForm is used', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<form ngNoForm>
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                </form>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.name = null; | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(fixture.debugElement.children[0].providerTokens.length).toEqual(0); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should remove controls', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |            const t = `<form>
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                     <div *ngIf="name == 'show'"> | 
					
						
							| 
									
										
										
										
											2016-06-12 16:37:42 -07:00
										 |  |  |                       <input type="text" name="login" ngModel> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                     </div> | 
					
						
							|  |  |  |                   </form>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            fixture.debugElement.componentInstance.name = 'show'; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            tick(); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:53:01 -07:00
										 |  |  |            var form = fixture.debugElement.children[0].injector.get(NgForm); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            expect(form.controls['login']).toBeDefined(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            fixture.debugElement.componentInstance.name = 'hide'; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            expect(form.controls['login']).not.toBeDefined(); | 
					
						
							|  |  |  |          }))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should remove control groups', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |            const t = `<form>
 | 
					
						
							| 
									
										
										
										
											2016-06-12 16:37:42 -07:00
										 |  |  |                      <div *ngIf="name=='show'" ngModelGroup="user"> | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                       <input type="text" name="login" ngModel> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                      </div> | 
					
						
							|  |  |  |                </form>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            fixture.debugElement.componentInstance.name = 'show'; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            tick(); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:53:01 -07:00
										 |  |  |            var form = fixture.debugElement.children[0].injector.get(NgForm); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            expect(form.controls['user']).toBeDefined(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            fixture.debugElement.componentInstance.name = 'hide'; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            expect(form.controls['user']).not.toBeDefined(); | 
					
						
							|  |  |  |          }))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support ngModel for complex forms', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |            const t = `<form>
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                       <input type="text" name="name" [(ngModel)]="name"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                </form>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            fixture.debugElement.componentInstance.name = 'oldValue'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var input = fixture.debugElement.query(By.css('input')).nativeElement; | 
					
						
							|  |  |  |            expect(input.value).toEqual('oldValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            input.value = 'updatedValue'; | 
					
						
							|  |  |  |            dispatchEvent(input, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(fixture.debugElement.componentInstance.name).toEqual('updatedValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          }))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should support ngModel for single fields', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |            const t = `<div><input type="text" [(ngModel)]="name"></div>`; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            fixture.debugElement.componentInstance.name = 'oldValue'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var input = fixture.debugElement.query(By.css('input')).nativeElement; | 
					
						
							|  |  |  |            expect(input.value).toEqual('oldValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            input.value = 'updatedValue'; | 
					
						
							|  |  |  |            dispatchEvent(input, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(fixture.debugElement.componentInstance.name).toEqual('updatedValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          }))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 10:09:50 -07:00
										 |  |  |       it('should support ngModel registration with a parent form', | 
					
						
							|  |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            const t = `
 | 
					
						
							|  |  |  |             <form> | 
					
						
							|  |  |  |               <input name="first" [(ngModel)]="name" maxlength="4"> | 
					
						
							|  |  |  |             </form> | 
					
						
							|  |  |  |             `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            fixture.debugElement.componentInstance.name = 'Nancy'; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:53:01 -07:00
										 |  |  |            var form = fixture.debugElement.children[0].injector.get(NgForm); | 
					
						
							| 
									
										
										
										
											2016-06-10 10:09:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            expect(form.value).toEqual({first: 'Nancy'}); | 
					
						
							|  |  |  |            expect(form.valid).toBe(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          }))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should throw if ngModel has a parent form but no name attr', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							|  |  |  |                const t = `<form>
 | 
					
						
							|  |  |  |                   <input [(ngModel)]="name"> | 
					
						
							|  |  |  |                 </form>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      expect(() => fixture.detectChanges()) | 
					
						
							|  |  |  |                          .toThrowError(new RegExp(`Name attribute must be set`)); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-10 10:09:50 -07:00
										 |  |  |              })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-13 16:32:45 -07:00
										 |  |  |       it('should override name attribute with ngModelOptions name if provided', | 
					
						
							|  |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            const t = `
 | 
					
						
							|  |  |  |             <form> | 
					
						
							|  |  |  |               <input name="one" [(ngModel)]="data" [ngModelOptions]="{name: 'two'}"> | 
					
						
							|  |  |  |             </form> | 
					
						
							|  |  |  |             `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            const fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            fixture.debugElement.componentInstance.data = 'some data'; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-14 14:53:01 -07:00
										 |  |  |            const form = fixture.debugElement.children[0].injector.get(NgForm); | 
					
						
							| 
									
										
										
										
											2016-06-13 16:32:45 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            expect(form.value).toEqual({two: 'some data'}); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |       it('should support <type=radio>', | 
					
						
							|  |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            const t = `<form>
 | 
					
						
							|  |  |  |                   <input type="radio" name="food" [(ngModel)]="data.food" value="chicken"> | 
					
						
							|  |  |  |                   <input type="radio" name="food" [(ngModel)]="data.food" value="fish"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                 </form>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |            const fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |            fixture.debugElement.componentInstance.data = {food: 'fish'}; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |            const inputs = fixture.debugElement.queryAll(By.css('input')); | 
					
						
							|  |  |  |            expect(inputs[0].nativeElement.checked).toEqual(false); | 
					
						
							|  |  |  |            expect(inputs[1].nativeElement.checked).toEqual(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |            dispatchEvent(inputs[0].nativeElement, 'change'); | 
					
						
							|  |  |  |            tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |            const data = fixture.debugElement.componentInstance.data; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |            expect(data.food).toEqual('chicken'); | 
					
						
							|  |  |  |            expect(inputs[1].nativeElement.checked).toEqual(false); | 
					
						
							|  |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |       it('should support multiple named <type=radio> groups', | 
					
						
							|  |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            const t = `<form>
 | 
					
						
							|  |  |  |                   <input type="radio" name="food" [(ngModel)]="data.food" value="chicken"> | 
					
						
							|  |  |  |                   <input type="radio" name="food"  [(ngModel)]="data.food" value="fish"> | 
					
						
							|  |  |  |                   <input type="radio" name="drink" [(ngModel)]="data.drink" value="cola"> | 
					
						
							|  |  |  |                   <input type="radio" name="drink" [(ngModel)]="data.drink" value="sprite"> | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |                 </form>`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |            const fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            fixture.debugElement.componentInstance.data = {food: 'fish', drink: 'sprite'}; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |            tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |            const inputs = fixture.debugElement.queryAll(By.css('input')); | 
					
						
							|  |  |  |            expect(inputs[0].nativeElement.checked).toEqual(false); | 
					
						
							|  |  |  |            expect(inputs[1].nativeElement.checked).toEqual(true); | 
					
						
							|  |  |  |            expect(inputs[2].nativeElement.checked).toEqual(false); | 
					
						
							|  |  |  |            expect(inputs[3].nativeElement.checked).toEqual(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            dispatchEvent(inputs[0].nativeElement, 'change'); | 
					
						
							|  |  |  |            tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |            const data = fixture.debugElement.componentInstance.data; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |            expect(data.food).toEqual('chicken'); | 
					
						
							|  |  |  |            expect(data.drink).toEqual('sprite'); | 
					
						
							|  |  |  |            expect(inputs[1].nativeElement.checked).toEqual(false); | 
					
						
							|  |  |  |            expect(inputs[2].nativeElement.checked).toEqual(false); | 
					
						
							|  |  |  |            expect(inputs[3].nativeElement.checked).toEqual(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:15:41 -07:00
										 |  |  |          }))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     describe('setting status classes', () => { | 
					
						
							|  |  |  |       it('should work with single fields', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |                var form = new FormControl('', Validators.required); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 17:28:19 -07:00
										 |  |  |                const t = `<div><input type="text" [formControl]="form"></div>`; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      var input = fixture.debugElement.query(By.css('input')).nativeElement; | 
					
						
							|  |  |  |                      expect(sortedClassList(input)).toEqual([ | 
					
						
							|  |  |  |                        'ng-invalid', 'ng-pristine', 'ng-untouched' | 
					
						
							|  |  |  |                      ]); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      dispatchEvent(input, 'blur'); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(sortedClassList(input)).toEqual([ | 
					
						
							|  |  |  |                        'ng-invalid', 'ng-pristine', 'ng-touched' | 
					
						
							|  |  |  |                      ]); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      input.value = 'updatedValue'; | 
					
						
							|  |  |  |                      dispatchEvent(input, 'input'); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(sortedClassList(input)).toEqual(['ng-dirty', 'ng-touched', 'ng-valid']); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should work with complex model-driven forms', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |                var form = new FormGroup({'name': new FormControl('', Validators.required)}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                const t = | 
					
						
							|  |  |  |                    `<form [formGroup]="form"><input type="text" formControlName="name"></form>`; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      var input = fixture.debugElement.query(By.css('input')).nativeElement; | 
					
						
							|  |  |  |                      expect(sortedClassList(input)).toEqual([ | 
					
						
							|  |  |  |                        'ng-invalid', 'ng-pristine', 'ng-untouched' | 
					
						
							|  |  |  |                      ]); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      dispatchEvent(input, 'blur'); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(sortedClassList(input)).toEqual([ | 
					
						
							|  |  |  |                        'ng-invalid', 'ng-pristine', 'ng-touched' | 
					
						
							|  |  |  |                      ]); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      input.value = 'updatedValue'; | 
					
						
							|  |  |  |                      dispatchEvent(input, 'input'); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(sortedClassList(input)).toEqual(['ng-dirty', 'ng-touched', 'ng-valid']); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should work with ngModel', | 
					
						
							|  |  |  |          inject( | 
					
						
							|  |  |  |              [TestComponentBuilder, AsyncTestCompleter], | 
					
						
							|  |  |  |              (tcb: TestComponentBuilder, async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |                const t = `<div><input [(ngModel)]="name" required></div>`; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                tcb.overrideTemplate(MyComp8, t) | 
					
						
							|  |  |  |                    .overrideProviders(MyComp8, providerArr) | 
					
						
							|  |  |  |                    .createAsync(MyComp8) | 
					
						
							|  |  |  |                    .then((fixture) => { | 
					
						
							|  |  |  |                      fixture.debugElement.componentInstance.name = ''; | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      var input = fixture.debugElement.query(By.css('input')).nativeElement; | 
					
						
							|  |  |  |                      expect(sortedClassList(input)).toEqual([ | 
					
						
							|  |  |  |                        'ng-invalid', 'ng-pristine', 'ng-untouched' | 
					
						
							|  |  |  |                      ]); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      dispatchEvent(input, 'blur'); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(sortedClassList(input)).toEqual([ | 
					
						
							|  |  |  |                        'ng-invalid', 'ng-pristine', 'ng-touched' | 
					
						
							|  |  |  |                      ]); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      input.value = 'updatedValue'; | 
					
						
							|  |  |  |                      dispatchEvent(input, 'input'); | 
					
						
							|  |  |  |                      fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  |                      expect(sortedClassList(input)).toEqual(['ng-dirty', 'ng-touched', 'ng-valid']); | 
					
						
							|  |  |  |                      async.done(); | 
					
						
							|  |  |  |                    }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     describe('ngModel corner cases', () => { | 
					
						
							|  |  |  |       it('should not update the view when the value initially came from the view', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |            var form = new FormControl(''); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 17:28:19 -07:00
										 |  |  |            const t = `<div><input type="text" [formControl]="form" [(ngModel)]="name"></div>`; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            fixture.debugElement.componentInstance.form = form; | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var input = fixture.debugElement.query(By.css('input')).nativeElement; | 
					
						
							|  |  |  |            input.value = 'aa'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            input.setSelectionRange(1, 2); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            dispatchEvent(input, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            // selection start has not changed because we did not reset the value
 | 
					
						
							|  |  |  |            expect(input.selectionStart).toEqual(1); | 
					
						
							|  |  |  |          }))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should update the view when the model is set back to what used to be in the view', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |            const t = `<input type="text" [(ngModel)]="name">`; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            fixture.debugElement.componentInstance.name = ''; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            // Type "aa" into the input.
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            var input = fixture.debugElement.query(By.css('input')).nativeElement; | 
					
						
							|  |  |  |            input.value = 'aa'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            input.selectionStart = 1; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            dispatchEvent(input, 'input'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(fixture.debugElement.componentInstance.name).toEqual('aa'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            // Programatically update the input value to be "bb".
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            fixture.debugElement.componentInstance.name = 'bb'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            tick(); | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(input.value).toEqual('bb'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            // Programatically set it back to "aa".
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            fixture.debugElement.componentInstance.name = 'aa'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            tick(); | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(input.value).toEqual('aa'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          }))); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should not crash when validity is checked from a binding', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          fakeAsync(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => { | 
					
						
							|  |  |  |            // {{x.valid}} used to crash because valid() tried to read a property
 | 
					
						
							|  |  |  |            // from form.control before it was set. This test verifies this bug is
 | 
					
						
							|  |  |  |            // fixed.
 | 
					
						
							| 
									
										
										
										
											2016-06-12 16:37:42 -07:00
										 |  |  |            const t = `<form><div ngModelGroup="x" #x="ngModelGroup">
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |                   <input type="text" name="test" ngModel></div>{{x.valid}}</form>`;
 | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            let fixture = tcb.overrideTemplate(MyComp8, t).createFakeAsync(MyComp8); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            fixture.detectChanges(); | 
					
						
							|  |  |  |          }))); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Directive({ | 
					
						
							|  |  |  |   selector: '[wrapped-value]', | 
					
						
							|  |  |  |   host: {'(input)': 'handleOnInput($event.target.value)', '[value]': 'value'} | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | class WrappedValue implements ControlValueAccessor { | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |   value: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |   onChange: Function; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   constructor(cd: NgControl) { cd.valueAccessor = this; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |   writeValue(value: any /** TODO #9100 */) { this.value = `!${value}!`; } | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |   registerOnChange(fn: any /** TODO #9100 */) { this.onChange = fn; } | 
					
						
							|  |  |  |   registerOnTouched(fn: any /** TODO #9100 */) {} | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   handleOnInput(value: any /** TODO #9100 */) { | 
					
						
							|  |  |  |     this.onChange(value.substring(1, value.length - 1)); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | @Component({selector: 'my-input', template: ''}) | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | class MyInput implements ControlValueAccessor { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |   @Output('input') onInput = new EventEmitter(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |   value: string; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   constructor(cd: NgControl) { cd.valueAccessor = this; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |   writeValue(value: any /** TODO #9100 */) { this.value = `!${value}!`; } | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |   registerOnChange(fn: any /** TODO #9100 */) { ObservableWrapper.subscribe(this.onInput, fn); } | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |   registerOnTouched(fn: any /** TODO #9100 */) {} | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   dispatchChangeEvent() { | 
					
						
							|  |  |  |     ObservableWrapper.callEmit(this.onInput, this.value.substring(1, this.value.length - 1)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function uniqLoginAsyncValidator(expectedValue: string) { | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |   return (c: any /** TODO #9100 */) => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |     var completer = PromiseWrapper.completer(); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     var res = (c.value == expectedValue) ? null : {'uniqLogin': true}; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |     completer.resolve(res); | 
					
						
							|  |  |  |     return completer.promise; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  | function loginIsEmptyGroupValidator(c: FormGroup) { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   return c.controls['login'].value == '' ? {'loginIsEmpty': true} : null; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Directive({ | 
					
						
							|  |  |  |   selector: '[login-is-empty-validator]', | 
					
						
							|  |  |  |   providers: [ | 
					
						
							|  |  |  |     /* @ts2dart_Provider */ { | 
					
						
							|  |  |  |       provide: NG_VALIDATORS, | 
					
						
							|  |  |  |       useValue: loginIsEmptyGroupValidator, | 
					
						
							|  |  |  |       multi: true | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   ] | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | class LoginIsEmptyValidator { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Directive({ | 
					
						
							|  |  |  |   selector: '[uniq-login-validator]', | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   providers: [{ | 
					
						
							|  |  |  |     provide: NG_ASYNC_VALIDATORS, | 
					
						
							|  |  |  |     useExisting: forwardRef(() => UniqLoginValidator), | 
					
						
							|  |  |  |     multi: true | 
					
						
							|  |  |  |   }] | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | }) | 
					
						
							|  |  |  | class UniqLoginValidator implements Validator { | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |   @Input('uniq-login-validator') expected: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |   validate(c: any /** TODO #9100 */) { return uniqLoginAsyncValidator(this.expected)(c); } | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Component({ | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   selector: 'my-comp', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |   template: '', | 
					
						
							|  |  |  |   directives: [ | 
					
						
							| 
									
										
										
										
											2016-06-10 17:28:19 -07:00
										 |  |  |     FORM_DIRECTIVES, WrappedValue, MyInput, NgIf, NgFor, LoginIsEmptyValidator, UniqLoginValidator, | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |     REACTIVE_FORM_DIRECTIVES | 
					
						
							| 
									
										
										
										
											2016-06-10 10:09:50 -07:00
										 |  |  |   ], | 
					
						
							|  |  |  |   providers: [FORM_PROVIDERS] | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | }) | 
					
						
							|  |  |  | class MyComp8 { | 
					
						
							|  |  |  |   form: any; | 
					
						
							|  |  |  |   name: string; | 
					
						
							|  |  |  |   data: any; | 
					
						
							|  |  |  |   list: any[]; | 
					
						
							|  |  |  |   selectedCity: any; | 
					
						
							|  |  |  |   customTrackBy(index: number, obj: any): number { return index; }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  | function sortedClassList(el: any /** TODO #9100 */) { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |   var l = getDOM().classList(el); | 
					
						
							|  |  |  |   ListWrapper.sort(l); | 
					
						
							|  |  |  |   return l; | 
					
						
							|  |  |  | } |