mirror of https://github.com/lukechilds/node.git
Browse Source
Documentation for REPL states that the default value of `useGlobal` is `false`. It makes no distinction between a REPL that is created programmatically, and the one a user is dropped into on the command line by executing `node` with no arguments. This change ensures that the CLI REPL uses a default value of `false`. Fixes: https://github.com/nodejs/node/issues/5659 Ref: https://github.com/nodejs/node/issues/6802 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> PR-URL: https://github.com/nodejs/node/pull/5703v7.x
2 changed files with 86 additions and 1 deletions
@ -0,0 +1,85 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
// Flags: --expose-internals
|
||||
|
|
||||
|
const common = require('../common'); |
||||
|
const stream = require('stream'); |
||||
|
const repl = require('internal/repl'); |
||||
|
const assert = require('assert'); |
||||
|
|
||||
|
common.globalCheck = false; |
||||
|
|
||||
|
// 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)); |
||||
|
} |
Loading…
Reference in new issue