From 271abb7bc43f11c9b9e9c1353b162d9d267b1d21 Mon Sep 17 00:00:00 2001 From: vsrs Date: Thu, 2 Jul 2020 21:33:26 +0300 Subject: Add tests --- editors/code/src/config.ts | 4 +- editors/code/src/debug.ts | 2 +- editors/code/src/run.ts | 14 ++-- editors/code/tests/unit/runnable_env.test.ts | 118 +++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 editors/code/tests/unit/runnable_env.test.ts (limited to 'editors/code') diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts index a317aabcb..3257275c5 100644 --- a/editors/code/src/config.ts +++ b/editors/code/src/config.ts @@ -5,7 +5,7 @@ export type UpdatesChannel = "stable" | "nightly"; export const NIGHTLY_TAG = "nightly"; -export type RunnableEnvCfg = Record | [{ mask?: string, env: Record; }] +export type RunnableEnvCfg = undefined | Record | { mask?: string, env: Record; }[]; export class Config { readonly extensionId = "matklad.rust-analyzer"; @@ -117,7 +117,7 @@ export class Config { } get runnableEnv() { - return this.get("runnableEnv"); + return this.get("runnableEnv"); } get debug() { diff --git a/editors/code/src/debug.ts b/editors/code/src/debug.ts index 525d26923..bd92c5b6d 100644 --- a/editors/code/src/debug.ts +++ b/editors/code/src/debug.ts @@ -93,7 +93,7 @@ async function getDebugConfiguration(ctx: Ctx, runnable: ra.Runnable): Promise { +export function prepareEnv(runnable: ra.Runnable, runnableEnvCfg: RunnableEnvCfg): Record { const env: Record = { "RUST_BACKTRACE": "short" }; if (runnable.args.expectTest) { env["UPDATE_EXPECT"] = "1"; } - if (config.runnableEnv) { - if (Array.isArray(config.runnableEnv)) { - for (const it of config.runnableEnv) { + if (runnableEnvCfg) { + if (Array.isArray(runnableEnvCfg)) { + for (const it of runnableEnvCfg) { if (!it.mask || new RegExp(it.mask).test(runnable.label)) { Object.assign(env, it.env); } } } else { - Object.assign(env, config.runnableEnv as Record); + Object.assign(env, runnableEnvCfg as Record); } } @@ -136,7 +136,7 @@ export async function createTask(runnable: ra.Runnable, config: Config): Promise command: args[0], // run, test, etc... args: args.slice(1), cwd: runnable.args.workspaceRoot, - env: prepareEnv(runnable, config), + env: prepareEnv(runnable, config.runnableEnv), }; const target = vscode.workspace.workspaceFolders![0]; // safe, see main activate() diff --git a/editors/code/tests/unit/runnable_env.test.ts b/editors/code/tests/unit/runnable_env.test.ts new file mode 100644 index 000000000..979d497dd --- /dev/null +++ b/editors/code/tests/unit/runnable_env.test.ts @@ -0,0 +1,118 @@ +import * as assert from 'assert'; +import { prepareEnv } from '../../src/run'; +import { RunnableEnvCfg } from '../../src/config'; +import * as ra from '../../src/lsp_ext'; + +function make_runnable(label: string): ra.Runnable { + return { + label, + kind: "cargo", + args: { + cargoArgs: [], + executableArgs: [] + } + } +} + +function fakePrepareEnv(runnable_name: string, config: RunnableEnvCfg) : Record { + const runnable = make_runnable(runnable_name); + return prepareEnv(runnable, config); +} + +suite('Runnable env', () => { + test('Global config works', () => { + const bin_env = fakePrepareEnv("run project_name", {"GLOBAL": "g"}); + assert.equal(bin_env["GLOBAL"], "g"); + + const test_env = fakePrepareEnv("test some::mod::test_name", {"GLOBAL": "g"}); + assert.equal(test_env["GLOBAL"], "g"); + }); + + test('null mask works', () => { + const config = [ + { + env: { DATA: "data" } + } + ]; + const bin_env = fakePrepareEnv("run project_name", config); + assert.equal(bin_env["DATA"], "data"); + + const test_env = fakePrepareEnv("test some::mod::test_name", config); + assert.equal(test_env["DATA"], "data"); + }); + + test('order works', () => { + const config = [ + { + env: { DATA: "data" } + }, + { + env: { DATA: "newdata" } + } + ]; + const bin_env = fakePrepareEnv("run project_name", config); + assert.equal(bin_env["DATA"], "newdata"); + + const test_env = fakePrepareEnv("test some::mod::test_name", config); + assert.equal(test_env["DATA"], "newdata"); + }); + + test('mask works', () => { + const config = [ + { + env: { DATA: "data" } + }, + { + mask: "^run", + env: { DATA: "rundata" } + }, + { + mask: "special_test$", + env: { DATA: "special_test" } + } + ]; + const bin_env = fakePrepareEnv("run project_name", config); + assert.equal(bin_env["DATA"], "rundata"); + + const test_env = fakePrepareEnv("test some::mod::test_name", config); + assert.equal(test_env["DATA"], "data"); + + const special_test_env = fakePrepareEnv("test some::mod::special_test", config); + assert.equal(special_test_env["DATA"], "special_test"); + }); + + test('exact test name works', () => { + const config = [ + { + env: { DATA: "data" } + }, + { + mask: "some::mod::test_name", + env: { DATA: "test special" } + } + ]; + const test_env = fakePrepareEnv("test some::mod::test_name", config); + assert.equal(test_env["DATA"], "test special"); + + const special_test_env = fakePrepareEnv("test some::mod::another_test", config); + assert.equal(special_test_env["DATA"], "data"); + }); + + test('test mod name works', () => { + const config = [ + { + env: { DATA: "data" } + }, + { + mask: "some::mod", + env: { DATA: "mod special" } + } + ]; + const test_env = fakePrepareEnv("test some::mod::test_name", config); + assert.equal(test_env["DATA"], "mod special"); + + const special_test_env = fakePrepareEnv("test some::mod::another_test", config); + assert.equal(special_test_env["DATA"], "mod special"); + }); + +}); -- cgit v1.2.3