summaryrefslogtreecommitdiff
path: root/tests/specs/node/node_test_module/test.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/specs/node/node_test_module/test.js')
-rw-r--r--tests/specs/node/node_test_module/test.js390
1 files changed, 390 insertions, 0 deletions
diff --git a/tests/specs/node/node_test_module/test.js b/tests/specs/node/node_test_module/test.js
new file mode 100644
index 000000000..0f0f9b6b6
--- /dev/null
+++ b/tests/specs/node/node_test_module/test.js
@@ -0,0 +1,390 @@
+// Copyright Joyent, Inc. and other Node contributors.
+
+// Ported from https://github.com/nodejs/node/blob/d396a041f71cc055ad60b0abc63ad81c0ee6a574/test/fixtures/test-runner/output/output.js
+
+// deno-lint-ignore-file
+
+import assert from "node:assert";
+import test from "node:test";
+import util from "node:util";
+import { setImmediate } from "node:timers";
+
+test("sync pass todo", (t) => {
+ t.todo();
+});
+
+test("sync pass todo with message", (t) => {
+ t.todo("this is a passing todo");
+});
+
+test("sync fail todo", (t) => {
+ t.todo();
+ throw new Error("thrown from sync fail todo");
+});
+
+test("sync fail todo with message", (t) => {
+ t.todo("this is a failing todo");
+ throw new Error("thrown from sync fail todo with message");
+});
+
+test("sync skip pass", (t) => {
+ t.skip();
+});
+
+test("sync skip pass with message", (t) => {
+ t.skip("this is skipped");
+});
+
+test("sync pass", (t) => {
+ t.diagnostic("this test should pass");
+});
+
+test("sync throw fail", () => {
+ throw new Error("thrown from sync throw fail");
+});
+
+test("async skip pass", async (t) => {
+ t.skip();
+});
+
+test("async pass", async () => {
+});
+
+test("async throw fail", async () => {
+ throw new Error("thrown from async throw fail");
+});
+
+test("nested test", async (t) => {
+ await t.test("nested 1", async (t) => {
+ await t.test("nested 2", () => {
+ });
+ });
+});
+
+test("async skip fail", async (t) => {
+ t.skip();
+ throw new Error("thrown from async throw fail");
+});
+
+test("async assertion fail", async () => {
+ // Make sure the assert module is handled.
+ assert.strictEqual(true, false);
+});
+
+test("resolve pass", () => {
+ return Promise.resolve();
+});
+
+test("reject fail", () => {
+ return Promise.reject(new Error("rejected from reject fail"));
+});
+
+test("unhandled rejection - passes but warns", () => {
+ Promise.reject(new Error("rejected from unhandled rejection fail"));
+});
+
+test("async unhandled rejection - passes but warns", async () => {
+ Promise.reject(new Error("rejected from async unhandled rejection fail"));
+});
+
+test("immediate throw - passes but warns", () => {
+ setImmediate(() => {
+ throw new Error("thrown from immediate throw fail");
+ });
+});
+
+test("immediate reject - passes but warns", () => {
+ setImmediate(() => {
+ Promise.reject(new Error("rejected from immediate reject fail"));
+ });
+});
+
+test("immediate resolve pass", () => {
+ return new Promise((resolve) => {
+ setImmediate(() => {
+ resolve();
+ });
+ });
+});
+
+test("subtest sync throw fail", async (t) => {
+ await t.test("+sync throw fail", (t) => {
+ t.diagnostic("this subtest should make its parent test fail");
+ throw new Error("thrown from subtest sync throw fail");
+ });
+});
+
+test("sync throw non-error fail", async (t) => {
+ throw Symbol("thrown symbol from sync throw non-error fail");
+});
+
+test("level 0a", { concurrency: 4 }, async (t) => {
+ t.test("level 1a", async (t) => {
+ const p1a = new Promise((resolve) => {
+ setTimeout(() => {
+ resolve();
+ }, 100);
+ });
+
+ return p1a;
+ });
+
+ test("level 1b", async (t) => {
+ const p1b = new Promise((resolve) => {
+ resolve();
+ });
+
+ return p1b;
+ });
+
+ t.test("level 1c", async (t) => {
+ const p1c = new Promise((resolve) => {
+ setTimeout(() => {
+ resolve();
+ }, 200);
+ });
+
+ return p1c;
+ });
+
+ t.test("level 1d", async (t) => {
+ const p1c = new Promise((resolve) => {
+ setTimeout(() => {
+ resolve();
+ }, 150);
+ });
+
+ return p1c;
+ });
+
+ const p0a = new Promise((resolve) => {
+ setTimeout(() => {
+ resolve();
+ }, 300);
+ });
+
+ return p0a;
+});
+
+test("top level", { concurrency: 2 }, async (t) => {
+ t.test("+long running", async (t) => {
+ return new Promise((resolve, reject) => {
+ setTimeout(resolve, 300).unref();
+ });
+ });
+
+ t.test("+short running", async (t) => {
+ t.test("++short running", async (t) => {});
+ });
+});
+
+test("invalid subtest - pass but subtest fails", (t) => {
+ setImmediate(() => {
+ t.test("invalid subtest fail", () => {
+ throw new Error("this should not be thrown");
+ });
+ });
+});
+
+test("sync skip option", { skip: true }, (t) => {
+ throw new Error("this should not be executed");
+});
+
+test("sync skip option with message", { skip: "this is skipped" }, (t) => {
+ throw new Error("this should not be executed");
+});
+
+test("sync skip option is false fail", { skip: false }, (t) => {
+ throw new Error("this should be executed");
+});
+
+// A test with no arguments provided.
+test();
+
+// A test with only a named function provided.
+test(function functionOnly() {});
+
+// A test with only an anonymous function provided.
+test(() => {});
+
+// A test with only a name provided.
+test("test with only a name provided");
+
+// A test with an empty string name.
+test("");
+
+// A test with only options provided.
+test({ skip: true });
+
+// A test with only a name and options provided.
+test("test with a name and options provided", { skip: true });
+
+// A test with only options and a function provided.
+test({ skip: true }, function functionAndOptions() {});
+
+// A test whose description needs to be escaped.
+// test("escaped description \\ # \\#\\ \n \t \f \v \b \r");
+
+// A test whose skip message needs to be escaped.
+test("escaped skip message", { skip: "#skip" });
+
+// A test whose todo message needs to be escaped.
+test("escaped todo message", { todo: "#todo" });
+
+// A test with a diagnostic message that needs to be escaped.
+test("escaped diagnostic", (t) => {
+ t.diagnostic("#diagnostic");
+});
+
+test("callback pass", (t, done) => {
+ setImmediate(done);
+});
+
+test("callback fail", (t, done) => {
+ setImmediate(() => {
+ done(new Error("callback failure"));
+ });
+});
+
+test("sync t is this in test", function (t) {
+ assert.strictEqual(this, t);
+});
+
+test("async t is this in test", async function (t) {
+ assert.strictEqual(this, t);
+});
+
+test("callback t is this in test", function (t, done) {
+ assert.strictEqual(this, t);
+ done();
+});
+
+test("callback also returns a Promise", async (t, done) => {
+ throw new Error("thrown from callback also returns a Promise");
+});
+
+test("callback throw", (t, done) => {
+ throw new Error("thrown from callback throw");
+});
+
+test("callback called twice", (t, done) => {
+ done();
+ done();
+});
+
+test("callback called twice in different ticks", (t, done) => {
+ setImmediate(done);
+ done();
+});
+
+test("callback called twice in future tick", (t, done) => {
+ setImmediate(() => {
+ done();
+ done();
+ });
+});
+
+test("callback async throw", (t, done) => {
+ setImmediate(() => {
+ throw new Error("thrown from callback async throw");
+ });
+});
+
+test("callback async throw after done", (t, done) => {
+ setImmediate(() => {
+ throw new Error("thrown from callback async throw after done");
+ });
+
+ done();
+});
+
+test("custom inspect symbol fail", () => {
+ const obj = {
+ [util.inspect.custom]() {
+ return "customized";
+ },
+ foo: 1,
+ };
+
+ throw obj;
+});
+
+test("custom inspect symbol that throws fail", () => {
+ const obj = {
+ [util.inspect.custom]() {
+ throw new Error("bad-inspect");
+ },
+ foo: 1,
+ };
+
+ throw obj;
+});
+
+test("subtest sync throw fails", async (t) => {
+ await t.test("sync throw fails at first", (t) => {
+ throw new Error("thrown from subtest sync throw fails at first");
+ });
+ await t.test("sync throw fails at second", (t) => {
+ throw new Error("thrown from subtest sync throw fails at second");
+ });
+});
+
+test("timed out async test", { timeout: 5 }, async (t) => {
+ return new Promise((resolve) => {
+ setTimeout(resolve, 100);
+ });
+});
+
+test("timed out callback test", { timeout: 5 }, (t, done) => {
+ setTimeout(done, 100);
+});
+
+test("large timeout async test is ok", { timeout: 30_000_000 }, async (t) => {
+ return new Promise((resolve) => {
+ setTimeout(resolve, 10);
+ });
+});
+
+test(
+ "large timeout callback test is ok",
+ { timeout: 30_000_000 },
+ (t, done) => {
+ setTimeout(done, 10);
+ },
+);
+
+test("successful thenable", () => {
+ let thenCalled = false;
+ return {
+ get then() {
+ if (thenCalled) throw new Error();
+ thenCalled = true;
+ return (successHandler) => successHandler();
+ },
+ };
+});
+
+test("rejected thenable", () => {
+ let thenCalled = false;
+ return {
+ get then() {
+ if (thenCalled) throw new Error();
+ thenCalled = true;
+ return (_, errorHandler) => errorHandler("custom error");
+ },
+ };
+});
+
+test("unfinished test with uncaughtException", async () => {
+ await new Promise(() => {
+ setTimeout(() => {
+ throw new Error("foo");
+ });
+ });
+});
+
+test("unfinished test with unhandledRejection", async () => {
+ await new Promise(() => {
+ setTimeout(() => Promise.reject(new Error("bar")));
+ });
+});