diff --git a/__tests__/PlatformPickerBenchmark.test.js b/__tests__/PlatformPickerBenchmark.test.js new file mode 100644 index 0000000..b384d35 --- /dev/null +++ b/__tests__/PlatformPickerBenchmark.test.js @@ -0,0 +1,61 @@ +import React from 'react'; +import renderer from 'react-test-renderer'; +import PlatformPicker from '../src/components/PlatformPicker'; + +const mockPickerRender = jest.fn(); + +jest.mock('react-native', () => { + const ReactLib = require('react'); + const View = props => ReactLib.createElement('View', props, props.children); + const Text = props => ReactLib.createElement('Text', props, props.children); + const Picker = props => { + mockPickerRender(); + return ReactLib.createElement('Picker', props, props.children); + }; + Picker.Item = props => ReactLib.createElement('Picker.Item', props); + + return { + View, + Text, + Picker, + StyleSheet: { + create: obj => obj, + flatten: obj => obj, + }, + Platform: { + OS: 'ios', + select: obj => obj.ios, + }, + }; +}); + +describe('PlatformPicker Performance', () => { + test('renders repeatedly', () => { + mockPickerRender.mockClear(); + const handler = () => {}; + const selectedValue = 'mobile'; + + // Initial render + const component = renderer.create( + , + ); + + expect(mockPickerRender).toHaveBeenCalledTimes(1); + + const start = Date.now(); + + // Update 5000 times + for (let i = 0; i < 5000; i++) { + component.update( + , + ); + } + + const end = Date.now(); + console.log(`Benchmark Duration: ${end - start}ms`); + console.log(`Picker Render Count: ${mockPickerRender.mock.calls.length}`); + }); +}); diff --git a/src/components/PlatformPicker.js b/src/components/PlatformPicker.js index ee7d28e..7ff2394 100644 --- a/src/components/PlatformPicker.js +++ b/src/components/PlatformPicker.js @@ -22,4 +22,4 @@ const PlatformPicker = ({selectedValue, onValueChange}) => { ); }; -export default PlatformPicker; +export default React.memo(PlatformPicker);