Bones/node_modules/reflect-metadata/test/reflect/reflect-decorate.ts

208 lines
8.4 KiB
TypeScript
Raw Normal View History

2017-05-17 13:45:25 -04:00
// Reflect.decorate ( decorators, target [, propertyKey [, descriptor] ] )
import "../../Reflect";
import * as assert from "assert";
export function ReflectDecorateThrowsIfDecoratorsArgumentNotArrayForFunctionOverload() {
let target = function() { };
assert.throws(() => Reflect.decorate(undefined, target, undefined, undefined), TypeError);
}
export function ReflectDecorateThrowsIfTargetArgumentNotFunctionForFunctionOverload() {
let decorators: (ClassDecorator | MethodDecorator | PropertyDecorator)[] = [];
let target = {};
assert.throws(() => Reflect.decorate(decorators, target, undefined, undefined), TypeError);
}
export function ReflectDecorateThrowsIfDecoratorsArgumentNotArrayForPropertyOverload() {
let target = {};
let name = "name";
assert.throws(() => Reflect.decorate(undefined, target, name, undefined), TypeError);
}
export function ReflectDecorateThrowsIfTargetArgumentNotObjectForPropertyOverload() {
let decorators: (ClassDecorator | MethodDecorator | PropertyDecorator)[] = [];
let target = 1;
let name = "name";
assert.throws(() => Reflect.decorate(decorators, target, name, undefined), TypeError);
}
export function ReflectDecorateThrowsIfDecoratorsArgumentNotArrayForPropertyDescriptorOverload() {
let target = {};
let name = "name";
let descriptor = {};
assert.throws(() => Reflect.decorate(undefined, target, name, descriptor), TypeError);
}
export function ReflectDecorateThrowsIfTargetArgumentNotObjectForPropertyDescriptorOverload() {
let decorators: (ClassDecorator | MethodDecorator | PropertyDecorator)[] = [];
let target = 1;
let name = "name";
let descriptor = {};
assert.throws(() => Reflect.decorate(decorators, target, name, descriptor), TypeError);
}
export function ReflectDecorateExecutesDecoratorsInReverseOrderForFunctionOverload() {
let order: number[] = [];
let decorators = [
(target: Function): void => { order.push(0); },
(target: Function): void => { order.push(1); }
];
let target = function() { };
Reflect.decorate(decorators, target);
assert.deepEqual(order, [1, 0]);
}
export function ReflectDecorateExecutesDecoratorsInReverseOrderForPropertyOverload() {
let order: number[] = [];
let decorators = [
(target: Object, name: string | symbol): void => { order.push(0); },
(target: Object, name: string | symbol): void => { order.push(1); }
];
let target = {};
let name = "name";
Reflect.decorate(decorators, target, name, undefined);
assert.deepEqual(order, [1, 0]);
}
export function ReflectDecorateExecutesDecoratorsInReverseOrderForPropertyDescriptorOverload() {
let order: number[] = [];
let decorators = [
(target: Object, name: string | symbol): void => { order.push(0); },
(target: Object, name: string | symbol): void => { order.push(1); }
];
let target = {};
let name = "name";
let descriptor = {};
Reflect.decorate(decorators, target, name, descriptor);
assert.deepEqual(order, [1, 0]);
}
export function ReflectDecoratorPipelineForFunctionOverload() {
let A = function A(): void { };
let B = function B(): void { };
let decorators = [
(target: Function): any => { return undefined; },
(target: Function): any => { return A; },
(target: Function): any => { return B; }
];
let target = function (): void { };
let result = Reflect.decorate(decorators, target);
assert.strictEqual(result, A);
}
export function ReflectDecoratorPipelineForPropertyOverload() {
let A = {};
let B = {};
let decorators = [
(target: Object, name: string | symbol): any => { return undefined; },
(target: Object, name: string | symbol): any => { return A; },
(target: Object, name: string | symbol): any => { return B; }
];
let target = {};
let result = Reflect.decorate(decorators, target, "name", undefined);
assert.strictEqual(result, undefined);
}
export function ReflectDecoratorPipelineForPropertyDescriptorOverload() {
let A = {};
let B = {};
let C = {};
let decorators = [
(target: Object, name: string | symbol): any => { return undefined; },
(target: Object, name: string | symbol): any => { return A; },
(target: Object, name: string | symbol): any => { return B; }
];
let target = {};
let result = Reflect.decorate(decorators, target, "name", C);
assert.strictEqual(result, A);
}
export function ReflectDecoratorCorrectTargetInPipelineForFunctionOverload() {
let sent: Function[] = [];
let A = function A(): void { };
let B = function B(): void { };
let decorators = [
(target: Function): any => { sent.push(target); return undefined; },
(target: Function): any => { sent.push(target); return undefined; },
(target: Function): any => { sent.push(target); return A; },
(target: Function): any => { sent.push(target); return B; }
];
let target = function (): void { };
Reflect.decorate(decorators, target);
assert.deepEqual(sent, [target, B, A, A]);
}
export function ReflectDecoratorCorrectTargetInPipelineForPropertyOverload() {
let sent: Object[] = [];
let decorators = [
(target: Object, name: string | symbol): any => { sent.push(target); },
(target: Object, name: string | symbol): any => { sent.push(target); },
(target: Object, name: string | symbol): any => { sent.push(target); },
(target: Object, name: string | symbol): any => { sent.push(target); }
];
let target = { };
Reflect.decorate(decorators, target, "name");
assert.deepEqual(sent, [target, target, target, target]);
}
export function ReflectDecoratorCorrectNameInPipelineForPropertyOverload() {
let sent: (symbol | string)[] = [];
let decorators = [
(target: Object, name: string | symbol): any => { sent.push(name); },
(target: Object, name: string | symbol): any => { sent.push(name); },
(target: Object, name: string | symbol): any => { sent.push(name); },
(target: Object, name: string | symbol): any => { sent.push(name); }
];
let target = { };
Reflect.decorate(decorators, target, "name");
assert.deepEqual(sent, ["name", "name", "name", "name"]);
}
export function ReflectDecoratorCorrectTargetInPipelineForPropertyDescriptorOverload() {
let sent: Object[] = [];
let A = { };
let B = { };
let C = { };
let decorators = [
(target: Object, name: string | symbol): any => { sent.push(target); return undefined; },
(target: Object, name: string | symbol): any => { sent.push(target); return undefined; },
(target: Object, name: string | symbol): any => { sent.push(target); return A; },
(target: Object, name: string | symbol): any => { sent.push(target); return B; }
];
let target = { };
Reflect.decorate(decorators, target, "name", C);
assert.deepEqual(sent, [target, target, target, target]);
}
export function ReflectDecoratorCorrectNameInPipelineForPropertyDescriptorOverload() {
let sent: (symbol | string)[] = [];
let A = { };
let B = { };
let C = { };
let decorators = [
(target: Object, name: string | symbol): any => { sent.push(name); return undefined; },
(target: Object, name: string | symbol): any => { sent.push(name); return undefined; },
(target: Object, name: string | symbol): any => { sent.push(name); return A; },
(target: Object, name: string | symbol): any => { sent.push(name); return B; }
];
let target = { };
Reflect.decorate(decorators, target, "name", C);
assert.deepEqual(sent, ["name", "name", "name", "name"]);
}
export function ReflectDecoratorCorrectDescriptorInPipelineForPropertyDescriptorOverload() {
let sent: PropertyDescriptor[] = [];
let A = { };
let B = { };
let C = { };
let decorators = [
(target: Object, name: string | symbol, descriptor: PropertyDescriptor): any => { sent.push(descriptor); return undefined; },
(target: Object, name: string | symbol, descriptor: PropertyDescriptor): any => { sent.push(descriptor); return undefined; },
(target: Object, name: string | symbol, descriptor: PropertyDescriptor): any => { sent.push(descriptor); return A; },
(target: Object, name: string | symbol, descriptor: PropertyDescriptor): any => { sent.push(descriptor); return B; }
];
let target = { };
Reflect.decorate(decorators, target, "name", C);
assert.deepEqual(sent, [C, B, A, A]);
}