about summary refs log tree commit diff
path: root/editors/code/tests
diff options
context:
space:
mode:
authorLaurențiu Nicola <lnicola@dend.ro>2021-12-02 08:20:10 +0200
committerLaurențiu Nicola <lnicola@dend.ro>2021-12-02 13:05:50 +0200
commit76b3d437d31a2643d1097648930ae2a6dec26ce5 (patch)
treef03d4cba69f11a0f1f291f3fa1f255f09566ac1a /editors/code/tests
parent4691a0647b2c96cc475d8bbe7c31fe194d1443e7 (diff)
downloadrust-76b3d437d31a2643d1097648930ae2a6dec26ce5.tar.gz
rust-76b3d437d31a2643d1097648930ae2a6dec26ce5.zip
Replace mocha with a custom test runner
Diffstat (limited to 'editors/code/tests')
-rw-r--r--editors/code/tests/unit/index.ts106
-rw-r--r--editors/code/tests/unit/launch_config.test.ts22
-rw-r--r--editors/code/tests/unit/runnable_env.test.ts194
3 files changed, 183 insertions, 139 deletions
diff --git a/editors/code/tests/unit/index.ts b/editors/code/tests/unit/index.ts
index b7d8d21448c..39ff36707f9 100644
--- a/editors/code/tests/unit/index.ts
+++ b/editors/code/tests/unit/index.ts
@@ -1,38 +1,80 @@
 import * as path from 'path';
-import * as Mocha from 'mocha';
-import * as glob from 'glob';
-
-export function run(): Promise<void> {
-    // Create the mocha test
-    const mocha = new Mocha({
-        ui: 'tdd',
-        color: true
-    });
-
-    const testsRoot = __dirname;
-
-    return new Promise((resolve, reject) => {
-        glob('**/**.test.js', { cwd: testsRoot }, (err, files) => {
-            if (err) {
-                return reject(err);
-            }
 
-            // Add files to the test suite
-            files.forEach(f => mocha.addFile(path.resolve(testsRoot, f)));
+class Test {
+    readonly name: string;
+    readonly promise: Promise<void>;
+
+    constructor(name: string, promise: Promise<void>) {
+        this.name = name;
+        this.promise = promise;
+    }
+}
+
+class Suite {
+    tests: Test[];
 
+    constructor() {
+        this.tests = [];
+    }
+
+    public addTest(name: string, f: () => Promise<void>): void {
+        const test = new Test(name, f());
+        this.tests.push(test);
+    }
+
+    public async run(): Promise<void> {
+        let failed = 0;
+        for (const test of this.tests) {
             try {
-                // Run the mocha test
-                mocha.timeout(100000);
-                mocha.run(failures => {
-                    if (failures > 0) {
-                        reject(new Error(`${failures} tests failed.`));
-                    } else {
-                        resolve();
-                    }
-                });
-            } catch (err) {
-                reject(err);
+                await test.promise;
+                ok(`  ✔ ${test.name}`);
+            } catch (e) {
+                error(`  ✖︎ ${test.name}\n  ${e.stack}`);
+                failed += 1;
             }
-        });
-    });
+        }
+        if (failed) {
+            const plural = failed > 1 ? "s" : "";
+            throw new Error(`${failed} failed test${plural}`);
+        }
+    }
+}
+
+export class Context {
+    public async suite(name: string, f: (ctx: Suite) => void): Promise<void> {
+        const ctx = new Suite();
+        f(ctx);
+        try {
+            ok(`⌛︎ ${name}`);
+            await ctx.run();
+            ok(`✔ ${name}`);
+        } catch (e) {
+            error(`✖︎ ${name}\n  ${e.stack}`);
+            throw e;
+        }
+    }
+}
+
+export async function run(): Promise<void> {
+    const context = new Context();
+    const testFiles = ["launch_config.test.js", "runnable_env.test.js"];
+    for (const testFile of testFiles) {
+        try {
+            const testModule = require(path.resolve(__dirname, testFile));
+            await testModule.getTests(context);
+        } catch (e) {
+            error(`${e}`);
+            throw e;
+        }
+    }
+}
+
+function ok(message: string): void {
+    // eslint-disable-next-line no-console
+    console.log(`\x1b[32m${message}\x1b[0m`);
+}
+
+function error(message: string): void {
+    // eslint-disable-next-line no-console
+    console.error(`\x1b[31m${message}\x1b[0m`);
 }
diff --git a/editors/code/tests/unit/launch_config.test.ts b/editors/code/tests/unit/launch_config.test.ts
index e53ae5ce9ec..aa7a6be2696 100644
--- a/editors/code/tests/unit/launch_config.test.ts
+++ b/editors/code/tests/unit/launch_config.test.ts
@@ -1,24 +1,24 @@
 import * as assert from 'assert';
 import { Cargo } from '../../src/toolchain';
+import { Context } from '.';
 
-suite('Launch configuration', () => {
-
-    suite('Lens', () => {
-        test('A binary', async () => {
+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);
         });
 
-        test('One of Multiple Binaries', async () => {
+        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);
         });
 
-        test('A test', async () => {
+        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"]);
@@ -26,8 +26,8 @@ suite('Launch configuration', () => {
         });
     });
 
-    suite('QuickPick', () => {
-        test('A binary', async () => {
+    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"]);
@@ -35,18 +35,18 @@ suite('Launch configuration', () => {
         });
 
 
-        test('One of Multiple Binaries', async () => {
+        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);
         });
 
-        test('A test', async () => {
+        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);
         });
     });
-});
+}
diff --git a/editors/code/tests/unit/runnable_env.test.ts b/editors/code/tests/unit/runnable_env.test.ts
index d5f522dd11c..085c96da929 100644
--- a/editors/code/tests/unit/runnable_env.test.ts
+++ b/editors/code/tests/unit/runnable_env.test.ts
@@ -1,6 +1,7 @@
 import * as assert from 'assert';
 import { prepareEnv } from '../../src/run';
 import { RunnableEnvCfg } from '../../src/config';
