| 
									
										
										
										
											2018-10-30 10:16:52 -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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-09 13:49:16 -08:00
										 |  |  | import {Type} from '../../src/interface/type'; | 
					
						
							| 
									
										
										
										
											2018-10-30 10:16:52 -07:00
										 |  |  | import {setClassMetadata} from '../../src/render3/metadata'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interface Decorator { | 
					
						
							|  |  |  |   type: any; | 
					
						
							|  |  |  |   args?: any[]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interface HasMetadata extends Type<any> { | 
					
						
							|  |  |  |   decorators?: Decorator[]; | 
					
						
							| 
									
										
										
										
											2018-12-09 15:31:55 +01:00
										 |  |  |   ctorParameters: () => CtorParameter[]; | 
					
						
							| 
									
										
										
										
											2018-10-30 10:16:52 -07:00
										 |  |  |   propDecorators: {[field: string]: Decorator[]}; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interface CtorParameter { | 
					
						
							|  |  |  |   type: any; | 
					
						
							|  |  |  |   decorators?: Decorator[]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function metadataOf(value: Type<any>): HasMetadata { | 
					
						
							|  |  |  |   return value as HasMetadata; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('render3 setClassMetadata()', () => { | 
					
						
							|  |  |  |   it('should set decorator metadata on a type', () => { | 
					
						
							|  |  |  |     const Foo = metadataOf(class Foo{}); | 
					
						
							|  |  |  |     setClassMetadata(Foo, [{type: 'test', args: ['arg']}], null, null); | 
					
						
							|  |  |  |     expect(Foo.decorators).toEqual([{type: 'test', args: ['arg']}]); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should merge decorator metadata on a type', () => { | 
					
						
							|  |  |  |     const Foo = metadataOf(class Foo{}); | 
					
						
							|  |  |  |     Foo.decorators = [{type: 'first'}]; | 
					
						
							|  |  |  |     setClassMetadata(Foo, [{type: 'test', args: ['arg']}], null, null); | 
					
						
							|  |  |  |     expect(Foo.decorators).toEqual([{type: 'first'}, {type: 'test', args: ['arg']}]); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should set ctor parameter metadata on a type', () => { | 
					
						
							|  |  |  |     const Foo = metadataOf(class Foo{}); | 
					
						
							| 
									
										
										
										
											2018-12-09 15:31:55 +01:00
										 |  |  |     Foo.ctorParameters = () => [{type: 'initial'}]; | 
					
						
							|  |  |  |     setClassMetadata(Foo, null, () => [{type: 'test'}], null); | 
					
						
							|  |  |  |     expect(Foo.ctorParameters()).toEqual([{type: 'test'}]); | 
					
						
							| 
									
										
										
										
											2018-10-30 10:16:52 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should set parameter decorator metadata on a type', () => { | 
					
						
							|  |  |  |     const Foo = metadataOf(class Foo{}); | 
					
						
							|  |  |  |     setClassMetadata(Foo, null, null, {field: [{type: 'test', args: ['arg']}]}); | 
					
						
							|  |  |  |     expect(Foo.propDecorators).toEqual({field: [{type: 'test', args: ['arg']}]}); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should merge parameter decorator metadata on a type', () => { | 
					
						
							|  |  |  |     const Foo = metadataOf(class Foo{}); | 
					
						
							|  |  |  |     Foo.propDecorators = {initial: [{type: 'first'}]}; | 
					
						
							|  |  |  |     setClassMetadata(Foo, null, null, {field: [{type: 'test', args: ['arg']}]}); | 
					
						
							|  |  |  |     expect(Foo.propDecorators) | 
					
						
							|  |  |  |         .toEqual({field: [{type: 'test', args: ['arg']}], initial: [{type: 'first'}]}); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |