1'use strict'; 2const common = require('../common'); 3const assert = require('assert'); 4const { isDisturbed, isErrored, Readable } = require('stream'); 5 6function noop() {} 7 8function check(readable, data, fn) { 9 assert.strictEqual(readable.readableDidRead, false); 10 assert.strictEqual(isDisturbed(readable), false); 11 assert.strictEqual(isErrored(readable), false); 12 if (data === -1) { 13 readable.on('error', common.mustCall(() => { 14 assert.strictEqual(isErrored(readable), true); 15 })); 16 readable.on('data', common.mustNotCall()); 17 readable.on('end', common.mustNotCall()); 18 } else { 19 readable.on('error', common.mustNotCall()); 20 if (data === -2) { 21 readable.on('end', common.mustNotCall()); 22 } else { 23 readable.on('end', common.mustCall()); 24 } 25 if (data > 0) { 26 readable.on('data', common.mustCallAtLeast(data)); 27 } else { 28 readable.on('data', common.mustNotCall()); 29 } 30 } 31 readable.on('close', common.mustCall()); 32 fn(); 33 setImmediate(() => { 34 assert.strictEqual(readable.readableDidRead, data > 0); 35 if (data > 0) { 36 assert.strictEqual(isDisturbed(readable), true); 37 } 38 }); 39} 40 41{ 42 const readable = new Readable({ 43 read() { 44 this.push(null); 45 } 46 }); 47 check(readable, 0, () => { 48 readable.read(); 49 }); 50} 51 52{ 53 const readable = new Readable({ 54 read() { 55 this.push(null); 56 } 57 }); 58 check(readable, 0, () => { 59 readable.resume(); 60 }); 61} 62 63{ 64 const readable = new Readable({ 65 read() { 66 this.push(null); 67 } 68 }); 69 check(readable, -2, () => { 70 readable.destroy(); 71 }); 72} 73 74{ 75 const readable = new Readable({ 76 read() { 77 this.push(null); 78 } 79 }); 80 81 check(readable, -1, () => { 82 readable.destroy(new Error()); 83 }); 84} 85 86{ 87 const readable = new Readable({ 88 read() { 89 this.push('data'); 90 this.push(null); 91 } 92 }); 93 94 check(readable, 1, () => { 95 readable.on('data', noop); 96 }); 97} 98 99{ 100 const readable = new Readable({ 101 read() { 102 this.push('data'); 103 this.push(null); 104 } 105 }); 106 107 check(readable, 1, () => { 108 readable.on('data', noop); 109 readable.off('data', noop); 110 }); 111} 112