| var from = require('..') | 
| var spec = require('stream-spec') | 
| var a = require('assertions') | 
|   | 
| 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) | 
|   }) | 
| } | 
|   | 
| function pause(stream) { | 
|   stream.on('data', function () { | 
|     if(Math.random() > 0.1) return | 
|     stream.pause() | 
|     process.nextTick(function () { | 
|       stream.resume() | 
|     }) | 
|   }) | 
| } | 
|   | 
| exports['inc'] = function (test) { | 
|   | 
|   var fs = from(function (i) { | 
|     this.emit('data', i) | 
|     if(i >= 99) | 
|       return this.emit('end') | 
|     return true | 
|   }) | 
|   | 
|   spec(fs).readable().validateOnExit()  | 
|   | 
|   read(fs, function (err, arr) { | 
|     test.equal(arr.length, 100) | 
|     test.done() | 
|   }) | 
| } | 
|   | 
| exports['inc - async'] = function (test) { | 
|   | 
|   var fs = from(function (i, next) { | 
|     this.emit('data', i) | 
|     if(i >= 99) | 
|       return this.emit('end') | 
|         next(); | 
|   }) | 
|   | 
|   spec(fs).readable().validateOnExit()  | 
|   | 
|   read(fs, function (err, arr) { | 
|     test.equal(arr.length, 100) | 
|     test.done() | 
|   }) | 
| } | 
|   | 
| exports['large stream - from an array'] = function (test) { | 
|   | 
|   var l = 100000 | 
|     , expected = []  | 
|   | 
|   while(l--) expected.push(l * Math.random()) | 
|   | 
|   var fs = from(expected.slice()) | 
|   | 
|   spec(fs).readable().validateOnExit()  | 
|   | 
|   read(fs, function (err, arr) { | 
|         a.deepEqual(arr, expected) | 
|     test.done() | 
|   }) | 
| } | 
|   | 
| exports['large stream - callback return true'] = function (test) { | 
|   | 
|   var fs = from(function (i, next) { | 
|     this.emit('data', i) | 
|     if(i >= 99999) | 
|       return this.emit('end') | 
|         return true; | 
|   }) | 
|   | 
|   spec(fs).readable().validateOnExit()  | 
|   | 
|   read(fs, function (err, arr) { | 
|     test.equal(arr.length, 100000) | 
|     test.done() | 
|   }) | 
| } | 
|   | 
| exports['large stream - callback call next()'] = function (test) { | 
|   | 
|   var fs = from(function (i, next) { | 
|     this.emit('data', i) | 
|     if(i >= 99999) | 
|       return this.emit('end') | 
|         next(); | 
|   }) | 
|   | 
|   spec(fs).readable().validateOnExit()  | 
|   | 
|   read(fs, function (err, arr) { | 
|     test.equal(arr.length, 100000) | 
|     test.done() | 
|   }) | 
| } | 
|   | 
| exports['simple'] = function (test) { | 
|   | 
|   var l = 1000 | 
|     , expected = []  | 
|   | 
|   while(l--) expected.push(l * Math.random()) | 
|   | 
|   var t = from(expected.slice()) | 
|   | 
|   spec(t) | 
|     .readable() | 
|     .pausable({strict: true}) | 
|     .validateOnExit() | 
|   | 
|   read(t, function (err, actual) { | 
|     if(err) test.error(err) //fail | 
|     a.deepEqual(actual, expected) | 
|     test.done() | 
|   }) | 
|   | 
| } | 
|   | 
| exports['simple pausable'] = function (test) { | 
|   | 
|   var l = 1000 | 
|     , expected = []  | 
|   | 
|   while(l--) expected.push(l * Math.random()) | 
|   | 
|   var t = from(expected.slice()) | 
|   | 
|   spec(t) | 
|     .readable() | 
|     .pausable({strict: true}) | 
|     .validateOnExit() | 
|   | 
|   pause(t) | 
|   | 
|   read(t, function (err, actual) { | 
|     if(err) test.error(err) //fail | 
|     a.deepEqual(actual, expected) | 
|     test.done() | 
|   }) | 
|   | 
| } | 
|   | 
| exports['simple (not strictly pausable) setTimeout'] = function (test) { | 
|   | 
|   var l = 10 | 
|     , expected = []  | 
|   while(l--) expected.push(l * Math.random()) | 
|   | 
|   | 
|   var _expected = expected.slice() | 
|   var t = from(function (i, n) { | 
|     var self = this | 
|     setTimeout(function () { | 
|       if(_expected.length) | 
|         self.emit('data', _expected.shift()) | 
|       else | 
|         if(!self.ended) | 
|           self.emit('end') | 
|       n() | 
|     }, 3) | 
|   }) | 
|   | 
|   /* | 
|     using from in this way will not be strictly pausable. | 
|     it could be extended to buffer outputs, but I think a better | 
|     way would be to use a PauseStream that implements strict pause. | 
|   */ | 
|   | 
|   spec(t) | 
|     .readable() | 
|     .pausable({strict: false }) | 
|     .validateOnExit() | 
|   | 
|   //pause(t) | 
|   var paused = false | 
|   var i = setInterval(function () { | 
|     if(!paused) t.pause() | 
|     else t.resume() | 
|     paused = !paused | 
|   }, 2) | 
|   | 
|   t.on('end', function () { | 
|     clearInterval(i) | 
|   }) | 
|   | 
|   read(t, function (err, actual) { | 
|     if(err) test.error(err) //fail | 
|     a.deepEqual(actual, expected) | 
|     test.done() | 
|   }) | 
|   | 
| } |