198 lines
4.6 KiB
JavaScript
198 lines
4.6 KiB
JavaScript
|
|
||
|
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)
|