You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
4.6 KiB
197 lines
4.6 KiB
|
|
var es = require('../') |
|
, it = require('it-is').style('colour') |
|
, u = require('ubelt') |
|
|
|
exports ['read an array'] = function (test) { |
|
|
|
|
|
console.log('readable') |
|
return test.end() |
|
var readThis = u.map(3, 6, 100, u.id) //array of multiples of 3 < 100 |
|
|
|
console.log('readable') |
|
|
|
var reader = |
|
es.readable(function (i, callback) { |
|
if(i >= readThis.length) |
|
return this.emit('end') |
|
console.log('readable') |
|
callback(null, readThis[i]) |
|
}) |
|
|
|
var writer = es.writeArray(function (err, array){ |
|
if(err) throw err |
|
it(array).deepEqual(readThis) |
|
test.done() |
|
}) |
|
|
|
reader.pipe(writer) |
|
} |
|
|
|
exports ['read an array - async'] = function (test) { |
|
|
|
var readThis = u.map(3, 6, 100, u.id) //array of multiples of 3 < 100 |
|
|
|
var reader = |
|
es.readable(function (i, callback) { |
|
if(i >= readThis.length) |
|
return this.emit('end') |
|
u.delay(callback)(null, readThis[i]) |
|
}) |
|
|
|
var writer = es.writeArray(function (err, array){ |
|
if(err) throw err |
|
it(array).deepEqual(readThis) |
|
test.done() |
|
}) |
|
|
|
reader.pipe(writer) |
|
} |
|
|
|
|
|
exports ['emit data then call next() also works'] = function (test) { |
|
|
|
var readThis = u.map(3, 6, 100, u.id) //array of multiples of 3 < 100 |
|
|
|
var reader = |
|
es.readable(function (i, next) { |
|
if(i >= readThis.length) |
|
return this.emit('end') |
|
this.emit('data', readThis[i]) |
|
next() |
|
}) |
|
|
|
var writer = es.writeArray(function (err, array){ |
|
if(err) throw err |
|
it(array).deepEqual(readThis) |
|
test.done() |
|
}) |
|
|
|
reader.pipe(writer) |
|
} |
|
|
|
|
|
exports ['callback emits error, then stops'] = function (test) { |
|
|
|
var err = new Error('INTENSIONAL ERROR') |
|
, called = 0 |
|
|
|
var reader = |
|
es.readable(function (i, callback) { |
|
if(called++) |
|
return |
|
callback(err) |
|
}) |
|
|
|
reader.on('error', function (_err){ |
|
it(_err).deepEqual(err) |
|
u.delay(function() { |
|
it(called).equal(1) |
|
test.done() |
|
}, 50)() |
|
}) |
|
} |
|
|
|
exports['readable does not call read concurrently'] = function (test) { |
|
|
|
var current = 0 |
|
var source = es.readable(function(count, cb){ |
|
current ++ |
|
if(count > 100) |
|
return this.emit('end') |
|
u.delay(function(){ |
|
current -- |
|
it(current).equal(0) |
|
cb(null, {ok: true, n: count}); |
|
})(); |
|
}); |
|
|
|
var destination = es.map(function(data, cb){ |
|
//console.info(data); |
|
cb(); |
|
}); |
|
|
|
var all = es.connect(source, destination); |
|
|
|
destination.on('end', test.done) |
|
} |
|
|
|
exports ['does not raise a warning: Recursive process.nextTick detected'] = function (test) { |
|
var readThisDelayed; |
|
|
|
u.delay(function () { |
|
readThisDelayed = [1, 3, 5]; |
|
})(); |
|
|
|
es.readable(function (count, callback) { |
|
|
|
if (readThisDelayed) { |
|
var that = this; |
|
readThisDelayed.forEach(function (item) { |
|
that.emit('data', item); |
|
}); |
|
|
|
this.emit('end'); |
|
test.done(); |
|
} |
|
|
|
callback(); |
|
}); |
|
}; |
|
|
|
// |
|
// emitting multiple errors is not supported by stream. |
|
// |
|
// I do not think that this is a good idea, at least, there should be an option to pipe to |
|
// continue on error. it makes alot ef sense, if you are using Stream like I am, to be able to emit multiple errors. |
|
// an error might not necessarily mean the end of the stream. it depends on the error, at least. |
|
// |
|
// I will start a thread on the mailing list. I'd rather that than use a custom `pipe` implementation. |
|
// |
|
// basically, I want to be able use pipe to transform objects, and if one object is invalid, |
|
// the next might still be good, so I should get to choose if it's gonna stop. |
|
// re-enstate this test when this issue progresses. |
|
// |
|
// hmm. I could add this to es.connect by deregistering the error listener, |
|
// but I would rather it be an option in core. |
|
|
|
/* |
|
exports ['emit multiple errors, with 2nd parameter (continueOnError)'] = function (test) { |
|
|
|
var readThis = d.map(1, 100, d.id) |
|
, errors = 0 |
|
var reader = |
|
es.readable(function (i, callback) { |
|
console.log(i, readThis.length) |
|
if(i >= readThis.length) |
|
return this.emit('end') |
|
if(!(readThis[i] % 7)) |
|
return callback(readThis[i]) |
|
callback(null, readThis[i]) |
|
}, true) |
|
|
|
var writer = es.writeArray(function (err, array) { |
|
if(err) throw err |
|
it(array).every(function (u){ |
|
it(u % 7).notEqual(0) |
|
}).property('length', 80) |
|
it(errors).equal(14) |
|
test.done() |
|
}) |
|
|
|
reader.on('error', function (u) { |
|
errors ++ |
|
console.log(u) |
|
if('number' !== typeof u) |
|
throw u |
|
|
|
it(u % 7).equal(0) |
|
|
|
}) |
|
|
|
reader.pipe(writer) |
|
} |
|
*/ |
|
|
|
require('./helper')(module)
|
|
|