0
0
mirror of https://github.com/nodejs/node.git synced 2024-12-01 16:10:02 +01:00
nodejs/test/parallel/test-repl-context.js
Ruben Bridgewater 7e977d7cd4 repl: fix some repl context issues
This partially fixes contexts like `{} instanceof Object === false`
in the REPL. This does not fix all cases, since it's something
fundamental from the REPL's design that things like these can happen.

Refs: https://github.com/nodejs/node/issues/27859

PR-URL: https://github.com/nodejs/node/pull/28561
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Anto Aravinth <anto.aravinth.cse@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
2019-07-17 20:59:12 -07:00

85 lines
2.4 KiB
JavaScript

'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();
}