208 lines
8.4 KiB
TypeScript
208 lines
8.4 KiB
TypeScript
|
// 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]);
|
||
|
}
|