2015-02-05 16:08:05 -05:00
|
|
|
import {describe, it, iit, ddescribe, expect, beforeEach} from 'angular2/test_lib';
|
|
|
|
import {Reflector} from 'angular2/src/reflection/reflection';
|
|
|
|
import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities';
|
2015-05-22 19:20:46 -04:00
|
|
|
import {ClassDecorator, ParamDecorator, classDecorator, paramDecorator} from './reflector_common';
|
2014-11-20 15:07:48 -05:00
|
|
|
|
|
|
|
class AType {
|
|
|
|
value;
|
|
|
|
|
2015-05-22 19:20:46 -04:00
|
|
|
constructor(value) { this.value = value; }
|
2014-11-20 15:07:48 -05:00
|
|
|
}
|
|
|
|
|
2015-05-22 19:20:46 -04:00
|
|
|
@ClassDecorator('class')
|
|
|
|
class ClassWithDecorators {
|
2014-11-20 15:07:48 -05:00
|
|
|
a;
|
|
|
|
b;
|
|
|
|
|
2015-05-22 19:20:46 -04:00
|
|
|
constructor(@ParamDecorator("a") a: AType, @ParamDecorator("b") b: AType) {
|
2014-11-20 15:07:48 -05:00
|
|
|
this.a = a;
|
|
|
|
this.b = b;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-22 19:20:46 -04:00
|
|
|
class ClassWithoutDecorators {
|
|
|
|
constructor(a, b) {}
|
2014-11-20 15:07:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
class TestObjWith11Args {
|
2015-05-22 19:20:46 -04:00
|
|
|
constructor(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) {}
|
2014-11-20 15:07:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
class TestObj {
|
|
|
|
a;
|
|
|
|
b;
|
|
|
|
|
|
|
|
constructor(a, b) {
|
|
|
|
this.a = a;
|
|
|
|
this.b = b;
|
|
|
|
}
|
|
|
|
|
2015-05-22 19:20:46 -04:00
|
|
|
identity(arg) { return arg; }
|
2014-11-20 15:07:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
export function main() {
|
|
|
|
describe('Reflector', () => {
|
|
|
|
var reflector;
|
|
|
|
|
2015-05-22 19:20:46 -04:00
|
|
|
beforeEach(() => { reflector = new Reflector(new ReflectionCapabilities()); });
|
2014-11-20 15:07:48 -05: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 19:20:46 -04:00
|
|
|
expect(() => reflector.factory(TestObjWith11Args)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11))
|
|
|
|
.toThrowError();
|
2014-11-20 15:07:48 -05:00
|
|
|
});
|
|
|
|
|
|
|
|
it("should return a registered factory if available", () => {
|
2015-05-22 19:20:46 -04:00
|
|
|
reflector.registerType(TestObj, {"factory": () => "fake"});
|
2014-11-20 15:07:48 -05:00
|
|
|
expect(reflector.factory(TestObj)()).toEqual("fake");
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("parameters", () => {
|
|
|
|
it("should return an array of parameters for a type", () => {
|
2015-05-22 19:20:46 -04:00
|
|
|
var p = reflector.parameters(ClassWithDecorators);
|
|
|
|
expect(p).toEqual([[AType, paramDecorator('a')], [AType, paramDecorator('b')]]);
|
2014-11-20 15:07:48 -05:00
|
|
|
});
|
|
|
|
|
|
|
|
it("should work for a class without annotations", () => {
|
2015-05-22 19:20:46 -04:00
|
|
|
var p = reflector.parameters(ClassWithoutDecorators);
|
2014-11-20 15:07:48 -05:00
|
|
|
expect(p.length).toEqual(2);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should return registered parameters if available", () => {
|
2015-05-22 19:20:46 -04:00
|
|
|
reflector.registerType(TestObj, {"parameters": [1, 2]});
|
|
|
|
expect(reflector.parameters(TestObj)).toEqual([1, 2]);
|
2014-11-20 15:07:48 -05:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("annotations", () => {
|
|
|
|
it("should return an array of annotations for a type", () => {
|
2015-05-22 19:20:46 -04:00
|
|
|
var p = reflector.annotations(ClassWithDecorators);
|
|
|
|
expect(p).toEqual([classDecorator('class')]);
|
2014-11-20 15:07:48 -05:00
|
|
|
});
|
|
|
|
|
|
|
|
it("should return registered annotations if available", () => {
|
2015-05-22 19:20:46 -04:00
|
|
|
reflector.registerType(TestObj, {"annotations": [1, 2]});
|
|
|
|
expect(reflector.annotations(TestObj)).toEqual([1, 2]);
|
2014-11-20 15:07:48 -05:00
|
|
|
});
|
2015-05-15 04:16:04 -04:00
|
|
|
|
|
|
|
it("should work for a clas without annotations", () => {
|
2015-05-22 19:20:46 -04:00
|
|
|
var p = reflector.annotations(ClassWithoutDecorators);
|
2015-05-15 04:16:04 -04:00
|
|
|
expect(p).toEqual([]);
|
|
|
|
});
|
2014-11-20 15:07:48 -05:00
|
|
|
});
|
2015-02-02 19:25:34 -05:00
|
|
|
|
2014-11-20 15:07:48 -05: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 19:20:46 -04:00
|
|
|
reflector.registerGetters({"abc": (obj) => "fake"});
|
2014-11-20 15:07:48 -05: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 19:20:46 -04:00
|
|
|
reflector.registerSetters({"abc": (obj, value) => { updateMe = value; }});
|
2014-11-20 15:07:48 -05: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 19:20:46 -04:00
|
|
|
reflector.registerMethods({"abc": (obj, args) => args});
|
2014-11-20 15:07:48 -05:00
|
|
|
expect(reflector.method("abc")("anything", ["fake"])).toEqual(['fake']);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2015-05-15 04:16:04 -04:00
|
|
|
}
|