'use strict'; require('../common'); const ArrayStream = require('../common/arraystream'); const assert = require('assert'); const repl = require('repl'); const vm = require('vm'); // Create a dummy stream that does nothing. const stream = new ArrayStream(); // Test context when useGlobal is false. { const r = repl.start({ input: stream, output: stream, useGlobal: false }); let output = ''; stream.write = function(d) { output += d; }; // Ensure that the repl context gets its own "console" instance. assert(r.context.console); // Ensure that the repl console instance is not the global one. assert.notStrictEqual(r.context.console, console); assert.notStrictEqual(r.context.Object, Object); stream.run(['({} instanceof Object)']); assert.strictEqual(output, 'true\n> '); const context = r.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 is writable. context.console = 'foo'; r.close(); } // Test for context side effects. { const server = repl.start({ input: stream, output: stream }); 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(); }