UNPKG

rafa

Version:

Rafa.js is a Javascript framework for building concurrent applications.

130 lines (120 loc) 3.96 kB
module.exports = (assert, Rafa) => { suite("zip", () => { test("basics", () => { var values = []; var last; var outer = Rafa.stream(); var inner = Rafa.stream(); outer.zip(inner).each(v => values.push(v)).done(v => last = v); outer.write(1); assert.equal(values.length, 0); inner.write(2); assert.equal(values.length, 1); assert.equal(values[0][0], 1); assert.equal(values[0][1], 2); assert.isUndefined(last); inner.write(3); assert.equal(values.length, 1); outer.write(4); assert.equal(values.length, 2); assert.equal(values[1][0], 4); assert.equal(values[1][1], 3); assert.isUndefined(last); }); test("errors pass through", () => { var values = []; var outer = Rafa.stream(); var inner = Rafa.stream(); outer.zip(inner).error(v => values.push(v)); outer.write(new Error("outer")); assert.equal(values.length, 1); assert.equal(values[0].message, "outer"); inner.write(new Error("inner")); assert.equal(values.length, 2); assert.equal(values[1].message, "inner"); }); test("done error converts to error", () => { var value, end; var outer = Rafa.stream(); var inner = Rafa.stream(); outer.zip(inner).error(v => value = v).done(v => end = true); outer.write(new Error("oops"), true); assert.ok(value); assert.ok(!end); assert.equal(value.message, "oops"); }); // if a stream produces an error, it is pushed immediately and also counts // as a message in the cache. the cache will be set to undefined or null // and a new message is pushed test("error counts as value", () => { var value, error; var outer = Rafa.stream(); var inner = Rafa.stream(); outer.zip(inner).error(v => error = v).each(v => value = v); outer.write(1); inner.write(new Error(2)); assert.ok(value); assert.ok(error); assert.equal(error.message, 2); assert.equal(value[0], 1); assert.isUndefined(value[1]); }); // done message sent once all streams produce a done message test("all done", () => { var last; var outer = Rafa.stream(); var inner = Rafa.stream(); outer.zip(inner).done(v => last = v); outer.write(1, true); assert.isUndefined(last); inner.write(2, true); assert.ok(last); assert.equal(last[0], 1); assert.equal(last[1], 2); }); // an error/done message should count as a done message, send the error // through immediately, and then set the cache to undefined. test("error/done counts as done", () => { var last, errors = []; var outer = Rafa.stream(); var inner = Rafa.stream(); outer.zip(inner).error(e => errors.push(e)).done(v => last = v); outer.write(new Error(1), true); assert.isUndefined(last); assert.ok(errors[0]); assert.equal(errors[0].message, 1); inner.write(new Error(2), true); assert.ok(errors[1]); assert.equal(errors[1].message, 2); assert.ok(last); assert.equal(last.length, 2); assert.isUndefined(last[0]); assert.isUndefined(last[1]); }); test("3 streams", () => { var last; var a = Rafa.stream(); var b = Rafa.stream(); var c = Rafa.stream(); a.zip(b, c).each(v => last = v); a.write(1); assert.isUndefined(last); b.write(2); assert.isUndefined(last); c.write(3); assert.ok(last); assert.equal(last.length, 3); assert.equal(last[0], 1); assert.equal(last[1], 2); assert.equal(last[2], 3); }); test("destroy", () => { var outer = Rafa.stream(); var inner = Rafa.stream(); var composed = outer.zip(inner); composed.detach(); assert.isNull(outer.child); assert.isNull(inner.child); }); }); };