|
|
|
'use strict';
|
|
|
|
const common = require('../common');
|
|
|
|
const assert = require('assert');
|
|
|
|
const repl = require('repl');
|
|
|
|
const vm = require('vm');
|
|
|
|
|
|
|
|
// Create a dummy stream that does nothing
|
|
|
|
const stream = new common.ArrayStream();
|
|
|
|
|
|
|
|
// Test when useGlobal is false
|
|
|
|
testContext(repl.start({
|
|
|
|
input: stream,
|
|
|
|
output: stream,
|
|
|
|
useGlobal: false
|
|
|
|
}));
|
|
|
|
|
|
|
|
function testContext(repl) {
|
|
|
|
const context = repl.createContext();
|
|
|
|
// ensure that the repl context gets its own "console" instance
|
|
|
|
assert(context.console instanceof require('console').Console);
|
|
|
|
|
|
|
|
// ensure that the repl's global property is the context
|
|
|
|
assert.strictEqual(context.global, context);
|
|
|
|
|
|
|
|
// ensure that the repl console instance does not have a setter
|
|
|
|
assert.throws(() => context.console = 'foo', TypeError);
|
|
|
|
repl.close();
|
|
|
|
}
|
|
|
|
|
|
|
|
testContextSideEffects(repl.start({ input: stream, output: stream }));
|
|
|
|
|
|
|
|
function testContextSideEffects(server) {
|
|
|
|
assert.ok(!server.underscoreAssigned);
|
|
|
|
assert.strictEqual(server.lines.length, 0);
|
|
|
|
|
|
|
|
// an assignment to '_' in the repl server
|
|
|
|
server.write('_ = 500;\n');
|
|
|
|
assert.ok(server.underscoreAssigned);
|
|
|
|
assert.strictEqual(server.lines.length, 1);
|
|
|
|
assert.strictEqual(server.lines[0], '_ = 500;');
|
|
|
|
assert.strictEqual(server.last, 500);
|
|
|
|
|
|
|
|
// use the server to create a new context
|
|
|
|
const context = server.createContext();
|
|
|
|
|
|
|
|
// ensure that creating a new context does not
|
|
|
|
// have side effects on the server
|
|
|
|
assert.ok(server.underscoreAssigned);
|
|
|
|
assert.strictEqual(server.lines.length, 1);
|
|
|
|
assert.strictEqual(server.lines[0], '_ = 500;');
|
|
|
|
assert.strictEqual(server.last, 500);
|
|
|
|
|
|
|
|
// reset the server context
|
|
|
|
server.resetContext();
|
|
|
|
assert.ok(!server.underscoreAssigned);
|
|
|
|
assert.strictEqual(server.lines.length, 0);
|
|
|
|
|
|
|
|
// ensure that assigning to '_' in the new context
|
|
|
|
// does not change the value in our server.
|
|
|
|
assert.ok(!server.underscoreAssigned);
|
|
|
|
vm.runInContext('_ = 1000;\n', context);
|
|
|
|
|
|
|
|
assert.ok(!server.underscoreAssigned);
|
|
|
|
assert.strictEqual(server.lines.length, 0);
|
|
|
|
server.close();
|
|
|
|
}
|