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