63 lines
1.9 KiB
TypeScript
63 lines
1.9 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
import mix from './mix';
|
|
|
|
describe('MixinBuilder', () => {
|
|
class BaseClass {
|
|
baseMethod() {
|
|
return 'base method';
|
|
}
|
|
}
|
|
|
|
const MixinA = (superclass: any) => class extends superclass {
|
|
mixinAMethod() {
|
|
return 'mixin A method';
|
|
}
|
|
};
|
|
|
|
const MixinB = (superclass: any) => class extends superclass {
|
|
mixinBMethod() {
|
|
return 'mixin B method';
|
|
}
|
|
};
|
|
|
|
test('applies mixins correctly', () => {
|
|
const MixedClass = mix(BaseClass).with(MixinA, MixinB);
|
|
const instance = new MixedClass();
|
|
|
|
expect(instance.baseMethod()).toBe('base method');
|
|
|
|
// @ts-expect-error mixin method not defined
|
|
expect(instance.mixinAMethod()).toBe('mixin A method');
|
|
|
|
// @ts-expect-error mixin method not defined
|
|
expect(instance.mixinBMethod()).toBe('mixin B method');
|
|
});
|
|
|
|
test('applies a single mixin correctly', () => {
|
|
const MixedClass = mix(BaseClass).with(MixinA);
|
|
const instance = new MixedClass();
|
|
|
|
expect(instance.baseMethod()).toBe('base method');
|
|
|
|
// @ts-expect-error mixin method not defined
|
|
expect(instance.mixinAMethod()).toBe('mixin A method');
|
|
|
|
// @ts-expect-error mixin method not defined
|
|
expect(() => instance.mixinBMethod()).toThrow(TypeError);
|
|
});
|
|
|
|
test('returns the superclass if no mixins are provided', () => {
|
|
const MixedClass = mix(BaseClass).with();
|
|
const instance = new MixedClass();
|
|
|
|
expect(instance.baseMethod()).toBe('base method');
|
|
|
|
// @ts-expect-error mixin method not defined
|
|
expect(() => instance.mixinAMethod()).toThrow(TypeError);
|
|
|
|
// @ts-expect-error mixin method not defined
|
|
expect(() => instance.mixinBMethod()).toThrow(TypeError);
|
|
});
|
|
});
|