Skip to content

Commit c7a9599

Browse files
authored
[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
1 parent aece811 commit c7a9599

File tree

2 files changed

+122
-41
lines changed

2 files changed

+122
-41
lines changed

packages/react-native-renderer/src/__mocks__/UIManager.js

+34-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,40 @@ const RCTUIManager = {
153153
views.get(parentTag).children.forEach(tag => removeChild(parentTag, tag));
154154
}),
155155
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+
}),
157190
__takeSnapshot: jest.fn(),
158191
};
159192

packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js

+88-40
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,88 @@ describe('ReactNative', () => {
249249
});
250250
});
251251

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+
252334
it('should support reactTag in ref.measureLayout', () => {
253335
const View = createReactNativeComponentClass('RCTView', () => ({
254336
validAttributes: {foo: true},
@@ -269,7 +351,7 @@ describe('ReactNative', () => {
269351
});
270352

271353
[View, Subclass, CreateClass].forEach(Component => {
272-
UIManager.measureLayout.mockReset();
354+
UIManager.measureLayout.mockClear();
273355

274356
let viewRef;
275357
let otherRef;
@@ -291,33 +373,16 @@ describe('ReactNative', () => {
291373
);
292374

293375
expect(UIManager.measureLayout).not.toBeCalled();
294-
295376
const successCallback = jest.fn();
296377
const failureCallback = jest.fn();
297378
viewRef.measureLayout(
298379
ReactNative.findNodeHandle(otherRef),
299380
successCallback,
300381
failureCallback,
301382
);
302-
303383
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);
321386
});
322387
});
323388

@@ -328,7 +393,7 @@ describe('ReactNative', () => {
328393
}));
329394

330395
[View].forEach(Component => {
331-
UIManager.measureLayout.mockReset();
396+
UIManager.measureLayout.mockClear();
332397

333398
let viewRef;
334399
let otherRef;
@@ -350,29 +415,12 @@ describe('ReactNative', () => {
350415
);
351416

352417
expect(UIManager.measureLayout).not.toBeCalled();
353-
354418
const successCallback = jest.fn();
355419
const failureCallback = jest.fn();
356420
viewRef.measureLayout(otherRef, successCallback, failureCallback);
357-
358421
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);
376424
});
377425
});
378426

0 commit comments

Comments
 (0)