"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"); });