Browse Source

update repl to distinguish JSON.parse SyntaxErrors from the rest

v0.7.4-release
Marco Rogers 15 years ago
committed by Ryan Dahl
parent
commit
118b88e44f
  1. 5
      lib/repl.js
  2. 72
      test/simple/test-repl.js

5
lib/repl.js

@ -106,6 +106,11 @@ function REPLServer(prompt, stream) {
// instanceof doesn't work across context switches.
if (!(e && e.constructor && e.constructor.name === "SyntaxError")) {
throw e;
// It could also be an error from JSON.parse
} else if(e && e.stack
&& e.stack.match('Unexpected token ILLEGAL')
&& e.stack.match(/Object.parse \(native\)/)) {
throw e;
}
}
} catch (e) {

72
test/simple/test-repl.js

@ -7,6 +7,7 @@ var net = require("net"),
unix_socket_path = "/tmp/node-repl-sock",
prompt_unix = "node via Unix socket> ",
prompt_tcp = "node via TCP socket> ",
prompt_multiline = "... ",
server_tcp, server_unix, client_tcp, client_unix, timer;
// absolute path to test/fixtures/a.js
@ -33,6 +34,63 @@ function send_expect(list) {
}
}
function clean_up() {
client_tcp.end();
client_unix.end();
clearTimeout(timer);
}
function error_test() {
// The other stuff is done so reuse unix socket
var read_buffer = "";
client_unix.removeAllListeners('data');
client_unix.addListener('data', function (data) {
read_buffer += data.toString('ascii', 0, data.length);
common.error("Unix data: " + JSON.stringify(read_buffer) + ", expecting "
+ (client_unix.expect.exec ? client_unix.expect : JSON.stringify(client_unix.expect)));
if (read_buffer.indexOf(prompt_unix) !== -1) {
assert.ok(read_buffer.match(client_unix.expect));
common.error("match");
read_buffer = "";
if (client_unix.list && client_unix.list.length > 0) {
send_expect(client_unix.list);
} else {
common.error("End of Error test, running TCP test.");
tcp_test();
}
}
else if(read_buffer === prompt_multiline) {
// Check that you meant to send a multiline test
assert.strictEqual(prompt_multiline, client_unix.expect);
read_buffer = "";
if (client_unix.list && client_unix.list.length > 0) {
send_expect(client_unix.list);
} else {
common.error("End of Error test, running TCP test.\n");
tcp_test();
}
}
else {
common.error("didn't see prompt yet, buffering.");
}
});
send_expect([
// Uncaught error throws and prints out
{ client: client_unix, send: "throw new Error('test error');", expect: /^Error: test error/ },
// Common syntax error is treated as multiline command
{ client: client_unix, send: "function test_func() {", expect: prompt_multiline },
// You can recover with the .break command
{ client: client_unix, send: ".break", expect: prompt_unix },
// Can parse valid JSON
{ client: client_unix, send: "JSON.parse('{\"valid\": \"json\"}');", expect: "{ valid: 'json' }"},
// invalid input to JSON.parse error is special case of syntax error, should throw
{ client: client_unix, send: "JSON.parse('{invalid: \\'json\\'}');",
expect: /^SyntaxError: Unexpected token ILLEGAL/ }
]);
}
function tcp_test() {
server_tcp = net.createServer(function (socket) {
assert.strictEqual(server_tcp, socket.server);
@ -69,15 +127,14 @@ function tcp_test() {
common.error("TCP data: " + JSON.stringify(read_buffer) + ", expecting " + JSON.stringify(client_tcp.expect));
if (read_buffer.indexOf(prompt_tcp) !== -1) {
assert.strictEqual(client_tcp.expect, read_buffer);
common.error("match");
read_buffer = "";
if (client_tcp.list && client_tcp.list.length > 0) {
send_expect(client_tcp.list);
}
else {
common.error("End of TCP test.");
client_tcp.end();
client_unix.end();
clearTimeout(timer);
common.error("End of TCP test.\n");
clean_up();
}
}
else {
@ -135,12 +192,12 @@ function unix_test() {
if (client_unix.list && client_unix.list.length > 0) {
send_expect(client_unix.list);
} else {
common.error("End of Unix test, running TCP test.");
tcp_test();
common.error("End of Unix test, running Error test.\n");
process.nextTick(error_test);
}
}
else {
common.error("didn't see prompt yet, bufering.");
common.error("didn't see prompt yet, buffering.");
}
});
@ -157,6 +214,7 @@ function unix_test() {
}
unix_test();
timer = setTimeout(function () {
assert.fail("Timeout");
}, 1000);

Loading…
Cancel
Save