+import { Context } from '.';
 import * as ra from '../../src/lsp_ext';
 
 function makeRunnable(label: string): ra.Runnable {
@@ -20,100 +21,101 @@ function fakePrepareEnv(runnableName: string, config: RunnableEnvCfg): Record<st
     return prepareEnv(runnable, config);
 }
 
-suite('Runnable env', () => {
-    test('Global config works', () => {
-        const binEnv = fakePrepareEnv("run project_name", { "GLOBAL": "g" });
-        assert.strictEqual(binEnv["GLOBAL"], "g");
-
-        const testEnv = fakePrepareEnv("test some::mod::test_name", { "GLOBAL": "g" });
-        assert.strictEqual(testEnv["GLOBAL"], "g");
-    });
-
-    test('null mask works', () => {
-        const config = [
-            {
-                env: { DATA: "data" }
-            }
-        ];
-        const binEnv = fakePrepareEnv("run project_name", config);
-        assert.strictEqual(binEnv["DATA"], "data");
-
-        const testEnv = fakePrepareEnv("test some::mod::test_name", config);
-        assert.strictEqual(testEnv["DATA"], "data");
-    });
-
-    test('order works', () => {
-        const config = [
-            {
-                env: { DATA: "data" }
-            },
-            {
-                env: { DATA: "newdata" }
-            }
-        ];
-        const binEnv = fakePrepareEnv("run project_name", config);
-        assert.strictEqual(binEnv["DATA"], "newdata");
-
-        const testEnv = fakePrepareEnv("test some::mod::test_name", config);
-        assert.strictEqual(testEnv["DATA"], "newdata");
+export async function getTests(ctx: Context) {
+    await ctx.suite('Runnable env', suite => {
+        suite.addTest('Global config works', async () => {
+            const binEnv = fakePrepareEnv("run project_name", { "GLOBAL": "g" });
+            assert.strictEqual(binEnv["GLOBAL"], "g");
+
+            const testEnv = fakePrepareEnv("test some::mod::test_name", { "GLOBAL": "g" });
+            assert.strictEqual(testEnv["GLOBAL"], "g");
+        });
+
+        suite.addTest('null mask works', async () => {
+            const config = [
+                {
+                    env: { DATA: "data" }
+                }
+            ];
+            const binEnv = fakePrepareEnv("run project_name", config);
+            assert.strictEqual(binEnv["DATA"], "data");
+
+            const testEnv = fakePrepareEnv("test some::mod::test_name", config);
+            assert.strictEqual(testEnv["DATA"], "data");
+        });
+
+        suite.addTest('order works', async () => {
+            const config = [
+                {
+                    env: { DATA: "data" }
+                },
+                {
+                    env: { DATA: "newdata" }
+                }
+            ];
+            const binEnv = fakePrepareEnv("run project_name", config);
+            assert.strictEqual(binEnv["DATA"], "newdata");
+
+            const testEnv = fakePrepareEnv("test some::mod::test_name", config);
+            assert.strictEqual(testEnv["DATA"], "newdata");
+        });
+
+        suite.addTest('mask works', async () => {
+            const config = [
+                {
+                    env: { DATA: "data" }
+                },
+                {
+                    mask: "^run",
+                    env: { DATA: "rundata" }
+                },
+                {
+                    mask: "special_test$",
+                    env: { DATA: "special_test" }
+                }
+            ];
+            const binEnv = fakePrepareEnv("run project_name", config);
+            assert.strictEqual(binEnv["DATA"], "rundata");
+
+            const testEnv = fakePrepareEnv("test some::mod::test_name", config);
+            assert.strictEqual(testEnv["DATA"], "data");
+
+            const specialTestEnv = fakePrepareEnv("test some::mod::special_test", config);
+            assert.strictEqual(specialTestEnv["DATA"], "special_test");
+        });
+
+        suite.addTest('exact test name works', async () => {
+            const config = [
+                {
+                    env: { DATA: "data" }
+                },
+                {
+                    mask: "some::mod::test_name",
+                    env: { DATA: "test special" }
+                }
+            ];
+            const testEnv = fakePrepareEnv("test some::mod::test_name", config);
+            assert.strictEqual(testEnv["DATA"], "test special");
+
+            const specialTestEnv = fakePrepareEnv("test some::mod::another_test", config);
+            assert.strictEqual(specialTestEnv["DATA"], "data");
+        });
+
+        suite.addTest('test mod name works', async () => {
+            const config = [
+                {
+                    env: { DATA: "data" }
+                },
+                {
+                    mask: "some::mod",
+                    env: { DATA: "mod special" }
+                }
+            ];
+            const testEnv = fakePrepareEnv("test some::mod::test_name", config);
+            assert.strictEqual(testEnv["DATA"], "mod special");
+
+            const specialTestEnv = fakePrepareEnv("test some::mod::another_test", config);
+            assert.strictEqual(specialTestEnv["DATA"], "mod special");
+        });
     });
-
-    test('mask works', () => {
-        const config = [
-            {
-                env: { DATA: "data" }
-            },
-            {
-                mask: "^run",
-                env: { DATA: "rundata" }
-            },
-            {
-                mask: "special_test$",
-                env: { DATA: "special_test" }
-            }
-        ];
-        const binEnv = fakePrepareEnv("run project_name", config);
-        assert.strictEqual(binEnv["DATA"], "rundata");
-
-        const testEnv = fakePrepareEnv("test some::mod::test_name", config);
-        assert.strictEqual(testEnv["DATA"], "data");
-
-        const specialTestEnv = fakePrepareEnv("test some::mod::special_test", config);
-        assert.strictEqual(specialTestEnv["DATA"], "special_test");
-    });
-
-    test('exact test name works', () => {
-        const config = [
-            {
-                env: { DATA: "data" }
-            },
-            {
-                mask: "some::mod::test_name",
-                env: { DATA: "test special" }
-            }
-        ];
-        const testEnv = fakePrepareEnv("test some::mod::test_name", config);
-        assert.strictEqual(testEnv["DATA"], "test special");
-
-        const specialTestEnv = fakePrepareEnv("test some::mod::another_test", config);
-        assert.strictEqual(specialTestEnv["DATA"], "data");
-    });
-
-    test('test mod name works', () => {
-        const config = [
-            {
-                env: { DATA: "data" }
-            },
-            {
-                mask: "some::mod",
-                env: { DATA: "mod special" }
-            }
-        ];
-        const testEnv = fakePrepareEnv("test some::mod::test_name", config);
-        assert.strictEqual(testEnv["DATA"], "mod special");
-
-        const specialTestEnv = fakePrepareEnv("test some::mod::another_test", config);
-        assert.strictEqual(specialTestEnv["DATA"], "mod special");
-    });
-
-});
+}