mirror of
https://github.com/musix-org/musix-oss
synced 2024-11-14 03:30:18 +00:00
448 lines
12 KiB
JavaScript
448 lines
12 KiB
JavaScript
|
var stream = require("readable-stream");
|
||
|
|
||
|
var bun = require("..");
|
||
|
|
||
|
var assert = require("assert");
|
||
|
|
||
|
describe("bun", function() {
|
||
|
it("should be the best", function() {
|
||
|
var bun = "is the best";
|
||
|
|
||
|
assert.strictEqual(bun, "is the best");
|
||
|
});
|
||
|
|
||
|
it("should pass data through one stream", function(done) {
|
||
|
var uppercaser = new stream.Transform({objectMode: true});
|
||
|
|
||
|
uppercaser._transform = function _transform(input, encoding, done) {
|
||
|
this.push(input.toString().toUpperCase());
|
||
|
return done();
|
||
|
};
|
||
|
|
||
|
var stack = bun([uppercaser]);
|
||
|
|
||
|
stack.on("readable", function() {
|
||
|
var data = stack.read();
|
||
|
|
||
|
assert(typeof data === "string", "data should be a string");
|
||
|
assert(data === "HELLO", "data should be transformed correctly");
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
stack.write("hello");
|
||
|
});
|
||
|
|
||
|
it("should pass data through two streams", function(done) {
|
||
|
var uppercaser = new stream.Transform({objectMode: true}),
|
||
|
underscorer = new stream.Transform({objectMode: true});
|
||
|
|
||
|
uppercaser._transform = function _transform(input, encoding, done) {
|
||
|
this.push(input.toString().toUpperCase());
|
||
|
return done();
|
||
|
};
|
||
|
|
||
|
underscorer._transform = function _transform(input, encoding, done) {
|
||
|
this.push(input.toString().split("").join("_"));
|
||
|
return done();
|
||
|
};
|
||
|
|
||
|
var stack = bun([uppercaser, underscorer]);
|
||
|
|
||
|
stack.on("readable", function() {
|
||
|
var data = stack.read();
|
||
|
|
||
|
assert(typeof data === "string", "data should be a string");
|
||
|
assert(data === "H_E_L_L_O", "data should be transformed correctly");
|
||
|
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
stack.write("hello");
|
||
|
});
|
||
|
|
||
|
it("should finish correctly with no streams and no data written", function(done) {
|
||
|
var stack = bun([]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
stack.end();
|
||
|
});
|
||
|
|
||
|
it("should finish correctly with one stream and no data written", function(done) {
|
||
|
var alice = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
stack.end();
|
||
|
});
|
||
|
|
||
|
it("should finish correctly with two streams and no data written", function(done) {
|
||
|
var alice = new stream.PassThrough({objectMode: true}),
|
||
|
bob = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice, bob]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
stack.end();
|
||
|
});
|
||
|
|
||
|
it("should finish correctly with no streams and some data written", function(done) {
|
||
|
var stack = bun([]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
stack.on("readable", function() {
|
||
|
var e;
|
||
|
while (e = stack.read()) {
|
||
|
}
|
||
|
});
|
||
|
|
||
|
stack.write("some data");
|
||
|
stack.end();
|
||
|
});
|
||
|
|
||
|
it("should finish correctly with one stream and some data written", function(done) {
|
||
|
var alice = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
stack.on("readable", function() {
|
||
|
var e;
|
||
|
while (e = stack.read()) {
|
||
|
}
|
||
|
});
|
||
|
|
||
|
stack.write("some data");
|
||
|
stack.end();
|
||
|
});
|
||
|
|
||
|
it("should finish correctly with two streams and some data written", function(done) {
|
||
|
var alice = new stream.PassThrough({objectMode: true}),
|
||
|
bob = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice, bob]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
stack.on("readable", function() {
|
||
|
var e;
|
||
|
while (e = stack.read()) {
|
||
|
}
|
||
|
});
|
||
|
|
||
|
stack.write("some data");
|
||
|
stack.end();
|
||
|
});
|
||
|
|
||
|
it("should finish correctly when piped through with no streams and no data written", function(done) {
|
||
|
var input = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var stack = bun([]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
input.pipe(stack).pipe(nowhere);
|
||
|
input.end();
|
||
|
});
|
||
|
|
||
|
it("should finish correctly when piped through with one stream and no data written", function(done) {
|
||
|
var input = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var alice = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
input.pipe(stack).pipe(nowhere);
|
||
|
input.end();
|
||
|
});
|
||
|
|
||
|
it("should finish correctly when piped through with two streams and no data written", function(done) {
|
||
|
var input = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var alice = new stream.PassThrough({objectMode: true}),
|
||
|
bob = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice, bob]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
input.pipe(stack).pipe(nowhere);
|
||
|
input.end();
|
||
|
});
|
||
|
|
||
|
it("should finish correctly when piped through with no streams and some data written", function(done) {
|
||
|
var input = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var stack = bun([]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
input.pipe(stack).pipe(nowhere);
|
||
|
input.write("hello");
|
||
|
input.end();
|
||
|
});
|
||
|
|
||
|
it("should finish correctly when piped through with one stream and some data written", function(done) {
|
||
|
var input = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var alice = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
input.pipe(stack).pipe(nowhere);
|
||
|
input.write("hello");
|
||
|
input.end();
|
||
|
});
|
||
|
|
||
|
it("should finish correctly when piped through with two streams and some data written", function(done) {
|
||
|
var input = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var alice = new stream.PassThrough({objectMode: true}),
|
||
|
bob = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice, bob]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
input.pipe(stack).pipe(nowhere);
|
||
|
input.write("hello");
|
||
|
input.end();
|
||
|
});
|
||
|
|
||
|
it("should end correctly when piped through with no streams and no data written", function(done) {
|
||
|
var input = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var stack = bun([]);
|
||
|
|
||
|
stack.on("end", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
input.pipe(stack).pipe(nowhere);
|
||
|
input.push(null);
|
||
|
});
|
||
|
|
||
|
it("should end correctly when piped through with one stream and no data written", function(done) {
|
||
|
var input = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var alice = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice]);
|
||
|
|
||
|
stack.on("end", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
input.pipe(stack).pipe(nowhere);
|
||
|
input.end();
|
||
|
});
|
||
|
|
||
|
it("should end correctly when piped through with two streams and no data written", function(done) {
|
||
|
var input = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var alice = new stream.PassThrough({objectMode: true}),
|
||
|
bob = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice, bob]);
|
||
|
|
||
|
stack.on("end", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
input.pipe(stack).pipe(nowhere);
|
||
|
input.end();
|
||
|
});
|
||
|
|
||
|
it("should end correctly when piped through with no streams and some data written", function(done) {
|
||
|
var input = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var stack = bun([]);
|
||
|
|
||
|
stack.on("end", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
input.pipe(stack).pipe(nowhere);
|
||
|
input.write("hello");
|
||
|
input.end();
|
||
|
});
|
||
|
|
||
|
it("should end correctly when piped through with one stream and some data written", function(done) {
|
||
|
var input = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var alice = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice]);
|
||
|
|
||
|
stack.on("end", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
input.pipe(stack).pipe(nowhere);
|
||
|
input.write("hello");
|
||
|
input.end();
|
||
|
});
|
||
|
|
||
|
it("should end correctly when piped through with two streams and some data written", function(done) {
|
||
|
var input = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var alice = new stream.PassThrough({objectMode: true}),
|
||
|
bob = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice, bob]);
|
||
|
|
||
|
stack.on("end", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
input.pipe(stack).pipe(nowhere);
|
||
|
input.write("hello");
|
||
|
input.end();
|
||
|
});
|
||
|
|
||
|
it("should end wrapped streams correctly when ended", function(done) {
|
||
|
var alice = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
alice.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
var stack = bun([alice]);
|
||
|
|
||
|
stack.end();
|
||
|
});
|
||
|
|
||
|
it("should finish when wrapped streams finish", function(done) {
|
||
|
var alice = new stream.PassThrough({objectMode: true}),
|
||
|
outside = new stream.PassThrough({objectMode: true});
|
||
|
|
||
|
var stack = bun([alice]);
|
||
|
|
||
|
stack.on("finish", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
outside.pipe(stack).pipe(outside);
|
||
|
|
||
|
alice.end();
|
||
|
});
|
||
|
|
||
|
it("should end when wrapped streams end", function(done) {
|
||
|
var alice = new stream.PassThrough({objectMode: true});
|
||
|
var nowhere = new stream.Writable({objectMode: true});
|
||
|
nowhere._write = function _write(input, encoding, done) { return done(); };
|
||
|
|
||
|
var stack = bun([alice]);
|
||
|
|
||
|
stack.on("end", function() {
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
stack.pipe(nowhere);
|
||
|
|
||
|
alice.push(null);
|
||
|
});
|
||
|
|
||
|
it("should forward errors if bubbleErrors is not specified", function(done) {
|
||
|
var alice = new stream.PassThrough();
|
||
|
|
||
|
var stack = bun([alice]);
|
||
|
|
||
|
stack.on("error", function(err) {
|
||
|
return done();
|
||
|
});
|
||
|
|
||
|
alice.emit("error", Error("test error"));
|
||
|
});
|
||
|
|
||
|
it("should forward errors if bubbleErrors is true", function(done) {
|
||
|
var alice = new stream.PassThrough();
|
||
|
|
||
|
var stack = bun([alice], {bubbleErrors: true});
|
||
|
|
||
|
stack.on("error", function(err) {
|
||
|
return done();
|
||
|
});
|
||
|
|
||
|
alice.emit("error", Error("test error"));
|
||
|
});
|
||
|
|
||
|
it("should not forward errors if bubbleErrors is false", function(done) {
|
||
|
var alice = new stream.PassThrough();
|
||
|
|
||
|
var stack = bun([alice], {bubbleErrors: false});
|
||
|
|
||
|
var timeout = setTimeout(done, 10);
|
||
|
|
||
|
stack.on("error", function(err) {
|
||
|
clearTimeout(timeout);
|
||
|
|
||
|
return done(Error("shouldn't have bubbled the error"));
|
||
|
});
|
||
|
|
||
|
alice.on("error", function(err) {
|
||
|
// prevent uncaught error crash
|
||
|
});
|
||
|
|
||
|
alice.emit("error", Error("test error"));
|
||
|
});
|
||
|
});
|