diff --git a/render/hyperscript.js b/render/hyperscript.js index c6205410..ff793e43 100644 --- a/render/hyperscript.js +++ b/render/hyperscript.js @@ -90,11 +90,12 @@ function hyperscript(selector) { var vnode = hyperscriptVnode.apply(1, arguments) if (typeof selector === "string") { - return execSelector(selectorCache[selector] || compileSelector(selector), vnode) - } else { - vnode.tag = selector - return vnode + vnode.children = Vnode.normalizeChildren(vnode.children) + if (selector !== "[") return execSelector(selectorCache[selector] || compileSelector(selector), vnode) } + + vnode.tag = selector + return vnode } module.exports = hyperscript diff --git a/render/tests/test-fragment.js b/render/tests/test-fragment.js index 2883cd44..528fa9a9 100644 --- a/render/tests/test-fragment.js +++ b/render/tests/test-fragment.js @@ -2,196 +2,208 @@ var o = require("../../ospec/ospec") var fragment = require("../../render/fragment") +var m = require("../../render/hyperscript") -o.spec("fragment", function() { - o("works", function() { - var attrs = {foo: 5} - var child = {tag: "p"} - var frag = fragment(attrs, [child]) +function fragmentStr() { + var args = [].slice.call(arguments); + args.unshift("["); + return m.apply(null, args) +} - o(frag.tag).equals("[") +function runTest(name, fragment) { + o.spec(name, function() { + o("works", function() { + var attrs = {foo: 5} + var child = {tag: "p"} + var frag = fragment(attrs, [child]) - o(Array.isArray(frag.children)).equals(true) - o(frag.children.length).equals(1) - o(frag.children[0]).equals(child) + o(frag.tag).equals("[") - o(frag.attrs).equals(attrs) + o(Array.isArray(frag.children)).equals(true) + o(frag.children.length).equals(1) + o(frag.children[0]).equals(child) - o(frag.key).equals(undefined) - }) - o("supports keys", function() { - var attrs = {key: 7} - var frag = fragment(attrs, []) - o(frag.tag).equals("[") + o(frag.attrs).equals(attrs) - o(Array.isArray(frag.children)).equals(true) - o(frag.children.length).equals(0) - - o(frag.attrs).equals(attrs) - o(frag.attrs.key).equals(7) - - o(frag.key).equals(7) - }) - o.spec("children with no attrs", function() { - o("handles string single child", function() { - var vnode = fragment(["a"]) - - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals("a") + o(frag.key).equals(undefined) }) - o("handles falsy string single child", function() { - var vnode = fragment([""]) + o("supports keys", function() { + var attrs = {key: 7} + var frag = fragment(attrs, []) + o(frag.tag).equals("[") - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals("") + o(Array.isArray(frag.children)).equals(true) + o(frag.children.length).equals(0) + + o(frag.attrs).equals(attrs) + o(frag.attrs.key).equals(7) + + o(frag.key).equals(7) }) - o("handles number single child", function() { - var vnode = fragment([1]) + o.spec("children with no attrs", function() { + o("handles string single child", function() { + var vnode = fragment(["a"]) - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals(1) + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals("a") + }) + o("handles falsy string single child", function() { + var vnode = fragment([""]) + + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals("") + }) + o("handles number single child", function() { + var vnode = fragment([1]) + + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals(1) + }) + o("handles falsy number single child", function() { + var vnode = fragment([0]) + + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals(0) + }) + o("handles boolean single child", function() { + var vnode = fragment([true]) + + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals(true) + }) + o("handles falsy boolean single child", function() { + var vnode = fragment([false]) + + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals("") + }) + o("handles null single child", function() { + var vnode = fragment([null]) + + o(vnode.children[0]).equals(null) + }) + o("handles undefined single child", function() { + var vnode = fragment([undefined]) + + o(vnode.children[0]).equals(undefined) + }) + o("handles multiple string children", function() { + var vnode = fragment(["", "a"]) + + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals("") + o(vnode.children[1].tag).equals("#") + o(vnode.children[1].children).equals("a") + }) + o("handles multiple number children", function() { + var vnode = fragment([0, 1]) + + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals(0) + o(vnode.children[1].tag).equals("#") + o(vnode.children[1].children).equals(1) + }) + o("handles multiple boolean children", function() { + var vnode = fragment([false, true]) + + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals("") + o(vnode.children[1].tag).equals("#") + o(vnode.children[1].children).equals(true) + }) + o("handles multiple null/undefined child", function() { + var vnode = fragment([null, undefined]) + + o(vnode.children[0]).equals(null) + o(vnode.children[1]).equals(undefined) + }) + o("handles falsy number single child without attrs", function() { + var vnode = fragment(0) + + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals(0) + }) }) - o("handles falsy number single child", function() { - var vnode = fragment([0]) + o.spec("children with attrs", function() { + o("handles string single child", function() { + var vnode = fragment({}, ["a"]) - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals(0) - }) - o("handles boolean single child", function() { - var vnode = fragment([true]) + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals("a") + }) + o("handles falsy string single child", function() { + var vnode = fragment({}, [""]) - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals(true) - }) - o("handles falsy boolean single child", function() { - var vnode = fragment([false]) + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals("") + }) + o("handles number single child", function() { + var vnode = fragment({}, [1]) - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals("") - }) - o("handles null single child", function() { - var vnode = fragment([null]) + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals(1) + }) + o("handles falsy number single child", function() { + var vnode = fragment({}, [0]) - o(vnode.children[0]).equals(null) - }) - o("handles undefined single child", function() { - var vnode = fragment([undefined]) + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals(0) + }) + o("handles boolean single child", function() { + var vnode = fragment({}, [true]) - o(vnode.children[0]).equals(undefined) - }) - o("handles multiple string children", function() { - var vnode = fragment(["", "a"]) + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals(true) + }) + o("handles falsy boolean single child", function() { + var vnode = fragment({}, [false]) - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals("") - o(vnode.children[1].tag).equals("#") - o(vnode.children[1].children).equals("a") - }) - o("handles multiple number children", function() { - var vnode = fragment([0, 1]) + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals("") + }) + o("handles null single child", function() { + var vnode = fragment({}, [null]) - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals(0) - o(vnode.children[1].tag).equals("#") - o(vnode.children[1].children).equals(1) - }) - o("handles multiple boolean children", function() { - var vnode = fragment([false, true]) + o(vnode.children[0]).equals(null) + }) + o("handles undefined single child", function() { + var vnode = fragment({}, [undefined]) - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals("") - o(vnode.children[1].tag).equals("#") - o(vnode.children[1].children).equals(true) - }) - o("handles multiple null/undefined child", function() { - var vnode = fragment([null, undefined]) + o(vnode.children[0]).equals(undefined) + }) + o("handles multiple string children", function() { + var vnode = fragment({}, ["", "a"]) - o(vnode.children[0]).equals(null) - o(vnode.children[1]).equals(undefined) - }) - o("handles falsy number single child without attrs", function() { - var vnode = fragment(0) + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals("") + o(vnode.children[1].tag).equals("#") + o(vnode.children[1].children).equals("a") + }) + o("handles multiple number children", function() { + var vnode = fragment({}, [0, 1]) - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals(0) + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals(0) + o(vnode.children[1].tag).equals("#") + o(vnode.children[1].children).equals(1) + }) + o("handles multiple boolean children", function() { + var vnode = fragment({}, [false, true]) + + o(vnode.children[0].tag).equals("#") + o(vnode.children[0].children).equals("") + o(vnode.children[1].tag).equals("#") + o(vnode.children[1].children).equals(true) + }) + o("handles multiple null/undefined child", function() { + var vnode = fragment({}, [null, undefined]) + + o(vnode.children[0]).equals(null) + o(vnode.children[1]).equals(undefined) + }) }) }) - o.spec("children with attrs", function() { - o("handles string single child", function() { - var vnode = fragment({}, ["a"]) +} - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals("a") - }) - o("handles falsy string single child", function() { - var vnode = fragment({}, [""]) - - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals("") - }) - o("handles number single child", function() { - var vnode = fragment({}, [1]) - - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals(1) - }) - o("handles falsy number single child", function() { - var vnode = fragment({}, [0]) - - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals(0) - }) - o("handles boolean single child", function() { - var vnode = fragment({}, [true]) - - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals(true) - }) - o("handles falsy boolean single child", function() { - var vnode = fragment({}, [false]) - - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals("") - }) - o("handles null single child", function() { - var vnode = fragment({}, [null]) - - o(vnode.children[0]).equals(null) - }) - o("handles undefined single child", function() { - var vnode = fragment({}, [undefined]) - - o(vnode.children[0]).equals(undefined) - }) - o("handles multiple string children", function() { - var vnode = fragment({}, ["", "a"]) - - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals("") - o(vnode.children[1].tag).equals("#") - o(vnode.children[1].children).equals("a") - }) - o("handles multiple number children", function() { - var vnode = fragment({}, [0, 1]) - - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals(0) - o(vnode.children[1].tag).equals("#") - o(vnode.children[1].children).equals(1) - }) - o("handles multiple boolean children", function() { - var vnode = fragment({}, [false, true]) - - o(vnode.children[0].tag).equals("#") - o(vnode.children[0].children).equals("") - o(vnode.children[1].tag).equals("#") - o(vnode.children[1].children).equals(true) - }) - o("handles multiple null/undefined child", function() { - var vnode = fragment({}, [null, undefined]) - - o(vnode.children[0]).equals(null) - o(vnode.children[1]).equals(undefined) - }) - }) -}) +runTest("fragment", fragment); +runTest("fragment-string-selector", fragmentStr);