deno.land / std@0.166.0 / node / _tools / test / parallel / test-readline-promises-csi.mjs
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234// deno-fmt-ignore-file// deno-lint-ignore-file
// Copyright Joyent and Node contributors. All rights reserved. MIT license.// Taken from Node 18.12.0// 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); }}
Version Info