'use strict'; const common = require('../common'); const stream = require('stream'); const assert = require('assert'); { const r = new stream.Readable({ autoDestroy: true, read() { this.push('hello'); this.push('world'); this.push(null); }, destroy: common.mustCall((err, cb) => cb()) }); let ended = false; r.resume(); r.on('end', common.mustCall(() => { ended = true; })); r.on('close', common.mustCall(() => { assert(ended); })); } { const w = new stream.Writable({ autoDestroy: true, write(data, enc, cb) { cb(null); }, destroy: common.mustCall((err, cb) => cb()) }); let finished = false; w.write('hello'); w.write('world'); w.end(); w.on('finish', common.mustCall(() => { finished = true; })); w.on('close', common.mustCall(() => { assert(finished); })); } { const t = new stream.Transform({ autoDestroy: true, transform(data, enc, cb) { cb(null, data); }, destroy: common.mustCall((err, cb) => cb()) }); let ended = false; let finished = false; t.write('hello'); t.write('world'); t.end(); t.resume(); t.on('end', common.mustCall(() => { ended = true; })); t.on('finish', common.mustCall(() => { finished = true; })); t.on('close', common.mustCall(() => { assert(ended); assert(finished); })); } { const r = new stream.Readable({ read() { r2.emit('error', new Error('fail')); } }); const r2 = new stream.Readable({ autoDestroy: true, destroy: common.mustCall((err, cb) => cb()) }); r.pipe(r2); } { const r = new stream.Readable({ read() { w.emit('error', new Error('fail')); } }); const w = new stream.Writable({ autoDestroy: true, destroy: common.mustCall((err, cb) => cb()) }); r.pipe(w); }