import { h } from '../../src/preact'; import { VNode } from '../../src/vnode'; import { expect } from 'chai'; /*eslint-env browser, mocha */ /** @jsx h */ const buildVNode = (nodeName, attributes, children=[]) => ({ nodeName, children, attributes, key: attributes && attributes.key }); describe('h(jsx)', () => { it('should return a VNode', () => { let r; expect( () => r = h('foo') ).not.to.throw(); expect(r).to.be.an('object'); expect(r).to.be.an.instanceof(VNode); expect(r).to.have.property('nodeName', 'foo'); expect(r).to.have.property('attributes', undefined); expect(r).to.have.property('children').that.eql([]); }); it('should perserve raw attributes', () => { let attrs = { foo:'bar', baz:10, func:()=>{} }, r = h('foo', attrs); expect(r).to.be.an('object') .with.property('attributes') .that.deep.equals(attrs); }); it('should support element children', () => { let r = h( 'foo', null, h('bar'), h('baz') ); expect(r).to.be.an('object') .with.property('children') .that.deep.equals([ buildVNode('bar'), buildVNode('baz') ]); }); it('should support multiple element children, given as arg list', () => { let r = h( 'foo', null, h('bar'), h('baz', null, h('test')) ); expect(r).to.be.an('object') .with.property('children') .that.deep.equals([ buildVNode('bar'), buildVNode('baz', undefined, [ buildVNode('test') ]) ]); }); it('should handle multiple element children, given as an array', () => { let r = h( 'foo', null, [ h('bar'), h('baz', null, h('test')) ] ); expect(r).to.be.an('object') .with.property('children') .that.deep.equals([ buildVNode('bar'), buildVNode('baz', undefined, [ buildVNode('test') ]) ]); }); it('should handle multiple children, flattening one layer as needed', () => { let r = h( 'foo', null, h('bar'), [ h('baz', null, h('test')) ] ); expect(r).to.be.an('object') .with.property('children') .that.deep.equals([ buildVNode('bar'), buildVNode('baz', undefined, [ buildVNode('test') ]) ]); }); it('should support nested children', () => { const m = x => h(x); expect( h('foo', null, m('a'), [m('b'), m('c')], m('d')) ).to.have.property('children').that.eql(['a', 'b', 'c', 'd'].map(m)); expect( h('foo', null, [m('a'), [m('b'), m('c')], m('d')]) ).to.have.property('children').that.eql(['a', 'b', 'c', 'd'].map(m)); expect( h('foo', { children: [m('a'), [m('b'), m('c')], m('d')] }) ).to.have.property('children').that.eql(['a', 'b', 'c', 'd'].map(m)); expect( h('foo', { children: [[m('a'), [m('b'), m('c')], m('d')]] }) ).to.have.property('children').that.eql(['a', 'b', 'c', 'd'].map(m)); expect( h('foo', { children: m('a') }) ).to.have.property('children').that.eql([m('a')]); expect( h('foo', { children: 'a' }) ).to.have.property('children').that.eql(['a']); }); it('should support text children', () => { let r = h( 'foo', null, 'textstuff' ); expect(r).to.be.an('object') .with.property('children') .with.length(1) .with.property('0') .that.equals('textstuff'); }); it('should merge adjacent text children', () => { let r = h( 'foo', null, 'one', 'two', h('bar'), 'three', h('baz'), h('baz'), 'four', null, 'five', 'six' ); expect(r).to.be.an('object') .with.property('children') .that.deep.equals([ 'onetwo', buildVNode('bar'), 'three', buildVNode('baz'), buildVNode('baz'), 'fourfivesix' ]); }); it('should merge nested adjacent text children', () => { let r = h( 'foo', null, 'one', ['two', null, 'three'], null, ['four', null, 'five', null], 'six', null ); expect(r).to.be.an('object') .with.property('children') .that.deep.equals([ 'onetwothreefourfivesix' ]); }); });