test.html 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <script src="build/build.js"></script>
  5. <script src="node_modules/mocha/mocha.js"></script>
  6. <script src="node_modules/expect.js/expect.js"></script>
  7. <link rel="stylesheet" href="node_modules/mocha/mocha.css" />
  8. <script>
  9. mocha.setup('bdd');
  10. var $ = require('component-jquery');
  11. var Emitter = require('component-emitter');
  12. var Stream = require('stream');
  13. describe('Stream', function() {
  14. describe('module', function() {
  15. it('should export a function', function() {
  16. expect(Stream).to.be.a(Function);
  17. });
  18. it('should export Stream', function() {
  19. expect(Stream.Stream).to.be.ok();
  20. });
  21. it('should be an EventEmitter', function() {
  22. expect(Stream.prototype).to.be.an(Emitter);
  23. });
  24. });
  25. describe('.pipe(dest)', function() {
  26. var src, dest;
  27. beforeEach(function() {
  28. src = new Stream();
  29. src.readable = true;
  30. dest = new Stream();
  31. dest.writable = true;
  32. src.pipe(dest);
  33. });
  34. it('should pipe data', function(done) {
  35. dest.write = function(data) {
  36. expect(data).to.equal('like a boss');
  37. done();
  38. }
  39. src.emit('data', 'like a boss');
  40. });
  41. it('shouldn\'t write to not writable streams', function() {
  42. dest.writable = false;
  43. src.emit('data', 'never received');
  44. });
  45. it('should pause', function(done) {
  46. dest.write = function() { return false; }
  47. src.emit('data', 'pause');
  48. src.pause = done;
  49. src.emit('data', 'pause');
  50. });
  51. it('should resume', function(done) {
  52. dest.emit('drain');
  53. src.readable = false;
  54. dest.emit('drain');
  55. src.readable = true;
  56. src.resume = done;
  57. dest.emit('drain');
  58. });
  59. it('should end', function(done) {
  60. dest.end = done;
  61. src.emit('end');
  62. });
  63. it('should end only once', function() {
  64. var didOnEnd = false;
  65. dest.end = function() {
  66. if (didOnEnd) throw new Error('end called twice');
  67. }
  68. src.emit('end');
  69. src.emit('end');
  70. });
  71. it('should close', function(done) {
  72. dest.destroy = done;
  73. src.emit('close');
  74. });
  75. it('should close without destroy function', function() {
  76. src.emit('close');
  77. });
  78. it('should throw errors on uncaught exceptions in src', function(done) {
  79. try {
  80. src.emit('error', new Error('some error'));
  81. } catch(err) {
  82. expect(err).to.be.an(Error);
  83. done();
  84. }
  85. });
  86. it('should throw errors on uncaught exceptions in dest', function(done) {
  87. try {
  88. dest.emit('error', new Error('some error'));
  89. } catch(err) {
  90. expect(err).to.be.an(Error);
  91. done();
  92. }
  93. });
  94. it('shouldn\'t throw errors if listeners are present', function(done) {
  95. src.on('error', function(err) {
  96. expect(err).to.be.an(Error);
  97. done();
  98. });
  99. src.emit('error', new Error('done'));
  100. });
  101. function empty(src, dest) {
  102. expect(src.listeners('data')).to.be.empty();
  103. expect(dest.listeners('drain')).to.be.empty();
  104. expect(src.listeners('end')).to.be.empty();
  105. expect(src.listeners('close')).to.be.empty();
  106. expect(dest.listeners('end')).to.be.empty();
  107. expect(dest.listeners('close')).to.be.empty();
  108. }
  109. it('should remove listeners on error in src', function() {
  110. src.on('error', function(){});
  111. src.emit('error', new Error('test'));
  112. empty(src, dest);
  113. });
  114. it('should remove listeners on error in dest', function() {
  115. dest.on('error', function(){})
  116. dest.emit('error', new Error('test'));
  117. empty(src, dest);
  118. });
  119. it('should remove listeners on end in src', function() {
  120. dest.end = function(){}
  121. src.emit('end');
  122. empty(src, dest);
  123. });
  124. it('should remove listeners on close in src', function() {
  125. dest.close = function(){}
  126. src.emit('close');
  127. empty(src, dest);
  128. });
  129. it('should remove listeners on end in dest', function() {
  130. dest.end = function(){}
  131. dest.emit('end');
  132. empty(src, dest);
  133. });
  134. it('should remove listeners on close in dest', function() {
  135. dest.close = function(){}
  136. dest.emit('close');
  137. empty(src, dest);
  138. });
  139. it('should emit pipe in dest', function(done) {
  140. dest.on('pipe', function() {
  141. done();
  142. });
  143. src.pipe(dest);
  144. });
  145. });
  146. describe('.pipe(dest, options)', function() {
  147. it('shouldn\'t end if specified', function() {
  148. var src = new Stream();
  149. src.readable = true;
  150. var dest = new Stream();
  151. dest.writable = true;
  152. dest.end = function() {
  153. throw Error('shouldn\'t be called');
  154. }
  155. src.pipe(dest, {end: false});
  156. src.emit('end');
  157. });
  158. });
  159. });
  160. $(function() {
  161. mocha.run();
  162. });
  163. </script>
  164. </head>
  165. <body>
  166. <div id="mocha"></div>
  167. </body>
  168. </html>