| import * as assert from "assert"; | |
| import * as os from "os"; | |
| import * as path from "path"; | |
| import { mkdtemp, mkdir, rm, writeFile } from "fs/promises"; | |
| import { Cargo, cargoPath } from "../../src/toolchain"; | |
| import { isWindows, normalizeDriveLetter } from "../../src/util"; | |
| import type { Context } from "."; | |
| export async function getTests(ctx: Context) { | |
| await ctx.suite("Launch configuration/Lens", (suite) => { | |
| suite.addTest("A binary", async () => { | |
| const args = Cargo.artifactSpec([ | |
| "build", | |
| "--package", | |
| "pkg_name", | |
| "--bin", | |
| "pkg_name", | |
| ]); | |
| assert.deepStrictEqual(args.cargoArgs, [ | |
| "build", | |
| "--package", | |
| "pkg_name", | |
| "--bin", | |
| "pkg_name", | |
| "--message-format=json", | |
| ]); | |
| assert.deepStrictEqual(args.filter, undefined); | |
| }); | |
| suite.addTest("One of Multiple Binaries", async () => { | |
| const args = Cargo.artifactSpec(["build", "--package", "pkg_name", "--bin", "bin1"]); | |
| assert.deepStrictEqual(args.cargoArgs, [ | |
| "build", | |
| "--package", | |
| "pkg_name", | |
| "--bin", | |
| "bin1", | |
| "--message-format=json", | |
| ]); | |
| assert.deepStrictEqual(args.filter, undefined); | |
| }); | |
| suite.addTest("A test", async () => { | |
| const args = Cargo.artifactSpec(["test", "--package", "pkg_name", "--lib", "--no-run"]); | |
| assert.deepStrictEqual(args.cargoArgs, [ | |
| "test", | |
| "--package", | |
| "pkg_name", | |
| "--lib", | |
| "--no-run", | |
| "--message-format=json", | |
| ]); | |
| assert.notDeepStrictEqual(args.filter, undefined); | |
| }); | |
| }); | |
| await ctx.suite("Launch configuration/QuickPick", (suite) => { | |
| suite.addTest("A binary", async () => { | |
| const args = Cargo.artifactSpec(["run", "--package", "pkg_name", "--bin", "pkg_name"]); | |
| assert.deepStrictEqual(args.cargoArgs, [ | |
| "build", | |
| "--package", | |
| "pkg_name", | |
| "--bin", | |
| "pkg_name", | |
| "--message-format=json", | |
| ]); | |
| assert.deepStrictEqual(args.filter, undefined); | |
| }); | |
| suite.addTest("One of Multiple Binaries", async () => { | |
| const args = Cargo.artifactSpec(["run", "--package", "pkg_name", "--bin", "bin2"]); | |
| assert.deepStrictEqual(args.cargoArgs, [ | |
| "build", | |
| "--package", | |
| "pkg_name", | |
| "--bin", | |
| "bin2", | |
| "--message-format=json", | |
| ]); | |
| assert.deepStrictEqual(args.filter, undefined); | |
| }); | |
| suite.addTest("A test", async () => { | |
| const args = Cargo.artifactSpec(["test", "--package", "pkg_name", "--lib"]); | |
| assert.deepStrictEqual(args.cargoArgs, [ | |
| "test", | |
| "--package", | |
| "pkg_name", | |
| "--lib", | |
| "--message-format=json", | |
| "--no-run", | |
| ]); | |
| assert.notDeepStrictEqual(args.filter, undefined); | |
| }); | |
| }); | |
| await ctx.suite("Toolchain resolution", (suite) => { | |
| suite.addTest("prefers explicit CARGO from provided env", async () => { | |
| const explicitCargo = path.join(os.tmpdir(), "custom-cargo"); | |
| assert.strictEqual(await cargoPath({ CARGO: explicitCargo }), explicitCargo); | |
| }); | |
| suite.addTest("resolves cargo from provided PATH", async () => { | |
| const tempDir = await mkdtemp(path.join(os.tmpdir(), "ra-cargo-path-")); | |
| try { | |
| const cargoBinary = path.join(tempDir, isWindows ? "cargo.exe" : "cargo"); | |
| await writeFile(cargoBinary, ""); | |
| const pathKey = isWindows ? "Path" : "PATH"; | |
| assert.strictEqual(await cargoPath({ [pathKey]: tempDir }), "cargo"); | |
| } finally { | |
| await rm(tempDir, { recursive: true, force: true }); | |
| } | |
| }); | |
| suite.addTest("resolves cargo from provided CARGO_HOME", async () => { | |
| const cargoHome = await mkdtemp(path.join(os.tmpdir(), "ra-cargo-home-")); | |
| try { | |
| const binDir = path.join(cargoHome, "bin"); | |
| await mkdir(binDir); | |
| const cargoBinary = path.join(binDir, isWindows ? "cargo.exe" : "cargo"); | |
| await writeFile(cargoBinary, ""); | |
| assert.strictEqual( | |
| normalizeComparablePath(await cargoPath({ PATH: "", CARGO_HOME: cargoHome })), | |
| normalizeComparablePath(cargoBinary), | |
| ); | |
| } finally { | |
| await rm(cargoHome, { recursive: true, force: true }); | |
| } | |
| }); | |
| }); | |
| } | |
| function normalizeComparablePath(filePath: string): string { | |
| // Windows path comparisons should ignore drive-letter casing because `fsPath` | |
| // may normalize it differently while still pointing to the same file. | |
| return normalizeDriveLetter(filePath, isWindows); | |
| } |