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