[React Native] Add tests to paper renderer for measure, measureLayout (#15323)
* [React Native] Add tests to paper renderer for measure, measureLayout * Update tests * Shouldn't have removed UIManager import
Eli White committed
Apr 9, 2019 at 14:49 UTC
c7a959982b4b05c97db9b26349da2ade7bbb02be
2 files changed
+122
-41
packages/react-native-renderer/src/__mocks__/UIManager.js
+34
-1
@@ -153,7 +153,40 @@ const RCTUIManager = {
153
views.get(parentTag).children.forEach(tag => removeChild(parentTag, tag));
154
}),
155
replaceExistingNonRootView: jest.fn(),
156
- measureLayout: jest.fn(),
156
+ measure: jest.fn(function measure(tag, callback) {
157
+ invariant(
158
+ typeof tag === 'number',
159
+ 'Expected tag to be a number, was passed %s',
160
+ tag,
161
+ );
162
+ callback(10, 10, 100, 100, 0, 0);
163
+ }),
164
+ measureInWindow: jest.fn(function measureInWindow(tag, callback) {
165
+ invariant(
166
+ typeof tag === 'number',
167
+ 'Expected tag to be a number, was passed %s',
168
+ tag,
169
+ );
170
+ callback(10, 10, 100, 100);
171
+ }),
172
+ measureLayout: jest.fn(function measureLayout(
173
+ tag,
174
+ relativeTag,
175
+ fail,
176
+ success,
177
+ ) {
178
+ invariant(
179
+ typeof tag === 'number',
180
+ 'Expected tag to be a number, was passed %s',
181
+ tag,
182
+ );
183
+ invariant(
184
+ typeof relativeTag === 'number',
185
+ 'Expected relativeTag to be a number, was passed %s',
186
+ relativeTag,
187
+ );
188
+ success(1, 1, 100, 100);
189
+ }),
190
__takeSnapshot: jest.fn(),
191
};
192
packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js
+88
-40
@@ -249,6 +249,88 @@ describe('ReactNative', () => {
249
});
250
});
251
252
+ it('should call UIManager.measure on ref.measure', () => {
253
+ const View = createReactNativeComponentClass('RCTView', () => ({
254
+ validAttributes: {foo: true},
255
+ uiViewClassName: 'RCTView',
256
+ }));
257
+
258
+ class Subclass extends ReactNative.NativeComponent {
259
+ render() {
260
+ return <View>{this.props.children}</View>;
261
+ }
262
+ }
263
+
264
+ const CreateClass = createReactClass({
265
+ mixins: [NativeMethodsMixin],
266
+ render() {
267
+ return <View>{this.props.children}</View>;
268
+ },
269
+ });
270
+
271
+ [View, Subclass, CreateClass].forEach(Component => {
272
+ UIManager.measure.mockClear();
273
+
274
+ let viewRef;
275
+ ReactNative.render(
276
+ <Component
277
+ ref={ref => {
278
+ viewRef = ref;
279
+ }}
280
+ />,
281
+ 11,
282
+ );
283
+
284
+ expect(UIManager.measure).not.toBeCalled();
285
+ const successCallback = jest.fn();
286
+ viewRef.measure(successCallback);
287
+ expect(UIManager.measure).toHaveBeenCalledTimes(1);
288
+ expect(successCallback).toHaveBeenCalledTimes(1);
289
+ expect(successCallback).toHaveBeenCalledWith(10, 10, 100, 100, 0, 0);
290
+ });
291
+ });
292
+
293
+ it('should call UIManager.measureInWindow on ref.measureInWindow', () => {
294
+ const View = createReactNativeComponentClass('RCTView', () => ({
295
+ validAttributes: {foo: true},
296
+ uiViewClassName: 'RCTView',
297
+ }));
298
+
299
+ class Subclass extends ReactNative.NativeComponent {
300
+ render() {
301
+ return <View>{this.props.children}</View>;
302
+ }
303
+ }
304
+
305
+ const CreateClass = createReactClass({
306
+ mixins: [NativeMethodsMixin],
307
+ render() {
308
+ return <View>{this.props.children}</View>;
309
+ },
310
+ });
311
+
312
+ [View, Subclass, CreateClass].forEach(Component => {
313
+ UIManager.measureInWindow.mockClear();
314
+
315
+ let viewRef;
316
+ ReactNative.render(
317
+ <Component
318
+ ref={ref => {
319
+ viewRef = ref;
320
+ }}
321
+ />,
322
+ 11,
323
+ );
324
+
325
+ expect(UIManager.measureInWindow).not.toBeCalled();
326
+ const successCallback = jest.fn();
327
+ viewRef.measureInWindow(successCallback);
328
+ expect(UIManager.measureInWindow).toHaveBeenCalledTimes(1);
329
+ expect(successCallback).toHaveBeenCalledTimes(1);
330
+ expect(successCallback).toHaveBeenCalledWith(10, 10, 100, 100);
331
+ });
332
+ });
333
+
334
it('should support reactTag in ref.measureLayout', () => {
335
const View = createReactNativeComponentClass('RCTView', () => ({
336
validAttributes: {foo: true},
@@ -269,7 +351,7 @@ describe('ReactNative', () => {
351
});
352
353
[View, Subclass, CreateClass].forEach(Component => {
272
- UIManager.measureLayout.mockReset();
354
+ UIManager.measureLayout.mockClear();
355
356
let viewRef;
357
let otherRef;
@@ -291,7 +373,6 @@ describe('ReactNative', () => {
373
);
374
375
expect(UIManager.measureLayout).not.toBeCalled();
294
-
376
const successCallback = jest.fn();
377
const failureCallback = jest.fn();
378
viewRef.measureLayout(
@@ -299,25 +380,9 @@ describe('ReactNative', () => {
380
successCallback,
381
failureCallback,
382
);
302
-
383
expect(UIManager.measureLayout).toHaveBeenCalledTimes(1);
304
- expect(UIManager.measureLayout).toHaveBeenCalledWith(
305
- expect.any(Number),
306
- expect.any(Number),
307
- expect.any(Function),
308
- expect.any(Function),
309
- );
310
-
311
- const args = UIManager.measureLayout.mock.calls[0];
312
- expect(args[0]).not.toEqual(args[1]);
313
- expect(successCallback).not.toBeCalled();
314
- expect(failureCallback).not.toBeCalled();
315
- args[2]('fail');
316
- expect(failureCallback).toBeCalledWith('fail');
317
-
318
- expect(successCallback).not.toBeCalled();
319
- args[3]('success');
320
- expect(successCallback).toBeCalledWith('success');
384
+ expect(successCallback).toHaveBeenCalledTimes(1);
385
+ expect(successCallback).toHaveBeenCalledWith(1, 1, 100, 100);
386
});
387
});
388
@@ -328,7 +393,7 @@ describe('ReactNative', () => {
393
}));
394
395
[View].forEach(Component => {
331
- UIManager.measureLayout.mockReset();
396
+ UIManager.measureLayout.mockClear();
397
398
let viewRef;
399
let otherRef;
@@ -350,29 +415,12 @@ describe('ReactNative', () => {
415
);
416
417
expect(UIManager.measureLayout).not.toBeCalled();
353
-
418
const successCallback = jest.fn();
419
const failureCallback = jest.fn();
420
viewRef.measureLayout(otherRef, successCallback, failureCallback);
357
-
421
expect(UIManager.measureLayout).toHaveBeenCalledTimes(1);
359
- expect(UIManager.measureLayout).toHaveBeenCalledWith(
360
- expect.any(Number),
361
- expect.any(Number),
362
- expect.any(Function),
363
- expect.any(Function),
364
- );
365
-
366
- const args = UIManager.measureLayout.mock.calls[0];
367
- expect(args[0]).not.toEqual(args[1]);
368
- expect(successCallback).not.toBeCalled();
369
- expect(failureCallback).not.toBeCalled();
370
- args[2]('fail');
371
- expect(failureCallback).toBeCalledWith('fail');
372
-
373
- expect(successCallback).not.toBeCalled();
374
- args[3]('success');
375
- expect(successCallback).toBeCalledWith('success');
422
+ expect(successCallback).toHaveBeenCalledTimes(1);
423
+ expect(successCallback).toHaveBeenCalledWith(1, 1, 100, 100);
424
});
425
});
426