| 
									
										
										
										
											2016-06-23 09:47:54 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  | import {SimpleChange} from '@angular/core/src/change_detection'; | 
					
						
							|  |  |  | import {fakeAsync, flushMicrotasks, tick} from '@angular/core/testing'; | 
					
						
							| 
									
										
										
										
											2016-09-27 17:12:25 -07:00
										 |  |  | import {beforeEach, describe, expect, it} from '@angular/core/testing/testing_internal'; | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  | import {CheckboxControlValueAccessor, ControlValueAccessor, DefaultValueAccessor, FormArray, FormArrayName, FormControl, FormControlDirective, FormControlName, FormGroup, FormGroupDirective, FormGroupName, NgControl, NgForm, NgModel, NgModelGroup, SelectControlValueAccessor, SelectMultipleControlValueAccessor, Validator, Validators} from '@angular/forms'; | 
					
						
							|  |  |  | import {composeValidators, selectValueAccessor} from '@angular/forms/src/directives/shared'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-14 18:23:40 -07:00
										 |  |  | import {SpyNgControl, SpyValueAccessor} from './spies'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | class DummyControlValueAccessor implements ControlValueAccessor { | 
					
						
							| 
									
										
										
										
											2016-06-11 21:23:37 -07:00
										 |  |  |   writtenValue: any; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |   registerOnChange(fn: any /** TODO #9100 */) {} | 
					
						
							|  |  |  |   registerOnTouched(fn: any /** TODO #9100 */) {} | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   writeValue(obj: any): void { this.writtenValue = obj; } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CustomValidatorDirective implements Validator { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |   validate(c: FormControl): {[key: string]: any} { return {'custom': true}; } | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  | function asyncValidator(expected: any /** TODO #9100 */, timeout = 0) { | 
					
						
							|  |  |  |   return (c: any /** TODO #9100 */) => { | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |     var resolve: (result: any) => void; | 
					
						
							|  |  |  |     var promise = new Promise(res => { resolve = res; }); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     var res = c.value != expected ? {'async': true} : null; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |     if (timeout == 0) { | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |       resolve(res); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |       setTimeout(() => { resolve(res); }, timeout); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |     return promise; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   describe('Form Directives', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |     var defaultAccessor: DefaultValueAccessor; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     beforeEach(() => { defaultAccessor = new DefaultValueAccessor(null, null); }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     describe('shared', () => { | 
					
						
							|  |  |  |       describe('selectValueAccessor', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         var dir: NgControl; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         beforeEach(() => { dir = <any>new SpyNgControl(); }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should throw when given an empty array', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            () => { expect(() => selectValueAccessor(dir, [])).toThrowError(); }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should return the default value accessor when no other provided', | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            () => { expect(selectValueAccessor(dir, [defaultAccessor])).toEqual(defaultAccessor); }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should return checkbox accessor when provided', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |           var checkboxAccessor = new CheckboxControlValueAccessor(null, null); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |           expect(selectValueAccessor(dir, [ | 
					
						
							|  |  |  |             defaultAccessor, checkboxAccessor | 
					
						
							|  |  |  |           ])).toEqual(checkboxAccessor); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should return select accessor when provided', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |           var selectAccessor = new SelectControlValueAccessor(null, null); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |           expect(selectValueAccessor(dir, [ | 
					
						
							|  |  |  |             defaultAccessor, selectAccessor | 
					
						
							|  |  |  |           ])).toEqual(selectAccessor); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-30 18:04:00 -07:00
										 |  |  |         it('should return select multiple accessor when provided', () => { | 
					
						
							| 
									
										
										
										
											2016-08-24 16:58:43 -07:00
										 |  |  |           const selectMultipleAccessor = new SelectMultipleControlValueAccessor(null, null); | 
					
						
							| 
									
										
										
										
											2016-06-30 18:04:00 -07:00
										 |  |  |           expect(selectValueAccessor(dir, [ | 
					
						
							|  |  |  |             defaultAccessor, selectMultipleAccessor | 
					
						
							|  |  |  |           ])).toEqual(selectMultipleAccessor); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should throw when more than one build-in accessor is provided', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |           var checkboxAccessor = new CheckboxControlValueAccessor(null, null); | 
					
						
							|  |  |  |           var selectAccessor = new SelectControlValueAccessor(null, null); | 
					
						
							|  |  |  |           expect(() => selectValueAccessor(dir, [checkboxAccessor, selectAccessor])).toThrowError(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should return custom accessor when provided', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |           var customAccessor = new SpyValueAccessor(); | 
					
						
							|  |  |  |           var checkboxAccessor = new CheckboxControlValueAccessor(null, null); | 
					
						
							|  |  |  |           expect(selectValueAccessor(dir, <any>[defaultAccessor, customAccessor, checkboxAccessor])) | 
					
						
							|  |  |  |               .toEqual(customAccessor); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-30 18:04:00 -07:00
										 |  |  |         it('should return custom accessor when provided with select multiple', () => { | 
					
						
							|  |  |  |           const customAccessor = new SpyValueAccessor(); | 
					
						
							| 
									
										
										
										
											2016-08-24 16:58:43 -07:00
										 |  |  |           const selectMultipleAccessor = new SelectMultipleControlValueAccessor(null, null); | 
					
						
							| 
									
										
										
										
											2016-06-30 18:04:00 -07:00
										 |  |  |           expect(selectValueAccessor( | 
					
						
							|  |  |  |                      dir, <any>[defaultAccessor, customAccessor, selectMultipleAccessor])) | 
					
						
							|  |  |  |               .toEqual(customAccessor); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should throw when more than one custom accessor is provided', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |           var customAccessor: ControlValueAccessor = <any>new SpyValueAccessor(); | 
					
						
							|  |  |  |           expect(() => selectValueAccessor(dir, [customAccessor, customAccessor])).toThrowError(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       describe('composeValidators', () => { | 
					
						
							|  |  |  |         it('should compose functions', () => { | 
					
						
							|  |  |  |           var dummy1 = (_: any /** TODO #9100 */) => ({'dummy1': true}); | 
					
						
							|  |  |  |           var dummy2 = (_: any /** TODO #9100 */) => ({'dummy2': true}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |           var v = composeValidators([dummy1, dummy2]); | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |           expect(v(new FormControl(''))).toEqual({'dummy1': true, 'dummy2': true}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should compose validator directives', () => { | 
					
						
							|  |  |  |           var dummy1 = (_: any /** TODO #9100 */) => ({'dummy1': true}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |           var v = composeValidators([dummy1, new CustomValidatorDirective()]); | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |           expect(v(new FormControl(''))).toEqual({'dummy1': true, 'custom': true}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |     describe('formGroup', () => { | 
					
						
							| 
									
										
										
										
											2016-08-24 16:58:43 -07:00
										 |  |  |       let form: FormGroupDirective; | 
					
						
							|  |  |  |       let formModel: FormGroup; | 
					
						
							|  |  |  |       let loginControlDir: FormControlName; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |         form = new FormGroupDirective([], []); | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |         formModel = new FormGroup({ | 
					
						
							|  |  |  |           'login': new FormControl(), | 
					
						
							|  |  |  |           'passwords': new FormGroup( | 
					
						
							|  |  |  |               {'password': new FormControl(), 'passwordConfirm': new FormControl()}) | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  |         form.form = formModel; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |         loginControlDir = new FormControlName( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |             form, [Validators.required], [asyncValidator('expected')], [defaultAccessor]); | 
					
						
							|  |  |  |         loginControlDir.name = 'login'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         loginControlDir.valueAccessor = new DummyControlValueAccessor(); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should reexport control properties', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(form.control).toBe(formModel); | 
					
						
							|  |  |  |         expect(form.value).toBe(formModel.value); | 
					
						
							|  |  |  |         expect(form.valid).toBe(formModel.valid); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:41:25 -07:00
										 |  |  |         expect(form.invalid).toBe(formModel.invalid); | 
					
						
							|  |  |  |         expect(form.pending).toBe(formModel.pending); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(form.errors).toBe(formModel.errors); | 
					
						
							|  |  |  |         expect(form.pristine).toBe(formModel.pristine); | 
					
						
							|  |  |  |         expect(form.dirty).toBe(formModel.dirty); | 
					
						
							|  |  |  |         expect(form.touched).toBe(formModel.touched); | 
					
						
							|  |  |  |         expect(form.untouched).toBe(formModel.untouched); | 
					
						
							| 
									
										
										
										
											2016-06-24 13:37:42 -07:00
										 |  |  |         expect(form.statusChanges).toBe(formModel.statusChanges); | 
					
						
							|  |  |  |         expect(form.valueChanges).toBe(formModel.valueChanges); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-19 18:49:02 +02:00
										 |  |  |       it('should reexport control methods', () => { | 
					
						
							|  |  |  |         expect(form.hasError('required')).toBe(formModel.hasError('required')); | 
					
						
							|  |  |  |         expect(form.getError('required')).toBe(formModel.getError('required')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         formModel.setErrors({required: true}); | 
					
						
							|  |  |  |         expect(form.hasError('required')).toBe(formModel.hasError('required')); | 
					
						
							|  |  |  |         expect(form.getError('required')).toBe(formModel.getError('required')); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       describe('addControl', () => { | 
					
						
							|  |  |  |         it('should throw when no control found', () => { | 
					
						
							| 
									
										
										
										
											2016-08-24 16:58:43 -07:00
										 |  |  |           const dir = new FormControlName(form, null, null, [defaultAccessor]); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |           dir.name = 'invalidName'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |           expect(() => form.addControl(dir)) | 
					
						
							| 
									
										
										
										
											2016-07-13 14:13:02 -07:00
										 |  |  |               .toThrowError(new RegExp(`Cannot find control with name: 'invalidName'`)); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 14:13:02 -07:00
										 |  |  |         it('should throw for a named control when no value accessor', () => { | 
					
						
							|  |  |  |           const dir = new FormControlName(form, null, null, null); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |           dir.name = 'login'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |           expect(() => form.addControl(dir)) | 
					
						
							| 
									
										
										
										
											2016-07-13 14:13:02 -07:00
										 |  |  |               .toThrowError(new RegExp(`No value accessor for form control with name: 'login'`)); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should throw when no value accessor with path', () => { | 
					
						
							|  |  |  |           const group = new FormGroupName(form, null, null); | 
					
						
							|  |  |  |           const dir = new FormControlName(group, null, null, null); | 
					
						
							|  |  |  |           group.name = 'passwords'; | 
					
						
							|  |  |  |           dir.name = 'password'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(() => form.addControl(dir)) | 
					
						
							|  |  |  |               .toThrowError(new RegExp( | 
					
						
							|  |  |  |                   `No value accessor for form control with path: 'passwords -> password'`)); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should set up validators', fakeAsync(() => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |              form.addControl(loginControlDir); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              // sync validators are set
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              expect(formModel.hasError('required', ['login'])).toBe(true); | 
					
						
							|  |  |  |              expect(formModel.hasError('async', ['login'])).toBe(false); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 13:35:17 -07:00
										 |  |  |              (<FormControl>formModel.get('login')).setValue('invalid value'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |              // sync validator passes, running async validators
 | 
					
						
							|  |  |  |              expect(formModel.pending).toBe(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              expect(formModel.hasError('required', ['login'])).toBe(false); | 
					
						
							|  |  |  |              expect(formModel.hasError('async', ['login'])).toBe(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should write value to the DOM', () => { | 
					
						
							| 
									
										
										
										
											2016-08-05 13:35:17 -07:00
										 |  |  |           (<FormControl>formModel.get(['login'])).setValue('initValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |           form.addControl(loginControlDir); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |           expect((<any>loginControlDir.valueAccessor).writtenValue).toEqual('initValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should add the directive to the list of directives included in the form', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |           form.addControl(loginControlDir); | 
					
						
							|  |  |  |           expect(form.directives).toEqual([loginControlDir]); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |       describe('addFormGroup', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |         var matchingPasswordsValidator = (g: any /** TODO #9100 */) => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |           if (g.controls['password'].value != g.controls['passwordConfirm'].value) { | 
					
						
							|  |  |  |             return {'differentPasswords': true}; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |           } else { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should set up validator', fakeAsync(() => { | 
					
						
							| 
									
										
										
										
											2016-06-12 16:37:42 -07:00
										 |  |  |              var group = new FormGroupName( | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                  form, [matchingPasswordsValidator], [asyncValidator('expected')]); | 
					
						
							|  |  |  |              group.name = 'passwords'; | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |              form.addFormGroup(group); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 13:35:17 -07:00
										 |  |  |              (<FormControl>formModel.get(['passwords', 'password'])).setValue('somePassword'); | 
					
						
							|  |  |  |              (<FormControl>formModel.get([ | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                'passwords', 'passwordConfirm' | 
					
						
							| 
									
										
										
										
											2016-08-05 13:35:17 -07:00
										 |  |  |              ])).setValue('someOtherPassword'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |              // sync validators are set
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              expect(formModel.hasError('differentPasswords', ['passwords'])).toEqual(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 13:35:17 -07:00
										 |  |  |              (<FormControl>formModel.get([ | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |                'passwords', 'passwordConfirm' | 
					
						
							| 
									
										
										
										
											2016-08-05 13:35:17 -07:00
										 |  |  |              ])).setValue('somePassword'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |              // sync validators pass, running async validators
 | 
					
						
							|  |  |  |              expect(formModel.pending).toBe(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              expect(formModel.hasError('async', ['passwords'])).toBe(true); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            })); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       describe('removeControl', () => { | 
					
						
							|  |  |  |         it('should remove the directive to the list of directives included in the form', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |           form.addControl(loginControlDir); | 
					
						
							|  |  |  |           form.removeControl(loginControlDir); | 
					
						
							|  |  |  |           expect(form.directives).toEqual([]); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       describe('ngOnChanges', () => { | 
					
						
							|  |  |  |         it('should update dom values of all the directives', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |           form.addControl(loginControlDir); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 13:35:17 -07:00
										 |  |  |           (<FormControl>formModel.get(['login'])).setValue('new value'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |           form.ngOnChanges({}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |           expect((<any>loginControlDir.valueAccessor).writtenValue).toEqual('new value'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should set up a sync validator', () => { | 
					
						
							|  |  |  |           var formValidator = (c: any /** TODO #9100 */) => ({'custom': true}); | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |           var f = new FormGroupDirective([formValidator], []); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |           f.form = formModel; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |           f.ngOnChanges({'form': new SimpleChange(null, null)}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |           expect(formModel.errors).toEqual({'custom': true}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should set up an async validator', fakeAsync(() => { | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |              var f = new FormGroupDirective([], [asyncValidator('expected')]); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |              f.form = formModel; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              f.ngOnChanges({'form': new SimpleChange(null, null)}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |              tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |              expect(formModel.errors).toEqual({'async': true}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            })); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     describe('NgForm', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |       var form: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |       var formModel: FormGroup; | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |       var loginControlDir: any /** TODO #9100 */; | 
					
						
							|  |  |  |       var personControlGroupDir: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => { | 
					
						
							|  |  |  |         form = new NgForm([], []); | 
					
						
							|  |  |  |         formModel = form.form; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-12 16:37:42 -07:00
										 |  |  |         personControlGroupDir = new NgModelGroup(form, [], []); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         personControlGroupDir.name = 'person'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-23 09:55:26 -07:00
										 |  |  |         loginControlDir = new NgModel(personControlGroupDir, null, null, [defaultAccessor]); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         loginControlDir.name = 'login'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         loginControlDir.valueAccessor = new DummyControlValueAccessor(); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should reexport control properties', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(form.control).toBe(formModel); | 
					
						
							|  |  |  |         expect(form.value).toBe(formModel.value); | 
					
						
							|  |  |  |         expect(form.valid).toBe(formModel.valid); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:41:25 -07:00
										 |  |  |         expect(form.invalid).toBe(formModel.invalid); | 
					
						
							|  |  |  |         expect(form.pending).toBe(formModel.pending); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(form.errors).toBe(formModel.errors); | 
					
						
							|  |  |  |         expect(form.pristine).toBe(formModel.pristine); | 
					
						
							|  |  |  |         expect(form.dirty).toBe(formModel.dirty); | 
					
						
							|  |  |  |         expect(form.touched).toBe(formModel.touched); | 
					
						
							|  |  |  |         expect(form.untouched).toBe(formModel.untouched); | 
					
						
							| 
									
										
										
										
											2016-06-24 13:37:42 -07:00
										 |  |  |         expect(form.statusChanges).toBe(formModel.statusChanges); | 
					
						
							|  |  |  |         expect(form.valueChanges).toBe(formModel.valueChanges); | 
					
						
							| 
									
										
										
										
											2016-08-25 14:56:31 -07:00
										 |  |  |         expect(form.disabled).toBe(formModel.disabled); | 
					
						
							|  |  |  |         expect(form.enabled).toBe(formModel.enabled); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-19 18:49:02 +02:00
										 |  |  |       it('should reexport control methods', () => { | 
					
						
							|  |  |  |         expect(form.hasError('required')).toBe(formModel.hasError('required')); | 
					
						
							|  |  |  |         expect(form.getError('required')).toBe(formModel.getError('required')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         formModel.setErrors({required: true}); | 
					
						
							|  |  |  |         expect(form.hasError('required')).toBe(formModel.hasError('required')); | 
					
						
							|  |  |  |         expect(form.getError('required')).toBe(formModel.getError('required')); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |       describe('addControl & addFormGroup', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should create a control with the given name', fakeAsync(() => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |              form.addFormGroup(personControlGroupDir); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |              form.addControl(loginControlDir); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              flushMicrotasks(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 13:35:17 -07:00
										 |  |  |              expect(formModel.get(['person', 'login'])).not.toBeNull; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // should update the form's value and validity
 | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |       describe('removeControl & removeFormGroup', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         it('should remove control', fakeAsync(() => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |              form.addFormGroup(personControlGroupDir); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |              form.addControl(loginControlDir); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |              form.removeFormGroup(personControlGroupDir); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |              form.removeControl(loginControlDir); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |              flushMicrotasks(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 13:35:17 -07:00
										 |  |  |              expect(formModel.get(['person'])).toBeNull(); | 
					
						
							|  |  |  |              expect(formModel.get(['person', 'login'])).toBeNull(); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // should update the form's value and validity
 | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should set up sync validator', fakeAsync(() => { | 
					
						
							|  |  |  |            var formValidator = (c: any /** TODO #9100 */) => ({'custom': true}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            var f = new NgForm([formValidator], []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(f.form.errors).toEqual({'custom': true}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should set up async validator', fakeAsync(() => { | 
					
						
							|  |  |  |            var f = new NgForm([], [asyncValidator('expected')]); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(f.form.errors).toEqual({'async': true}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-12 16:37:42 -07:00
										 |  |  |     describe('FormGroupName', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |       var formModel: any /** TODO #9100 */; | 
					
						
							|  |  |  |       var controlGroupDir: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |         formModel = new FormGroup({'login': new FormControl(null)}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |         var parent = new FormGroupDirective([], []); | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |         parent.form = new FormGroup({'group': formModel}); | 
					
						
							| 
									
										
										
										
											2016-06-12 16:37:42 -07:00
										 |  |  |         controlGroupDir = new FormGroupName(parent, [], []); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         controlGroupDir.name = 'group'; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should reexport control properties', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(controlGroupDir.control).toBe(formModel); | 
					
						
							|  |  |  |         expect(controlGroupDir.value).toBe(formModel.value); | 
					
						
							|  |  |  |         expect(controlGroupDir.valid).toBe(formModel.valid); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:41:25 -07:00
										 |  |  |         expect(controlGroupDir.invalid).toBe(formModel.invalid); | 
					
						
							|  |  |  |         expect(controlGroupDir.pending).toBe(formModel.pending); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(controlGroupDir.errors).toBe(formModel.errors); | 
					
						
							|  |  |  |         expect(controlGroupDir.pristine).toBe(formModel.pristine); | 
					
						
							|  |  |  |         expect(controlGroupDir.dirty).toBe(formModel.dirty); | 
					
						
							|  |  |  |         expect(controlGroupDir.touched).toBe(formModel.touched); | 
					
						
							|  |  |  |         expect(controlGroupDir.untouched).toBe(formModel.untouched); | 
					
						
							| 
									
										
										
										
											2016-06-24 13:37:42 -07:00
										 |  |  |         expect(controlGroupDir.statusChanges).toBe(formModel.statusChanges); | 
					
						
							|  |  |  |         expect(controlGroupDir.valueChanges).toBe(formModel.valueChanges); | 
					
						
							| 
									
										
										
										
											2016-08-25 14:56:31 -07:00
										 |  |  |         expect(controlGroupDir.disabled).toBe(formModel.disabled); | 
					
						
							|  |  |  |         expect(controlGroupDir.enabled).toBe(formModel.enabled); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-10-19 18:49:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should reexport control methods', () => { | 
					
						
							|  |  |  |         expect(controlGroupDir.hasError('required')).toBe(formModel.hasError('required')); | 
					
						
							|  |  |  |         expect(controlGroupDir.getError('required')).toBe(formModel.getError('required')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         formModel.setErrors({required: true}); | 
					
						
							|  |  |  |         expect(controlGroupDir.hasError('required')).toBe(formModel.hasError('required')); | 
					
						
							|  |  |  |         expect(controlGroupDir.getError('required')).toBe(formModel.getError('required')); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-25 13:27:29 -07:00
										 |  |  |     describe('FormArrayName', () => { | 
					
						
							|  |  |  |       var formModel: FormArray; | 
					
						
							|  |  |  |       var formArrayDir: FormArrayName; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => { | 
					
						
							|  |  |  |         const parent = new FormGroupDirective([], []); | 
					
						
							|  |  |  |         formModel = new FormArray([new FormControl('')]); | 
					
						
							|  |  |  |         parent.form = new FormGroup({'array': formModel}); | 
					
						
							|  |  |  |         formArrayDir = new FormArrayName(parent, [], []); | 
					
						
							|  |  |  |         formArrayDir.name = 'array'; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should reexport control properties', () => { | 
					
						
							|  |  |  |         expect(formArrayDir.control).toBe(formModel); | 
					
						
							|  |  |  |         expect(formArrayDir.value).toBe(formModel.value); | 
					
						
							|  |  |  |         expect(formArrayDir.valid).toBe(formModel.valid); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:41:25 -07:00
										 |  |  |         expect(formArrayDir.invalid).toBe(formModel.invalid); | 
					
						
							|  |  |  |         expect(formArrayDir.pending).toBe(formModel.pending); | 
					
						
							| 
									
										
										
										
											2016-06-25 13:27:29 -07:00
										 |  |  |         expect(formArrayDir.errors).toBe(formModel.errors); | 
					
						
							|  |  |  |         expect(formArrayDir.pristine).toBe(formModel.pristine); | 
					
						
							|  |  |  |         expect(formArrayDir.dirty).toBe(formModel.dirty); | 
					
						
							|  |  |  |         expect(formArrayDir.touched).toBe(formModel.touched); | 
					
						
							|  |  |  |         expect(formArrayDir.untouched).toBe(formModel.untouched); | 
					
						
							| 
									
										
										
										
											2016-08-25 14:56:31 -07:00
										 |  |  |         expect(formArrayDir.disabled).toBe(formModel.disabled); | 
					
						
							|  |  |  |         expect(formArrayDir.enabled).toBe(formModel.enabled); | 
					
						
							| 
									
										
										
										
											2016-06-25 13:27:29 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-10-19 18:49:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should reexport control methods', () => { | 
					
						
							|  |  |  |         expect(formArrayDir.hasError('required')).toBe(formModel.hasError('required')); | 
					
						
							|  |  |  |         expect(formArrayDir.getError('required')).toBe(formModel.getError('required')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         formModel.setErrors({required: true}); | 
					
						
							|  |  |  |         expect(formArrayDir.hasError('required')).toBe(formModel.hasError('required')); | 
					
						
							|  |  |  |         expect(formArrayDir.getError('required')).toBe(formModel.getError('required')); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-06-25 13:27:29 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 17:28:19 -07:00
										 |  |  |     describe('FormControlDirective', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |       var controlDir: any /** TODO #9100 */; | 
					
						
							|  |  |  |       var control: any /** TODO #9100 */; | 
					
						
							|  |  |  |       var checkProperties = function(control: any /** TODO #9100 */) { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(controlDir.control).toBe(control); | 
					
						
							|  |  |  |         expect(controlDir.value).toBe(control.value); | 
					
						
							|  |  |  |         expect(controlDir.valid).toBe(control.valid); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:41:25 -07:00
										 |  |  |         expect(controlDir.invalid).toBe(control.invalid); | 
					
						
							|  |  |  |         expect(controlDir.pending).toBe(control.pending); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(controlDir.errors).toBe(control.errors); | 
					
						
							|  |  |  |         expect(controlDir.pristine).toBe(control.pristine); | 
					
						
							|  |  |  |         expect(controlDir.dirty).toBe(control.dirty); | 
					
						
							|  |  |  |         expect(controlDir.touched).toBe(control.touched); | 
					
						
							|  |  |  |         expect(controlDir.untouched).toBe(control.untouched); | 
					
						
							| 
									
										
										
										
											2016-06-24 13:37:42 -07:00
										 |  |  |         expect(controlDir.statusChanges).toBe(control.statusChanges); | 
					
						
							|  |  |  |         expect(controlDir.valueChanges).toBe(control.valueChanges); | 
					
						
							| 
									
										
										
										
											2016-08-25 14:56:31 -07:00
										 |  |  |         expect(controlDir.disabled).toBe(control.disabled); | 
					
						
							|  |  |  |         expect(controlDir.enabled).toBe(control.enabled); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => { | 
					
						
							| 
									
										
										
										
											2016-06-10 17:28:19 -07:00
										 |  |  |         controlDir = new FormControlDirective([Validators.required], [], [defaultAccessor]); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         controlDir.valueAccessor = new DummyControlValueAccessor(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |         control = new FormControl(null); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         controlDir.form = control; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should reexport control properties', () => { checkProperties(control); }); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-19 18:49:02 +02:00
										 |  |  |       it('should reexport control methods', () => { | 
					
						
							|  |  |  |         expect(controlDir.hasError('required')).toBe(control.hasError('required')); | 
					
						
							|  |  |  |         expect(controlDir.getError('required')).toBe(control.getError('required')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         control.setErrors({required: true}); | 
					
						
							|  |  |  |         expect(controlDir.hasError('required')).toBe(control.hasError('required')); | 
					
						
							|  |  |  |         expect(controlDir.getError('required')).toBe(control.getError('required')); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should reexport new control properties', () => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |         var newControl = new FormControl(null); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         controlDir.form = newControl; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         controlDir.ngOnChanges({'form': new SimpleChange(control, newControl)}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         checkProperties(newControl); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should set up validator', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(control.valid).toBe(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // this will add the required validator and recalculate the validity
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         controlDir.ngOnChanges({'form': new SimpleChange(null, control)}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(control.valid).toBe(false); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |     describe('NgModel', () => { | 
					
						
							| 
									
										
										
										
											2016-09-20 14:55:47 -07:00
										 |  |  |       let ngModel: NgModel; | 
					
						
							| 
									
										
										
										
											2016-10-19 18:49:02 +02:00
										 |  |  |       let control: FormControl; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => { | 
					
						
							| 
									
										
										
										
											2016-06-10 10:09:50 -07:00
										 |  |  |         ngModel = new NgModel( | 
					
						
							|  |  |  |             null, [Validators.required], [asyncValidator('expected')], [defaultAccessor]); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         ngModel.valueAccessor = new DummyControlValueAccessor(); | 
					
						
							| 
									
										
										
										
											2016-10-19 18:49:02 +02:00
										 |  |  |         control = ngModel.control; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should reexport control properties', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(ngModel.control).toBe(control); | 
					
						
							|  |  |  |         expect(ngModel.value).toBe(control.value); | 
					
						
							|  |  |  |         expect(ngModel.valid).toBe(control.valid); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:41:25 -07:00
										 |  |  |         expect(ngModel.invalid).toBe(control.invalid); | 
					
						
							|  |  |  |         expect(ngModel.pending).toBe(control.pending); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(ngModel.errors).toBe(control.errors); | 
					
						
							|  |  |  |         expect(ngModel.pristine).toBe(control.pristine); | 
					
						
							|  |  |  |         expect(ngModel.dirty).toBe(control.dirty); | 
					
						
							|  |  |  |         expect(ngModel.touched).toBe(control.touched); | 
					
						
							|  |  |  |         expect(ngModel.untouched).toBe(control.untouched); | 
					
						
							| 
									
										
										
										
											2016-06-24 13:37:42 -07:00
										 |  |  |         expect(ngModel.statusChanges).toBe(control.statusChanges); | 
					
						
							|  |  |  |         expect(ngModel.valueChanges).toBe(control.valueChanges); | 
					
						
							| 
									
										
										
										
											2016-08-25 14:56:31 -07:00
										 |  |  |         expect(ngModel.disabled).toBe(control.disabled); | 
					
						
							|  |  |  |         expect(ngModel.enabled).toBe(control.enabled); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-19 18:49:02 +02:00
										 |  |  |       it('should reexport control methods', () => { | 
					
						
							|  |  |  |         expect(ngModel.hasError('required')).toBe(control.hasError('required')); | 
					
						
							|  |  |  |         expect(ngModel.getError('required')).toBe(control.getError('required')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         control.setErrors({required: true}); | 
					
						
							|  |  |  |         expect(ngModel.hasError('required')).toBe(control.hasError('required')); | 
					
						
							|  |  |  |         expect(ngModel.getError('required')).toBe(control.getError('required')); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 14:13:02 -07:00
										 |  |  |       it('should throw when no value accessor with named control', () => { | 
					
						
							|  |  |  |         const namedDir = new NgModel(null, null, null, null); | 
					
						
							|  |  |  |         namedDir.name = 'one'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(() => namedDir.ngOnChanges({})) | 
					
						
							|  |  |  |             .toThrowError(new RegExp(`No value accessor for form control with name: 'one'`)); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should throw when no value accessor with unnamed control', () => { | 
					
						
							|  |  |  |         const unnamedDir = new NgModel(null, null, null, null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(() => unnamedDir.ngOnChanges({})) | 
					
						
							|  |  |  |             .toThrowError( | 
					
						
							|  |  |  |                 new RegExp(`No value accessor for form control with unspecified name attribute`)); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should set up validator', fakeAsync(() => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            // this will add the required validator and recalculate the validity
 | 
					
						
							|  |  |  |            ngModel.ngOnChanges({}); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(ngModel.control.errors).toEqual({'required': true}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 13:35:17 -07:00
										 |  |  |            ngModel.control.setValue('someValue'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |            expect(ngModel.control.errors).toEqual({'async': true}); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |          })); | 
					
						
							| 
									
										
										
										
											2016-09-20 14:55:47 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should mark as disabled properly', fakeAsync(() => { | 
					
						
							|  |  |  |            ngModel.ngOnChanges({isDisabled: new SimpleChange('', undefined)}); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            expect(ngModel.control.disabled).toEqual(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ngModel.ngOnChanges({isDisabled: new SimpleChange('', null)}); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            expect(ngModel.control.disabled).toEqual(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ngModel.ngOnChanges({isDisabled: new SimpleChange('', false)}); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            expect(ngModel.control.disabled).toEqual(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ngModel.ngOnChanges({isDisabled: new SimpleChange('', 'false')}); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            expect(ngModel.control.disabled).toEqual(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ngModel.ngOnChanges({isDisabled: new SimpleChange('', 0)}); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            expect(ngModel.control.disabled).toEqual(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ngModel.ngOnChanges({isDisabled: new SimpleChange(null, '')}); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            expect(ngModel.control.disabled).toEqual(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ngModel.ngOnChanges({isDisabled: new SimpleChange(null, 'true')}); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            expect(ngModel.control.disabled).toEqual(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ngModel.ngOnChanges({isDisabled: new SimpleChange(null, true)}); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            expect(ngModel.control.disabled).toEqual(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            ngModel.ngOnChanges({isDisabled: new SimpleChange(null, 'anything else')}); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  |            expect(ngModel.control.disabled).toEqual(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          })); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |     describe('FormControlName', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 17:08:59 -07:00
										 |  |  |       var formModel: any /** TODO #9100 */; | 
					
						
							|  |  |  |       var controlNameDir: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => { | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |         formModel = new FormControl('name'); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-10 19:10:17 -07:00
										 |  |  |         var parent = new FormGroupDirective([], []); | 
					
						
							| 
									
										
										
										
											2016-06-10 11:15:59 -07:00
										 |  |  |         parent.form = new FormGroup({'name': formModel}); | 
					
						
							| 
									
										
										
										
											2016-06-12 13:17:07 -07:00
										 |  |  |         controlNameDir = new FormControlName(parent, [], [], [defaultAccessor]); | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |         controlNameDir.name = 'name'; | 
					
						
							| 
									
										
										
										
											2016-09-02 15:57:35 -07:00
										 |  |  |         controlNameDir._control = formModel; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       it('should reexport control properties', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(controlNameDir.control).toBe(formModel); | 
					
						
							|  |  |  |         expect(controlNameDir.value).toBe(formModel.value); | 
					
						
							|  |  |  |         expect(controlNameDir.valid).toBe(formModel.valid); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:41:25 -07:00
										 |  |  |         expect(controlNameDir.invalid).toBe(formModel.invalid); | 
					
						
							|  |  |  |         expect(controlNameDir.pending).toBe(formModel.pending); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |         expect(controlNameDir.errors).toBe(formModel.errors); | 
					
						
							|  |  |  |         expect(controlNameDir.pristine).toBe(formModel.pristine); | 
					
						
							|  |  |  |         expect(controlNameDir.dirty).toBe(formModel.dirty); | 
					
						
							|  |  |  |         expect(controlNameDir.touched).toBe(formModel.touched); | 
					
						
							|  |  |  |         expect(controlNameDir.untouched).toBe(formModel.untouched); | 
					
						
							| 
									
										
										
										
											2016-06-24 13:37:42 -07:00
										 |  |  |         expect(controlNameDir.statusChanges).toBe(formModel.statusChanges); | 
					
						
							|  |  |  |         expect(controlNameDir.valueChanges).toBe(formModel.valueChanges); | 
					
						
							| 
									
										
										
										
											2016-08-25 14:56:31 -07:00
										 |  |  |         expect(controlNameDir.disabled).toBe(formModel.disabled); | 
					
						
							|  |  |  |         expect(controlNameDir.enabled).toBe(formModel.enabled); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-10-19 18:49:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should reexport control methods', () => { | 
					
						
							|  |  |  |         expect(controlNameDir.hasError('required')).toBe(formModel.hasError('required')); | 
					
						
							|  |  |  |         expect(controlNameDir.getError('required')).toBe(formModel.getError('required')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         formModel.setErrors({required: true}); | 
					
						
							|  |  |  |         expect(controlNameDir.hasError('required')).toBe(formModel.hasError('required')); | 
					
						
							|  |  |  |         expect(controlNameDir.getError('required')).toBe(formModel.getError('required')); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-06-08 15:36:24 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |