import assert from 'node:assert/strict'; import { resolve } from 'node:path'; import { Terminal } from './terminal.mjs'; import { mkdtempSync, writeFileSync, rmSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; const terminal = new Terminal(resolve(process.argv[2] || 'rc2')); const directory = mkdtempSync(join(tmpdir(), 'rc2-display-')); try { await terminal.expect('% '); terminal.send('\x0c'); await terminal.expect('\x1b[2J\x1b[H\r\x1b[J% '); terminal.resize(12); terminal.send('echo abcdefghijklmnop'); await terminal.expect('% echo abcdefghijklmnop'); terminal.send('\x1b[D\x1b[D\x0c'); await terminal.expect('\x1b[2J\x1b[H\r\x1b[J% echo abcdefghijklmnop'); terminal.send('X\r'); assert.match(await terminal.expect('\r\n% '), /\r\nabcdefghijklmnXop\r\n/); terminal.send('echo draft\x1b[A'); await terminal.expect('% echo abcdefghijklmnXop'); terminal.send('\x0c'); await terminal.expect('\x1b[2J\x1b[H\r\x1b[J% echo abcdefghijklmnXop'); terminal.send('\x1b[B\r'); assert.match(await terminal.expect('\r\n% '), /\r\ndraft\r\n/); terminal.resize(12); terminal.send('echo abcdefghijklmnop'); await terminal.expect('abcdefghijklmnop'); terminal.send('\x1b[D\x1b[D\x7fX\r'); assert.match(await terminal.expect('\r\n% '), /\r\nabcdefghijklmXop\r\n/); terminal.send('echo eΜπŸ‘©β€πŸ‘©β€πŸ‘§β€πŸ‘¦πŸ‡ΊπŸ‡Έ'); await terminal.expect('πŸ‡ΊπŸ‡Έ'); terminal.send('\x0c'); await terminal.expect('\x1b[2J\x1b[H\r\x1b[J% echo eΜπŸ‘©β€πŸ‘©β€πŸ‘§β€πŸ‘¦πŸ‡ΊπŸ‡Έ'); terminal.send('\x7f\x7f\x7fok\r'); assert.match(await terminal.expect('\r\n% '), /\r\nok\r\n/); terminal.send('echo resize'); await terminal.expect('resize'); terminal.resize(7); terminal.send('\x1b[D\x7fX\r'); assert.match(await terminal.expect('\r\n% '), /\r\nresiXe\r\n/); terminal.resize(80); terminal.send('fn multiline {\r'); await terminal.expect('\r\n '); terminal.send('\x0c'); await terminal.expect('\x1b[2J\x1b[H\r\x1b[J '); terminal.send('echo whole}\r'); await terminal.expect('\r\n% '); terminal.send('\x1b[A\r'); await terminal.expect('\r\n% '); assert.match(await terminal.command('multiline'), /\r\nwhole\r\n/); const output = []; terminal.process.stdout.on('data', chunk => output.push(chunk)); writeFileSync(`${directory}/bad\u009b31m`, ''); terminal.send(`echo ${directory}/bad\t`); await terminal.expect('31m'); assert.equal(Buffer.concat(output).includes(0x9b), false, 'The editor emitted an eight-bit terminal control'); terminal.send('\x03'); await terminal.expect('^C\r\n% '); } finally { await terminal.close(); rmSync(directory, { recursive: true, force: true }); } console.log('Editor tests passed');