77 lines
3.3 KiB
JavaScript
77 lines
3.3 KiB
JavaScript
import { expect } from '@open-wc/testing';
|
|
|
|
import { dedupeMixin } from '../src/dedupeMixin.js';
|
|
|
|
describe('dedupeMixin', () => {
|
|
function createMixin(name) {
|
|
return superClass =>
|
|
class MixinClass extends superClass {
|
|
getMixinNames() {
|
|
const superName = super.getMixinNames ? ` ${super.getMixinNames()}` : '';
|
|
return `${name}${superName}`;
|
|
}
|
|
};
|
|
}
|
|
|
|
function createMixins(...names) {
|
|
return names.map(name => createMixin(name));
|
|
}
|
|
|
|
it('dedupes mixins', () => {
|
|
const [Mixin1, Mixin2, Mixin3] = createMixins('Mixin1', 'Mixin2', 'Mixin3');
|
|
const DedupingMixin3 = dedupeMixin(Mixin3);
|
|
class BaseClass {}
|
|
class MixedClass1 extends DedupingMixin3(Mixin1(Mixin2(DedupingMixin3(BaseClass)))) {}
|
|
const MixedClass2 = DedupingMixin3(Mixin1(Mixin2(DedupingMixin3(BaseClass))));
|
|
const myObj1 = new MixedClass1();
|
|
const myObj2 = new MixedClass2();
|
|
expect(myObj1.getMixinNames()).to.equal('Mixin1 Mixin2 Mixin3');
|
|
expect(myObj2.getMixinNames()).to.equal('Mixin1 Mixin2 Mixin3');
|
|
});
|
|
|
|
it('dedupes mixins only explicitely', () => {
|
|
const [Mixin1, Mixin2, Mixin3] = createMixins('Mixin1', 'Mixin2', 'Mixin3');
|
|
const DedupingMixin3 = dedupeMixin(Mixin3);
|
|
class BaseClass {}
|
|
class MixedClass1 extends Mixin3(Mixin1(Mixin2(DedupingMixin3(BaseClass)))) {}
|
|
class MixedClass2 extends DedupingMixin3(Mixin1(Mixin2(Mixin3(BaseClass)))) {}
|
|
const myObj1 = new MixedClass1();
|
|
const myObj2 = new MixedClass2();
|
|
expect(myObj1.getMixinNames()).to.equal('Mixin3 Mixin1 Mixin2 Mixin3');
|
|
expect(myObj2.getMixinNames()).to.equal('Mixin3 Mixin1 Mixin2 Mixin3');
|
|
});
|
|
|
|
it('dedupes mixins applied on inherited base classes', () => {
|
|
const [Mixin1, Mixin2, Mixin3] = createMixins('Mixin1', 'Mixin2', 'Mixin3');
|
|
const DedupingMixin3 = dedupeMixin(Mixin3);
|
|
class BaseClass {}
|
|
class BaseMixedClass extends Mixin1(Mixin2(DedupingMixin3(BaseClass))) {}
|
|
class ExtendedMixedClass extends DedupingMixin3(BaseMixedClass) {}
|
|
const myObj = new ExtendedMixedClass();
|
|
expect(myObj.getMixinNames()).to.equal('Mixin1 Mixin2 Mixin3');
|
|
});
|
|
|
|
it('dedupes mixins applied via other mixins', () => {
|
|
const [Mixin1, Mixin2, Mixin3] = createMixins('Mixin1', 'Mixin2', 'Mixin3');
|
|
const DedupingMixin1 = dedupeMixin(Mixin1);
|
|
const DedupingMixin2 = dedupeMixin(Mixin2);
|
|
const DedupingMixin3 = dedupeMixin(Mixin3);
|
|
const Mixin123 = superClass => DedupingMixin1(DedupingMixin2(DedupingMixin3(superClass)));
|
|
const Mixin312 = superClass => DedupingMixin3(DedupingMixin1(DedupingMixin2(superClass)));
|
|
class BaseClass {}
|
|
class MixedClass extends Mixin312(Mixin123(BaseClass)) {}
|
|
const myObj = new MixedClass();
|
|
expect(myObj.getMixinNames()).to.equal('Mixin1 Mixin2 Mixin3');
|
|
});
|
|
|
|
// // ToDO: check with polymer3 mixin once we are on npm
|
|
// it('works with mixins deduped by Polymer', () => {
|
|
// const [Mixin1, Mixin2] = createMixins('Mixin1', 'Mixin2');
|
|
// const DedMixin1 = dedupeMixin(Mixin1);
|
|
// const PolMixin2 = dedupingMixin(Mixin2);
|
|
// class BaseClass {}
|
|
// class MixedClass extends DedMixin1(PolMixin2(DedMixin1(PolMixin2(BaseClass)))) {}
|
|
// const myObj = new MixedClass();
|
|
// expect(myObj.getMixinNames()).to.equal('Mixin1 Mixin2');
|
|
// });
|
|
});
|