'use strict'; // Flags: --expose-internals const common = require('../common'); const stream = require('stream'); const repl = require('internal/repl'); const assert = require('assert'); // Array of [useGlobal, expectedResult] pairs const globalTestCases = [ [false, 'undefined'], [true, '\'tacos\''], [undefined, 'undefined'] ]; const globalTest = (useGlobal, cb, output) => (err, repl) => { if (err) return cb(err); let str = ''; output.on('data', (data) => (str += data)); global.lunch = 'tacos'; repl.write('global.lunch;\n'); repl.close(); delete global.lunch; cb(null, str.trim()); }; // Test how the global object behaves in each state for useGlobal for (const [option, expected] of globalTestCases) { runRepl(option, globalTest, common.mustCall((err, output) => { assert.ifError(err); assert.strictEqual(output, expected); })); } // Test how shadowing the process object via `let` // behaves in each useGlobal state. Note: we can't // actually test the state when useGlobal is true, // because the exception that's generated is caught // (see below), but errors are printed, and the test // suite is aware of it, causing a failure to be flagged. // const processTestCases = [false, undefined]; const processTest = (useGlobal, cb, output) => (err, repl) => { if (err) return cb(err); let str = ''; output.on('data', (data) => (str += data)); // If useGlobal is false, then `let process` should work repl.write('let process;\n'); repl.write('21 * 2;\n'); repl.close(); cb(null, str.trim()); }; for (const option of processTestCases) { runRepl(option, processTest, common.mustCall((err, output) => { assert.ifError(err); assert.strictEqual(output, 'undefined\n42'); })); } function runRepl(useGlobal, testFunc, cb) { const inputStream = new stream.PassThrough(); const outputStream = new stream.PassThrough(); const opts = { input: inputStream, output: outputStream, useGlobal: useGlobal, useColors: false, terminal: false, prompt: '' }; repl.createInternalRepl( process.env, opts, testFunc(useGlobal, cb, opts.output)); }