'use strict'; const common = require('../common'); const assert = require('assert'); const { startNewREPLServer } = require('../common/repl'); if (process.env.TERM === 'dumb') { common.skip('skipping - dumb terminal'); } // \u001b[nG - Moves the cursor to n st column // \u001b[0J - Clear screen // \u001b[0K - Clear to line end const terminalCode = '\u001b[1G\u001b[0J> \u001b[3G'; const terminalCodeRegex = new RegExp(terminalCode.replace(/\[/g, '\\['), 'g'); function run({ input: inputStr, output: outputStr, event, checkTerminalCodes = true }) { let expected = `${terminalCode}.editor\n` + '// Entering editor mode (Ctrl+D to finish, Ctrl+C to cancel)\n' + `${inputStr}${outputStr}\n${terminalCode}`; const { replServer, input, output } = startNewREPLServer({ prompt: '> ', terminal: true, useColors: false }); input.emit('data', '.editor\n'); input.emit('data', inputStr); replServer.write('', event); replServer.close(); let found = output.accumulator; if (!checkTerminalCodes) { found = found.replace(terminalCodeRegex, '').replace(/\n/g, ''); expected = expected.replace(terminalCodeRegex, '').replace(/\n/g, ''); } assert.strictEqual(found, expected); } const tests = [ { input: '', output: '\n(To exit, press Ctrl+C again or Ctrl+D or type .exit)', event: { ctrl: true, name: 'c' } }, { input: 'let i = 1;', output: '', event: { ctrl: true, name: 'c' } }, { input: 'let i = 1;\ni + 3', output: '\n4', event: { ctrl: true, name: 'd' } }, { input: ' let i = 1;\ni + 3', output: '\n4', event: { ctrl: true, name: 'd' } }, { input: '', output: '', checkTerminalCodes: false, event: null, }, ]; tests.forEach(run); // Auto code alignment for .editor mode function testCodeAlignment({ input: inputStr, cursor = 0, line = '' }) { const { replServer, input } = startNewREPLServer({ prompt: '> ', terminal: true, useColors: false }); input.emit('data', '.editor\n'); inputStr.split('').forEach((ch) => input.emit('data', ch)); // Test the content of current line and the cursor position assert.strictEqual(line, replServer.line); assert.strictEqual(cursor, replServer.cursor); replServer.write('', { ctrl: true, name: 'd' }); replServer.close(); // Ensure that empty lines are not saved in history assert.notStrictEqual(replServer.history[0].trim(), ''); } const codeAlignmentTests = [ { input: 'let i = 1;\n' }, { input: ' let i = 1;\n', cursor: 2, line: ' ' }, { input: ' let i = 1;\n', cursor: 5, line: ' ' }, { input: ' let i = 1;\n let j = 2\n', cursor: 2, line: ' ' }, ]; codeAlignmentTests.forEach(testCodeAlignment);