undertake
Version:
Another choice beyond co.
431 lines (370 loc) • 10.5 kB
JavaScript
const MODULE_REQUIRE = 1
/* built-in */
, assert = require('assert')
/* NPM */
, noda = require('noda')
/* in-package */
, undertake = noda.inRequire('index')
;
describe('undertake, without callback (promise returned)', () => {
const A = 100;
const E = 'error';
it('promise (resolved)', done => {
function* f() {
var a = yield Promise.resolve(A);
return a;
};
undertake(f).then(ret => assert.equal(ret, A)).then(done);
});
it('promise (reject)', done => {
function* f() {
yield Promise.reject(E);
};
undertake(f).catch(err => assert.equal(err, E)).then(done);
});
it('promise (runtime error)', done => {
function* f() {
yield new Promise(() => {
throw E;
});
};
undertake(f).catch(err => assert.equal(err, E)).then(done);
});
it('thunkified function (data returned)', done => {
function* f() {
var a = yield callback => {
process.nextTick(() => callback(null, A));
};
return a;
}
undertake(f).then(ret => assert.equal(ret, A)).then(done);
});
it('thunkified function (error returned)', done => {
function* f() {
var a = yield callback => {
process.nextTick(() => callback(E));
};
return a;
}
undertake(f).catch(err => assert.equal(err, E)).then(done);
});
it('thunkified function (runtime error)', done => {
function* f() {
yield callback => {
throw E;
};
};
undertake(f).catch(err => assert.equal(err, E)).then(done);
});
it('apply function needing callback', done => {
function t(data, callback) {
setTimeout(callback, 1, null, data);
}
function* f() {
var a = yield undertake.applying(t, null, [A]);
return a;
}
undertake(f).then(ret => assert.equal(ret, A)).then(done);
});
it('call function needing callback', done => {
function t(data, callback) {
setTimeout(callback, 1, null, data);
}
function* f() {
var a = yield undertake.calling(t, null, A);
return a;
}
undertake(f).then(ret => assert.equal(ret, A)).then(done);
});
it('runtime error (directly in generatorFunction body)', done => {
function* f() {
throw E;
}
undertake(f).catch(err => assert.equal(err, E)).then(done);
});
});
describe('undertake, with callback which is a normal function (undefined returned)', () => {
const A = 100;
const E = 'error';
it('promise (resolved)', done => {
function* f() {
var a = yield Promise.resolve(A);
return a;
};
undertake(f, (err, ret) => {
assert.equal(ret, A);
done();
});
});
it('promise (reject)', done => {
function* f() {
yield Promise.reject(E);
};
undertake(f, (err, ret) => {
assert.equal(err, E);
done();
});
});
it('promise (runtime error)', done => {
function* f() {
yield new Promise(() => {
throw E;
});
};
undertake(f, (err, ret) => {
assert.equal(err, E);
done();
});
});
it('thunkified function (data returned)', done => {
function* f() {
var a = yield callback => {
process.nextTick(() => callback(null, A));
};
return a;
}
undertake(f, (err, ret) => {
assert.equal(ret, A);
done();
});
});
it('thunkified function (error returned)', done => {
function* f() {
var a = yield callback => {
process.nextTick(() => callback(E));
};
return a;
}
undertake(f, (err, ret) => {
assert.equal(err, E);
done();
});
});
it('thunkified function (runtime error)', done => {
function* f() {
yield callback => {
throw E;
};
};
undertake(f, (err, ret) => {
assert.equal(err, E);
done();
});
});
it('runtime error (directly in generatorFunction body)', done => {
function* f() {
throw E;
}
undertake(f, (err, ret) => {
assert.equal(err, E);
done();
});
});
});
describe('undertake, with callback which is also a generator function (promise returned)', () => {
const A = 100;
const E = 'error';
it('promise (resolved)', done => {
function* f() {
var a = yield Promise.resolve(A);
return a;
};
function* callback(err, ret) {
assert.equal(ret, A);
};
undertake(f, callback).then(done);
});
it('promise (reject)', done => {
function* f() {
yield Promise.reject(E);
};
function* callback(err, ret) {
assert.equal(err, E);
};
undertake(f, callback).then(done);
});
it('promise (runtime error)', done => {
function* f() {
yield new Promise(() => {
throw E;
});
};
function* callback(err, ret) {
assert.equal(err, E);
};
undertake(f, callback).then(done);
});
it('thunkified function (data returned)', done => {
function* f() {
var a = yield callback => {
process.nextTick(() => callback(null, A));
};
return a;
}
function* callback(err, ret) {
assert.equal(ret, A);
};
undertake(f, callback).then(done);
});
it('thunkified function (error returned)', done => {
function* f() {
var a = yield callback => {
process.nextTick(() => callback(E));
};
return a;
}
function* callback(err, ret) {
assert.equal(err, E);
};
undertake(f, callback).then(done);
});
it('thunkified function (runtime error)', done => {
function* f() {
yield callback => {
throw E;
};
};
function* callback(err, ret) {
assert.equal(err, E);
};
undertake(f, callback).then(done);
});
it('runtime error (directly in generatorFunction body)', done => {
function* f() {
throw E;
}
function* callback(err, ret) {
assert.equal(err, E);
};
undertake(f, callback).then(done);
});
});
describe('undertake, recursion on generator', () => {
const A = 100;
const E = 'error';
it('when GeneratorFunction after yield', done => {
function* g() {
var a = yield Promise.resolve(A);
return a;
}
function* f() {
return yield g;
}
undertake(f, (err, ret) => {
assert.equal(ret, A);
done();
});
});
it('when generator after yield', done => {
function* g(foo) {
var a = yield Promise.resolve(foo);
return a;
}
function* f() {
return yield g(A);
}
undertake(f, (err, ret) => {
assert.equal(ret, A);
done();
});
});
});
describe('undertake.easy', () => {
it('yield Error', done => {
function* g() {
yield new Error('foo');
}
undertake.easy(g).catch(ex => {
done();
});
});
});
describe('traverse arrays', () => {
it('undertake.each', done => {
function* f() {
let nums = Array.from(arguments);
let total = 0;
yield undertake.each(nums, function*(n, index) {
total += yield Promise.resolve(n);
});
return total;
}
undertake(f(1, 2, 3, 4)).then(ret => {
assert.equal(ret, 10);
done();
});
});
it('undertake.each, on exception', done => {
const E = 'Error';
function* f() {
yield undertake.each([1,2], function*(n, index) {
throw E;
});
}
undertake(f).catch(ex => {
assert.equal(E, ex);
done();
});
});
it('undertake.map', done => {
function* f() {
let nums = Array.from(arguments);
return yield undertake.map(nums, function*(n, index) {
return yield Promise.resolve(n * 2);
});
}
undertake(f(1, 2, 3)).then(ret => {
assert.deepEqual(ret, [2, 4, 6]);
done();
});
});
it('undertake.map, on exception', done => {
const E = 'Error';
function* f() {
yield undertake.map([1,2], function*(n, index) {
throw E;
});
}
undertake(f).catch(ex => {
assert.equal(E, ex);
done();
});
});
});
describe('undertake.sync', () => {
it('only generator function', done => {
function* g(n) {
return n + (yield Promise.resolve(1));
}
let fn = undertake.sync(g);
fn(1).then(d => {
assert.equal(d, 2);
done();
});
});
it('generator function and callback as normal function', done => {
function* g(n) {
return n + (yield Promise.resolve(1));
}
function callback(err, ret) {
assert.equal(ret, 2);
done();
}
let fn = undertake.sync(g, callback);
fn(1);
});
it('generator function and callback as generator function', done => {
function* g(n) {
return n + (yield Promise.resolve(1));
}
function* callback(err, ret) {
return ret + 1;
}
let fn = undertake.sync(g, callback);
fn(1).then(ret => {
assert.equal(ret, 3);
done();
});
});
});
;