import { render } from "@cerxes/csx"; import { testContainer } from "../utils/test-container"; describe("Basic elements", () => { test("Single element", async () => { expect( testContainer( render( ` ); }); test("With text-contents", async () => { expect( testContainer( render(
Simple test
) ).innerHTML ).toBe( `
Simple test
` ); }); // TODO once added: fragments }); describe("Native Attributes", () => { test("Button-type", async () => { expect( testContainer( render( ) ).innerHTML ).toBe( `` ); }); test("Image-src", async () => { expect( testContainer( render( ) ).innerHTML ).toBe( `` ); }); // We're testing for native functionality of class here, not className test("Class", async () => { expect( testContainer( render(
) ).innerHTML ).toBe( `
` ); }); // We're testing for native functionality of style here, which should always directly set style as an attribute // when passed in as a string test("Style", async () => { expect( testContainer( render(
) ).innerHTML ).toBe( `
` ); }); }); describe("Basic Events", () => { test("Click-event", async () => { let clicked = false; let clickHandler = (ev)=>{ clicked = true; // TODO test on properties that should be on a native click event }; /** @type {HTMLButtonElement} */ let button = render(); document.body.append(button); button.click(); expect(clicked).toBe(true); document.body.removeChild(button); }); test("Focus-event", async () => { // This test exists just to have a second event to test, ideally we would have used two-part word event // like focusin, but unfortunatily, it does not seem to be working. (probably JSDOM related?) let focused = false; let focusHandler = (ev)=>{ focused = true; }; /** @type {HTMLButtonElement} */ let input = render(); document.body.append(input); input.focus(); expect(focused).toBe(true); document.body.removeChild(input); }); }); describe("Children", () => { test("3 levels", async () => { expect( testContainer( render(
) ).innerHTML ).toBe( `
` ); }); test("Multiple children", async () => { expect( testContainer( render(

Title

Contents

) ).innerHTML ).toBe([ `
`, `

Title

`, `

Contents

`, ``, `
` ].join('')); }); test("Prerendered element", async () => { let element = render(

Title

); expect( testContainer( render(
{element}
) ).innerHTML ).toBe([ `
`, `

Title

`, `
` ].join('')); }); test("Prerendered text", async () => { // TODO: CSX doesn't support fragments yet (<>I am text) let text = document.createTextNode(`I am text!`); expect( testContainer( render(
{text}
) ).innerHTML ).toBe([ `
`, `I am text!`, `
` ].join('')); }); test("Nulls and undefined are ignored", async () => { expect( testContainer( render(

Title

{null} {undefined}
) ).innerHTML ).toBe([ `
`, `

Title

`, ``, `
` ].join('')); }); test("Update maintains the same elements where possible", async () => { let initialVSpec = (

Title

); let rendered = render(initialVSpec); let container = testContainer(rendered); let children = Array.from(rendered.childNodes);// Capture current child-nodes expect( container.innerHTML ).toBe([ `
`, `

Title

`, ``, `
` ].join('')); // Update it let updatedVSpec = (

Update

); render(updatedVSpec, {host: rendered, old: initialVSpec}); expect( container.innerHTML ).toBe([ `
`, `

Update

`, ``, `
` ].join('')); let updatedChildren = Array.from(rendered.childNodes);// Capture current child-nodes expect(children.length).toBe(updatedChildren.length); for(let i = 0; i < children.length; ++i){ expect(children[i] === updatedChildren[i]).toBe(true);// Expect the element to be the same by ref } }); });