import * as React from 'react'; import { act } from 'react'; import { validateHookValueNotChanged } from '@fluentui-react-native/test-tools'; import * as renderer from 'react-test-renderer'; import { useControllableValue } from '../useControllableValue'; describe('useControllableValue', () => { it('respects controlled value', () => { let resultValue: boolean | undefined; const TestComponent: React.FunctionComponent<{ value?: boolean; defaultValue?: boolean }> = ({ value, defaultValue }) => { [resultValue] = useControllableValue(value, defaultValue); return ; }; let wrapper1: renderer.ReactTestRenderer; act(() => { wrapper1 = renderer.create(); }); expect(resultValue!).toBe(true); act(() => { wrapper1.update(); }); expect(resultValue!).toBe(false); let wrapper2: renderer.ReactTestRenderer; act(() => { wrapper2 = renderer.create(); }); expect(resultValue!).toBe(false); act(() => { wrapper2.update(); }); expect(resultValue!).toBe(true); }); it('uses the default value if no controlled value is provided', () => { let resultValue: boolean | undefined; const TestComponent: React.FunctionComponent<{ value?: boolean; defaultValue?: boolean }> = ({ value, defaultValue }) => { [resultValue] = useControllableValue(value, defaultValue); return ; }; act(() => { renderer.create(); }); expect(resultValue!).toBe(true); }); it('does not change value when the default value changes', () => { let resultValue: boolean | undefined; const TestComponent: React.FunctionComponent<{ value?: boolean; defaultValue?: boolean }> = ({ value, defaultValue }) => { [resultValue] = useControllableValue(value, defaultValue); return ; }; let wrapper: renderer.ReactTestRenderer; act(() => { wrapper = renderer.create(); }); expect(resultValue!).toBe(true); act(() => { wrapper.update(); }); expect(resultValue!).toBe(true); }); validateHookValueNotChanged('returns the same setter callback', () => { const [, setValue] = useControllableValue('hello', 'world'); return [setValue]; }); validateHookValueNotChanged( 'returns same setter callback even if param values change', () => { const [, setValue] = useControllableValue('a', 'b', () => undefined); return [setValue]; }, () => { const [, setValue] = useControllableValue('c', 'd', () => undefined); return [setValue]; }, ); });