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
var mocks = require('mocks');
15
16
describe('ReactMultiChild', function() {
17
var React;
18
19
beforeEach(function() {
20
require('mock-modules').dumpCache();
21
React = require('React');
22
});
23
24
describe('reconciliation', function() {
25
it('should update children when possible', function() {
26
var container = document.createElement('div');
27
28
var mockMount = mocks.getMockFunction();
29
var mockUpdate = mocks.getMockFunction();
30
var mockUnmount = mocks.getMockFunction();
31
32
var MockComponent = React.createClass({
33
componentDidMount: mockMount,
34
componentDidUpdate: mockUpdate,
35
componentWillUnmount: mockUnmount,
36
render: function() {
37
return <span />;
38
}
39
});
40
41
expect(mockMount.mock.calls.length).toBe(0);
42
expect(mockUpdate.mock.calls.length).toBe(0);
43
expect(mockUnmount.mock.calls.length).toBe(0);
44
45
React.render(<div><MockComponent /></div>, container);
46
47
expect(mockMount.mock.calls.length).toBe(1);
48
expect(mockUpdate.mock.calls.length).toBe(0);
49
expect(mockUnmount.mock.calls.length).toBe(0);
50
51
React.render(<div><MockComponent /></div>, container);
52
53
expect(mockMount.mock.calls.length).toBe(1);
54
expect(mockUpdate.mock.calls.length).toBe(1);
55
expect(mockUnmount.mock.calls.length).toBe(0);
56
});
57
58
it('should replace children with different constructors', function() {
59
var container = document.createElement('div');
60
61
var mockMount = mocks.getMockFunction();
62
var mockUnmount = mocks.getMockFunction();
63
64
var MockComponent = React.createClass({
65
componentDidMount: mockMount,
66
componentWillUnmount: mockUnmount,
67
render: function() {
68
return <span />;
69
}
70
});
71
72
expect(mockMount.mock.calls.length).toBe(0);
73
expect(mockUnmount.mock.calls.length).toBe(0);
74
75
React.render(<div><MockComponent /></div>, container);
76
77
expect(mockMount.mock.calls.length).toBe(1);
78
expect(mockUnmount.mock.calls.length).toBe(0);
79
80
React.render(<div><span /></div>, container);
81
82
expect(mockMount.mock.calls.length).toBe(1);
83
expect(mockUnmount.mock.calls.length).toBe(1);
84
});
85
86
it('should replace children with different owners', function() {
87
var container = document.createElement('div');
88
89
var mockMount = mocks.getMockFunction();
90
var mockUnmount = mocks.getMockFunction();
91
92
var MockComponent = React.createClass({
93
componentDidMount: mockMount,
94
componentWillUnmount: mockUnmount,
95
render: function() {
96
return <span />;
97
}
98
});
99
100
var WrapperComponent = React.createClass({
101
render: function() {
102
return this.props.children || <MockComponent />;
103
}
104
});
105
106
expect(mockMount.mock.calls.length).toBe(0);
107
expect(mockUnmount.mock.calls.length).toBe(0);
108
109
React.render(<WrapperComponent />, container);
110
111
expect(mockMount.mock.calls.length).toBe(1);
112
expect(mockUnmount.mock.calls.length).toBe(0);
113
114
React.render(
115
<WrapperComponent><MockComponent /></WrapperComponent>,
116
container
117
);
118
119
expect(mockMount.mock.calls.length).toBe(2);
120
expect(mockUnmount.mock.calls.length).toBe(1);
121
});
122
123
it('should replace children with different keys', function() {
124
var container = document.createElement('div');
125
126
var mockMount = mocks.getMockFunction();
127
var mockUnmount = mocks.getMockFunction();
128
129
var MockComponent = React.createClass({
130
componentDidMount: mockMount,
131
componentWillUnmount: mockUnmount,
132
render: function() {
133
return <span />;
134
}
135
});
136
137
expect(mockMount.mock.calls.length).toBe(0);
138
expect(mockUnmount.mock.calls.length).toBe(0);
139
140
React.render(<div><MockComponent key="A" /></div>, container);
141
142
expect(mockMount.mock.calls.length).toBe(1);
143
expect(mockUnmount.mock.calls.length).toBe(0);
144
145
React.render(<div><MockComponent key="B" /></div>, container);
146
147
expect(mockMount.mock.calls.length).toBe(2);
148
expect(mockUnmount.mock.calls.length).toBe(1);
149
});
150
});
151
152
describe('innerHTML', function() {
153
var setInnerHTML;
154
155
// Only run this suite if `Element.prototype.innerHTML` can be spied on.
156
var innerHTMLDescriptor = Object.getOwnPropertyDescriptor(
157
Element.prototype,
158
'innerHTML'
159
);
160
if (!innerHTMLDescriptor) {
161
return;
162
}
163
164
beforeEach(function() {
165
Object.defineProperty(Element.prototype, 'innerHTML', {
166
set: setInnerHTML = jasmine.createSpy().andCallFake(
167
innerHTMLDescriptor.set
168
)
169
});
170
});
171
172
it('should only set `innerHTML` once on update', function() {
173
var container = document.createElement('div');
174
175
React.render(
176
<div>
177
<p><span /></p>
178
<p><span /></p>
179
<p><span /></p>
180
</div>,
181
container
182
);
183
// Warm the cache used by `getMarkupWrap`.
184
React.render(
185
<div>
186
<p><span /><span /></p>
187
<p><span /><span /></p>
188
<p><span /><span /></p>
189
</div>,
190
container
191
);
192
expect(setInnerHTML).toHaveBeenCalled();
193
var callCountOnMount = setInnerHTML.callCount;
194
195
React.render(
196
<div>
197
<p><span /><span /><span /></p>
198
<p><span /><span /><span /></p>
199
<p><span /><span /><span /></p>
200
</div>,
201
container
202
);
203
expect(setInnerHTML.callCount).toBe(callCountOnMount + 1);
204
});
205
});
206
});
207
208