react / react-0.13.3 / examples / basic-commonjs / node_modules / reactify / node_modules / react-tools / src / utils / __tests__ / traverseAllChildren-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"use strict";1213describe('traverseAllChildren', function() {14var traverseAllChildren;15var React;16beforeEach(function() {17traverseAllChildren = require('traverseAllChildren');18React = require('React');19});202122it('should support identity for simple', function() {23var traverseContext = [];24var traverseFn =25jasmine.createSpy().andCallFake(function(context, kid, key, index) {26context.push(true);27});2829var simpleKid = <span key="simple" />;3031// Jasmine doesn't provide a way to test that the fn was invoked with scope.32var instance = <div>{simpleKid}</div>;33traverseAllChildren(instance.props.children, traverseFn, traverseContext);34expect(traverseFn).toHaveBeenCalledWith(35traverseContext,36simpleKid,37'.$simple',38039);40expect(traverseContext.length).toEqual(1);41});4243it('should treat single arrayless child as being in array', function() {44var traverseContext = [];45var traverseFn =46jasmine.createSpy().andCallFake(function(context, kid, key, index) {47context.push(true);48});4950var simpleKid = <span />;51var instance = <div>{simpleKid}</div>;52traverseAllChildren(instance.props.children, traverseFn, traverseContext);53expect(traverseFn).toHaveBeenCalledWith(54traverseContext,55simpleKid,56'.0',57058);59expect(traverseContext.length).toEqual(1);60});6162it('should treat single child in array as expected', function() {63var traverseContext = [];64var traverseFn =65jasmine.createSpy().andCallFake(function(context, kid, key, index) {66context.push(true);67});6869var simpleKid = <span />;70var instance = <div>{[simpleKid]}</div>;71traverseAllChildren(instance.props.children, traverseFn, traverseContext);72expect(traverseFn).toHaveBeenCalledWith(73traverseContext,74simpleKid,75'.0',76077);78expect(traverseContext.length).toEqual(1);79});8081it('should be called for each child', function() {82var zero = <div key="keyZero" />;83var one = null;84var two = <div key="keyTwo" />;85var three = null;86var four = <div key="keyFour" />;8788var traverseContext = [];89var traverseFn =90jasmine.createSpy().andCallFake(function(context, kid, key, index) {91context.push(true);92});9394var instance = (95<div>96{zero}97{one}98{two}99{three}100{four}101</div>102);103104traverseAllChildren(instance.props.children, traverseFn, traverseContext);105expect(traverseFn).toHaveBeenCalledWith(106traverseContext,107zero,108'.$keyZero',1090110);111expect(traverseFn).toHaveBeenCalledWith(traverseContext, one, '.1', 1);112expect(traverseFn).toHaveBeenCalledWith(113traverseContext,114two,115'.$keyTwo',1162117);118expect(traverseFn).toHaveBeenCalledWith(traverseContext, three, '.3', 3);119expect(traverseFn).toHaveBeenCalledWith(120traverseContext,121four,122'.$keyFour',1234124);125});126127// Todo: test that nums/strings are converted to ReactComponents.128129it('should be called for each child in nested structure', function() {130var zero = <div key="keyZero" />;131var one = null;132var two = <div key="keyTwo" />;133var three = null;134var four = <div key="keyFour" />;135var five = <div key="keyFiveInner" />;136// five is placed into a JS object with a key that is joined to the137// component key attribute.138// Precedence is as follows:139// 1. If grouped in an Object, the object key combined with `key` prop140// 2. If grouped in an Array, the `key` prop, falling back to array index141142143var traverseContext = [];144var traverseFn =145jasmine.createSpy().andCallFake(function(context, kid, key, index) {146context.push(true);147});148149var instance = (150<div>{151[{152firstHalfKey: [zero, one, two],153secondHalfKey: [three, four],154keyFive: five155}]156}</div>157);158159traverseAllChildren(instance.props.children, traverseFn, traverseContext);160expect(traverseFn.calls.length).toBe(6);161expect(traverseContext.length).toEqual(6);162expect(traverseFn).toHaveBeenCalledWith(163traverseContext,164zero,165'.0:$firstHalfKey:0:$keyZero',1660167);168169expect(traverseFn)170.toHaveBeenCalledWith(traverseContext, one, '.0:$firstHalfKey:0:1', 1);171172expect(traverseFn).toHaveBeenCalledWith(173traverseContext,174two,175'.0:$firstHalfKey:0:$keyTwo',1762177);178179expect(traverseFn).toHaveBeenCalledWith(180traverseContext,181three,182'.0:$secondHalfKey:0:0',1833184);185186expect(traverseFn).toHaveBeenCalledWith(187traverseContext,188four,189'.0:$secondHalfKey:0:$keyFour',1904191);192193expect(traverseFn).toHaveBeenCalledWith(194traverseContext,195five,196'.0:$keyFive:$keyFiveInner',1975198);199});200201it('should retain key across two mappings', function() {202var zeroForceKey = <div key="keyZero" />;203var oneForceKey = <div key="keyOne" />;204var traverseContext = [];205var traverseFn =206jasmine.createSpy().andCallFake(function(context, kid, key, index) {207context.push(true);208});209210var forcedKeys = (211<div>212{zeroForceKey}213{oneForceKey}214</div>215);216217traverseAllChildren(forcedKeys.props.children, traverseFn, traverseContext);218expect(traverseContext.length).toEqual(2);219expect(traverseFn).toHaveBeenCalledWith(220traverseContext,221zeroForceKey,222'.$keyZero',2230224);225expect(traverseFn).toHaveBeenCalledWith(226traverseContext,227oneForceKey,228'.$keyOne',2291230);231});232233});234235236