92 lines
2.5 KiB
TypeScript
92 lines
2.5 KiB
TypeScript
import { tap, expect } from '../ts_tapbundle/index.js';
|
|
|
|
/**
|
|
* Simple class decorator for testing decorator support across runtimes
|
|
*/
|
|
function testDecorator(target: any) {
|
|
target.decoratorApplied = true;
|
|
target.decoratorData = 'Decorator was applied successfully';
|
|
return target;
|
|
}
|
|
|
|
/**
|
|
* Method decorator for testing
|
|
*/
|
|
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
|
|
const originalMethod = descriptor.value;
|
|
descriptor.value = function (...args: any[]) {
|
|
const result = originalMethod.apply(this, args);
|
|
return `[logged] ${result}`;
|
|
};
|
|
return descriptor;
|
|
}
|
|
|
|
/**
|
|
* Parameter decorator for testing
|
|
*/
|
|
function validateParam(target: any, propertyKey: string, parameterIndex: number) {
|
|
// Mark that parameter validation decorator was applied
|
|
if (!target.decoratedParams) {
|
|
target.decoratedParams = {};
|
|
}
|
|
if (!target.decoratedParams[propertyKey]) {
|
|
target.decoratedParams[propertyKey] = [];
|
|
}
|
|
target.decoratedParams[propertyKey].push(parameterIndex);
|
|
}
|
|
|
|
/**
|
|
* Test class with decorators
|
|
*/
|
|
@testDecorator
|
|
class TestClass {
|
|
public name: string = 'test';
|
|
|
|
@logMethod
|
|
public greet(message: string): string {
|
|
return `Hello, ${message}!`;
|
|
}
|
|
|
|
public getValue(): number {
|
|
return 42;
|
|
}
|
|
|
|
public testParams(@validateParam value: string): string {
|
|
return value;
|
|
}
|
|
}
|
|
|
|
// Tests
|
|
tap.test('Class decorator should be applied', async () => {
|
|
expect((TestClass as any).decoratorApplied).toEqual(true);
|
|
expect((TestClass as any).decoratorData).toEqual('Decorator was applied successfully');
|
|
});
|
|
|
|
tap.test('Method decorator should modify method behavior', async () => {
|
|
const instance = new TestClass();
|
|
const result = instance.greet('World');
|
|
expect(result).toEqual('[logged] Hello, World!');
|
|
});
|
|
|
|
tap.test('Regular methods should work normally', async () => {
|
|
const instance = new TestClass();
|
|
expect(instance.getValue()).toEqual(42);
|
|
expect(instance.name).toEqual('test');
|
|
});
|
|
|
|
tap.test('Parameter decorator should be applied', async () => {
|
|
const decoratedParams = (TestClass.prototype as any).decoratedParams;
|
|
expect(decoratedParams).toBeDefined();
|
|
expect(decoratedParams.testParams).toBeDefined();
|
|
expect(decoratedParams.testParams).toContain(0);
|
|
});
|
|
|
|
tap.test('Decorator metadata preservation', async () => {
|
|
const instance = new TestClass();
|
|
expect(instance instanceof TestClass).toEqual(true);
|
|
expect(instance.constructor.name).toEqual('TestClass');
|
|
expect(instance.testParams('hello')).toEqual('hello');
|
|
});
|
|
|
|
export default tap.start();
|