62 lines
1.6 KiB
JavaScript
62 lines
1.6 KiB
JavaScript
"use strict";
|
|
|
|
const test = require("node:test");
|
|
const assert = require("node:assert/strict");
|
|
|
|
const { trySafely } = require("../lib/trySafely");
|
|
|
|
test("成功時はokがtrueで結果を返し、onErrorは呼ばれない", async () => {
|
|
let onErrorCalls = 0;
|
|
const result = await trySafely(
|
|
async () => "done",
|
|
() => {
|
|
onErrorCalls += 1;
|
|
}
|
|
);
|
|
|
|
assert.equal(result.ok, true);
|
|
assert.equal(result.value, "done");
|
|
assert.equal(onErrorCalls, 0);
|
|
});
|
|
|
|
test("失敗時はokがfalseでonErrorが呼ばれ、例外は外に漏れない", async () => {
|
|
const capturedErrors = [];
|
|
const result = await trySafely(
|
|
async () => {
|
|
throw new Error("boom");
|
|
},
|
|
(err) => {
|
|
capturedErrors.push(err);
|
|
}
|
|
);
|
|
|
|
assert.equal(result.ok, false);
|
|
assert.equal(result.error.message, "boom");
|
|
assert.equal(capturedErrors.length, 1);
|
|
assert.equal(capturedErrors[0].message, "boom");
|
|
});
|
|
|
|
test("1つ目が失敗しても2つ目は独立して必ず実行される", async () => {
|
|
const calls = [];
|
|
|
|
const r1 = await trySafely(
|
|
async () => {
|
|
calls.push("a-start");
|
|
throw new Error("fail-a");
|
|
},
|
|
() => calls.push("a-error")
|
|
);
|
|
const r2 = await trySafely(
|
|
async () => {
|
|
calls.push("b-start");
|
|
return "b-done";
|
|
},
|
|
() => calls.push("b-error")
|
|
);
|
|
|
|
assert.deepEqual(calls, ["a-start", "a-error", "b-start"]);
|
|
assert.equal(r1.ok, false);
|
|
assert.equal(r2.ok, true);
|
|
assert.equal(r2.value, "b-done");
|
|
});
|