193fb6ee3Sopenharmony_ciimport * as assert from 'node:assert'; 293fb6ee3Sopenharmony_ciimport { html, parse, parseFragment, serialize, serializeOuter, type DefaultTreeAdapterMap } from 'parse5'; 393fb6ee3Sopenharmony_ciimport { generateSerializerTests } from 'parse5-test-utils/utils/generate-serializer-tests.js'; 493fb6ee3Sopenharmony_ciimport { treeAdapters } from 'parse5-test-utils/utils/common.js'; 593fb6ee3Sopenharmony_ci 693fb6ee3Sopenharmony_cigenerateSerializerTests('serializer', 'Serializer', serialize); 793fb6ee3Sopenharmony_ci 893fb6ee3Sopenharmony_cidescribe('serializer', () => { 993fb6ee3Sopenharmony_ci describe("Regression - Get text node's parent tagName only if it's an Element node (GH-38)", () => { 1093fb6ee3Sopenharmony_ci it('serializes correctly', () => { 1193fb6ee3Sopenharmony_ci const document = parse('<template>yo<div></div>42</template>'); 1293fb6ee3Sopenharmony_ci const treeAdapter: typeof treeAdapters.default = { 1393fb6ee3Sopenharmony_ci ...treeAdapters.default, 1493fb6ee3Sopenharmony_ci getTagName: (element: DefaultTreeAdapterMap['element']) => { 1593fb6ee3Sopenharmony_ci assert.ok(element.tagName); 1693fb6ee3Sopenharmony_ci 1793fb6ee3Sopenharmony_ci return treeAdapters.default.getTagName(element); 1893fb6ee3Sopenharmony_ci }, 1993fb6ee3Sopenharmony_ci }; 2093fb6ee3Sopenharmony_ci 2193fb6ee3Sopenharmony_ci serialize(document, { treeAdapter }); 2293fb6ee3Sopenharmony_ci }); 2393fb6ee3Sopenharmony_ci }); 2493fb6ee3Sopenharmony_ci 2593fb6ee3Sopenharmony_ci describe('serializeOuter', () => { 2693fb6ee3Sopenharmony_ci it('serializes outerHTML correctly', () => { 2793fb6ee3Sopenharmony_ci const document = parseFragment('<div><button>Hello</button></div>'); 2893fb6ee3Sopenharmony_ci const div = document.childNodes[0]; 2993fb6ee3Sopenharmony_ci assert.ok(treeAdapters.default.isElementNode(div)); 3093fb6ee3Sopenharmony_ci const html = serializeOuter(div); 3193fb6ee3Sopenharmony_ci 3293fb6ee3Sopenharmony_ci assert.equal(html, '<div><button>Hello</button></div>'); 3393fb6ee3Sopenharmony_ci }); 3493fb6ee3Sopenharmony_ci }); 3593fb6ee3Sopenharmony_ci 3693fb6ee3Sopenharmony_ci it('serializes <template> elements inner content', () => { 3793fb6ee3Sopenharmony_ci const document = parseFragment('<template><button>Hello</button></template>'); 3893fb6ee3Sopenharmony_ci const template = document.childNodes[0]; 3993fb6ee3Sopenharmony_ci assert.ok(treeAdapters.default.isElementNode(template)); 4093fb6ee3Sopenharmony_ci const html = serialize(template); 4193fb6ee3Sopenharmony_ci 4293fb6ee3Sopenharmony_ci assert.equal(html, '<button>Hello</button>'); 4393fb6ee3Sopenharmony_ci }); 4493fb6ee3Sopenharmony_ci 4593fb6ee3Sopenharmony_ci it('serializes the children of void elements as the empty string (GH-289)', () => { 4693fb6ee3Sopenharmony_ci const br = treeAdapters.default.createElement('br', html.NS.HTML, []); 4793fb6ee3Sopenharmony_ci 4893fb6ee3Sopenharmony_ci // Add child node to `br`, to make sure they are skipped. 4993fb6ee3Sopenharmony_ci treeAdapters.default.appendChild(br, treeAdapters.default.createElement('div', html.NS.HTML, [])); 5093fb6ee3Sopenharmony_ci 5193fb6ee3Sopenharmony_ci assert.equal(serialize(br), ''); 5293fb6ee3Sopenharmony_ci 5393fb6ee3Sopenharmony_ci // If the namespace is not HTML, the serializer should not skip the children. 5493fb6ee3Sopenharmony_ci const svgBr = treeAdapters.default.createElement('br', html.NS.SVG, []); 5593fb6ee3Sopenharmony_ci treeAdapters.default.appendChild(svgBr, treeAdapters.default.createElement('div', html.NS.HTML, [])); 5693fb6ee3Sopenharmony_ci 5793fb6ee3Sopenharmony_ci assert.equal(serialize(svgBr), '<div></div>'); 5893fb6ee3Sopenharmony_ci }); 5993fb6ee3Sopenharmony_ci 6093fb6ee3Sopenharmony_ci it('serializes unknown node to empty string', () => { 6193fb6ee3Sopenharmony_ci const unknown: any = {}; 6293fb6ee3Sopenharmony_ci assert.strictEqual(serialize(unknown), ''); 6393fb6ee3Sopenharmony_ci assert.strictEqual(serializeOuter(unknown), ''); 6493fb6ee3Sopenharmony_ci }); 6593fb6ee3Sopenharmony_ci}); 66