| 
 | |
| 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() | |
| })
 |