import { describe, expect, test } from "vitest";

import { classifyWin32BashToken } from "#src/access-intent/bash/msys-bash-tokens";

describe("classifyWin32BashToken", () => {
  describe("device paths", () => {
    test.each([
      "/dev/null",
      "/dev/stdin",
      "/dev/stdout",
      "/dev/stderr",
    ])("%s is a device", (token) => {
      expect(classifyWin32BashToken(token)).toEqual({ kind: "device" });
    });
  });

  describe("MSYS drive mounts", () => {
    test("translates /c/Users/x to C:\\Users\\x", () => {
      expect(classifyWin32BashToken("/c/Users/x")).toEqual({
        kind: "drive-mount",
        windowsPath: "C:\\Users\\x",
      });
    });

    test("uppercases the drive letter", () => {
      expect(classifyWin32BashToken("/d/secrets/pw.txt")).toEqual({
        kind: "drive-mount",
        windowsPath: "D:\\secrets\\pw.txt",
      });
    });

    test("accepts an already-uppercase mount letter", () => {
      expect(classifyWin32BashToken("/C/x")).toEqual({
        kind: "drive-mount",
        windowsPath: "C:\\x",
      });
    });

    test("bare /c translates to the drive root C:\\", () => {
      expect(classifyWin32BashToken("/c")).toEqual({
        kind: "drive-mount",
        windowsPath: "C:\\",
      });
    });

    test("trailing-slash /c/ translates to the drive root C:\\", () => {
      expect(classifyWin32BashToken("/c/")).toEqual({
        kind: "drive-mount",
        windowsPath: "C:\\",
      });
    });
  });

  describe("other POSIX absolutes", () => {
    test.each([
      "/tmp/foo",
      "/usr/bin",
      "/etc/hosts",
      "/mingw64/bin",
    ])("%s is a posix-absolute", (token) => {
      expect(classifyWin32BashToken(token)).toEqual({
        kind: "posix-absolute",
      });
    });

    test("a two-letter first segment is not a drive mount", () => {
      expect(classifyWin32BashToken("/cc/x")).toEqual({
        kind: "posix-absolute",
      });
    });
  });

  describe("plain tokens", () => {
    test.each([
      "src/foo.ts",
      "foo.ts",
      "C:\\Users\\x",
      "C:/Users/x",
      "../up",
    ])("%s is plain", (token) => {
      expect(classifyWin32BashToken(token)).toEqual({ kind: "plain" });
    });
  });
});
