update repl to distinguish JSON.parse SyntaxErrors from the rest
authorMarco Rogers <marco.rogers@gmail.com>
Sat, 20 Nov 2010 23:44:58 +0000 (18:44 -0500)
committerRyan Dahl <ry@tinyclouds.org>
Sun, 21 Nov 2010 04:36:14 +0000 (20:36 -0800)
lib/repl.js
test/simple/test-repl.js

index 8c4e6f0..3ad63bc 100644 (file)
@@ -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) {
index 6db7c01..d246508 100644 (file)
@@ -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);