joicomponents
Version:
Design patterns to build native web components
347 lines (317 loc) • 14.1 kB
JavaScript
const runSlotchangeMixinTest = function (SlotchangeMixinType) {
describe("GentleMom: " + SlotchangeMixinType.name, function () {
const name = SlotchangeMixinType.name.toLowerCase();
class Inner extends SlotchangeMixinType(HTMLElement) {
constructor(){
super();
this.attachShadow({mode: "open"});
this.shadowRoot.innerHTML= `
<style>
* {
color: blue;
font-weight: bold;
border-bottom: 5px solid lightblue;
}
</style>
-><slot><span>inner fallback title</span></slot>
`;
}
slottablesCallback(slot) {
if (this._stop)
throw new Error("Bug in test: Lingering slottablesCallback");
this.testValue = this.testValue || [];
this.testValue.push({
slotName: slot.name,
value: slot.assignedNodes({flatten: true}),
slot
});
}
stop() {
this._stop = true;
}
}
class MiddleMom extends SlotchangeMixinType(HTMLElement) {
constructor(){
super();
this.attachShadow({mode: "open"});
this.shadowRoot.innerHTML= `
<style>
* {
color: red;
font-style: italic;
border-right: 5px solid pink;
}
</style>
<${innerTag}><slot></slot></${innerTag}>
`;
}
slottablesCallback(slot) {
if (this._stop)
throw new Error("Bug in test: Lingering slottablesCallback");
this.testValue = this.testValue || [];
this.testValue.push({
slotName: slot.name,
value: slot.assignedNodes({flatten: true}),
slot
});
}
stop() {
this._stop = true;
}
}
class MiddlePap extends SlotchangeMixinType(HTMLElement) {
constructor(){
super();
this.attachShadow({mode: "open"});
this.shadowRoot.innerHTML= `
<style>
* {
color: red;
font-style: italic;
border-right: 5px solid pink;
}
</style>
<${innerTag}><slot><span>middle fallback title</span></slot></${innerTag}>
`;
}
slottablesCallback(slot) {
if (this._stop)
throw new Error("Bug in test: Lingering slottablesCallback");
this.testValue = this.testValue || [];
this.testValue.push({
slotName: slot.name,
value: slot.assignedNodes({flatten: true}),
slot
});
}
stop() {
this._stop = true;
}
}
const innerTag = name + "-inner-el";
const momTag = name + "-middle-mom";
const papTag = name + "-middle-pap";
customElements.define(innerTag, Inner);
customElements.define(momTag, MiddleMom);
customElements.define(papTag, MiddlePap);
it("1: inner empty <inner-el></inner-el>", function (done) {
const div = document.createElement("div");
div.innerHTML = `<${innerTag}></${innerTag}>`;
const el = div.children[0];
const slot = el.shadowRoot.children[1];
requestAnimationFrame(() => {
expect(el.testValue.length).to.be.equal(1);
expect(el.testValue[0].slotName).to.be.equal("");
expect(el.testValue[0].value.length).to.be.equal(0);
const varTest = flattenAssignedNodesVar(slot);
expect(varTest.length).to.be.equal(1);
expect(varTest[0].nodeName).to.be.equal("SPAN");
expect(varTest[0].innerText).to.be.equal("inner fallback title");
el.stop();
done();
});
});
it("2: inner with span <inner-el><span>top span</span></inner-el>", function (done) {
const div = document.createElement("div");
div.innerHTML = `<${innerTag}><span>top span</span></${innerTag}>`;
const el = div.children[0];
requestAnimationFrame(() => {
expect(el.testValue.length).to.be.equal(1);
expect(el.testValue[0].slotName).to.be.equal("");
expect(el.testValue[0].value.length).to.be.equal(1);
expect(el.testValue[0].value[0].nodeName).to.be.equal("SPAN");
expect(el.testValue[0].value[0].innerText).to.be.equal("top span");
const varTest = flattenAssignedNodesVar(el.testValue[0].slot);
expect(varTest.length).to.be.equal(1);
expect(varTest[0].nodeName).to.be.equal("SPAN");
expect(varTest[0].innerText).to.be.equal("top span");
el.stop();
done();
});
});
it("3: inner with slot-span <inner-el><slot><span>top slot span</span></slot></inner-el>", function (done) {
const div = document.createElement("div");
div.innerHTML = `<${innerTag}><slot><span>top slot span</span></slot></${innerTag}>`;
const el = div.children[0];
requestAnimationFrame(() => {
expect(el.testValue.length).to.be.equal(1);
expect(el.testValue[0].slotName).to.be.equal("");
expect(el.testValue[0].value.length).to.be.equal(1);
expect(el.testValue[0].value[0].nodeName).to.be.equal("SLOT");
// expect(el.testValue[0].value[0].innerText).to.be.equal("top span");
const varTest = flattenAssignedNodesVar(el.testValue[0].slot);
expect(varTest.length).to.be.equal(1);
expect(varTest[0].nodeName).to.be.equal("SPAN");
expect(varTest[0].innerText).to.be.equal("top slot span");
el.stop();
done();
});
});
it("4: gentlemom empty: <middle-mom></middle-mom>", function (done) {
const div = document.createElement("div");
div.innerHTML = `<${momTag}></${momTag}>`;
const el = div.children[0];
const child = el.shadowRoot.children[1];
const slot = el.shadowRoot.children[1].children[0];
const childSlot = child.shadowRoot.children[1];
requestAnimationFrame(() => {
expect(el.testValue.length).to.be.equal(1);
expect(el.testValue[0].slotName).to.be.equal("");
expect(el.testValue[0].value.length).to.be.equal(0);
expect(child.testValue.length).to.be.equal(1);
expect(child.testValue[0].slotName).to.be.equal("");
expect(child.testValue[0].value.length).to.be.equal(0);
const varTest = flattenAssignedNodesVar(slot);
expect(varTest.length).to.be.equal(0);
const childVarTest = flattenAssignedNodesVar(childSlot);
expect(childVarTest.length).to.be.equal(1);
expect(childVarTest[0].nodeName).to.be.equal("SPAN");
expect(childVarTest[0].innerText).to.be.equal("inner fallback title");
el.stop();
done();
});
});
it("5: gentlemom top span: <middle-mom><span>top span</span></middle-mom>", function (done) {
const div = document.createElement("div");
div.innerHTML = `<${momTag}><span>top span</span></${momTag}>`;
const el = div.children[0];
const child = el.shadowRoot.children[1];
requestAnimationFrame(() => {
expect(el.testValue.length).to.be.equal(1);
expect(el.testValue[0].slotName).to.be.equal("");
expect(el.testValue[0].value.length).to.be.equal(1);
expect(el.testValue[0].value[0].nodeName).to.be.equal("SPAN");
expect(el.testValue[0].value[0].innerText).to.be.equal("top span");
const varTest = flattenAssignedNodesVar(el.testValue[0].slot);
expect(varTest.length).to.be.equal(1);
expect(varTest[0].nodeName).to.be.equal("SPAN");
expect(varTest[0].innerText).to.be.equal("top span");
expect(child.testValue.length).to.be.equal(1);
expect(child.testValue[0].slotName).to.be.equal("");
expect(child.testValue[0].value.length).to.be.equal(1);
expect(child.testValue[0].value[0].nodeName).to.be.equal("SPAN");
expect(child.testValue[0].value[0].innerText).to.be.equal("top span");
const childVarTest = flattenAssignedNodesVar(child.testValue[0].slot);
expect(childVarTest.length).to.be.equal(1);
expect(childVarTest[0].nodeName).to.be.equal("SPAN");
expect(childVarTest[0].innerText).to.be.equal("top span");
el.stop();
done();
});
});
it("6: gentlemom top slot span: <middle-mom><slot><span>top slot span</span></slot></middle-mom>", function (done) {
const div = document.createElement("div");
div.innerHTML = `<${momTag}><slot><span>top span</span></slot></${momTag}>`;
const el = div.children[0];
const child = el.shadowRoot.children[1];
requestAnimationFrame(() => {
expect(el.testValue.length).to.be.equal(1);
expect(el.testValue[0].slotName).to.be.equal("");
expect(el.testValue[0].value.length).to.be.equal(1);
expect(el.testValue[0].value[0].nodeName).to.be.equal("SLOT");
const varTest = flattenAssignedNodesVar(el.testValue[0].slot);
expect(varTest.length).to.be.equal(1);
expect(varTest[0].nodeName).to.be.equal("SPAN");
expect(varTest[0].innerText).to.be.equal("top span");
expect(child.testValue.length).to.be.equal(1);
expect(child.testValue[0].slotName).to.be.equal("");
expect(child.testValue[0].value.length).to.be.equal(1);
expect(child.testValue[0].value[0].nodeName).to.be.equal("SLOT");
const childVarTest = flattenAssignedNodesVar(child.testValue[0].slot);
expect(childVarTest.length).to.be.equal(1);
expect(childVarTest[0].nodeName).to.be.equal("SPAN");
expect(childVarTest[0].innerText).to.be.equal("top span");
el.stop();
done();
});
});
it("7: gentlepap empty: <middle-pap></middle-pap>", function (done) {
const div = document.createElement("div");
div.innerHTML = `<${papTag}></${papTag}>`;
const el = div.children[0];
const child = el.shadowRoot.children[1];
const slot = el.shadowRoot.children[1].children[0];
const childSlot = child.shadowRoot.children[1];
requestAnimationFrame(() => {
expect(el.testValue.length).to.be.equal(1);
expect(el.testValue[0].slotName).to.be.equal("");
expect(el.testValue[0].value.length).to.be.equal(0);
expect(child.testValue.length).to.be.equal(1);
expect(child.testValue[0].slotName).to.be.equal("");
expect(child.testValue[0].value.length).to.be.equal(1);
expect(child.testValue[0].value[0].nodeName).to.be.equal("SPAN");
expect(child.testValue[0].value[0].innerText).to.be.equal("middle fallback title");
const varTest = flattenAssignedNodesVar(slot);
expect(varTest.length).to.be.equal(1);
expect(varTest[0].nodeName).to.be.equal("SPAN");
expect(varTest[0].innerText).to.be.equal("middle fallback title");
const childVarTest = flattenAssignedNodesVar(childSlot);
expect(childVarTest.length).to.be.equal(1);
expect(childVarTest[0].nodeName).to.be.equal("SPAN");
expect(childVarTest[0].innerText).to.be.equal("middle fallback title");
el.stop();
done();
});
});
it("8: gentlepap top span: <middle-pap><span>top span</span></middle-pap>", function (done) {
const div = document.createElement("div");
div.innerHTML = `<${papTag}><span>top span</span></${papTag}>`;
const el = div.children[0];
const child = el.shadowRoot.children[1];
requestAnimationFrame(() => {
expect(el.testValue.length).to.be.equal(1);
expect(el.testValue[0].slotName).to.be.equal("");
expect(el.testValue[0].value.length).to.be.equal(1);
expect(el.testValue[0].value[0].nodeName).to.be.equal("SPAN");
expect(el.testValue[0].value[0].innerText).to.be.equal("top span");
const varTest = flattenAssignedNodesVar(el.testValue[0].slot);
expect(varTest.length).to.be.equal(1);
expect(varTest[0].nodeName).to.be.equal("SPAN");
expect(varTest[0].innerText).to.be.equal("top span");
expect(child.testValue.length).to.be.equal(1);
expect(child.testValue[0].slotName).to.be.equal("");
expect(child.testValue[0].value.length).to.be.equal(1);
expect(child.testValue[0].value[0].nodeName).to.be.equal("SPAN");
expect(child.testValue[0].value[0].innerText).to.be.equal("top span");
const childVarTest = flattenAssignedNodesVar(child.testValue[0].slot);
expect(childVarTest.length).to.be.equal(1);
expect(childVarTest[0].nodeName).to.be.equal("SPAN");
expect(childVarTest[0].innerText).to.be.equal("top span");
el.stop();
done();
});
});
it("9: gentlepap top slot span: <middle-pap><slot><span>top slot span</span></slot></middle-pap>", function (done) {
const div = document.createElement("div");
div.innerHTML = `<${papTag}><slot><span>top span</span></slot></${papTag}>`;
const el = div.children[0];
const child = el.shadowRoot.children[1];
requestAnimationFrame(() => {
expect(el.testValue.length).to.be.equal(1);
expect(el.testValue[0].slotName).to.be.equal("");
expect(el.testValue[0].value.length).to.be.equal(1);
expect(el.testValue[0].value[0].nodeName).to.be.equal("SLOT");
const varTest = flattenAssignedNodesVar(el.testValue[0].slot);
expect(varTest.length).to.be.equal(1);
expect(varTest[0].nodeName).to.be.equal("SPAN");
expect(varTest[0].innerText).to.be.equal("top span");
expect(child.testValue.length).to.be.equal(1);
expect(child.testValue[0].slotName).to.be.equal("");
expect(child.testValue[0].value.length).to.be.equal(1);
expect(child.testValue[0].value[0].nodeName).to.be.equal("SLOT");
const childVarTest = flattenAssignedNodesVar(child.testValue[0].slot);
expect(childVarTest.length).to.be.equal(1);
expect(childVarTest[0].nodeName).to.be.equal("SPAN");
expect(childVarTest[0].innerText).to.be.equal("top span");
el.stop();
done();
});
});
});
};
// import {SlotchangeMixin} from "../../src/SlotchangeMixin.js";
import {SlottableMixin} from "../../../src/slot/SlottableMixin.js";
import {flattenAssignedNodesVar} from "../../../src/slot/VarMixin.js";
// runSlotchangeMixinTest(SlotchangeMixin);
runSlotchangeMixinTest(SlottableMixin);
// runSlotchangeMixinTest(VarMixin);