| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | import {DirectiveResolver} from '@angular/compiler/src/directive_resolver'; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | import {ContentChild, ContentChildMetadata, ContentChildren, ContentChildrenMetadata, Directive, DirectiveMetadata, HostBinding, HostListener, Input, Output, ViewChild, ViewChildMetadata, ViewChildren, ViewChildrenMetadata} from '@angular/core/src/metadata'; | 
					
						
							|  |  |  | import {beforeEach, ddescribe, describe, expect, iit, it} from '@angular/core/testing'; | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | @Directive({selector: 'someDirective'}) | 
					
						
							|  |  |  | class SomeDirective { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Directive({selector: 'someChildDirective'}) | 
					
						
							|  |  |  | class SomeChildDirective extends SomeDirective { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  | @Directive({selector: 'someDirective', inputs: ['c']}) | 
					
						
							| 
									
										
										
										
											2015-10-02 16:21:49 -07:00
										 |  |  | class SomeDirectiveWithInputs { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   @Input() a: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   @Input('renamed') b: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   c: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  | @Directive({selector: 'someDirective', outputs: ['c']}) | 
					
						
							|  |  |  | class SomeDirectiveWithOutputs { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   @Output() a: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   @Output('renamed') b: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   c: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-04 17:08:51 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | @Directive({selector: 'someDirective', outputs: ['a']}) | 
					
						
							|  |  |  | class SomeDirectiveWithDuplicateOutputs { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   @Output() a: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2015-11-04 17:08:51 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-02 16:21:49 -07:00
										 |  |  | @Directive({selector: 'someDirective', properties: ['a']}) | 
					
						
							|  |  |  | class SomeDirectiveWithProperties { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Directive({selector: 'someDirective', events: ['a']}) | 
					
						
							|  |  |  | class SomeDirectiveWithEvents { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  | @Directive({selector: 'someDirective'}) | 
					
						
							|  |  |  | class SomeDirectiveWithSetterProps { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   @Input('renamed') | 
					
						
							|  |  |  |   set a(value: any /** TODO #9100 */) {} | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Directive({selector: 'someDirective'}) | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  | class SomeDirectiveWithGetterOutputs { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   @Output('renamed') | 
					
						
							|  |  |  |   get a(): any /** TODO #9100 */ { return null; } | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-04 14:07:16 -07:00
										 |  |  | @Directive({selector: 'someDirective', host: {'[c]': 'c'}}) | 
					
						
							|  |  |  | class SomeDirectiveWithHostBindings { | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   @HostBinding() a: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   @HostBinding('renamed') b: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   c: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2015-09-04 14:07:16 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Directive({selector: 'someDirective', host: {'(c)': 'onC()'}}) | 
					
						
							|  |  |  | class SomeDirectiveWithHostListeners { | 
					
						
							|  |  |  |   @HostListener('a') | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   onA() {} | 
					
						
							| 
									
										
										
										
											2015-09-04 14:07:16 -07:00
										 |  |  |   @HostListener('b', ['$event.value']) | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   onB(value: any /** TODO #9100 */) {} | 
					
						
							| 
									
										
										
										
											2015-09-04 14:07:16 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | @Directive({selector: 'someDirective', queries: {'cs': new ContentChildren('c')}}) | 
					
						
							| 
									
										
										
										
											2015-09-17 18:45:49 -07:00
										 |  |  | class SomeDirectiveWithContentChildren { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   @ContentChildren('a') as: any; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   c: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2015-09-17 18:45:49 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | @Directive({selector: 'someDirective', queries: {'cs': new ViewChildren('c')}}) | 
					
						
							| 
									
										
										
										
											2015-09-17 18:45:49 -07:00
										 |  |  | class SomeDirectiveWithViewChildren { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   @ViewChildren('a') as: any; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   c: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2015-09-17 18:45:49 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | @Directive({selector: 'someDirective', queries: {'c': new ContentChild('c')}}) | 
					
						
							| 
									
										
										
										
											2015-09-19 18:39:35 -07:00
										 |  |  | class SomeDirectiveWithContentChild { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   @ContentChild('a') a: any; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   c: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2015-09-19 18:39:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | @Directive({selector: 'someDirective', queries: {'c': new ViewChild('c')}}) | 
					
						
							| 
									
										
										
										
											2015-09-19 18:39:35 -07:00
										 |  |  | class SomeDirectiveWithViewChild { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   @ViewChild('a') a: any; | 
					
						
							| 
									
										
										
										
											2016-06-08 15:45:15 -07:00
										 |  |  |   c: any /** TODO #9100 */; | 
					
						
							| 
									
										
										
										
											2015-09-19 18:39:35 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  | class SomeDirectiveWithoutMetadata {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   describe('DirectiveResolver', () => { | 
					
						
							| 
									
										
										
										
											2016-02-19 11:49:31 -08:00
										 |  |  |     var resolver: DirectiveResolver; | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     beforeEach(() => { resolver = new DirectiveResolver(); }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should read out the Directive metadata', () => { | 
					
						
							|  |  |  |       var directiveMetadata = resolver.resolve(SomeDirective); | 
					
						
							|  |  |  |       expect(directiveMetadata) | 
					
						
							| 
									
										
										
										
											2015-09-04 14:07:16 -07:00
										 |  |  |           .toEqual(new DirectiveMetadata( | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  |               {selector: 'someDirective', inputs: [], outputs: [], host: {}, queries: {}})); | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should throw if not matching metadata is found', () => { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |       expect(() => { | 
					
						
							|  |  |  |         resolver.resolve(SomeDirectiveWithoutMetadata); | 
					
						
							|  |  |  |       }).toThrowError('No Directive annotation found on SomeDirectiveWithoutMetadata'); | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should not read parent class Directive metadata', function() { | 
					
						
							|  |  |  |       var directiveMetadata = resolver.resolve(SomeChildDirective); | 
					
						
							|  |  |  |       expect(directiveMetadata) | 
					
						
							| 
									
										
										
										
											2015-09-04 14:07:16 -07:00
										 |  |  |           .toEqual(new DirectiveMetadata( | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  |               {selector: 'someChildDirective', inputs: [], outputs: [], host: {}, queries: {}})); | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  |     describe('inputs', () => { | 
					
						
							|  |  |  |       it('should append directive inputs', () => { | 
					
						
							| 
									
										
										
										
											2015-10-02 16:21:49 -07:00
										 |  |  |         var directiveMetadata = resolver.resolve(SomeDirectiveWithInputs); | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  |         expect(directiveMetadata.inputs).toEqual(['c', 'a', 'b: renamed']); | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should work with getters and setters', () => { | 
					
						
							|  |  |  |         var directiveMetadata = resolver.resolve(SomeDirectiveWithSetterProps); | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  |         expect(directiveMetadata.inputs).toEqual(['a: renamed']); | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-10-02 16:21:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  |     describe('outputs', () => { | 
					
						
							|  |  |  |       it('should append directive outputs', () => { | 
					
						
							|  |  |  |         var directiveMetadata = resolver.resolve(SomeDirectiveWithOutputs); | 
					
						
							|  |  |  |         expect(directiveMetadata.outputs).toEqual(['c', 'a', 'b: renamed']); | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should work with getters and setters', () => { | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  |         var directiveMetadata = resolver.resolve(SomeDirectiveWithGetterOutputs); | 
					
						
							|  |  |  |         expect(directiveMetadata.outputs).toEqual(['a: renamed']); | 
					
						
							| 
									
										
										
										
											2015-09-04 14:07:16 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-11-04 17:08:51 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should throw if duplicate outputs', () => { | 
					
						
							|  |  |  |         expect(() => { resolver.resolve(SomeDirectiveWithDuplicateOutputs); }) | 
					
						
							|  |  |  |             .toThrowError( | 
					
						
							|  |  |  |                 `Output event 'a' defined multiple times in 'SomeDirectiveWithDuplicateOutputs'`); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-09-04 14:07:16 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('host', () => { | 
					
						
							|  |  |  |       it('should append host bindings', () => { | 
					
						
							|  |  |  |         var directiveMetadata = resolver.resolve(SomeDirectiveWithHostBindings); | 
					
						
							|  |  |  |         expect(directiveMetadata.host).toEqual({'[c]': 'c', '[a]': 'a', '[renamed]': 'b'}); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should append host listeners', () => { | 
					
						
							|  |  |  |         var directiveMetadata = resolver.resolve(SomeDirectiveWithHostListeners); | 
					
						
							|  |  |  |         expect(directiveMetadata.host) | 
					
						
							|  |  |  |             .toEqual({'(c)': 'onC()', '(a)': 'onA()', '(b)': 'onB($event.value)'}); | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-09-17 18:45:49 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe('queries', () => { | 
					
						
							|  |  |  |       it('should append ContentChildren', () => { | 
					
						
							|  |  |  |         var directiveMetadata = resolver.resolve(SomeDirectiveWithContentChildren); | 
					
						
							|  |  |  |         expect(directiveMetadata.queries) | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |             .toEqual({'cs': new ContentChildren('c'), 'as': new ContentChildren('a')}); | 
					
						
							| 
									
										
										
										
											2015-09-17 18:45:49 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should append ViewChildren', () => { | 
					
						
							|  |  |  |         var directiveMetadata = resolver.resolve(SomeDirectiveWithViewChildren); | 
					
						
							|  |  |  |         expect(directiveMetadata.queries) | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |             .toEqual({'cs': new ViewChildren('c'), 'as': new ViewChildren('a')}); | 
					
						
							| 
									
										
										
										
											2015-09-17 18:45:49 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-09-19 18:39:35 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should append ContentChild', () => { | 
					
						
							|  |  |  |         var directiveMetadata = resolver.resolve(SomeDirectiveWithContentChild); | 
					
						
							|  |  |  |         expect(directiveMetadata.queries) | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |             .toEqual({'c': new ContentChild('c'), 'a': new ContentChild('a')}); | 
					
						
							| 
									
										
										
										
											2015-09-19 18:39:35 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should append ViewChild', () => { | 
					
						
							|  |  |  |         var directiveMetadata = resolver.resolve(SomeDirectiveWithViewChild); | 
					
						
							|  |  |  |         expect(directiveMetadata.queries) | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |             .toEqual({'c': new ViewChild('c'), 'a': new ViewChild('a')}); | 
					
						
							| 
									
										
										
										
											2015-09-19 18:39:35 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-09-17 18:45:49 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-09-03 15:10:48 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | } |