import os from "node:os";
import path from "node:path";
import { describe, expect, it } from "vitest";
import {
  buildVitestProfileCommand,
  parseArgs,
  resolveVitestProfileDir,
} from "../../scripts/run-vitest-profile.mjs";
import { createScriptTestHarness } from "./test-helpers.js";

describe("scripts/run-vitest-profile", () => {
  const { trackTempDir } = createScriptTestHarness();

  it("defaults profile output outside the repo", () => {
    const outputDir = trackTempDir(resolveVitestProfileDir({ mode: "main", outputDir: "" }));

    expect(outputDir.startsWith(os.tmpdir())).toBe(true);
    expect(outputDir.startsWith(process.cwd())).toBe(false);
  });

  it("keeps explicit output directories", () => {
    expect(
      resolveVitestProfileDir({ mode: "runner", outputDir: ".artifacts/custom-profile" }),
    ).toBe(path.resolve(".artifacts/custom-profile"));
  });

  it("builds main-thread cpu profiling args", () => {
    expect(buildVitestProfileCommand({ mode: "main", outputDir: "/tmp/profile-main" })).toEqual({
      command: process.execPath,
      args: [
        "--cpu-prof",
        "--cpu-prof-dir=/tmp/profile-main",
        "./node_modules/vitest/vitest.mjs",
        "run",
        "--config",
        "test/vitest/vitest.unit.config.ts",
        "--no-file-parallelism",
      ],
    });
  });

  it("builds runner cpu and heap profiling args", () => {
    expect(buildVitestProfileCommand({ mode: "runner", outputDir: "/tmp/profile-runner" })).toEqual(
      {
        command: "pnpm",
        args: [
          "vitest",
          "run",
          "--config",
          "test/vitest/vitest.unit.config.ts",
          "--no-file-parallelism",
          "--execArgv=--cpu-prof",
          "--execArgv=--cpu-prof-dir=/tmp/profile-runner",
          "--execArgv=--heap-prof",
          "--execArgv=--heap-prof-dir=/tmp/profile-runner",
        ],
      },
    );
  });

  it("parses mode and explicit output dir", () => {
    expect(parseArgs(["runner", "--output-dir", "/tmp/out"])).toEqual({
      mode: "runner",
      outputDir: "/tmp/out",
    });
  });
});
