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.
		
		
		
		
		
			
		
			
				
					134 lines
				
				2.3 KiB
			
		
		
			
		
	
	
					134 lines
				
				2.3 KiB
			| 
											3 years ago
										 | 
 | ||
|  | 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() | ||
|  | }) |