breakable
Version:
Break out of functions, recursive or not, in a more composable way than by using exceptions explicitly. Non-local return.
119 lines (107 loc) • 2.61 kB
JavaScript
var test = require("tap").test;
var breakable = require("../");
test("normal-return", function(t) {
t.equal(breakable(function(brk) {
return 1;
}), 1);
t.end();
});
test("break-return", function(t) {
t.equal(breakable(function(brk) {
brk(2);
return 1;
}), 2);
t.end();
});
test("recurse", function(t) {
t.equal(breakable(function(brk) {
function traverse(n) {
if (n < 100) {
traverse(n + 1);
}
brk(n);
}
traverse(0);
}), 100);
t.end();
});
test("simple-throws", function(t) {
t.throws(breakable.bind(null, function(brk) {
throw 1;
}));
t.doesNotThrow(breakable.bind(null, function(brk) {
brk(1);
throw 2;
}));
t.end();
});
test("prop-recurse-break", function(t) {
var tstObj = {a: 1, b: {c: 2, d: {e: 3, f: "gold", g: null}}, h: {i: 6}};
var found = breakable(function(brk) {
function traverse(obj) {
var props = Object.keys(obj);
props.forEach(function(prop) {
var val = obj[prop];
if (val === "gold") {
brk(prop);
} else if (val === null) {
throw new Error("break did not work");
} else if (val && typeof val === "object") {
traverse(val);
}
});
}
traverse(tstObj);
});
t.equal(found, "f");
t.end();
});
test("forEach-break", function(t) {
var cnt = 0;
breakable(function(brk) {
[1,2,3].forEach(function(v) {
++cnt;
if (v === 2) {
brk();
}
});
});
t.equal(cnt, 2);
t.end();
});
test("nested-forEach-break", function(t) {
var cnt = 0;
breakable(function(brk) {
[1,2,3].forEach(function(v) {
[4,5,6].forEach(function(v1) {
++cnt;
if (v === 2 && v1 === 5) {
brk();
}
});
});
});
t.equal(cnt, 5);
t.end();
});
test("nested-breakables-1", function(t) {
var res = breakable(function(brk1) {
breakable(function(brk2) {
brk1(13);
});
});
t.equal(res, 13);
t.end();
});
test("nested-breakables-2", function(t) {
t.plan(2);
var res1 = breakable(function(brk1) {
var res2 = breakable(function(brk2) {
brk2(13);
});
t.equal(res2, 13);
});
t.equal(res1, undefined);
t.end();
});
;