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