From 85da8b702071a5142ca853aaeb432d748403d6f3 Mon Sep 17 00:00:00 2001 From: Eli White Date: Thu, 4 Apr 2019 11:21:15 -0700 Subject: [PATCH 1/3] [React Native] Add tests to paper renderer for measure, measureLayout --- .../src/__mocks__/UIManager.js | 2 + .../ReactNativeMount-test.internal.js | 100 ++++++++++++++++++ 2 files changed, 102 insertions(+) diff --git a/packages/react-native-renderer/src/__mocks__/UIManager.js b/packages/react-native-renderer/src/__mocks__/UIManager.js index 2905761af05..ab55e6d792f 100644 --- a/packages/react-native-renderer/src/__mocks__/UIManager.js +++ b/packages/react-native-renderer/src/__mocks__/UIManager.js @@ -153,6 +153,8 @@ const RCTUIManager = { views.get(parentTag).children.forEach(tag => removeChild(parentTag, tag)); }), replaceExistingNonRootView: jest.fn(), + measure: jest.fn(), + measureInWindow: jest.fn(), measureLayout: jest.fn(), __takeSnapshot: jest.fn(), }; diff --git a/packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js b/packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js index fed124ed8af..698af82eb40 100644 --- a/packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js +++ b/packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js @@ -249,6 +249,106 @@ describe('ReactNative', () => { }); }); + it('should call UIManager.measure on ref.measure', () => { + const View = createReactNativeComponentClass('RCTView', () => ({ + validAttributes: {foo: true}, + uiViewClassName: 'RCTView', + })); + + class Subclass extends ReactNative.NativeComponent { + render() { + return {this.props.children}; + } + } + + const CreateClass = createReactClass({ + mixins: [NativeMethodsMixin], + render() { + return {this.props.children}; + }, + }); + + [View, Subclass, CreateClass].forEach(Component => { + UIManager.measure.mockClear(); + + let viewRef; + ReactNative.render( + { + viewRef = ref; + }} + />, + 11, + ); + + expect(UIManager.measure).not.toBeCalled(); + + const successCallback = jest.fn(); + viewRef.measure(successCallback); + + expect(UIManager.measure).toHaveBeenCalledTimes(1); + expect(UIManager.measure).toHaveBeenCalledWith( + expect.any(Number), + expect.any(Function), + ); + + const args = UIManager.measure.mock.calls[0]; + expect(successCallback).not.toBeCalled(); + args[1]('success'); + expect(successCallback).toBeCalledWith('success'); + }); + }); + + it('should call UIManager.measureInWindow on ref.measureInWindow', () => { + const View = createReactNativeComponentClass('RCTView', () => ({ + validAttributes: {foo: true}, + uiViewClassName: 'RCTView', + })); + + class Subclass extends ReactNative.NativeComponent { + render() { + return {this.props.children}; + } + } + + const CreateClass = createReactClass({ + mixins: [NativeMethodsMixin], + render() { + return {this.props.children}; + }, + }); + + [View, Subclass, CreateClass].forEach(Component => { + UIManager.measureInWindow.mockClear(); + + let viewRef; + ReactNative.render( + { + viewRef = ref; + }} + />, + 11, + ); + + expect(UIManager.measureInWindow).not.toBeCalled(); + + const successCallback = jest.fn(); + viewRef.measureInWindow(successCallback); + + expect(UIManager.measureInWindow).toHaveBeenCalledTimes(1); + expect(UIManager.measureInWindow).toHaveBeenCalledWith( + expect.any(Number), + expect.any(Function), + ); + + const args = UIManager.measureInWindow.mock.calls[0]; + expect(successCallback).not.toBeCalled(); + args[1]('success'); + expect(successCallback).toBeCalledWith('success'); + }); + }); + it('should support reactTag in ref.measureLayout', () => { const View = createReactNativeComponentClass('RCTView', () => ({ validAttributes: {foo: true}, From 8284dd9c148acb4a8f82ff02aa89cbf97a271943 Mon Sep 17 00:00:00 2001 From: Eli White Date: Tue, 9 Apr 2019 13:19:15 -0700 Subject: [PATCH 2/3] Update tests --- .../src/ReactFabricHostConfig.js | 1 - .../src/__mocks__/UIManager.js | 37 +++++++++- .../ReactNativeMount-test.internal.js | 72 +++---------------- 3 files changed, 44 insertions(+), 66 deletions(-) diff --git a/packages/react-native-renderer/src/ReactFabricHostConfig.js b/packages/react-native-renderer/src/ReactFabricHostConfig.js index c2ccde544cb..0c292d3112c 100644 --- a/packages/react-native-renderer/src/ReactFabricHostConfig.js +++ b/packages/react-native-renderer/src/ReactFabricHostConfig.js @@ -40,7 +40,6 @@ import { completeRoot, registerEventHandler, } from 'FabricUIManager'; -import UIManager from 'UIManager'; // Counter for uniquely identifying views. // % 10 === 1 means it is a rootTag. diff --git a/packages/react-native-renderer/src/__mocks__/UIManager.js b/packages/react-native-renderer/src/__mocks__/UIManager.js index ab55e6d792f..41ed47725ce 100644 --- a/packages/react-native-renderer/src/__mocks__/UIManager.js +++ b/packages/react-native-renderer/src/__mocks__/UIManager.js @@ -153,9 +153,40 @@ const RCTUIManager = { views.get(parentTag).children.forEach(tag => removeChild(parentTag, tag)); }), replaceExistingNonRootView: jest.fn(), - measure: jest.fn(), - measureInWindow: jest.fn(), - measureLayout: jest.fn(), + measure: jest.fn(function measure(tag, callback) { + invariant( + typeof tag === 'number', + 'Expected tag to be a number, was passed %s', + tag, + ); + callback(10, 10, 100, 100, 0, 0); + }), + measureInWindow: jest.fn(function measureInWindow(tag, callback) { + invariant( + typeof tag === 'number', + 'Expected tag to be a number, was passed %s', + tag, + ); + callback(10, 10, 100, 100); + }), + measureLayout: jest.fn(function measureLayout( + tag, + relativeTag, + fail, + success, + ) { + invariant( + typeof tag === 'number', + 'Expected tag to be a number, was passed %s', + tag, + ); + invariant( + typeof relativeTag === 'number', + 'Expected relativeTag to be a number, was passed %s', + relativeTag, + ); + success(1, 1, 100, 100); + }), __takeSnapshot: jest.fn(), }; diff --git a/packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js b/packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js index 698af82eb40..e590b9f6353 100644 --- a/packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js +++ b/packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js @@ -282,20 +282,11 @@ describe('ReactNative', () => { ); expect(UIManager.measure).not.toBeCalled(); - const successCallback = jest.fn(); viewRef.measure(successCallback); - expect(UIManager.measure).toHaveBeenCalledTimes(1); - expect(UIManager.measure).toHaveBeenCalledWith( - expect.any(Number), - expect.any(Function), - ); - - const args = UIManager.measure.mock.calls[0]; - expect(successCallback).not.toBeCalled(); - args[1]('success'); - expect(successCallback).toBeCalledWith('success'); + expect(successCallback).toHaveBeenCalledTimes(1); + expect(successCallback).toHaveBeenCalledWith(10, 10, 100, 100, 0, 0); }); }); @@ -332,20 +323,11 @@ describe('ReactNative', () => { ); expect(UIManager.measureInWindow).not.toBeCalled(); - const successCallback = jest.fn(); viewRef.measureInWindow(successCallback); - expect(UIManager.measureInWindow).toHaveBeenCalledTimes(1); - expect(UIManager.measureInWindow).toHaveBeenCalledWith( - expect.any(Number), - expect.any(Function), - ); - - const args = UIManager.measureInWindow.mock.calls[0]; - expect(successCallback).not.toBeCalled(); - args[1]('success'); - expect(successCallback).toBeCalledWith('success'); + expect(successCallback).toHaveBeenCalledTimes(1); + expect(successCallback).toHaveBeenCalledWith(10, 10, 100, 100); }); }); @@ -369,7 +351,7 @@ describe('ReactNative', () => { }); [View, Subclass, CreateClass].forEach(Component => { - UIManager.measureLayout.mockReset(); + UIManager.measureLayout.mockClear(); let viewRef; let otherRef; @@ -391,7 +373,6 @@ describe('ReactNative', () => { ); expect(UIManager.measureLayout).not.toBeCalled(); - const successCallback = jest.fn(); const failureCallback = jest.fn(); viewRef.measureLayout( @@ -399,25 +380,9 @@ describe('ReactNative', () => { successCallback, failureCallback, ); - expect(UIManager.measureLayout).toHaveBeenCalledTimes(1); - expect(UIManager.measureLayout).toHaveBeenCalledWith( - expect.any(Number), - expect.any(Number), - expect.any(Function), - expect.any(Function), - ); - - const args = UIManager.measureLayout.mock.calls[0]; - expect(args[0]).not.toEqual(args[1]); - expect(successCallback).not.toBeCalled(); - expect(failureCallback).not.toBeCalled(); - args[2]('fail'); - expect(failureCallback).toBeCalledWith('fail'); - - expect(successCallback).not.toBeCalled(); - args[3]('success'); - expect(successCallback).toBeCalledWith('success'); + expect(successCallback).toHaveBeenCalledTimes(1); + expect(successCallback).toHaveBeenCalledWith(1, 1, 100, 100); }); }); @@ -428,7 +393,7 @@ describe('ReactNative', () => { })); [View].forEach(Component => { - UIManager.measureLayout.mockReset(); + UIManager.measureLayout.mockClear(); let viewRef; let otherRef; @@ -450,29 +415,12 @@ describe('ReactNative', () => { ); expect(UIManager.measureLayout).not.toBeCalled(); - const successCallback = jest.fn(); const failureCallback = jest.fn(); viewRef.measureLayout(otherRef, successCallback, failureCallback); - expect(UIManager.measureLayout).toHaveBeenCalledTimes(1); - expect(UIManager.measureLayout).toHaveBeenCalledWith( - expect.any(Number), - expect.any(Number), - expect.any(Function), - expect.any(Function), - ); - - const args = UIManager.measureLayout.mock.calls[0]; - expect(args[0]).not.toEqual(args[1]); - expect(successCallback).not.toBeCalled(); - expect(failureCallback).not.toBeCalled(); - args[2]('fail'); - expect(failureCallback).toBeCalledWith('fail'); - - expect(successCallback).not.toBeCalled(); - args[3]('success'); - expect(successCallback).toBeCalledWith('success'); + expect(successCallback).toHaveBeenCalledTimes(1); + expect(successCallback).toHaveBeenCalledWith(1, 1, 100, 100); }); }); From c7ec6abbc6cfd912e1ce239d3cc4aeab45a7410b Mon Sep 17 00:00:00 2001 From: Eli White Date: Tue, 9 Apr 2019 14:36:59 -0700 Subject: [PATCH 3/3] Shouldn't have removed UIManager import --- packages/react-native-renderer/src/ReactFabricHostConfig.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react-native-renderer/src/ReactFabricHostConfig.js b/packages/react-native-renderer/src/ReactFabricHostConfig.js index 0c292d3112c..c2ccde544cb 100644 --- a/packages/react-native-renderer/src/ReactFabricHostConfig.js +++ b/packages/react-native-renderer/src/ReactFabricHostConfig.js @@ -40,6 +40,7 @@ import { completeRoot, registerEventHandler, } from 'FabricUIManager'; +import UIManager from 'UIManager'; // Counter for uniquely identifying views. // % 10 === 1 means it is a rootTag.