diff --git a/test/nodejs/client.js b/test/nodejs/client.js
index 8e19b88..ea2cc38 100644
--- a/test/nodejs/client.js
+++ b/test/nodejs/client.js
@@ -31,7 +31,7 @@
   assert(false, err);
 });
 
- // deepEqual doesn't work for binary64
+ // deepEqual doesn't work with fields using node-int64
 function checkRecursively(map1, map2) {
   if (typeof map1 !== 'function' && typeof map2 !== 'function') {
     if (!map1 || typeof map1 !== 'object') {
@@ -47,7 +47,7 @@
 
 client.testVoid(function(err, response) {
   assert( ! err);
-  assert.equal(undefined, response);
+  assert.equal(undefined, response); //void
 });
 
 
@@ -83,6 +83,18 @@
   assert( ! err);
   assert.equal(1, response);
 });
+client.testByte(0, function(err, response) {
+  assert( ! err);
+  assert.equal(0, response);
+});
+client.testByte(-1, function(err, response) {
+  assert( ! err);
+  assert.equal(-1, response);
+});
+client.testByte(-127, function(err, response) {
+  assert( ! err);
+  assert.equal(-127, response);
+});
 
 client.testI32(-1, function(err, response) {
   assert( ! err);
@@ -93,12 +105,10 @@
   assert( ! err);
   assert.equal(5, response);
 });
-
 client.testI64(-5, function(err, response) {
   assert( ! err);
   assert.equal(-5, response);
 });
-
 client.testI64(-34359738368, function(err, response) {
   assert( ! err);
   assert.equal(-34359738368, response);
@@ -108,7 +118,6 @@
   assert( ! err);
   assert.equal(-5.2098523, response);
 });
-
 client.testDouble(7.012052175215044, function(err, response) {
   assert( ! err);
   assert.equal(7.012052175215044, response);
@@ -126,6 +135,7 @@
   checkRecursively(out, response);
 });
 
+
 var out2 = new ttypes.Xtruct2();
 out2.byte_thing = 1;
 out2.struct_thing = out;
@@ -135,6 +145,7 @@
   checkRecursively(out2, response);
 });
 
+
 var mapout = {};
 for (var i = 0; i < 5; ++i) {
   mapout[i] = i-10;
@@ -144,27 +155,103 @@
   assert.deepEqual(mapout, response);
 });
 
-/*
- * TODO: testSet, testList, testEnum, testTypedef, testMapMap, testInsanity
- */
 
-
-client.testException('ApplicationException', function(err, response) {
-  //assert.equal('ApplicationException', err);
-  assert( ! response);
-});
-
-client.testException('Xception', function(err, response) {
-  assert.equal('Xception', err.message);
-  assert( ! response);
-});
-
-client.testException('success', function(err, response) {
+var mapTestInput = {
+  "a":"123", "a b":"with spaces ", "same":"same", "0":"numeric key",
+  "longValue":stringTest, stringTest:"long key"
+};
+client.testStringMap(mapTestInput, function(err, response) {
   assert( ! err);
-  //assert.equal('success', response);
+  assert.deepEqual(mapTestInput, response);
 });
 
 
+var setTestInput = [1,2,3];
+client.testSet(setTestInput, function(err, response) {
+  assert( ! err);
+  assert.deepEqual(setTestInput, response);
+});
+client.testList(setTestInput, function(err, response) {
+  assert( ! err);
+  assert.deepEqual(setTestInput, response);
+});
+
+client.testEnum(ttypes.Numberz.ONE, function(err, response) {
+  assert( ! err);
+  assert.equal(ttypes.Numberz.ONE, response);
+});
+
+client.testTypedef(69, function(err, response) {
+  assert( ! err);
+  assert.equal(69, response);
+});
+
+
+var mapMapTest = {
+  "4": {"1":1, "2":2, "3":3, "4":4},
+  "-4": {"-4":-4, "-3":-3, "-2":-2, "-1":-1}
+};
+client.testMapMap(mapMapTest, function(err, response) {
+  assert( ! err);
+  assert.deepEqual(mapMapTest, response);
+});
+
+var crazy = new ttypes.Insanity({
+  "userMap":{ "5":5, "8":8 },
+  "xtructs":[new ttypes.Xtruct({
+      "string_thing":"Goodbye4",
+      "byte_thing":4,
+      "i32_thing":4,
+      "i64_thing":4
+    }), new ttypes.Xtruct({
+      "string_thing":"Hello2",
+      "byte_thing":2,
+      "i32_thing":2,
+      "i64_thing":2
+    })]
+});
+var insanity = {
+  "1":{ "2": crazy, "3": crazy },
+  "2":{ "6":{ "userMap":null, "xtructs":null } }
+};
+client.testInsanity(crazy, function(err, response) {
+  assert( ! err);
+  checkRecursively(insanity, response);
+});
+
+
+client.testException('TException', function(err, response) {
+  //assert(err); //BUG?
+  assert( ! response);
+});
+client.testException('Xception', function(err, response) {
+  assert( ! response);
+  assert.equal(err.errorCode, 1001);
+  assert.equal('Xception', err.message);
+});
+client.testException('no Exception', function(err, response) {
+  assert( ! err);
+  assert.equal(undefined, response); //void
+});
+
+
+client.testOneway(1, function(err, response) {
+  assert(false); //should not answer
+});
+
+/**
+ * redo a simple test after the oneway to make sure we aren't "off by one" --
+ * if the server treated oneway void like normal void, this next test will
+ * fail since it will get the void confirmation rather than the correct
+ * result. In this circumstance, the client will throw the exception:
+ *
+ *   TApplicationException: Wrong method namea
+ */
+client.testI32(-1, function(err, response) {
+  assert( ! err);
+  assert.equal(-1, response);
+});
+
 setTimeout(function() {
   console.log("Server successfully tested!");
   connection.end();
