| 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); |
| } |