mirror of
https://github.com/denoland/deno.git
synced 2024-11-05 09:04:41 -05:00
6915a9b7a7
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.
233 lines
6 KiB
JavaScript
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);
|
|
}
|
|
}
|