summaryrefslogtreecommitdiff
path: root/js/runner_test.ts
diff options
context:
space:
mode:
authorKitson Kelly <me@kitsonkelly.com>2018-11-20 10:51:35 +1100
committerRyan Dahl <ry@tinyclouds.org>2018-11-20 08:46:56 -0800
commit3d03f5b0cb3c513e449f3aaa5d35c493b72f47b4 (patch)
treece5d20849c3bc10aca0708f8d3910c8ab4cd82fd /js/runner_test.ts
parent3597d6859cacf0ef3ef935ad7d4e98d4df4a15ff (diff)
Split Runner from Compiler
Diffstat (limited to 'js/runner_test.ts')
-rw-r--r--js/runner_test.ts141
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" });
+});