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