Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81155 views
1
/**
2
* Copyright 2013-2014, Facebook, Inc.
3
* All rights reserved.
4
*
5
* This source code is licensed under the BSD-style license found in the
6
* LICENSE file in the root directory of this source tree. An additional grant
7
* of patent rights can be found in the PATENTS file in the same directory.
8
*
9
* @emails react-core
10
*/
11
12
"use strict";
13
14
describe('traverseAllChildren', function() {
15
var traverseAllChildren;
16
var React;
17
beforeEach(function() {
18
traverseAllChildren = require('traverseAllChildren');
19
React = require('React');
20
});
21
22
23
it('should support identity for simple', function() {
24
var traverseContext = [];
25
var traverseFn =
26
jasmine.createSpy().andCallFake(function(context, kid, key, index) {
27
context.push(true);
28
});
29
30
var simpleKid = <span key="simple" />;
31
32
// Jasmine doesn't provide a way to test that the fn was invoked with scope.
33
var instance = <div>{simpleKid}</div>;
34
traverseAllChildren(instance.props.children, traverseFn, traverseContext);
35
expect(traverseFn).toHaveBeenCalledWith(
36
traverseContext,
37
simpleKid,
38
'.$simple',
39
0
40
);
41
expect(traverseContext.length).toEqual(1);
42
});
43
44
it('should treat single arrayless child as being in array', function() {
45
var traverseContext = [];
46
var traverseFn =
47
jasmine.createSpy().andCallFake(function(context, kid, key, index) {
48
context.push(true);
49
});
50
51
var simpleKid = <span />;
52
var instance = <div>{simpleKid}</div>;
53
traverseAllChildren(instance.props.children, traverseFn, traverseContext);
54
expect(traverseFn).toHaveBeenCalledWith(
55
traverseContext,
56
simpleKid,
57
'.0',
58
0
59
);
60
expect(traverseContext.length).toEqual(1);
61
});
62
63
it('should treat single child in array as expected', function() {
64
var traverseContext = [];
65
var traverseFn =
66
jasmine.createSpy().andCallFake(function(context, kid, key, index) {
67
context.push(true);
68
});
69
70
var simpleKid = <span />;
71
var instance = <div>{[simpleKid]}</div>;
72
traverseAllChildren(instance.props.children, traverseFn, traverseContext);
73
expect(traverseFn).toHaveBeenCalledWith(
74
traverseContext,
75
simpleKid,
76
'.0',
77
0
78
);
79
expect(traverseContext.length).toEqual(1);
80
});
81
82
it('should be called for each child', function() {
83
var zero = <div key="keyZero" />;
84
var one = null;
85
var two = <div key="keyTwo" />;
86
var three = null;
87
var four = <div key="keyFour" />;
88
89
var traverseContext = [];
90
var traverseFn =
91
jasmine.createSpy().andCallFake(function(context, kid, key, index) {
92
context.push(true);
93
});
94
95
var instance = (
96
<div>
97
{zero}
98
{one}
99
{two}
100
{three}
101
{four}
102
</div>
103
);
104
105
traverseAllChildren(instance.props.children, traverseFn, traverseContext);
106
expect(traverseFn).toHaveBeenCalledWith(
107
traverseContext,
108
zero,
109
'.$keyZero',
110
0
111
);
112
expect(traverseFn).toHaveBeenCalledWith(traverseContext, one, '.1', 1);
113
expect(traverseFn).toHaveBeenCalledWith(
114
traverseContext,
115
two,
116
'.$keyTwo',
117
2
118
);
119
expect(traverseFn).toHaveBeenCalledWith(traverseContext, three, '.3', 3);
120
expect(traverseFn).toHaveBeenCalledWith(
121
traverseContext,
122
four,
123
'.$keyFour',
124
4
125
);
126
});
127
128
// Todo: test that nums/strings are converted to ReactComponents.
129
130
it('should be called for each child in nested structure', function() {
131
var zero = <div key="keyZero" />;
132
var one = null;
133
var two = <div key="keyTwo" />;
134
var three = null;
135
var four = <div key="keyFour" />;
136
var five = <div key="keyFiveInner" />;
137
// five is placed into a JS object with a key that is joined to the
138
// component key attribute.
139
// Precedence is as follows:
140
// 1. If grouped in an Object, the object key combined with `key` prop
141
// 2. If grouped in an Array, the `key` prop, falling back to array index
142
143
144
var traverseContext = [];
145
var traverseFn =
146
jasmine.createSpy().andCallFake(function(context, kid, key, index) {
147
context.push(true);
148
});
149
150
var instance = (
151
<div>{
152
[{
153
firstHalfKey: [zero, one, two],
154
secondHalfKey: [three, four],
155
keyFive: five
156
}]
157
}</div>
158
);
159
160
traverseAllChildren(instance.props.children, traverseFn, traverseContext);
161
expect(traverseFn.calls.length).toBe(6);
162
expect(traverseContext.length).toEqual(6);
163
expect(traverseFn).toHaveBeenCalledWith(
164
traverseContext,
165
zero,
166
'.0:$firstHalfKey:0:$keyZero',
167
0
168
);
169
170
expect(traverseFn)
171
.toHaveBeenCalledWith(traverseContext, one, '.0:$firstHalfKey:0:1', 1);
172
173
expect(traverseFn).toHaveBeenCalledWith(
174
traverseContext,
175
two,
176
'.0:$firstHalfKey:0:$keyTwo',
177
2
178
);
179
180
expect(traverseFn).toHaveBeenCalledWith(
181
traverseContext,
182
three,
183
'.0:$secondHalfKey:0:0',
184
3
185
);
186
187
expect(traverseFn).toHaveBeenCalledWith(
188
traverseContext,
189
four,
190
'.0:$secondHalfKey:0:$keyFour',
191
4
192
);
193
194
expect(traverseFn).toHaveBeenCalledWith(
195
traverseContext,
196
five,
197
'.0:$keyFive:$keyFiveInner',
198
5
199
);
200
});
201
202
it('should retain key across two mappings', function() {
203
var zeroForceKey = <div key="keyZero" />;
204
var oneForceKey = <div key="keyOne" />;
205
var traverseContext = [];
206
var traverseFn =
207
jasmine.createSpy().andCallFake(function(context, kid, key, index) {
208
context.push(true);
209
});
210
211
var forcedKeys = (
212
<div>
213
{zeroForceKey}
214
{oneForceKey}
215
</div>
216
);
217
218
traverseAllChildren(forcedKeys.props.children, traverseFn, traverseContext);
219
expect(traverseContext.length).toEqual(2);
220
expect(traverseFn).toHaveBeenCalledWith(
221
traverseContext,
222
zeroForceKey,
223
'.$keyZero',
224
0
225
);
226
expect(traverseFn).toHaveBeenCalledWith(
227
traverseContext,
228
oneForceKey,
229
'.$keyOne',
230
1
231
);
232
});
233
234
});
235
236