mirror of
https://github.com/denoland/deno.git
synced 2024-12-23 07:44:48 -05:00
128 lines
3.2 KiB
JavaScript
128 lines
3.2 KiB
JavaScript
|
// deno-fmt-ignore-file
|
||
|
// deno-lint-ignore-file
|
||
|
|
||
|
// Copyright Joyent and Node contributors. All rights reserved. MIT license.
|
||
|
// Taken from Node 20.11.1
|
||
|
// This file is automatically generated by `tests/node_compat/runner/setup.ts`. Do not modify this file manually.
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
const common = require('../common');
|
||
|
const fs = require('fs');
|
||
|
const readline = require('readline');
|
||
|
const { Readable } = require('stream');
|
||
|
const assert = require('assert');
|
||
|
|
||
|
const tmpdir = require('../common/tmpdir');
|
||
|
tmpdir.refresh();
|
||
|
|
||
|
const filename = tmpdir.resolve('test.txt');
|
||
|
|
||
|
const testContents = [
|
||
|
'',
|
||
|
'\n',
|
||
|
'line 1',
|
||
|
'line 1\nline 2 南越国是前203年至前111年存在于岭南地区的一个国家\nline 3\ntrailing',
|
||
|
'line 1\nline 2\nline 3 ends with newline\n',
|
||
|
];
|
||
|
|
||
|
async function testSimple() {
|
||
|
for (const fileContent of testContents) {
|
||
|
fs.writeFileSync(filename, fileContent);
|
||
|
|
||
|
const readable = fs.createReadStream(filename);
|
||
|
const rli = readline.createInterface({
|
||
|
input: readable,
|
||
|
crlfDelay: Infinity
|
||
|
});
|
||
|
|
||
|
const iteratedLines = [];
|
||
|
for await (const k of rli) {
|
||
|
iteratedLines.push(k);
|
||
|
}
|
||
|
|
||
|
const expectedLines = fileContent.split('\n');
|
||
|
if (expectedLines[expectedLines.length - 1] === '') {
|
||
|
expectedLines.pop();
|
||
|
}
|
||
|
assert.deepStrictEqual(iteratedLines, expectedLines);
|
||
|
assert.strictEqual(iteratedLines.join(''), fileContent.replace(/\n/g, ''));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async function testMutual() {
|
||
|
for (const fileContent of testContents) {
|
||
|
fs.writeFileSync(filename, fileContent);
|
||
|
|
||
|
const readable = fs.createReadStream(filename);
|
||
|
const rli = readline.createInterface({
|
||
|
input: readable,
|
||
|
crlfDelay: Infinity
|
||
|
});
|
||
|
|
||
|
const expectedLines = fileContent.split('\n');
|
||
|
if (expectedLines[expectedLines.length - 1] === '') {
|
||
|
expectedLines.pop();
|
||
|
}
|
||
|
const iteratedLines = [];
|
||
|
let iterated = false;
|
||
|
for await (const k of rli) {
|
||
|
// This outer loop should only iterate once.
|
||
|
assert.strictEqual(iterated, false);
|
||
|
iterated = true;
|
||
|
iteratedLines.push(k);
|
||
|
for await (const l of rli) {
|
||
|
iteratedLines.push(l);
|
||
|
}
|
||
|
assert.deepStrictEqual(iteratedLines, expectedLines);
|
||
|
}
|
||
|
assert.deepStrictEqual(iteratedLines, expectedLines);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async function testSlowStreamForLeaks() {
|
||
|
const message = 'a\nb\nc\n';
|
||
|
const DELAY = 1;
|
||
|
const REPETITIONS = 100;
|
||
|
const warningCallback = common.mustNotCall();
|
||
|
process.on('warning', warningCallback);
|
||
|
|
||
|
function getStream() {
|
||
|
const readable = Readable({
|
||
|
objectMode: true,
|
||
|
});
|
||
|
readable._read = () => {};
|
||
|
let i = REPETITIONS;
|
||
|
function schedule() {
|
||
|
setTimeout(() => {
|
||
|
i--;
|
||
|
if (i < 0) {
|
||
|
readable.push(null);
|
||
|
} else {
|
||
|
readable.push(message);
|
||
|
schedule();
|
||
|
}
|
||
|
}, DELAY);
|
||
|
}
|
||
|
schedule();
|
||
|
return readable;
|
||
|
}
|
||
|
const iterable = readline.createInterface({
|
||
|
input: getStream(),
|
||
|
});
|
||
|
|
||
|
let lines = 0;
|
||
|
// eslint-disable-next-line no-unused-vars
|
||
|
for await (const _ of iterable) {
|
||
|
lines++;
|
||
|
}
|
||
|
|
||
|
assert.strictEqual(lines, 3 * REPETITIONS);
|
||
|
process.off('warning', warningCallback);
|
||
|
}
|
||
|
|
||
|
testSimple()
|
||
|
.then(testMutual)
|
||
|
.then(testSlowStreamForLeaks)
|
||
|
.then(common.mustCall());
|