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