• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1
2var test = require('tape')
3var spec = require('stream-spec')
4var through = require('../')
5
6/*
7  I'm using these two functions, and not streams and pipe
8  so there is less to break. if this test fails it must be
9  the implementation of _through_
10*/
11
12function write(array, stream) {
13  array = array.slice()
14  function next() {
15    while(array.length)
16      if(stream.write(array.shift()) === false)
17        return stream.once('drain', next)
18
19    stream.end()
20  }
21
22  next()
23}
24
25function read(stream, callback) {
26  var actual = []
27  stream.on('data', function (data) {
28    actual.push(data)
29  })
30  stream.once('end', function () {
31    callback(null, actual)
32  })
33  stream.once('error', function (err) {
34    callback(err)
35  })
36}
37
38test('simple defaults', function(assert) {
39
40  var l = 1000
41    , expected = []
42
43  while(l--) expected.push(l * Math.random())
44
45  var t = through()
46  var s = spec(t).through().pausable()
47
48  read(t, function (err, actual) {
49    assert.ifError(err)
50    assert.deepEqual(actual, expected)
51    assert.end()
52  })
53
54  t.on('close', s.validate)
55
56  write(expected, t)
57});
58
59test('simple functions', function(assert) {
60
61  var l = 1000
62    , expected = []
63
64  while(l--) expected.push(l * Math.random())
65
66  var t = through(function (data) {
67      this.emit('data', data*2)
68    })
69  var s = spec(t).through().pausable()
70
71
72  read(t, function (err, actual) {
73    assert.ifError(err)
74    assert.deepEqual(actual, expected.map(function (data) {
75      return data*2
76    }))
77    assert.end()
78  })
79
80  t.on('close', s.validate)
81
82  write(expected, t)
83})
84
85test('pauses', function(assert) {
86
87  var l = 1000
88    , expected = []
89
90  while(l--) expected.push(l) //Math.random())
91
92  var t = through()
93
94  var s = spec(t)
95      .through()
96      .pausable()
97
98  t.on('data', function () {
99    if(Math.random() > 0.1) return
100    t.pause()
101    process.nextTick(function () {
102      t.resume()
103    })
104  })
105
106  read(t, function (err, actual) {
107    assert.ifError(err)
108    assert.deepEqual(actual, expected)
109  })
110
111  t.on('close', function () {
112    s.validate()
113    assert.end()
114  })
115
116  write(expected, t)
117})
118
119test('does not soft-end on `undefined`', function(assert) {
120  var stream = through()
121    , count = 0
122
123  stream.on('data', function (data) {
124    count++
125  })
126
127  stream.write(undefined)
128  stream.write(undefined)
129
130  assert.equal(count, 2)
131
132  assert.end()
133})
134