
ba094e2 Run only local tests for pull requests (#390) e9fc3c2 Fix CI build (#386) 70a5ca3 This adds a link to preact-i18nline. (#382) 5dffd85 Merge branch 'pr-fix-build-for-windows' of https://github.com/Download/preact f14edf7 kilobits => kilobytes (#383) c193547 Test for #292 284e4aa 6.4.0 24eab2f Prevent accidental duplicate recycling of elements when swapping the base element of a component. Fixes #373. 76c5ef7 fix lint error 8008886 When swapping the base of a composed child component, update its parent's base reference. Fixes #349. fd4f21f Add an equality check prior to setting `.nodeValue` on text nodes, since Firefox (and maybe others) don't do this internally by default. Fixes #368 - thanks @zbinlin! 1555e2b Add CDNJS version badge in readme (#365) 79c8bae Disable React Developer Tools integration tests under IE (#362) 84f4eeb Refactor `linkState()` a bit to drop around 40 bytes. Coincidentally, that's the exact size of the hooks just added for DevTools... 👌 22bbfcb Little tweaks 👯 f8b326e Document how to use the React DevTools with Preact (#354) 1f4a8eb Correct "preact/devtools" type definitions (#355) 68f22eb Add React Developer Tools integration (#339) 2a7a027 Add ref and allow objects in className (#316) 4a59cca fix readme todomvc link (#345) 37ca4e0 Fixes build for Windows #343 cf93387 6.3.0 ff05818 Make `VNode.children` *always* be an Array, even when there are no children. 9b095f4 Added link to preact-layout (#342) git-subtree-dir: thirdparty/preact git-subtree-split: ba094e27b602cb16aded7dcad95f71e44b7b0476
197 lines
3.9 KiB
JavaScript
197 lines
3.9 KiB
JavaScript
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'
|
|
]);
|
|
});
|
|
});
|