|  | 
 | var test = require('tape') | 
 | var spec = require('stream-spec') | 
 | var through = require('../') | 
 |  | 
 | /* | 
 |   I'm using these two functions, and not streams and pipe | 
 |   so there is less to break. if this test fails it must be | 
 |   the implementation of _through_ | 
 | */ | 
 |  | 
 | function write(array, stream) { | 
 |   array = array.slice() | 
 |   function next() { | 
 |     while(array.length) | 
 |       if(stream.write(array.shift()) === false) | 
 |         return stream.once('drain', next) | 
 |      | 
 |     stream.end() | 
 |   } | 
 |  | 
 |   next() | 
 | } | 
 |  | 
 | function read(stream, callback) { | 
 |   var actual = [] | 
 |   stream.on('data', function (data) { | 
 |     actual.push(data) | 
 |   }) | 
 |   stream.once('end', function () { | 
 |     callback(null, actual) | 
 |   }) | 
 |   stream.once('error', function (err) { | 
 |     callback(err) | 
 |   }) | 
 | } | 
 |  | 
 | test('simple defaults', function(assert) { | 
 |  | 
 |   var l = 1000 | 
 |     , expected = [] | 
 |  | 
 |   while(l--) expected.push(l * Math.random()) | 
 |  | 
 |   var t = through() | 
 |   var s = spec(t).through().pausable() | 
 |  | 
 |   read(t, function (err, actual) { | 
 |     assert.ifError(err) | 
 |     assert.deepEqual(actual, expected) | 
 |     assert.end() | 
 |   }) | 
 |  | 
 |   t.on('close', s.validate) | 
 |  | 
 |   write(expected, t) | 
 | }); | 
 |  | 
 | test('simple functions', function(assert) { | 
 |  | 
 |   var l = 1000 | 
 |     , expected = []  | 
 |  | 
 |   while(l--) expected.push(l * Math.random()) | 
 |  | 
 |   var t = through(function (data) { | 
 |       this.emit('data', data*2) | 
 |     })  | 
 |   var s = spec(t).through().pausable() | 
 |        | 
 |  | 
 |   read(t, function (err, actual) { | 
 |     assert.ifError(err) | 
 |     assert.deepEqual(actual, expected.map(function (data) { | 
 |       return data*2 | 
 |     })) | 
 |     assert.end() | 
 |   }) | 
 |  | 
 |   t.on('close', s.validate) | 
 |  | 
 |   write(expected, t) | 
 | }) | 
 |  | 
 | test('pauses', function(assert) { | 
 |  | 
 |   var l = 1000 | 
 |     , expected = []  | 
 |  | 
 |   while(l--) expected.push(l) //Math.random()) | 
 |  | 
 |   var t = through()     | 
 |   | 
 |   var s = spec(t) | 
 |       .through() | 
 |       .pausable() | 
 |  | 
 |   t.on('data', function () { | 
 |     if(Math.random() > 0.1) return | 
 |     t.pause() | 
 |     process.nextTick(function () { | 
 |       t.resume() | 
 |     }) | 
 |   }) | 
 |  | 
 |   read(t, function (err, actual) { | 
 |     assert.ifError(err) | 
 |     assert.deepEqual(actual, expected) | 
 |   }) | 
 |  | 
 |   t.on('close', function () { | 
 |     s.validate() | 
 |     assert.end() | 
 |   }) | 
 |  | 
 |   write(expected, t) | 
 | }) | 
 |  | 
 | test('does not soft-end on `undefined`', function(assert) { | 
 |   var stream = through() | 
 |     , count = 0 | 
 |  | 
 |   stream.on('data', function (data) { | 
 |     count++ | 
 |   }) | 
 |  | 
 |   stream.write(undefined) | 
 |   stream.write(undefined) | 
 |  | 
 |   assert.equal(count, 2) | 
 |  | 
 |   assert.end() | 
 | }) |