| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   AsyncTestCompleter, | 
					
						
							|  |  |  |   beforeEach, | 
					
						
							|  |  |  |   ddescribe, | 
					
						
							|  |  |  |   describe, | 
					
						
							|  |  |  |   el, | 
					
						
							|  |  |  |   expect, | 
					
						
							|  |  |  |   iit, | 
					
						
							|  |  |  |   inject, | 
					
						
							|  |  |  |   it, | 
					
						
							|  |  |  |   xit, | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   TestComponentBuilder, | 
					
						
							|  |  |  |   beforeEachBindings | 
					
						
							| 
									
										
										
										
											2015-10-13 00:29:13 -07:00
										 |  |  | } from 'angular2/testing_internal'; | 
					
						
							| 
									
										
										
										
											2015-11-06 17:34:07 -08:00
										 |  |  | import {MapWrapper} from 'angular2/src/facade/collection'; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | import { | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |   CompileDirectiveMetadata, | 
					
						
							|  |  |  |   CompileTypeMetadata | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  | } from 'angular2/src/compiler/directive_metadata'; | 
					
						
							|  |  |  | import {TemplateParser} from 'angular2/src/compiler/template_parser'; | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   Parser, | 
					
						
							|  |  |  |   Lexer, | 
					
						
							|  |  |  |   ChangeDetectorDefinition, | 
					
						
							|  |  |  |   ChangeDetectorGenConfig, | 
					
						
							|  |  |  |   DynamicProtoChangeDetector, | 
					
						
							|  |  |  |   ChangeDetectionStrategy, | 
					
						
							|  |  |  |   ChangeDispatcher, | 
					
						
							|  |  |  |   DirectiveIndex, | 
					
						
							|  |  |  |   Locals, | 
					
						
							|  |  |  |   BindingTarget, | 
					
						
							|  |  |  |   ChangeDetector | 
					
						
							|  |  |  | } from 'angular2/src/core/change_detection/change_detection'; | 
					
						
							|  |  |  | import {Pipes} from 'angular2/src/core/change_detection/pipes'; | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  | import {createChangeDetectorDefinitions} from 'angular2/src/compiler/change_definition_factory'; | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  | import {TestDirective, TestDispatcher, TestPipes} from './change_detector_mocks'; | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-10 22:11:13 -07:00
										 |  |  | import {TEST_PROVIDERS} from './test_bindings'; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  | export function main() { | 
					
						
							|  |  |  |   describe('ChangeDefinitionFactory', () => { | 
					
						
							| 
									
										
										
										
											2015-10-10 22:11:13 -07:00
										 |  |  |     beforeEachBindings(() => TEST_PROVIDERS); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  |     var parser: TemplateParser; | 
					
						
							|  |  |  |     var dispatcher: TestDispatcher; | 
					
						
							|  |  |  |     var context: TestContext; | 
					
						
							|  |  |  |     var directive: TestDirective; | 
					
						
							|  |  |  |     var locals: Locals; | 
					
						
							|  |  |  |     var pipes: Pipes; | 
					
						
							|  |  |  |     var eventLocals: Locals; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |     beforeEach(inject([TemplateParser], (_templateParser) => { | 
					
						
							|  |  |  |       parser = _templateParser; | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  |       context = new TestContext(); | 
					
						
							|  |  |  |       directive = new TestDirective(); | 
					
						
							|  |  |  |       dispatcher = new TestDispatcher([directive], []); | 
					
						
							|  |  |  |       locals = new Locals(null, MapWrapper.createFromStringMap({'someVar': null})); | 
					
						
							|  |  |  |       eventLocals = new Locals(null, MapWrapper.createFromStringMap({'$event': null})); | 
					
						
							|  |  |  |       pipes = new TestPipes(); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |     })); | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |     function createChangeDetector(template: string, directives: CompileDirectiveMetadata[], | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  |                                   protoViewIndex: number = 0): ChangeDetector { | 
					
						
							|  |  |  |       var protoChangeDetectors = | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |           createChangeDetectorDefinitions(new CompileTypeMetadata({name: 'SomeComp'}), | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |                                           ChangeDetectionStrategy.Default, | 
					
						
							| 
									
										
										
										
											2015-10-28 10:06:53 -07:00
										 |  |  |                                           new ChangeDetectorGenConfig(true, false, false), | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |                                           parser.parse(template, directives, 'TestComp')) | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  |               .map(definition => new DynamicProtoChangeDetector(definition)); | 
					
						
							|  |  |  |       var changeDetector = protoChangeDetectors[protoViewIndex].instantiate(dispatcher); | 
					
						
							|  |  |  |       changeDetector.hydrate(context, locals, dispatcher, pipes); | 
					
						
							|  |  |  |       return changeDetector; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should watch element properties', () => { | 
					
						
							|  |  |  |       var changeDetector = createChangeDetector('<div [el-prop]="someProp">', [], 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context.someProp = 'someValue'; | 
					
						
							|  |  |  |       changeDetector.detectChanges(); | 
					
						
							|  |  |  |       expect(dispatcher.log).toEqual(['elementProperty(elProp)=someValue']); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should watch text nodes', () => { | 
					
						
							|  |  |  |       var changeDetector = createChangeDetector('{{someProp}}', [], 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context.someProp = 'someValue'; | 
					
						
							|  |  |  |       changeDetector.detectChanges(); | 
					
						
							|  |  |  |       expect(dispatcher.log).toEqual(['textNode(null)=someValue']); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-23 16:08:46 -07:00
										 |  |  |     it('should handle events on regular elements', () => { | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  |       var changeDetector = createChangeDetector('<div on-click="onEvent($event)">', [], 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       eventLocals.set('$event', 'click'); | 
					
						
							|  |  |  |       changeDetector.handleEvent('click', 0, eventLocals); | 
					
						
							|  |  |  |       expect(context.eventLog).toEqual(['click']); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-23 16:08:46 -07:00
										 |  |  |     it('should handle events on template elements', () => { | 
					
						
							|  |  |  |       var dirMeta = CompileDirectiveMetadata.create({ | 
					
						
							|  |  |  |         type: new CompileTypeMetadata({name: 'SomeDir'}), | 
					
						
							|  |  |  |         selector: 'template', | 
					
						
							|  |  |  |         outputs: ['click'] | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       var changeDetector = | 
					
						
							|  |  |  |           createChangeDetector('<template on-click="onEvent($event)">', [dirMeta], 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       eventLocals.set('$event', 'click'); | 
					
						
							|  |  |  |       changeDetector.handleEvent('click', 0, eventLocals); | 
					
						
							|  |  |  |       expect(context.eventLog).toEqual(['click']); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |     it('should handle events with targets', () => { | 
					
						
							|  |  |  |       var changeDetector = createChangeDetector('<div (window:click)="onEvent($event)">', [], 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       eventLocals.set('$event', 'click'); | 
					
						
							|  |  |  |       changeDetector.handleEvent('window:click', 0, eventLocals); | 
					
						
							|  |  |  |       expect(context.eventLog).toEqual(['click']); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  |     it('should watch variables', () => { | 
					
						
							|  |  |  |       var changeDetector = createChangeDetector('<div #some-var [el-prop]="someVar">', [], 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       locals.set('someVar', 'someValue'); | 
					
						
							|  |  |  |       changeDetector.detectChanges(); | 
					
						
							|  |  |  |       expect(dispatcher.log).toEqual(['elementProperty(elProp)=someValue']); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should write directive properties', () => { | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |       var dirMeta = CompileDirectiveMetadata.create({ | 
					
						
							|  |  |  |         type: new CompileTypeMetadata({name: 'SomeDir'}), | 
					
						
							|  |  |  |         selector: '[dir-prop]', | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  |         inputs: ['dirProp'] | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       var changeDetector = createChangeDetector('<div [dir-prop]="someProp">', [dirMeta], 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context.someProp = 'someValue'; | 
					
						
							|  |  |  |       changeDetector.detectChanges(); | 
					
						
							|  |  |  |       expect(directive.dirProp).toEqual('someValue'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |     it('should write template directive properties', () => { | 
					
						
							|  |  |  |       var dirMeta = CompileDirectiveMetadata.create({ | 
					
						
							|  |  |  |         type: new CompileTypeMetadata({name: 'SomeDir'}), | 
					
						
							|  |  |  |         selector: '[dir-prop]', | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  |         inputs: ['dirProp'] | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       var changeDetector = createChangeDetector('<template [dir-prop]="someProp">', [dirMeta], 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context.someProp = 'someValue'; | 
					
						
							|  |  |  |       changeDetector.detectChanges(); | 
					
						
							|  |  |  |       expect(directive.dirProp).toEqual('someValue'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  |     it('should watch directive host properties', () => { | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |       var dirMeta = CompileDirectiveMetadata.create({ | 
					
						
							|  |  |  |         type: new CompileTypeMetadata({name: 'SomeDir'}), | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  |         selector: 'div', | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         host: {'[elProp]': 'dirProp'} | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       var changeDetector = createChangeDetector('<div>', [dirMeta], 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       directive.dirProp = 'someValue'; | 
					
						
							|  |  |  |       changeDetector.detectChanges(); | 
					
						
							|  |  |  |       expect(dispatcher.log).toEqual(['elementProperty(elProp)=someValue']); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should handle directive events', () => { | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |       var dirMeta = CompileDirectiveMetadata.create({ | 
					
						
							|  |  |  |         type: new CompileTypeMetadata({name: 'SomeDir'}), | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  |         selector: 'div', | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         host: {'(click)': 'onEvent($event)'} | 
					
						
							| 
									
										
										
										
											2015-09-01 16:24:23 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       var changeDetector = createChangeDetector('<div>', [dirMeta], 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       eventLocals.set('$event', 'click'); | 
					
						
							|  |  |  |       changeDetector.handleEvent('click', 0, eventLocals); | 
					
						
							|  |  |  |       expect(directive.eventLog).toEqual(['click']); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should create change detectors for embedded templates', () => { | 
					
						
							|  |  |  |       var changeDetector = createChangeDetector('<template>{{someProp}}<template>', [], 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context.someProp = 'someValue'; | 
					
						
							|  |  |  |       changeDetector.detectChanges(); | 
					
						
							|  |  |  |       expect(dispatcher.log).toEqual(['textNode(null)=someValue']); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should watch expressions after embedded templates', () => { | 
					
						
							|  |  |  |       var changeDetector = | 
					
						
							|  |  |  |           createChangeDetector('<template>{{someProp2}}</template>{{someProp}}', [], 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context.someProp = 'someValue'; | 
					
						
							|  |  |  |       changeDetector.detectChanges(); | 
					
						
							|  |  |  |       expect(dispatcher.log).toEqual(['textNode(null)=someValue']); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | class TestContext { | 
					
						
							|  |  |  |   eventLog: string[] = []; | 
					
						
							|  |  |  |   someProp: string; | 
					
						
							|  |  |  |   someProp2: string; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   onEvent(value: string) { this.eventLog.push(value); } | 
					
						
							|  |  |  | } |