1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-11 18:17:48 -05:00
denoland-deno/cli/tests/node_compat/test/parallel/test-readline-promises-csi.mjs
Yoshiya Hinosawa 6915a9b7a7
test(ext/node): more node compat tests (#17827)
This PR adds the remaining ~650 Node.js compat test cases from std/node.

Among these 650 cases, about 130 cases are now failing. These failing
cases are prefixed with `TODO:` in `tests/node_compat/config.json`.
These will be addressed in later PRs.
2023-02-20 16:35:04 +01:00

233 lines
6 KiB
JavaScript

// deno-fmt-ignore-file
// deno-lint-ignore-file
// Copyright Joyent and Node contributors. All rights reserved. MIT license.
// Taken from Node 18.12.1
// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually
// Flags: --expose-internals
import '../common/index.mjs';
import assert from 'assert';
import { Readline } from 'readline/promises';
import { setImmediate } from 'timers/promises';
import { Writable } from 'stream';
import utils from 'internal/readline/utils';
const { CSI } = utils;
const INVALID_ARG = {
name: 'TypeError',
code: 'ERR_INVALID_ARG_TYPE',
};
class TestWritable extends Writable {
data = '';
_write(chunk, encoding, callback) {
this.data += chunk.toString();
callback();
}
}
[
undefined, null,
0, 1, 1n, 1.1, NaN, Infinity,
true, false,
Symbol(),
'', '1',
[], {}, () => {},
].forEach((arg) =>
assert.throws(() => new Readline(arg), INVALID_ARG)
);
{
const writable = new TestWritable();
const readline = new Readline(writable);
await readline.clearScreenDown().commit();
assert.deepStrictEqual(writable.data, CSI.kClearScreenDown);
await readline.clearScreenDown().commit();
writable.data = '';
await readline.clearScreenDown().rollback();
assert.strictEqual(writable.data, '');
writable.data = '';
await readline.clearLine(-1).commit();
assert.deepStrictEqual(writable.data, CSI.kClearToLineBeginning);
writable.data = '';
await readline.clearLine(1).commit();
assert.deepStrictEqual(writable.data, CSI.kClearToLineEnd);
writable.data = '';
await readline.clearLine(0).commit();
assert.deepStrictEqual(writable.data, CSI.kClearLine);
writable.data = '';
await readline.clearLine(-1).commit();
assert.deepStrictEqual(writable.data, CSI.kClearToLineBeginning);
await readline.clearLine(0, null).commit();
// Nothing is written when moveCursor 0, 0
for (const set of
[
[0, 0, ''],
[1, 0, '\x1b[1C'],
[-1, 0, '\x1b[1D'],
[0, 1, '\x1b[1B'],
[0, -1, '\x1b[1A'],
[1, 1, '\x1b[1C\x1b[1B'],
[-1, 1, '\x1b[1D\x1b[1B'],
[-1, -1, '\x1b[1D\x1b[1A'],
[1, -1, '\x1b[1C\x1b[1A'],
]) {
writable.data = '';
await readline.moveCursor(set[0], set[1]).commit();
assert.deepStrictEqual(writable.data, set[2]);
writable.data = '';
await readline.moveCursor(set[0], set[1]).commit();
assert.deepStrictEqual(writable.data, set[2]);
}
await readline.moveCursor(1, 1, null).commit();
writable.data = '';
[
undefined, null,
true, false,
Symbol(),
'', '1',
[], {}, () => {},
].forEach((arg) =>
assert.throws(() => readline.cursorTo(arg), INVALID_ARG)
);
assert.strictEqual(writable.data, '');
writable.data = '';
assert.throws(() => readline.cursorTo('a', 'b'), INVALID_ARG);
assert.strictEqual(writable.data, '');
writable.data = '';
assert.throws(() => readline.cursorTo('a', 1), INVALID_ARG);
assert.strictEqual(writable.data, '');
writable.data = '';
assert.throws(() => readline.cursorTo(1, 'a'), INVALID_ARG);
assert.strictEqual(writable.data, '');
writable.data = '';
await readline.cursorTo(1).commit();
assert.strictEqual(writable.data, '\x1b[2G');
writable.data = '';
await readline.cursorTo(1, 2).commit();
assert.strictEqual(writable.data, '\x1b[3;2H');
writable.data = '';
await readline.cursorTo(1, 2).commit();
assert.strictEqual(writable.data, '\x1b[3;2H');
writable.data = '';
await readline.cursorTo(1).cursorTo(1, 2).commit();
assert.strictEqual(writable.data, '\x1b[2G\x1b[3;2H');
writable.data = '';
await readline.cursorTo(1).commit();
assert.strictEqual(writable.data, '\x1b[2G');
// Verify that cursorTo() rejects if x or y is NaN.
[1.1, NaN, Infinity].forEach((arg) => {
assert.throws(() => readline.cursorTo(arg), {
code: 'ERR_OUT_OF_RANGE',
name: 'RangeError',
});
});
[1.1, NaN, Infinity].forEach((arg) => {
assert.throws(() => readline.cursorTo(1, arg), {
code: 'ERR_OUT_OF_RANGE',
name: 'RangeError',
});
});
assert.throws(() => readline.cursorTo(NaN, NaN), {
code: 'ERR_OUT_OF_RANGE',
name: 'RangeError',
});
}
{
const error = new Error();
const writable = new class extends Writable {
_write() { throw error; }
}();
const readline = new Readline(writable);
await assert.rejects(readline.cursorTo(1).commit(), error);
}
{
const writable = new TestWritable();
const readline = new Readline(writable, { autoCommit: true });
await readline.clearScreenDown();
await setImmediate(); // Wait for next tick as auto commit is asynchronous.
assert.deepStrictEqual(writable.data, CSI.kClearScreenDown);
}
{
const writable = new TestWritable();
const readline = new Readline(writable, { autoCommit: true });
for (const [dir, data] of
[
[-1, CSI.kClearToLineBeginning],
[1, CSI.kClearToLineEnd],
[0, CSI.kClearLine],
]) {
writable.data = '';
readline.clearLine(dir);
await setImmediate(); // Wait for next tick as auto commit is asynchronous.
assert.deepStrictEqual(writable.data, data);
}
}
{
const writable = new TestWritable();
const readline = new Readline(writable, { autoCommit: true });
for (const [x, y, data] of
[
[0, 0, ''],
[1, 0, '\x1b[1C'],
[-1, 0, '\x1b[1D'],
[0, 1, '\x1b[1B'],
[0, -1, '\x1b[1A'],
[1, 1, '\x1b[1C\x1b[1B'],
[-1, 1, '\x1b[1D\x1b[1B'],
[-1, -1, '\x1b[1D\x1b[1A'],
[1, -1, '\x1b[1C\x1b[1A'],
]) {
writable.data = '';
readline.moveCursor(x, y);
await setImmediate(); // Wait for next tick as auto commit is asynchronous.
assert.deepStrictEqual(writable.data, data);
}
}
{
const writable = new TestWritable();
const readline = new Readline(writable, { autoCommit: true });
for (const [x, y, data] of
[
[1, undefined, '\x1b[2G'],
[1, 2, '\x1b[3;2H'],
]) {
writable.data = '';
readline.cursorTo(x, y);
await setImmediate(); // Wait for next tick as auto commit is asynchronous.
assert.deepStrictEqual(writable.data, data);
}
}