import { renderHook } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import { useIdleCallback } from "./index";
describe("useIdleCallback", () => {
    it("should execute callback when idle", () => {
        vi.useFakeTimers();
        // Mock requestIdleCallback if not present in jsdom
        let originalRequestIdleCallback = global.requestIdleCallback;
        let originalCancelIdleCallback = global.cancelIdleCallback;
        // Simple polyfill for testing if not available
        if (!global.requestIdleCallback) {
            global.requestIdleCallback = ((cb) => {
                return setTimeout(() => {
                    cb({
                        didTimeout: false,
                        timeRemaining: () => 50,
                    });
                }, 1);
            });
            global.cancelIdleCallback = ((id) => {
                clearTimeout(id);
            });
        }
        let fn = vi.fn();
        renderHook(() => useIdleCallback(fn));
        vi.advanceTimersByTime(1);
        expect(fn).toHaveBeenCalledTimes(1);
        // Cleanup
        if (originalRequestIdleCallback) {
            global.requestIdleCallback = originalRequestIdleCallback;
            global.cancelIdleCallback = originalCancelIdleCallback;
        }
        else {
            delete global.requestIdleCallback;
            delete global.cancelIdleCallback;
        }
        vi.useRealTimers();
    });
    it("should cancel callback on unmount", () => {
        vi.useFakeTimers();
        // Mock requestIdleCallback
        let originalRequestIdleCallback = global.requestIdleCallback;
        let originalCancelIdleCallback = global.cancelIdleCallback;
        if (!global.requestIdleCallback) {
            global.requestIdleCallback = ((cb) => {
                return setTimeout(() => {
                    cb({
                        didTimeout: false,
                        timeRemaining: () => 50,
                    });
                }, 10);
            });
            global.cancelIdleCallback = ((id) => {
                clearTimeout(id);
            });
        }
        let fn = vi.fn();
        let { unmount } = renderHook(() => useIdleCallback(fn));
        unmount();
        vi.advanceTimersByTime(10);
        expect(fn).toHaveBeenCalledTimes(0);
        // Cleanup
        if (originalRequestIdleCallback) {
            global.requestIdleCallback = originalRequestIdleCallback;
            global.cancelIdleCallback = originalCancelIdleCallback;
        }
        else {
            delete global.requestIdleCallback;
            delete global.cancelIdleCallback;
        }
        vi.useRealTimers();
    });
});
