import { renderHook, act } from '@testing-library/react-hooks';
import * as _ from 'lodash';
import { useMemoImmer } from './useMemoImmer';

test('useMemoImmer não atualizar com mesmo valor objeto', async () => {
   let renderNumber = 0;

   const { result, waitForNextUpdate, rerender } = renderHook(
      (initialValue) =>
         useMemoImmer(() => {
            renderNumber += 1;

            return renderNumber;
         }, [initialValue]),
      {
         initialProps: {
            value: 1,
         },
      },
   );

   expect(result.current).toEqual(1);

   act(() => {
      rerender({
         value: 1,
      });
   });

   // Não deve refazer função novamente
   expect(result.current).toEqual(1);
});

test('useMemoImmer duas variáveis com mesmo valor', async () => {
   let renderNumber = 0;

   const value1 = { a: 1, b: 2 };
   const value2 = { a: 1, b: 2 };

   const { result, waitForNextUpdate, rerender } = renderHook(
      (initialValue) =>
         useMemoImmer(() => {
            renderNumber += 1;

            return renderNumber;
         }, [initialValue]),
      {
         initialProps: value1,
      },
   );

   expect(result.current).toEqual(1);

   act(() => {
      rerender(value2);
   });

   // Não deve refazer função novamente
   expect(result.current).toEqual(1);
});

test('useMemoImmer atualizar novo valor no objeto', async () => {
   let renderNumber = 0;

   const { result, waitForNextUpdate, rerender } = renderHook(
      (initialValue) =>
         useMemoImmer(() => {
            renderNumber += 1;

            return renderNumber;
         }, [initialValue]),
      {
         initialProps: {
            value: 1,
         },
      },
   );

   expect(result.current).toEqual(1);

   act(() => {
      rerender({
         value: 2,
      });
   });
   
   expect(result.current).toEqual(3);
});
