/********************************************************************************
 * Copyright (c) 2017-2021 TypeFox and others.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the Eclipse
 * Public License v. 2.0 are satisfied: GNU General Public License, version 2
 * with the GNU Classpath Exception which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 ********************************************************************************/

/** @jsx svg */
import { svg } from './jsx';

import { expect, describe, it } from 'vitest';
import { h } from 'snabbdom';

const svgNS = 'http://www.w3.org/2000/svg';

describe("JSX", () => {
    it("should set namespace even for empty svg elements with no attributes", () => {
        expect(<g/>).to.deep.equal(
            h('g', {
                ns: svgNS
            },
            [])
        );
    });

    it("should convert prefixes of the jsx attribute to the key of the vnode", () => {
        const style = { fontWeight: 'bold' };
        const callback = () => null;
        const element = <g>
            <rect
                style={style}
                style-color='red'
                class-sprotty-rect={true}
                on-click={callback}/>
            </g>;

        expect(element.children[0]).to.deep.equal(
            h('rect', {
                ns: svgNS,
                on: { click: callback },
                style: { fontWeight: 'bold', color: 'red' },
                class: { 'sprotty-rect': true }
            },
            [])
        );
    });

    it("should convert a JSX function component to a vnode", () => {
        const MyComponent = (props: { name: string }) => <text>{props.name}</text>;
        expect(<MyComponent name="foo"/>).to.deep.equal(
            MyComponent({ name: "foo" })
        );

        expect(MyComponent({ name: "foo" })).to.deep.equal(
            h('text', {
                ns: svgNS
            },
            'foo')
        );
    });

    it("should convert regular svg attributes to vnode attributes", () => {
        const element = <g>
            <rect stroke-width={5} x={10} y={20} width={30} height={40}/>
        </g>;

        expect(element.children[0]).to.deep.equal(
            h('rect', {
                ns: svgNS,
                attrs: { 'stroke-width': 5, x: 10, y: 20, width: 30, height: 40 }
            },
            [])
        );
    });

});
