rafa
Version:
Rafa.js is a Javascript framework for building concurrent applications.
79 lines (68 loc) • 2.21 kB
JavaScript
module.exports = (assert, Rafa) => {
suite("enumerate", () => {
test("sync enumerate array", () => {
var it = Rafa.Enumerator.array([1,2]);
var stream = Rafa.stream();
var values = [];
stream.each(v => values.push(v));
stream.done(v => values.push(v));
stream.enumerate(it);
assert.equal(values.length, 3);
assert.equal(values[0], 1);
assert.equal(values[1], 2);
assert.equal(values[2], 2);
});
test("async enumerate array", done => {
var it = Rafa.Enumerator.array([1,2]);
var stream = Rafa.stream();
var values = [];
stream
.map(v => Promise.resolve(v + 1))
.each(v => values.push(v))
.done(v => values.push(v));
stream.enumerate(it);
setTimeout(() => {
assert.equal(values.length, 3);
assert.equal(values[0], 2);
assert.equal(values[1], 3);
assert.equal(values[2], 3);
done();
});
});
test("channel", () => {
var channel = Rafa.channel();
var stream = Rafa.stream();
var values = [];
stream.enumerate(channel).each(v => values.push(v));
channel.write(1);
assert.equal(values.length, 1);
assert.equal(values[0], 1);
});
test("channel backpressure", () => {
var channel = Rafa.channel();
var stream = Rafa.stream();
var nested;
var values = [];
var child = stream.enumerate(channel).flatMap(v => {
values.push(v);
return nested = Rafa.stream();
});
child.each(v => values.push(v));
// writing once should flow through the flatMap
channel.write(1);
assert.equal(values.length, 1);
assert.equal(values[0], 1);
// writing again should drop the write since flatMap hasn't fired
assert.equal(channel.write(2), 0);
assert.equal(values.length, 1);
// write done message from the flatMap nested stream
// clears the channel for more writes
nested.write(3, true);
assert.equal(values.length, 2);
assert.equal(values[1], 3);
channel.write(4);
assert.equal(values.length, 3);
assert.equal(values[2], 4);
});
});
};