diff options
author | Kitson Kelly <me@kitsonkelly.com> | 2018-11-20 10:51:35 +1100 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2018-11-20 08:46:56 -0800 |
commit | 3d03f5b0cb3c513e449f3aaa5d35c493b72f47b4 (patch) | |
tree | ce5d20849c3bc10aca0708f8d3910c8ab4cd82fd /js/runner_test.ts | |
parent | 3597d6859cacf0ef3ef935ad7d4e98d4df4a15ff (diff) |
Split Runner from Compiler
Diffstat (limited to 'js/runner_test.ts')
-rw-r--r-- | js/runner_test.ts | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/js/runner_test.ts b/js/runner_test.ts new file mode 100644 index 000000000..adfb8bc58 --- /dev/null +++ b/js/runner_test.ts @@ -0,0 +1,141 @@ +import { test, assert, assertEqual } from "./test_util"; +import * as deno from "deno"; + +// tslint:disable-next-line:no-any +const Runner = (deno as any)._runner.Runner; + +let mockGetOutputStack: string[] = []; +let mockGetFilenameStack: Array<[string, string]> = []; + +// tslint:disable:max-line-length +const mockOutput = { + "/root/project/foo/bar.ts": `define(["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.foo = "bar"; +}); +//# sourceMappingURL=bar.js.map +//# sourceURL=/root/project/foo/bar.ts`, + "/root/project/foo/baz.ts": `define(["require", "exports", "./qat.ts"], function (require, exports, qat) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.foo = qat.foo; +}); +//# sourceMappingURL=baz.js.map +//# sourceURL=/root/project/foo/baz.ts`, + "/root/project/foo/qat.ts": `define(["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.foo = "qat"; +}); +//# sourceMappingURL=qat.js.map +//# sourceURL=/root/project/foo/qat.ts`, + "/root/project/foo/config.json": `define([], function () { + return JSON.parse('{"foo":{"bar": true,"baz": ["qat", 1]}}'); +}); +//# sourceURL=/root/project/foo/config.json`, + "/circular/modA.ts": `define(["require", "exports", "./modB.ts"], function (require, exports, modB) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.foo = modB.foo; +}); +//# sourceMappingURL=modA.js.map +//# sourceURL=/circular/modA.ts`, + "/circular/modB.ts": `define(["require", "exports", "./modA.ts"], function (require, exports, modA) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + if (modA && typeof modA === "object") { + modA; + } else { + throw new Error("Mod A is empty!"); + } + exports.foo = "bar"; +}); +//# sourceMappingURL=modB.js.map +//# sourceURL=/circular/modB.ts` +}; +// tslint:enable + +const mockFilenames = { + "/root/project": { + "foo/bar.ts": "/root/project/foo/bar.ts", + "foo/baz.ts": "/root/project/foo/baz.ts", + "foo/config.json": "/root/project/foo/config.json" + }, + "/root/project/foo/baz.ts": { + "./qat.ts": "/root/project/foo/qat.ts" + }, + "/circular": { + "modA.ts": "/circular/modA.ts" + }, + "/circular/modA.ts": { + "./modB.ts": "/circular/modB.ts" + }, + "/circular/modB.ts": { + "./modA.ts": "/circular/modA.ts" + } +}; + +const mockCodeProvider = { + getOutput(filename: string) { + mockGetOutputStack.push(filename); + if (filename in mockOutput) { + return mockOutput[filename]; + } + throw new Error("Module not found."); + }, + getFilename(moduleSpecifier: string, containingFile: string) { + mockGetFilenameStack.push([moduleSpecifier, containingFile]); + if ( + containingFile in mockFilenames && + moduleSpecifier in mockFilenames[containingFile] + ) { + return mockFilenames[containingFile][moduleSpecifier]; + } + } +}; + +function setup() { + mockGetOutputStack = []; + mockGetFilenameStack = []; + return new Runner(mockCodeProvider); +} + +test(function runnerConstruction() { + const runner = setup(); + assert(runner); +}); + +test(function runnerRun() { + const runner = setup(); + const result = runner.run("foo/bar.ts", "/root/project"); + assertEqual(result, { foo: "bar" }); + assertEqual(mockGetFilenameStack, [["foo/bar.ts", "/root/project"]]); + assertEqual(mockGetOutputStack, ["/root/project/foo/bar.ts"]); +}); + +test(function runnerRunImports() { + const runner = setup(); + const result = runner.run("foo/baz.ts", "/root/project"); + assertEqual(result, { foo: "qat" }); + assertEqual(mockGetFilenameStack, [ + ["foo/baz.ts", "/root/project"], + ["./qat.ts", "/root/project/foo/baz.ts"] + ]); + assertEqual(mockGetOutputStack, [ + "/root/project/foo/baz.ts", + "/root/project/foo/qat.ts" + ]); +}); + +test(function runnerRunExportReturn() { + const runner = setup(); + const result = runner.run("foo/config.json", "/root/project"); + assertEqual(result, { foo: { bar: true, baz: ["qat", 1] } }); +}); + +test(function runnerCircularReference() { + const runner = setup(); + const result = runner.run("modA.ts", "/circular"); + assertEqual(result, { foo: "bar" }); +}); |