mirror of
https://github.com/nodejs/node.git
synced 2024-12-01 16:10:02 +01:00
7e977d7cd4
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>
85 lines
2.4 KiB
JavaScript
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();
|
|
}
|