import { describe, it, expect } from "vitest"; import { HtmlElementCreator } from '../src/utils/HtmlElementCreator.mjs'; let hec = new HtmlElementCreator(); /* A cel object { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "" }; */ /** * build cel block * auto set default if undefined in the in object * @param {Object} cel_in array for creating one entry * @returns {Object} */ function celCreate(cel_in) { let cel_out; if (cel_in.id === undefined) { cel_out = hec.cel(cel_in.tag); } else if (cel_in.content === undefined) { cel_out = hec.cel( cel_in.tag, cel_in.id, ); } else if (cel_in.css === undefined) { cel_out = cel_out = hec.cel( cel_in.tag, cel_in.id, cel_in.content, ); } else if (cel_in.options === undefined) { cel_out = cel_out = hec.cel( cel_in.tag, cel_in.id, cel_in.content, cel_in.css, ); } else { cel_out = hec.cel( cel_in.tag, cel_in.id, cel_in.content, cel_in.css, cel_in.options ); } return cel_out; } describe("cel", () => { it('should create HTML Element block and return an Object', () => { // test list for various calls let cel_list = [ { "id": "tag only", "in": { "tag": "div", }, "out": { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" } }, { "id": "tag+id only", "in": { "tag": "div", "id": "div-id", }, "out": { "content": "", "css": [], "id": "div-id", "name": undefined, "options": {}, "sub": [], "tag": "div" } }, { "id": "tag+id+content only", "in": { "tag": "div", "id": "div-id", "content": "text entry", }, "out": { "content": "text entry", "css": [], "id": "div-id", "name": undefined, "options": {}, "sub": [], "tag": "div" } }, { "id": "tag+id+content+css only", "in": { "tag": "div", "id": "div-id", "content": "text entry", "css": ['css-a', 'css-b'], }, "out": { "content": "text entry", "css": ['css-a', 'css-b'], "id": "div-id", "name": undefined, "options": {}, "sub": [], "tag": "div" } }, { "id": "tag+id+content+css+options only", "in": { "tag": "div", "id": "div-id", "content": "text entry", "css": ['css-a', 'css-b'], "options": {"onclick": "doThis();"} }, "out": { "content": "text entry", "css": ['css-a', 'css-b'], "id": "div-id", "name": undefined, "options": {"onclick": "doThis();"}, "sub": [], "tag": "div" } }, // various in random { "id": "only css", "in": { "tag": "div", "id": "", "content": "", "css": ["abc"], "options": undefined, }, "out": { "content": "", "css": ['abc'], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" } }, { "id": "set name", "in": { "tag": "div", "id": "foo-bar", "content": "", "css": [], "options": { "name": "baz" }, }, "out": { "content": "", "css": [], "id": "foo-bar", "name": "baz", "options": {"name": "baz"}, "sub": [], "tag": "div" } }, ]; for (const cel_entry of cel_list) { expect(celCreate(cel_entry.in)).toEqual(cel_entry.out); } }); }); describe("ael", () => { it('should attach one HTML Element block to another and return an Object', () => { let ael_block = hec.ael( hec.cel('div'), hec.cel('div') ); expect(ael_block).toEqual( { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [ { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" } ], "tag": "div" } ); ael_block = hec.ael( ael_block, hec.cel('div') ); expect(ael_block).toEqual( { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [ { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" }, { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" } ], "tag": "div" } ); let test_cel = hec.ael( hec.cel('div', 'block-id'), hec.cel('div', 'sub-id'), ); expect(hec.ael(test_cel, hec.cel('div', 'new-block'), 'sub-id')).toEqual( { "content": "", "css": [], "id": "block-id", "name": undefined, "options": {}, "sub": [ { "content": "", "css": [], "id": "sub-id", "name": undefined, "options": {}, "sub": [ { "content": "", "css": [], "id": "new-block", "name": undefined, "options": {}, "sub": [], "tag": "div" } ], "tag": "div" } ], "tag": "div" } ); }); }); describe("aelx", () => { it('should attach one or more HTML Element block to another and return an Object', () => { let ael_block = hec.aelx( hec.cel('div'), hec.cel('div') ); expect(ael_block).toEqual( { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [ { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" } ], "tag": "div" } ); ael_block = hec.aelx( ael_block, hec.cel('div'), hec.cel('div'), hec.cel('div') ); expect(ael_block).toEqual( { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [ { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" }, { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" }, { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" }, { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" }, ], "tag": "div" } ); }); }); describe("aelxar", () => { it('should attach one or more HTML Element block arrays to another and return an Object', () => { let ael_block = hec.aelxar( hec.cel('div'), [hec.cel('div')] ); expect(ael_block).toEqual( { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [ { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" } ], "tag": "div" } ); ael_block = hec.aelxar( ael_block, [ hec.cel('div'), hec.cel('div'), hec.cel('div') ] ); expect(ael_block).toEqual( { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [ { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" }, { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" }, { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" }, { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" }, ], "tag": "div" } ); }); }); describe("rel", () => { it('should reset the sub entry array in an element and return an Object', () => { let ael_block = hec.ael( hec.cel('div'), hec.cel('div') ); expect(ael_block).toEqual( { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [ { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" } ], "tag": "div" } ); let ael_removed = hec.rel(ael_block); expect(ael_removed).toEqual( { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" } ); }); }); // grouped CSS together describe("rcssel/acssel/scssel", () => { it('should remove/add/replace css entries in an element and return an object', () => { let cel_entry = hec.cel('div'); let css_test = hec.acssel(cel_entry, 'foo'); expect(css_test).toEqual( { "content": "", "css": ['foo'], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" } ); css_test = hec.rcssel(cel_entry, 'foo'); expect(css_test).toEqual( { "content": "", "css": [], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" } ); css_test = hec.acssel(cel_entry, 'foo'); expect(css_test).toEqual( { "content": "", "css": ['foo'], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" } ); cel_entry = hec.scssel(cel_entry, 'foo', 'bar'); expect(css_test).toEqual( { "content": "", "css": ['bar'], "id": "", "name": undefined, "options": {}, "sub": [], "tag": "div" } ); }); }); // render describe("phfo", () => { it('should render an object tree out to HTML', () => { let cel_list = [ { "id": "tag only", "in": { "tag": "div", }, "out": '
' }, { "id": "tag+id only", "in": { "tag": "div", "id": "div-id", }, "out": '' }, { "id": "tag+id+content only", "in": { "tag": "div", "id": "div-id", "content": "text entry", }, "out": '