blob: b3c59de491ee59ecab2f761b0da1ffa10d7fccea [file] [log] [blame]
import { ExtensibleFunction } from '@superset-ui/core/src';
describe('ExtensibleFunction', () => {
interface Func1 {
(): number;
}
class Func1 extends ExtensibleFunction {
constructor(x: unknown) {
super(() => x); // closure
}
}
interface Func2 {
(): number;
}
class Func2 extends ExtensibleFunction {
x: unknown;
constructor(x: unknown) {
super(() => this.x); // arrow function, refer to its own field
this.x = x;
}
// eslint-disable-next-line class-methods-use-this
hi() {
return 'hi';
}
}
class Func3 extends ExtensibleFunction {
x: unknown;
constructor(x: unknown) {
// @ts-ignore
super(function customName() {
// @ts-ignore
return customName.x as unknown;
}); // named function
this.x = x;
}
}
it('its subclass is an instance of Function', () => {
expect(Func1).toBeInstanceOf(Function);
expect(Func2).toBeInstanceOf(Function);
expect(Func3).toBeInstanceOf(Function);
});
const func1 = new Func1(100);
const func2 = new Func2(100);
const func3 = new Func3(100);
it('an instance of its subclass is executable like regular function', () => {
expect(func1()).toEqual(100);
expect(func2()).toEqual(100);
});
it('its subclass behaves like regular class with its own fields and functions', () => {
expect(func2.x).toEqual(100);
expect(func2.hi()).toEqual('hi');
});
it('its subclass can set name by passing named function to its constructor', () => {
expect(func3.name).toEqual('customName');
});
});