| 
									
										
										
										
											2015-03-13 11:10:11 +01:00
										 |  |  | import { | 
					
						
							|  |  |  |   afterEach, | 
					
						
							|  |  |  |   AsyncTestCompleter, | 
					
						
							|  |  |  |   beforeEach, | 
					
						
							|  |  |  |   ddescribe, | 
					
						
							|  |  |  |   describe, | 
					
						
							|  |  |  |   dispatchEvent, | 
					
						
							|  |  |  |   el, | 
					
						
							|  |  |  |   expect, | 
					
						
							|  |  |  |   iit, | 
					
						
							|  |  |  |   inject, | 
					
						
							|  |  |  |   it, | 
					
						
							| 
									
										
										
										
											2015-03-19 11:35:48 +01:00
										 |  |  |   xit | 
					
						
							| 
									
										
										
										
											2015-03-13 11:10:11 +01:00
										 |  |  | } from 'angular2/test_lib'; | 
					
						
							| 
									
										
										
										
											2015-03-19 11:35:48 +01:00
										 |  |  | import {DOM} from 'angular2/src/dom/dom_adapter'; | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  | import {Inject} from 'angular2/di'; | 
					
						
							| 
									
										
										
										
											2015-02-24 16:05:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  | import {Component, Decorator, Template, PropertySetter} from 'angular2/angular2'; | 
					
						
							| 
									
										
										
										
											2015-02-12 14:44:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  | import {TestBed} from 'angular2/src/test_lib/test_bed'; | 
					
						
							| 
									
										
										
										
											2015-02-12 14:44:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-24 11:59:10 -08:00
										 |  |  | import {ControlGroupDirective, ControlDirective, Control, ControlGroup, OptionalControl, | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |   ControlValueAccessor, RequiredValidatorDirective, CheckboxControlValueAccessor, | 
					
						
							|  |  |  |   DefaultValueAccessor, Validators} from 'angular2/forms'; | 
					
						
							| 
									
										
										
										
											2015-02-04 11:45:33 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | export function main() { | 
					
						
							| 
									
										
										
										
											2015-04-07 20:54:20 -07:00
										 |  |  |   describe("integration tests", () => { | 
					
						
							|  |  |  |     if (DOM.supportsDOMEvents()) { | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |       it("should initialize DOM elements with the given form object", | 
					
						
							|  |  |  |         inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |         var ctx = new MyComp(new ControlGroup({ | 
					
						
							|  |  |  |           "login": new Control("loginValue") | 
					
						
							|  |  |  |         })); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |         var t = `<div [control-group]="form">
 | 
					
						
							| 
									
										
										
										
											2015-02-23 15:26:53 -08:00
										 |  |  |                 <input type="text" control="login"> | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  |               </div>`; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |           view.detectChanges(); | 
					
						
							|  |  |  |           var input = view.querySelector("input"); | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |           expect(input.value).toEqual("loginValue"); | 
					
						
							|  |  |  |           async.done(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       })); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |       it("should update the control group values on DOM change", | 
					
						
							|  |  |  |         inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |         var form = new ControlGroup({ | 
					
						
							|  |  |  |           "login": new Control("oldValue") | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         var ctx = new MyComp(form); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |         var t = `<div [control-group]="form">
 | 
					
						
							|  |  |  |                   <input type="text" control="login"> | 
					
						
							|  |  |  |                 </div>`; | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |           view.detectChanges(); | 
					
						
							|  |  |  |           var input = view.querySelector("input"); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |           input.value = "updatedValue"; | 
					
						
							|  |  |  |           dispatchEvent(input, "change"); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |           expect(form.value).toEqual({"login": "updatedValue"}); | 
					
						
							|  |  |  |           async.done(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       })); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |       it("should work with single controls", inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-25 14:21:57 -07:00
										 |  |  |         var control = new Control("loginValue"); | 
					
						
							|  |  |  |         var ctx = new MyComp(control); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         var t = `<div><input type="text" [control]="form"></div>`; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |           view.detectChanges(); | 
					
						
							|  |  |  |           var input = view.querySelector("input") | 
					
						
							| 
									
										
										
										
											2015-03-25 14:21:57 -07:00
										 |  |  |           expect(input.value).toEqual("loginValue"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           input.value = "updatedValue"; | 
					
						
							|  |  |  |           dispatchEvent(input, "change"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(control.value).toEqual("updatedValue"); | 
					
						
							|  |  |  |           async.done(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |       it("should update DOM elements when rebinding the control group", | 
					
						
							|  |  |  |         inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |         var form = new ControlGroup({ | 
					
						
							|  |  |  |           "login": new Control("oldValue") | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         var ctx = new MyComp(form); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |         var t = `<div [control-group]="form">
 | 
					
						
							| 
									
										
										
										
											2015-02-23 15:26:53 -08:00
										 |  |  |                 <input type="text" control="login"> | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  |               </div>`; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |           view.detectChanges(); | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |           ctx.form = new ControlGroup({ | 
					
						
							|  |  |  |             "login": new Control("newValue") | 
					
						
							|  |  |  |           }); | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           view.detectChanges(); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           var input = view.querySelector("input") | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |           expect(input.value).toEqual("newValue"); | 
					
						
							|  |  |  |           async.done(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       })); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |       it("should update DOM element when rebinding the control name", | 
					
						
							|  |  |  |         inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |         var ctx = new MyComp(new ControlGroup({ | 
					
						
							|  |  |  |           "one": new Control("one"), | 
					
						
							|  |  |  |           "two": new Control("two") | 
					
						
							|  |  |  |         }), "one"); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |         var t = `<div [control-group]="form">
 | 
					
						
							| 
									
										
										
										
											2015-02-23 15:26:53 -08:00
										 |  |  |                 <input type="text" [control]="name"> | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  |               </div>`; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |           view.detectChanges(); | 
					
						
							|  |  |  |           var input = view.querySelector("input") | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |           expect(input.value).toEqual("one"); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |           ctx.name = "two"; | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           view.detectChanges(); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |           expect(input.value).toEqual("two"); | 
					
						
							|  |  |  |           async.done(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       })); | 
					
						
							| 
									
										
										
										
											2015-02-04 11:45:33 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |       describe("different control types", () => { | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         it("should support <input type=text>", inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |           var ctx = new MyComp(new ControlGroup({"text": new Control("old")})); | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |           var t = `<div [control-group]="form">
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |                     <input type="text" control="text"> | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |                   </div>`; | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |             view.detectChanges(); | 
					
						
							|  |  |  |             var input = view.querySelector("input") | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |             expect(input.value).toEqual("old"); | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |             input.value = "new"; | 
					
						
							|  |  |  |             dispatchEvent(input, "input"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             expect(ctx.form.value).toEqual({"text": "new"}); | 
					
						
							|  |  |  |             async.done(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         it("should support <input> without type", inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |           var ctx = new MyComp(new ControlGroup({"text": new Control("old")})); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           var t = `<div [control-group]="form">
 | 
					
						
							|  |  |  |                     <input control="text"> | 
					
						
							|  |  |  |                   </div>`; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |             view.detectChanges(); | 
					
						
							|  |  |  |             var input = view.querySelector("input") | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |             expect(input.value).toEqual("old"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             input.value = "new"; | 
					
						
							|  |  |  |             dispatchEvent(input, "input"); | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |             expect(ctx.form.value).toEqual({"text": "new"}); | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |             async.done(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         })); | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         it("should support <textarea>", inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-19 09:51:30 -07:00
										 |  |  |           var ctx = new MyComp(new ControlGroup({"text": new Control('old')})); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           var t = `<div [control-group]="form">
 | 
					
						
							|  |  |  |                     <textarea control="text"></textarea> | 
					
						
							|  |  |  |                   </div>`; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |             view.detectChanges(); | 
					
						
							|  |  |  |             var textarea = view.querySelector("textarea") | 
					
						
							| 
									
										
										
										
											2015-03-19 09:51:30 -07:00
										 |  |  |             expect(textarea.value).toEqual("old"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             textarea.value = "new"; | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |             dispatchEvent(textarea, "input"); | 
					
						
							| 
									
										
										
										
											2015-03-19 09:51:30 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |             expect(ctx.form.value).toEqual({"text": 'new'}); | 
					
						
							| 
									
										
										
										
											2015-03-19 09:51:30 -07:00
										 |  |  |             async.done(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         it("should support <type=checkbox>", inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |           var ctx = new MyComp(new ControlGroup({"checkbox": new Control(true)})); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           var t = `<div [control-group]="form">
 | 
					
						
							|  |  |  |                     <input type="checkbox" control="checkbox"> | 
					
						
							|  |  |  |                   </div>`; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |             view.detectChanges(); | 
					
						
							|  |  |  |             var input = view.querySelector("input") | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |             expect(input.checked).toBe(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             input.checked = false; | 
					
						
							|  |  |  |             dispatchEvent(input, "change"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             expect(ctx.form.value).toEqual({"checkbox": false}); | 
					
						
							|  |  |  |             async.done(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         it("should support <select>", inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-19 10:06:56 -07:00
										 |  |  |           var ctx = new MyComp(new ControlGroup({"city": new Control("SF")})); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           var t = `<div [control-group]="form">
 | 
					
						
							|  |  |  |                       <select control="city"> | 
					
						
							|  |  |  |                         <option value="SF"></option> | 
					
						
							|  |  |  |                         <option value="NYC"></option> | 
					
						
							|  |  |  |                       </select> | 
					
						
							|  |  |  |                     </div>`; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |             view.detectChanges(); | 
					
						
							|  |  |  |             var select = view.querySelector("select") | 
					
						
							|  |  |  |             var sfOption = view.querySelector("option") | 
					
						
							| 
									
										
										
										
											2015-03-19 10:06:56 -07:00
										 |  |  |             expect(select.value).toEqual('SF'); | 
					
						
							|  |  |  |             expect(sfOption.selected).toBe(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             select.value = 'NYC'; | 
					
						
							|  |  |  |             dispatchEvent(select, "change"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |             expect(ctx.form.value).toEqual({"city": 'NYC'}); | 
					
						
							| 
									
										
										
										
											2015-03-19 10:06:56 -07:00
										 |  |  |             expect(sfOption.selected).toBe(false); | 
					
						
							|  |  |  |             async.done(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         it("should support custom value accessors", inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |           var ctx = new MyComp(new ControlGroup({"name": new Control("aa")})); | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |           var t = `<div [control-group]="form">
 | 
					
						
							|  |  |  |                     <input type="text" control="name" wrapped-value> | 
					
						
							|  |  |  |                   </div>`; | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |             view.detectChanges(); | 
					
						
							|  |  |  |             var input = view.querySelector("input") | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |             expect(input.value).toEqual("!aa!"); | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |             input.value = "!bb!"; | 
					
						
							|  |  |  |             dispatchEvent(input, "change"); | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |             expect(ctx.form.value).toEqual({"name": "bb"}); | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |             async.done(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         })); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |       describe("validations", () => { | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         it("should use validators defined in html", | 
					
						
							|  |  |  |           inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |           var form = new ControlGroup({"login": new Control("aa")}); | 
					
						
							|  |  |  |           var ctx = new MyComp(form); | 
					
						
							| 
									
										
										
										
											2015-02-04 11:45:33 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |           var t = `<div [control-group]="form">
 | 
					
						
							|  |  |  |                     <input type="text" control="login" required> | 
					
						
							|  |  |  |                    </div>`; | 
					
						
							| 
									
										
										
										
											2015-02-04 11:45:33 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |             view.detectChanges(); | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |             expect(form.valid).toEqual(true); | 
					
						
							| 
									
										
										
										
											2015-02-04 11:45:33 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |             var input = view.querySelector("input"); | 
					
						
							| 
									
										
										
										
											2015-02-04 11:45:33 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |             input.value = ""; | 
					
						
							|  |  |  |             dispatchEvent(input, "change"); | 
					
						
							| 
									
										
										
										
											2015-02-04 11:45:33 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |             expect(form.valid).toEqual(false); | 
					
						
							|  |  |  |             async.done(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         })); | 
					
						
							| 
									
										
										
										
											2015-02-04 11:45:33 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         it("should use validators defined in the model", | 
					
						
							|  |  |  |           inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-19 14:21:40 -07:00
										 |  |  |           var form = new ControlGroup({"login": new Control("aa", Validators.required)}); | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |           var ctx = new MyComp(form); | 
					
						
							| 
									
										
										
										
											2015-02-23 15:26:53 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |           var t = `<div [control-group]="form">
 | 
					
						
							|  |  |  |                     <input type="text" control="login"> | 
					
						
							|  |  |  |                    </div>`; | 
					
						
							| 
									
										
										
										
											2015-02-11 11:10:31 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |             view.detectChanges(); | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |             expect(form.valid).toEqual(true); | 
					
						
							| 
									
										
										
										
											2015-02-11 11:10:31 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |             var input = view.querySelector("input"); | 
					
						
							| 
									
										
										
										
											2015-02-11 11:10:31 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |             input.value = ""; | 
					
						
							|  |  |  |             dispatchEvent(input, "change"); | 
					
						
							| 
									
										
										
										
											2015-02-11 11:10:31 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |             expect(form.valid).toEqual(false); | 
					
						
							|  |  |  |             async.done(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         })); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-03-03 11:32:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |       describe("nested forms", () => { | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         it("should init DOM with the given form object", | 
					
						
							|  |  |  |           inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |           var form = new ControlGroup({ | 
					
						
							|  |  |  |             "nested": new ControlGroup({ | 
					
						
							|  |  |  |               "login": new Control("value") | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |           var ctx = new MyComp(form); | 
					
						
							| 
									
										
										
										
											2015-02-25 15:10:27 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |           var t = `<div [control-group]="form">
 | 
					
						
							| 
									
										
										
										
											2015-02-25 15:10:27 -08:00
										 |  |  |                     <div control-group="nested"> | 
					
						
							|  |  |  |                       <input type="text" control="login"> | 
					
						
							|  |  |  |                     </div> | 
					
						
							|  |  |  |                 </div>`; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |             view.detectChanges(); | 
					
						
							|  |  |  |             var input = view.querySelector("input") | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |             expect(input.value).toEqual("value"); | 
					
						
							|  |  |  |             async.done(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         })); | 
					
						
							| 
									
										
										
										
											2015-02-25 15:10:27 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |         it("should update the control group values on DOM change", | 
					
						
							|  |  |  |           inject([TestBed, AsyncTestCompleter], (tb, async) => { | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |           var form = new ControlGroup({ | 
					
						
							|  |  |  |             "nested": new ControlGroup({ | 
					
						
							|  |  |  |               "login": new Control("value") | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |           var ctx = new MyComp(form); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           var t = `<div [control-group]="form">
 | 
					
						
							|  |  |  |                       <div control-group="nested"> | 
					
						
							|  |  |  |                         <input type="text" control="login"> | 
					
						
							|  |  |  |                       </div> | 
					
						
							|  |  |  |                   </div>`; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  |           tb.createView(MyComp, {context: ctx, html: t}).then((view) => { | 
					
						
							|  |  |  |             view.detectChanges(); | 
					
						
							|  |  |  |             var input = view.querySelector("input") | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             input.value = "updatedValue"; | 
					
						
							|  |  |  |             dispatchEvent(input, "change"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |             expect(form.value).toEqual({"nested": {"login": "updatedValue"}}); | 
					
						
							| 
									
										
										
										
											2015-03-09 17:41:49 +01:00
										 |  |  |             async.done(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         })); | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-04-07 20:54:20 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-30 17:11:18 +02:00
										 |  |  | @Component({selector: "my-comp"}) | 
					
						
							|  |  |  | @Template({directives: [ | 
					
						
							|  |  |  |   ControlGroupDirective, | 
					
						
							|  |  |  |   ControlDirective, | 
					
						
							|  |  |  |   WrappedValue, | 
					
						
							|  |  |  |   RequiredValidatorDirective, | 
					
						
							|  |  |  |   CheckboxControlValueAccessor, | 
					
						
							|  |  |  |   DefaultValueAccessor]}) | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  | class MyComp { | 
					
						
							| 
									
										
										
										
											2015-03-25 14:21:57 -07:00
										 |  |  |   form:any; | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  |   name:string; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 14:40:49 -07:00
										 |  |  |   constructor(@Inject('form') form = null, @Inject('name') name = null) { | 
					
						
							| 
									
										
										
										
											2015-02-03 07:27:09 -08:00
										 |  |  |     this.form = form; | 
					
						
							|  |  |  |     this.name = name; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-01-30 09:43:21 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 13:12:16 -07:00
										 |  |  | @Decorator({ | 
					
						
							|  |  |  |   selector:'[wrapped-value]', | 
					
						
							|  |  |  |   events: { | 
					
						
							|  |  |  |     'change' : 'handleOnChange($event.target.value)' | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-03-19 13:12:16 -07:00
										 |  |  | }) | 
					
						
							| 
									
										
										
										
											2015-03-19 14:01:11 -07:00
										 |  |  | class WrappedValue { | 
					
						
							| 
									
										
										
										
											2015-03-19 13:12:16 -07:00
										 |  |  |   _setProperty:Function; | 
					
						
							|  |  |  |   onChange:Function; | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 13:12:16 -07:00
										 |  |  |   constructor(cd:ControlDirective, @PropertySetter('value') setProperty:Function) { | 
					
						
							|  |  |  |     this._setProperty = setProperty; | 
					
						
							|  |  |  |     cd.valueAccessor = this; | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-19 13:12:16 -07:00
										 |  |  |   writeValue(value) { | 
					
						
							|  |  |  |     this._setProperty(`!${value}!`); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   handleOnChange(value) { | 
					
						
							|  |  |  |     this.onChange(value.substring(1, value.length - 1)); | 
					
						
							| 
									
										
										
										
											2015-02-07 14:14:07 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-02-12 14:44:59 +01:00
										 |  |  | } |