• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 'use strict';
2 
3 const common = require('../common');
4 const fs = require('fs');
5 const { once } = require('events');
6 const { join } = require('path');
7 const readline = require('readline');
8 const assert = require('assert');
9 
10 const tmpdir = require('../common/tmpdir');
11 tmpdir.refresh();
12 
13 const filename = join(tmpdir.path, 'test.txt');
14 
15 const testContents = [
16   '',
17   '\n',
18   'line 1',
19   'line 1\nline 2 南越国是前203年至前111年存在于岭南地区的一个国家\nline 3\ntrailing',
20   'line 1\nline 2\nline 3 ends with newline\n',
21 ];
22 
23 async function testSimpleDestroy() {
24   for (const fileContent of testContents) {
25     fs.writeFileSync(filename, fileContent);
26 
27     const readable = fs.createReadStream(filename);
28     const rli = readline.createInterface({
29       input: readable,
30       crlfDelay: Infinity
31     });
32 
33     const iteratedLines = [];
34     for await (const k of rli) {
35       iteratedLines.push(k);
36       break;
37     }
38 
39     const expectedLines = fileContent.split('\n');
40     if (expectedLines[expectedLines.length - 1] === '') {
41       expectedLines.pop();
42     }
43     expectedLines.splice(1);
44 
45     assert.deepStrictEqual(iteratedLines, expectedLines);
46 
47     rli.close();
48     readable.destroy();
49 
50     await once(readable, 'close');
51   }
52 }
53 
54 async function testMutualDestroy() {
55   for (const fileContent of testContents) {
56     fs.writeFileSync(filename, fileContent);
57 
58     const readable = fs.createReadStream(filename);
59     const rli = readline.createInterface({
60       input: readable,
61       crlfDelay: Infinity
62     });
63 
64     const expectedLines = fileContent.split('\n');
65     if (expectedLines[expectedLines.length - 1] === '') {
66       expectedLines.pop();
67     }
68     expectedLines.splice(2);
69 
70     const iteratedLines = [];
71     for await (const k of rli) {
72       iteratedLines.push(k);
73       for await (const l of rli) {
74         iteratedLines.push(l);
75         break;
76       }
77       assert.deepStrictEqual(iteratedLines, expectedLines);
78     }
79 
80     assert.deepStrictEqual(iteratedLines, expectedLines);
81 
82     rli.close();
83     readable.destroy();
84 
85     await once(readable, 'close');
86   }
87 }
88 
89 testSimpleDestroy().then(testMutualDestroy).then(common.mustCall());
90