Initial commit
[yaffs-website] / node_modules / multipipe / test / multipipe.js
1 var assert = require('assert');
2 var pipe = require('..');
3 var Stream = require('stream');
4
5 describe('pipe(a)', function(){
6   it('should return a', function(){
7     var readable = Readable();
8     var stream = pipe(readable);
9     assert.equal(stream, readable);
10   });
11 });
12
13 describe('pipe(a, b, c)', function(){
14   it('should pipe internally', function(done){
15     pipe(Readable(), Transform(), Writable(done));
16   });
17   
18   it('should be writable', function(done){
19     var stream = pipe(Transform(), Writable(done));
20     assert(stream.writable);
21     Readable().pipe(stream);
22   });
23
24   it('should be readable', function(done){
25     var stream = pipe(Readable(), Transform());
26     assert(stream.readable);
27     stream.pipe(Writable(done));
28   });
29   
30   it('should be readable and writable', function(done){
31     var stream = pipe(Transform(), Transform());
32     assert(stream.readable);
33     assert(stream.writable);
34     Readable()
35     .pipe(stream)
36     .pipe(Writable(done));
37   });
38  
39   describe('errors', function(){
40     it('should reemit', function(done){
41       var a = Transform();
42       var b = Transform();
43       var c = Transform();
44       var stream = pipe(a, b, c);
45       var err = new Error;
46       var i = 0;
47       
48       stream.on('error', function(_err){
49         i++;
50         assert.equal(_err, err);
51         assert(i <= 3);
52         if (i == 3) done();
53       });
54       
55       a.emit('error', err);
56       b.emit('error', err);
57       c.emit('error', err);
58     });
59
60     it('should not reemit endlessly', function(done){
61       var a = Transform();
62       var b = Transform();
63       var c = Transform();
64       c.readable = false;
65       var stream = pipe(a, b, c);
66       var err = new Error;
67       var i = 0;
68       
69       stream.on('error', function(_err){
70         i++;
71         assert.equal(_err, err);
72         assert(i <= 3);
73         if (i == 3) done();
74       });
75       
76       a.emit('error', err);
77       b.emit('error', err);
78       c.emit('error', err);
79     });
80   });
81 });
82
83 describe('pipe(a, b, c, fn)', function(){
84   it('should call on finish', function(done){
85     var finished = false;
86     var a = Readable();
87     var b = Transform();
88     var c = Writable(function(){
89       finished = true;
90     });
91
92     pipe(a, b, c, function(err){
93       assert(!err);
94       assert(finished);
95       done();
96     });
97   });
98
99   it('should call with error once', function(done){
100     var a = Readable();
101     var b = Transform();
102     var c = Writable();
103     var err = new Error;
104
105     pipe(a, b, c, function(err){
106       assert(err);
107       done();
108     });
109
110     a.emit('error', err);
111     b.emit('error', err);
112     c.emit('error', err);
113   });
114 });
115
116 function Readable(){
117   var readable = new Stream.Readable({ objectMode: true });
118   readable._read = function(){
119     this.push('a');
120     this.push(null);
121   };
122   return readable;
123 }
124
125 function Transform(){
126   var transform = new Stream.Transform({ objectMode: true });
127   transform._transform = function(chunk, _, done){
128     done(null, chunk.toUpperCase());
129   };
130   return transform;
131 }
132
133 function Writable(cb){
134   var writable = new Stream.Writable({ objectMode: true });
135   writable._write = function(chunk, _, done){
136     assert.equal(chunk, 'A');
137     done();
138     cb();
139   };
140   return writable;
141 }