| 
									
										
										
										
											2015-05-27 08:07:11 -07:00
										 |  |  | import {describe, it, iit, ddescribe, expect, beforeEach, IS_DARTIUM} from 'angular2/test_lib'; | 
					
						
							| 
									
										
										
										
											2015-02-05 13:08:05 -08:00
										 |  |  | import {Reflector} from 'angular2/src/reflection/reflection'; | 
					
						
							|  |  |  | import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities'; | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  | import {ClassDecorator, ParamDecorator, classDecorator, paramDecorator} from './reflector_common'; | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class AType { | 
					
						
							|  |  |  |   value; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |   constructor(value) { this.value = value; } | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  | @ClassDecorator('class') | 
					
						
							|  |  |  | class ClassWithDecorators { | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |   a; | 
					
						
							|  |  |  |   b; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |   constructor(@ParamDecorator("a") a: AType, @ParamDecorator("b") b: AType) { | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |     this.a = a; | 
					
						
							|  |  |  |     this.b = b; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  | class ClassWithoutDecorators { | 
					
						
							|  |  |  |   constructor(a, b) {} | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestObjWith11Args { | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |   constructor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) {} | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestObj { | 
					
						
							|  |  |  |   a; | 
					
						
							|  |  |  |   b; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   constructor(a, b) { | 
					
						
							|  |  |  |     this.a = a; | 
					
						
							|  |  |  |     this.b = b; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |   identity(arg) { return arg; } | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-27 08:07:11 -07:00
										 |  |  | class Interface {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-27 08:08:14 -07:00
										 |  |  | class ClassImplementingInterface implements Interface {} | 
					
						
							| 
									
										
										
										
											2015-05-27 08:07:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  | export function main() { | 
					
						
							|  |  |  |   describe('Reflector', () => { | 
					
						
							|  |  |  |     var reflector; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |     beforeEach(() => { reflector = new Reflector(new ReflectionCapabilities()); }); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe("factory", () => { | 
					
						
							|  |  |  |       it("should create a factory for the given type", () => { | 
					
						
							|  |  |  |         var obj = reflector.factory(TestObj)(1, 2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(obj.a).toEqual(1); | 
					
						
							|  |  |  |         expect(obj.b).toEqual(2); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it("should throw when more than 10 arguments", () => { | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |         expect(() => reflector.factory(TestObjWith11Args)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)) | 
					
						
							|  |  |  |             .toThrowError(); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it("should return a registered factory if available", () => { | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |         reflector.registerType(TestObj, {"factory": () => "fake"}); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |         expect(reflector.factory(TestObj)()).toEqual("fake"); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe("parameters", () => { | 
					
						
							|  |  |  |       it("should return an array of parameters for a type", () => { | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |         var p = reflector.parameters(ClassWithDecorators); | 
					
						
							|  |  |  |         expect(p).toEqual([[AType, paramDecorator('a')], [AType, paramDecorator('b')]]); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it("should work for a class without annotations", () => { | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |         var p = reflector.parameters(ClassWithoutDecorators); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |         expect(p.length).toEqual(2); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it("should return registered parameters if available", () => { | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |         reflector.registerType(TestObj, {"parameters": [1, 2]}); | 
					
						
							|  |  |  |         expect(reflector.parameters(TestObj)).toEqual([1, 2]); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-05-27 08:08:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it("should return an empty list when no paramters field in the stored type info", () => { | 
					
						
							|  |  |  |         reflector.registerType(TestObj, {}); | 
					
						
							|  |  |  |         expect(reflector.parameters(TestObj)).toEqual([]); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe("annotations", () => { | 
					
						
							|  |  |  |       it("should return an array of annotations for a type", () => { | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |         var p = reflector.annotations(ClassWithDecorators); | 
					
						
							|  |  |  |         expect(p).toEqual([classDecorator('class')]); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it("should return registered annotations if available", () => { | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |         reflector.registerType(TestObj, {"annotations": [1, 2]}); | 
					
						
							|  |  |  |         expect(reflector.annotations(TestObj)).toEqual([1, 2]); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2015-05-15 10:16:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-27 08:07:11 -07:00
										 |  |  |       it("should work for a class without annotations", () => { | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |         var p = reflector.annotations(ClassWithoutDecorators); | 
					
						
							| 
									
										
										
										
											2015-05-15 10:16:04 +02:00
										 |  |  |         expect(p).toEqual([]); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-02-02 16:25:34 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-27 08:07:11 -07:00
										 |  |  |     if (IS_DARTIUM) { | 
					
						
							|  |  |  |       describe("interfaces", () => { | 
					
						
							|  |  |  |         it("should return an array of interfaces for a type", () => { | 
					
						
							|  |  |  |           var p = reflector.interfaces(ClassImplementingInterface); | 
					
						
							|  |  |  |           expect(p).toEqual([Interface]); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it("should return an empty array otherwise", () => { | 
					
						
							|  |  |  |           var p = reflector.interfaces(ClassWithDecorators); | 
					
						
							|  |  |  |           expect(p).toEqual([]); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |     describe("getter", () => { | 
					
						
							|  |  |  |       it("returns a function reading a property", () => { | 
					
						
							|  |  |  |         var getA = reflector.getter('a'); | 
					
						
							|  |  |  |         expect(getA(new TestObj(1, 2))).toEqual(1); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it("should return a registered getter if available", () => { | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |         reflector.registerGetters({"abc": (obj) => "fake"}); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |         expect(reflector.getter("abc")("anything")).toEqual("fake"); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe("setter", () => { | 
					
						
							|  |  |  |       it("returns a function setting a property", () => { | 
					
						
							|  |  |  |         var setA = reflector.setter('a'); | 
					
						
							|  |  |  |         var obj = new TestObj(1, 2); | 
					
						
							|  |  |  |         setA(obj, 100); | 
					
						
							|  |  |  |         expect(obj.a).toEqual(100); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it("should return a registered setter if available", () => { | 
					
						
							|  |  |  |         var updateMe; | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |         reflector.registerSetters({"abc": (obj, value) => { updateMe = value; }}); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |         reflector.setter("abc")("anything", "fake"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(updateMe).toEqual("fake"); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe("method", () => { | 
					
						
							|  |  |  |       it("returns a function invoking a method", () => { | 
					
						
							|  |  |  |         var func = reflector.method('identity'); | 
					
						
							|  |  |  |         var obj = new TestObj(1, 2); | 
					
						
							|  |  |  |         expect(func(obj, ['value'])).toEqual('value'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it("should return a registered method if available", () => { | 
					
						
							| 
									
										
										
										
											2015-05-22 16:20:46 -07:00
										 |  |  |         reflector.registerMethods({"abc": (obj, args) => args}); | 
					
						
							| 
									
										
										
										
											2014-11-20 12:07:48 -08:00
										 |  |  |         expect(reflector.method("abc")("anything", ["fake"])).toEqual(['fake']); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2015-05-15 10:16:04 +02:00
										 |  |  | } |