// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.

import {renderHook, act} from '@testing-library/react-native';

import {usePreventDoubleTap} from './utils';

describe('usePreventDoubleTap', () => {
    const callback = jest.fn();

    it('should allow the first tap', () => {
        const {result} = renderHook(() => usePreventDoubleTap(callback));

        act(() => {
            result.current();
        });

        expect(callback).toHaveBeenCalled();
    });

    it('should prevent the second tap within the delay', () => {
        const {result} = renderHook(() => usePreventDoubleTap(callback));

        act(() => {
            result.current();
        });

        expect(callback).toHaveBeenCalledTimes(1);

        act(() => {
            result.current();
        });

        expect(callback).toHaveBeenCalledTimes(1);
    });

    it('should allow the tap after the delay', () => {
        jest.useFakeTimers();

        const {result} = renderHook(() => usePreventDoubleTap(callback));

        act(() => {
            result.current();
        });

        expect(callback).toHaveBeenCalledTimes(1);

        act(() => {
            result.current();
        });

        expect(callback).toHaveBeenCalledTimes(1);

        act(() => {
            jest.advanceTimersByTime(750);
            result.current();
        });

        expect(callback).toHaveBeenCalledTimes(2);
        jest.useRealTimers();
    });
    it('should return the same result if the same callback is passed', () => {
        const {result, rerender} = renderHook(() => usePreventDoubleTap(callback));

        const firstResult = result.current;

        rerender(undefined);

        const secondResult = result.current;

        expect(firstResult).toBe(secondResult);
    });
});
