1'use strict'; 2require('../common'); 3const assert = require('assert'); 4 5const { Transform, Readable, Writable } = require('stream'); 6 7const DEFAULT = 16 * 1024; 8 9function testTransform(expectedReadableHwm, expectedWritableHwm, options) { 10 const t = new Transform(options); 11 assert.strictEqual(t._readableState.highWaterMark, expectedReadableHwm); 12 assert.strictEqual(t._writableState.highWaterMark, expectedWritableHwm); 13} 14 15// Test overriding defaultHwm 16testTransform(666, DEFAULT, { readableHighWaterMark: 666 }); 17testTransform(DEFAULT, 777, { writableHighWaterMark: 777 }); 18testTransform(666, 777, { 19 readableHighWaterMark: 666, 20 writableHighWaterMark: 777, 21}); 22 23// Test highWaterMark overriding 24testTransform(555, 555, { 25 highWaterMark: 555, 26 readableHighWaterMark: 666, 27}); 28testTransform(555, 555, { 29 highWaterMark: 555, 30 writableHighWaterMark: 777, 31}); 32testTransform(555, 555, { 33 highWaterMark: 555, 34 readableHighWaterMark: 666, 35 writableHighWaterMark: 777, 36}); 37 38// Test undefined, null 39[undefined, null].forEach((v) => { 40 testTransform(DEFAULT, DEFAULT, { readableHighWaterMark: v }); 41 testTransform(DEFAULT, DEFAULT, { writableHighWaterMark: v }); 42 testTransform(666, DEFAULT, { highWaterMark: v, readableHighWaterMark: 666 }); 43 testTransform(DEFAULT, 777, { highWaterMark: v, writableHighWaterMark: 777 }); 44}); 45 46// test NaN 47{ 48 assert.throws(() => { 49 new Transform({ readableHighWaterMark: NaN }); 50 }, { 51 name: 'TypeError', 52 code: 'ERR_INVALID_ARG_VALUE', 53 message: "The property 'options.readableHighWaterMark' is invalid. " + 54 'Received NaN' 55 }); 56 57 assert.throws(() => { 58 new Transform({ writableHighWaterMark: NaN }); 59 }, { 60 name: 'TypeError', 61 code: 'ERR_INVALID_ARG_VALUE', 62 message: "The property 'options.writableHighWaterMark' is invalid. " + 63 'Received NaN' 64 }); 65} 66 67// Test non Duplex streams ignore the options 68{ 69 const r = new Readable({ readableHighWaterMark: 666 }); 70 assert.strictEqual(r._readableState.highWaterMark, DEFAULT); 71 const w = new Writable({ writableHighWaterMark: 777 }); 72 assert.strictEqual(w._writableState.highWaterMark, DEFAULT); 73} 74