import { isAsyncFilePath, isFilePath, isSyncFilePath } from "@/utils/io/file-path";
import { FileHandle } from "node:fs/promises";

describe("isFilePath", () => {
    test("returns true for string file paths", () => {
        expect(isFilePath("path/to/file.txt")).toBe(true);
    });

    test("returns true for file descriptors", () => {
        expect(isFilePath(123)).toBe(true);
    });

    test("returns true for URL file paths", () => {
        expect(isFilePath(new URL("file:///path/to/file.txt"))).toBe(true);
    });

    test("returns true for Buffer file paths", () => {
        expect(isFilePath(Buffer.from("path/to/file.txt"))).toBe(true);
    });

    test("returns true for file handles", () => {
        expect(isFilePath({ fd: 1 } as FileHandle)).toBe(true);
    });

    test("returns false for invalid file paths", () => {
        expect(isFilePath(null)).toBe(false);
        expect(isFilePath(undefined)).toBe(false);
        expect(isFilePath({})).toBe(false);
        expect(isFilePath([])).toBe(false);
    });
});

describe("isAsyncFilePath", () => {
    test("returns true for string file paths", () => {
        expect(isAsyncFilePath("path/to/file.txt")).toBe(true);
    });

    test("returns true for URL file paths", () => {
        expect(isAsyncFilePath(new URL("file:///path/to/file.txt"))).toBe(true);
    });

    test("returns true for Buffer file paths", () => {
        expect(isAsyncFilePath(Buffer.from("path/to/file.txt"))).toBe(true);
    });

    test("returns true for file handles", () => {
        expect(isAsyncFilePath({ fd: 1 } as FileHandle)).toBe(true);
    });

    test("returns false for invalid file paths", () => {
        expect(isAsyncFilePath(null)).toBe(false);
        expect(isAsyncFilePath(undefined)).toBe(false);
        expect(isAsyncFilePath({})).toBe(false);
        expect(isAsyncFilePath([])).toBe(false);
        expect(isAsyncFilePath(1)).toBe(false);
    });
});

describe("isSyncFilePath", () => {
    test("returns true for string file paths", () => {
        expect(isSyncFilePath("path/to/file.txt")).toBe(true);
    });

    test("returns true for file descriptors", () => {
        expect(isSyncFilePath(123)).toBe(true);
    });

    test("returns true for URL file paths", () => {
        expect(isSyncFilePath(new URL("file:///path/to/file.txt"))).toBe(true);
    });

    test("returns true for Buffer file paths", () => {
        expect(isSyncFilePath(Buffer.from("path/to/file.txt"))).toBe(true);
    });

    test("returns false for file handles", () => {
        expect(isSyncFilePath({ fd: 1 } as FileHandle)).toBe(false);
    });

    test("returns false for invalid file paths", () => {
        expect(isSyncFilePath(null)).toBe(false);
        expect(isSyncFilePath(undefined)).toBe(false);
        expect(isSyncFilePath({})).toBe(false);
        expect(isSyncFilePath([])).toBe(false);
    });
});