react / react-0.13.3 / examples / basic-commonjs / node_modules / reactify / node_modules / react-tools / src / core / __tests__ / ReactMultiChildText-test.js
81155 views/**1* Copyright 2013-2014, Facebook, Inc.2* All rights reserved.3*4* This source code is licensed under the BSD-style license found in the5* LICENSE file in the root directory of this source tree. An additional grant6* of patent rights can be found in the PATENTS file in the same directory.7*8* @emails react-core9*/1011/*jslint evil: true */1213"use strict";1415require('mock-modules');1617var React = require('React');18var ReactTestUtils = require('ReactTestUtils');1920var reactComponentExpect = require('reactComponentExpect');2122// Helpers23var testAllPermutations = function(testCases) {24for (var i = 0; i < testCases.length; i += 2) {25var renderWithChildren = testCases[i];26var expectedResultAfterRender = testCases[i + 1];2728for (var j = 0; j < testCases.length; j += 2) {29var updateWithChildren = testCases[j];30var expectedResultAfterUpdate = testCases[j + 1];3132var d = renderChildren(renderWithChildren);33expectChildren(d, expectedResultAfterRender);3435updateChildren(d, updateWithChildren);36expectChildren(d, expectedResultAfterUpdate);37}38}39};4041var renderChildren = function(children) {42return ReactTestUtils.renderIntoDocument(43<div>{children}</div>44);45};4647var updateChildren = function(d, children) {48d.replaceProps({children: children});49};5051var expectChildren = function(d, children) {52var textNode;53if (typeof children === 'string') {54textNode = d.getDOMNode().firstChild;5556if (children === '') {57expect(textNode != null).toBe(false);58} else {59expect(textNode != null).toBe(true);60expect(textNode.nodeType).toBe(3);61expect(textNode.data).toBe('' + children);62}63} else {64expect(d.getDOMNode().childNodes.length).toBe(children.length);6566for (var i = 0; i < children.length; i++) {67var child = children[i];6869if (typeof child === 'string') {70reactComponentExpect(d)71.expectRenderedChildAt(i)72.toBeTextComponent()73.instance();7475textNode = d.getDOMNode().childNodes[i].firstChild;7677if (child === '') {78expect(textNode != null).toBe(false);79} else {80expect(textNode != null).toBe(true);81expect(textNode.nodeType).toBe(3);82expect(textNode.data).toBe('' + child);83}84} else {85var elementDOMNode =86reactComponentExpect(d)87.expectRenderedChildAt(i)88.toBeComponentOfType('div')89.instance()90.getDOMNode();9192expect(elementDOMNode.tagName).toBe('DIV');93}94}95}96};979899/**100* ReactMultiChild DOM integration test. In ReactDOM components, we make sure101* that single children that are strings are treated as "content" which is much102* faster to render and update.103*/104describe('ReactMultiChildText', function() {105it('should correctly handle all possible children for render and update', function() {106testAllPermutations([107// basic values108undefined, [],109null, [],110false, [],111true, [],1120, '0',1131.2, '1.2',114'', '',115'foo', 'foo',116117[], [],118[undefined], [],119[null], [],120[false], [],121[true], [],122[0], ['0'],123[1.2], ['1.2'],124[''], [''],125['foo'], ['foo'],126[<div />], [<div />],127128// two adjacent values129[true, 0], ['0'],130[0, 0], ['0', '0'],131[1.2, 0], ['1.2', '0'],132[0, ''], ['0', ''],133['foo', 0], ['foo', '0'],134[0, <div />], ['0', <div />],135136[true, 1.2], ['1.2'],137[1.2, 0], ['1.2', '0'],138[1.2, 1.2], ['1.2', '1.2'],139[1.2, ''], ['1.2', ''],140['foo', 1.2], ['foo', '1.2'],141[1.2, <div />], ['1.2', <div />],142143[true, ''], [''],144['', 0], ['', '0'],145[1.2, ''], ['1.2', ''],146['', ''], ['', ''],147['foo', ''], ['foo', ''],148['', <div />], ['', <div />],149150[true, 'foo'], ['foo'],151['foo', 0], ['foo', '0'],152[1.2, 'foo'], ['1.2', 'foo'],153['foo', ''], ['foo', ''],154['foo', 'foo'], ['foo', 'foo'],155['foo', <div />], ['foo', <div />],156157// values separated by an element158[true, <div />, true], [<div />],159[1.2, <div />, 1.2], ['1.2', <div />, '1.2'],160['', <div />, ''], ['', <div />, ''],161['foo', <div />, 'foo'], ['foo', <div />, 'foo'],162163[true, 1.2, <div />, '', 'foo'], ['1.2', <div />, '', 'foo'],164[1.2, '', <div />, 'foo', true], ['1.2', '', <div />, 'foo'],165['', 'foo', <div />, true, 1.2], ['', 'foo', <div />, '1.2'],166167[true, 1.2, '', <div />, 'foo', true, 1.2], ['1.2', '', <div />, 'foo', '1.2'],168['', 'foo', true, <div />, 1.2, '', 'foo'], ['', 'foo', <div />, '1.2', '', 'foo'],169170// values inside arrays171[[true], [true]], [],172[[1.2], [1.2]], ['1.2', '1.2'],173[[''], ['']], ['', ''],174[['foo'], ['foo']], ['foo', 'foo'],175[[<div />], [<div />]], [<div />, <div />],176177[[true, 1.2, <div />], '', 'foo'], ['1.2', <div />, '', 'foo'],178[1.2, '', [<div />, 'foo', true]], ['1.2', '', <div />, 'foo'],179['', ['foo', <div />, true], 1.2], ['', 'foo', <div />, '1.2'],180181[true, [1.2, '', <div />, 'foo'], true, 1.2], ['1.2', '', <div />, 'foo', '1.2'],182['', 'foo', [true, <div />, 1.2, ''], 'foo'], ['', 'foo', <div />, '1.2', '', 'foo'],183184// values inside objects185[{a: true}, {a: true}], [],186[{a: 1.2}, {a: 1.2}], ['1.2', '1.2'],187[{a: ''}, {a: ''}], ['', ''],188[{a: 'foo'}, {a: 'foo'}], ['foo', 'foo'],189[{a: <div />}, {a: <div />}], [<div />, <div />],190191[{a: true, b: 1.2, c: <div />}, '', 'foo'], ['1.2', <div />, '', 'foo'],192[1.2, '', {a: <div />, b: 'foo', c: true}], ['1.2', '', <div />, 'foo'],193['', {a: 'foo', b: <div />, c: true}, 1.2], ['', 'foo', <div />, '1.2'],194195[true, {a: 1.2, b: '', c: <div />, d: 'foo'}, true, 1.2], ['1.2', '', <div />, 'foo', '1.2'],196['', 'foo', {a: true, b: <div />, c: 1.2, d: ''}, 'foo'], ['', 'foo', <div />, '1.2', '', 'foo'],197198// values inside elements199[<div>{true}{1.2}{<div />}</div>, '', 'foo'], [<div />, '', 'foo'],200[1.2, '', <div>{<div />}{'foo'}{true}</div>], ['1.2', '', <div />],201['', <div>{'foo'}{<div />}{true}</div>, 1.2], ['', <div />, '1.2'],202203[true, <div>{1.2}{''}{<div />}{'foo'}</div>, true, 1.2], [<div />, '1.2'],204['', 'foo', <div>{true}{<div />}{1.2}{''}</div>, 'foo'], ['', 'foo', <div />, 'foo']205]);206});207208it('should throw if rendering both HTML and children', function() {209expect(function() {210ReactTestUtils.renderIntoDocument(211<div dangerouslySetInnerHTML={{_html: 'abcdef'}}>ghjkl</div>212);213}).toThrow();214});215216it('should render between nested components and inline children', function() {217var container = document.createElement('div');218React.render(<div><h1><span /><span /></h1></div>, container);219220expect(function() {221React.render(<div><h1>A</h1></div>, container);222}).not.toThrow();223224React.render(<div><h1><span /><span /></h1></div>, container);225226expect(function() {227React.render(<div><h1>{['A']}</h1></div>, container);228}).not.toThrow();229230React.render(<div><h1><span /><span /></h1></div>, container);231232expect(function() {233React.render(<div><h1>{['A', 'B']}</h1></div>, container);234}).not.toThrow();235});236});237238239