diff --git a/lib/ts/Gruntfile.js b/lib/ts/Gruntfile.js
index 61ab582..3e4b1c4 100644
--- a/lib/ts/Gruntfile.js
+++ b/lib/ts/Gruntfile.js
@@ -5,55 +5,57 @@
 // Grunt Setup -  npm install  //reads the ./package.json and installs project dependencies
 // Run grunt -    npx grunt  // uses project-local installed version of grunt (from package.json)
 
-module.exports = function(grunt) {
-  'use strict';
+module.exports = function (grunt) {
+  "use strict";
 
   grunt.initConfig({
-    pkg: grunt.file.readJSON('package.json'),
+    pkg: grunt.file.readJSON("package.json"),
     concat: {
       options: {
-        separator: ';'
+        separator: ";",
       },
       dist: {
-        src: ['src/**/*.js'],
-        dest: 'dist/<%= pkg.name %>.js'
-      }
+        src: ["src/**/*.js"],
+        dest: "dist/<%= pkg.name %>.js",
+      },
     },
     shell: {
       InstallThriftJS: {
-        command: 'mkdir -p test/build/ts/lib; cp ../js/src/thrift.js test/build/ts/thrift.js'
+        command:
+          "mkdir -p test/build/ts/lib; cp ../js/src/thrift.js test/build/ts/thrift.js",
       },
       InstallThriftNodeJSDep: {
-        command: 'cd ../..; npm install'
+        command: "cd ../..; npm install",
       },
       InstallTestLibs: {
-        command: 'cd test; ant download_jslibs'
+        command: "cd test; ant download_jslibs",
       },
       ThriftGen: {
         command: [
-          'mkdir -p test/gen-js',
-          '../../compiler/cpp/thrift -gen js:ts --out test/gen-js ../../test/v0.16/ThriftTest.thrift',
-          'mkdir -p test/gen-nodejs',
-          '../../compiler/cpp/thrift -gen js:node,ts --out test/gen-nodejs ../../test/v0.16/ThriftTest.thrift',
-        ].join(' && ')
+          "mkdir -p test/gen-js",
+          "../../compiler/cpp/thrift -gen js:ts --out test/gen-js ../../test/v0.16/ThriftTest.thrift",
+          "mkdir -p test/gen-nodejs",
+          "../../compiler/cpp/thrift -gen js:node,ts --out test/gen-nodejs ../../test/v0.16/ThriftTest.thrift",
+        ].join(" && "),
       },
       ThriftBrowserifyNodeInt64: {
         command: [
-          './node_modules/browserify/bin/cmd.js ./node_modules/node-int64/Int64.js -s Int64 -o test/build/js/lib/Int64.js',
-          './node_modules/browserify/bin/cmd.js ../nodejs/lib/thrift/int64_util.js -s Int64Util -o test/build/js/lib/Int64Util.js',
-          './node_modules/browserify/bin/cmd.js ./node_modules/json-int64/index.js -s JSONInt64 -o test/build/js/lib/JSONInt64.js'
-        ].join(' && ')
+          "./node_modules/browserify/bin/cmd.js ./node_modules/node-int64/Int64.js -s Int64 -o test/build/js/lib/Int64.js",
+          "./node_modules/browserify/bin/cmd.js ../nodejs/lib/thrift/int64_util.js -s Int64Util -o test/build/js/lib/Int64Util.js",
+          "./node_modules/browserify/bin/cmd.js ./node_modules/json-int64/index.js -s JSONInt64 -o test/build/js/lib/JSONInt64.js",
+        ].join(" && "),
       },
       ThriftGenInt64: {
-        command: '../../compiler/cpp/thrift -gen js:ts -o test ../../test/Int64Test.thrift'
+        command:
+          "../../compiler/cpp/thrift -gen js:ts -o test ../../test/Int64Test.thrift",
       },
       ThriftTestServer: {
         options: {
           async: true,
           execOptions: {
             cwd: "./test",
-            env: {NODE_PATH: "../../nodejs/lib:../../../node_modules"}
-          }
+            env: { NODE_PATH: "../../nodejs/lib:../../../node_modules" },
+          },
         },
         command: "node server_http.js",
       },
@@ -61,103 +63,104 @@
         options: {
           execOptions: {
             cwd: "./test",
-          }
+          },
         },
-        command : "../node_modules/typescript/bin/tsc --listFiles --outDir build/ts"
+        command:
+          "../node_modules/typescript/bin/tsc --listFiles --outDir build/ts",
       },
       BrowserifyCompiledTS: {
         command: [
           "./node_modules/browserify/bin/cmd.js test/build/ts/test.js -o test/build/ts/lib/test.js --standalone test",
           "./node_modules/browserify/bin/cmd.js test/build/ts/test-int64.js -o test/build/ts/lib/test-int64.js --standalone testInt64",
-        ].join(" && ")
+        ].join(" && "),
       },
       InstallGeneratedCode: {
         command: [
           "mkdir -p test/build/ts",
-          "cp -r test/gen-js test/build/ts"
-        ].join(" && ")
+          "cp -r test/gen-js test/build/ts",
+        ].join(" && "),
       },
     },
     qunit: {
       ThriftJS: {
         options: {
-          urls: [
-            'http://localhost:8089/test.html'
-          ],
+          urls: ["http://localhost:8089/test.html"],
           puppeteer: {
             headless: true,
-            args: ['--no-sandbox'],
+            args: ["--no-sandbox"],
           },
-        }
+        },
       },
       ThriftJS_Int64: {
         options: {
-          urls: [
-            'http://localhost:8089/test-int64.html'
-          ],
+          urls: ["http://localhost:8089/test-int64.html"],
           puppeteer: {
             headless: true,
-            args: ['--no-sandbox'],
+            args: ["--no-sandbox"],
             ignoreHTTPSErrors: true,
           },
-        }
+        },
       },
     },
     jshint: {
       // The main Thrift library file. not es6 yet :(
       lib: {
-        src: ['../js/src/**/*.js'],
+        src: ["../js/src/**/*.js"],
       },
       // The test files use es6
       test: {
-        src: ['Gruntfile.js', 'test/*.js'],
+        src: ["Gruntfile.js", "test/*.js"],
         options: {
           esversion: 6,
-        }
+        },
       },
       gen_js_code: {
-        src: ['test/gen-js/*.js'],
+        src: ["test/gen-js/*.js"],
       },
       gen_node_code: {
-        src: ['test/gen-nodejs/*.js'],
+        src: ["test/gen-nodejs/*.js"],
         options: {
           node: true,
-        }
+        },
       },
     },
   });
 
-  grunt.loadNpmTasks('grunt-contrib-jshint');
-  grunt.loadNpmTasks('grunt-contrib-qunit');
-  grunt.loadNpmTasks('grunt-shell-spawn');
+  grunt.loadNpmTasks("grunt-contrib-jshint");
+  grunt.loadNpmTasks("grunt-contrib-qunit");
+  grunt.loadNpmTasks("grunt-shell-spawn");
 
-  grunt.registerTask('wait', 'Wait just one second for the server to start', function () {
-    var done = this.async();
-    setTimeout(function() {
-      done(true);
-    }, 1000);
-  });
+  grunt.registerTask(
+    "wait",
+    "Wait just one second for the server to start",
+    function () {
+      var done = this.async();
+      setTimeout(function () {
+        done(true);
+      }, 1000);
+    },
+  );
 
-  grunt.registerTask('installAndGenerate', [
-    'shell:InstallThriftJS',
-    'shell:InstallThriftNodeJSDep',
-    'shell:ThriftGen',
-    'shell:ThriftBrowserifyNodeInt64',
-    'shell:ThriftGenInt64',
-    'shell:InstallTestLibs',
-    'shell:BuildTS',
-    'shell:InstallGeneratedCode',
-    'shell:BrowserifyCompiledTS',
+  grunt.registerTask("installAndGenerate", [
+    "shell:InstallThriftJS",
+    "shell:InstallThriftNodeJSDep",
+    "shell:ThriftGen",
+    "shell:ThriftBrowserifyNodeInt64",
+    "shell:ThriftGenInt64",
+    "shell:InstallTestLibs",
+    "shell:BuildTS",
+    "shell:InstallGeneratedCode",
+    "shell:BrowserifyCompiledTS",
   ]);
 
-  grunt.registerTask('test', [
-    'installAndGenerate',
-    'jshint',
-    'shell:ThriftTestServer',
-    'wait',
-    'qunit:ThriftJS',
-    'qunit:ThriftJS_Int64',
-    'shell:ThriftTestServer:kill',
+  grunt.registerTask("test", [
+    "installAndGenerate",
+    "jshint",
+    "shell:ThriftTestServer",
+    "wait",
+    "qunit:ThriftJS",
+    "qunit:ThriftJS_Int64",
+    "shell:ThriftTestServer:kill",
   ]);
-  grunt.registerTask('default', ['test']);
+  grunt.registerTask("default", ["test"]);
 };
diff --git a/lib/ts/test/phantom-client.ts b/lib/ts/test/phantom-client.ts
index 5518937..90a532d 100644
--- a/lib/ts/test/phantom-client.ts
+++ b/lib/ts/test/phantom-client.ts
@@ -16,337 +16,360 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- /* jshint -W100 */
+/* jshint -W100 */
 
 import { ThriftTest } from "./gen-js/ThriftTest_types";
 import "./gen-js/ThriftTest";
 var Int64 = require("node-int64");
 var phantom = require("phantom");
 
-const int64_2_pow_60: typeof Int64 = new Int64('1000000000000000');
-const int64_minus_2_pow_60: typeof Int64 = new Int64('f000000000000000');
+const int64_2_pow_60: typeof Int64 = new Int64("1000000000000000");
+const int64_minus_2_pow_60: typeof Int64 = new Int64("f000000000000000");
 
- (function() {
-    'use strict';
-  
-    // Rudimentary test helper functions
-    // TODO: Return error code based on kind of errors rather than throw
-    var ok = function(t, msg) {
-      if (!t) {
-        console.log('*** FAILED ***');
-        throw new Error(msg);
+(function () {
+  "use strict";
+
+  // Rudimentary test helper functions
+  // TODO: Return error code based on kind of errors rather than throw
+  var ok = function (t, msg) {
+    if (!t) {
+      console.log("*** FAILED ***");
+      throw new Error(msg);
+    }
+  };
+  var equal = function (a, b) {
+    if (a !== b) {
+      console.log("*** FAILED ***");
+      throw new Error();
+    }
+  };
+  var test = function (name, f) {
+    console.log("TEST : " + name);
+    f();
+    console.log("OK\n");
+  };
+
+  var parseArgs = function (args) {
+    var skips = ["--transport=http", "--protocol=json"];
+    var opts = {
+      port: "9090",
+      // protocol: 'json',
+    };
+    var keys = {};
+    for (var key in opts) {
+      keys["--" + key + "="] = key;
+    }
+    for (var i in args) {
+      var arg = args[i];
+      if (skips.indexOf(arg) != -1) {
+        continue;
       }
-    };
-    var equal = function(a, b) {
-      if (a !== b) {
-        console.log('*** FAILED ***');
-        throw new Error();
+      var hit = false;
+      for (var k in keys) {
+        if (arg.slice(0, k.length) === k) {
+          opts[keys[k]] = arg.slice(k.length);
+          hit = true;
+          break;
+        }
       }
-    };
-    var test = function(name, f) {
-      console.log('TEST : ' + name);
-      f();
-      console.log('OK\n');
-    };
-  
-    var parseArgs = function(args) {
-      var skips = [
-        '--transport=http',
-        '--protocol=json'
-      ];
-      var opts = {
-        port: '9090'
-        // protocol: 'json',
+      if (!hit) {
+        throw new Error("Unknown argument: " + arg);
+      }
+    }
+    var portAsInt: number = parseInt(opts.port, 10);
+    if (!opts.port || portAsInt < 1 || portAsInt > 65535) {
+      throw new Error("Invalid port number");
+    }
+    return opts;
+  };
+
+  var execute = function () {
+    console.log("### Apache Thrift Javascript standalone test client");
+    console.log("------------------------------------------------------------");
+
+    phantom.page.injectJs("thrift.js");
+    phantom.page.injectJs("gen-js/ThriftTest_types.js");
+    phantom.page.injectJs("gen-js/ThriftTest.js");
+
+    var system = require("system");
+    var opts = parseArgs(system.args.slice(1));
+    var port = opts.port;
+    var transport = new Thrift.Transport(
+      "http://localhost:" + port + "/service",
+    );
+    var protocol = new Thrift.Protocol(transport);
+    var client = new ThriftTest.ThriftTestClient(protocol);
+
+    // TODO: Remove duplicate code with test.js.
+    // all Languages in UTF-8
+    var stringTest =
+      "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語";
+
+    function checkRecursively(map1, map2) {
+      if (typeof map1 !== "function" && typeof map2 !== "function") {
+        if (!map1 || typeof map1 !== "object") {
+          equal(map1, map2);
+        } else {
+          for (var key in map1) {
+            checkRecursively(map1[key], map2[key]);
+          }
+        }
+      }
+    }
+
+    test("Void", function () {
+      equal(client.testVoid(), undefined);
+    });
+    test("Binary (String)", function () {
+      var binary: string = "";
+      for (var v = 255; v >= 0; --v) {
+        binary += String.fromCharCode(v);
+      }
+      equal(client.testBinary(binary), binary);
+    });
+    test("Binary (Uint8Array)", function () {
+      var binary: string = "";
+      for (var v = 255; v >= 0; --v) {
+        binary += String.fromCharCode(v);
+      }
+      var arr = new Uint8Array(binary.length);
+      for (var i = 0; i < binary.length; ++i) {
+        arr[i] = binary[i].charCodeAt(0);
+      }
+      const hexEncodedString = Array.from(arr, function (byte) {
+        return String.fromCharCode(byte);
+      }).join("");
+      equal(client.testBinary(hexEncodedString), binary);
+    });
+    test("String", function () {
+      equal(client.testString(""), "");
+      equal(client.testString(stringTest), stringTest);
+
+      var specialCharacters =
+        'quote: \" backslash:' +
+        " forwardslash-escaped: \/ " +
+        " backspace: \b formfeed: \f newline: \n return: \r tab: " +
+        ' now-all-of-them-together: "\\\/\b\n\r\t' +
+        " now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><";
+      equal(client.testString(specialCharacters), specialCharacters);
+    });
+    test("Double", function () {
+      equal(client.testDouble(0), 0);
+      equal(client.testDouble(-1), -1);
+      equal(client.testDouble(3.14), 3.14);
+      equal(client.testDouble(Math.pow(2, 60)), Math.pow(2, 60));
+    });
+    test("Bool", function () {
+      equal(client.testBool(true), true);
+      equal(client.testBool(false), false);
+    });
+    test("I8", function () {
+      equal(client.testByte(0), 0);
+      equal(client.testByte(0x01), 0x01);
+    });
+    test("I32", function () {
+      equal(client.testI32(0), 0);
+      equal(client.testI32(Math.pow(2, 30)), Math.pow(2, 30));
+      equal(client.testI32(-Math.pow(2, 30)), -Math.pow(2, 30));
+    });
+    test("I64", function () {
+      equal(client.testI64(new Int64(0)), 0);
+      equal(client.testI64(int64_2_pow_60), Math.pow(2, 52));
+      equal(client.testI64(int64_minus_2_pow_60), -Math.pow(2, 52));
+    });
+
+    test("Struct", function () {
+      var structTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct();
+      structTestInput.string_thing = "worked";
+      structTestInput.byte_thing = 0x01;
+      structTestInput.i32_thing = Math.pow(2, 30);
+      structTestInput.i64_thing = int64_2_pow_60;
+
+      var structTestOutput: ThriftTest.Xtruct =
+        client.testStruct(structTestInput);
+
+      equal(structTestOutput.string_thing, structTestInput.string_thing);
+      equal(structTestOutput.byte_thing, structTestInput.byte_thing);
+      equal(structTestOutput.i32_thing, structTestInput.i32_thing);
+      equal(structTestOutput.i64_thing, structTestInput.i64_thing);
+
+      equal(JSON.stringify(structTestOutput), JSON.stringify(structTestInput));
+    });
+
+    test("Nest", function () {
+      var xtrTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct();
+      xtrTestInput.string_thing = "worked";
+      xtrTestInput.byte_thing = 0x01;
+      xtrTestInput.i32_thing = Math.pow(2, 30);
+      xtrTestInput.i64_thing = int64_2_pow_60;
+
+      var nestTestInput: ThriftTest.Xtruct2 = new ThriftTest.Xtruct2();
+      nestTestInput.byte_thing = 0x02;
+      nestTestInput.struct_thing = xtrTestInput;
+      nestTestInput.i32_thing = Math.pow(2, 15);
+
+      var nestTestOutput = client.testNest(nestTestInput);
+
+      equal(nestTestOutput.byte_thing, nestTestInput.byte_thing);
+      equal(
+        nestTestOutput.struct_thing.string_thing,
+        nestTestInput.struct_thing.string_thing,
+      );
+      equal(
+        nestTestOutput.struct_thing.byte_thing,
+        nestTestInput.struct_thing.byte_thing,
+      );
+      equal(
+        nestTestOutput.struct_thing.i32_thing,
+        nestTestInput.struct_thing.i32_thing,
+      );
+      equal(
+        nestTestOutput.struct_thing.i64_thing,
+        nestTestInput.struct_thing.i64_thing,
+      );
+      equal(nestTestOutput.i32_thing, nestTestInput.i32_thing);
+
+      equal(JSON.stringify(nestTestOutput), JSON.stringify(nestTestInput));
+    });
+
+    test("Map", function () {
+      var mapTestInput: { [k: number]: number } = { 7: 77, 8: 88, 9: 99 };
+
+      var mapTestOutput: { [k: number]: number } = client.testMap(mapTestInput);
+
+      for (var key in mapTestOutput) {
+        equal(mapTestOutput[key], mapTestInput[key]);
+      }
+    });
+
+    test("StringMap", function () {
+      var mapTestInput: { [k: string]: string } = {
+        a: "123",
+        "a b": "with spaces ",
+        same: "same",
+        "0": "numeric key",
+        longValue: stringTest,
+        stringTest: "long key",
       };
-      var keys = {};
-      for (var key in opts) {
-        keys['--' + key + '='] = key;
+
+      var mapTestOutput: { [k: string]: string } =
+        client.testStringMap(mapTestInput);
+
+      for (var key in mapTestOutput) {
+        equal(mapTestOutput[key], mapTestInput[key]);
       }
-      for (var i in args) {
-        var arg = args[i];
-        if (skips.indexOf(arg) != -1) {
-          continue;
-        }
-        var hit = false;
-        for (var k in keys) {
-          if (arg.slice(0, k.length) === k) {
-            opts[keys[k]] = arg.slice(k.length);
-            hit = true;
-            break;
-          }
-        }
-        if (!hit) {
-          throw new Error('Unknown argument: ' + arg);
+    });
+
+    test("Set", function () {
+      var setTestInput: number[] = [1, 2, 3];
+      ok(client.testSet(setTestInput), setTestInput);
+    });
+
+    test("List", function () {
+      var listTestInput: number[] = [1, 2, 3];
+      ok(client.testList(listTestInput), listTestInput);
+    });
+
+    test("Enum", function () {
+      equal(client.testEnum(ThriftTest.Numberz.ONE), ThriftTest.Numberz.ONE);
+    });
+
+    test("TypeDef", function () {
+      equal(client.testTypedef(new Int64(69)), 69);
+    });
+
+    test("MapMap", function () {
+      var mapMapTestExpectedResult: { [K: number]: { [k: number]: number } } = {
+        "4": { "1": 1, "2": 2, "3": 3, "4": 4 },
+        "-4": { "-4": -4, "-3": -3, "-2": -2, "-1": -1 },
+      };
+
+      var mapMapTestOutput = client.testMapMap(1);
+
+      for (var key in mapMapTestOutput) {
+        for (var key2 in mapMapTestOutput[key]) {
+          equal(
+            mapMapTestOutput[key][key2],
+            mapMapTestExpectedResult[key][key2],
+          );
         }
       }
-      var portAsInt: number = parseInt(opts.port, 10);
-      if (!opts.port || portAsInt < 1 || portAsInt > 65535) {
-        throw new Error('Invalid port number');
+
+      checkRecursively(mapMapTestOutput, mapMapTestExpectedResult);
+    });
+
+    test("Xception", function () {
+      try {
+        client.testException("Xception");
+        ok(false, "expected an exception but there was no exception");
+      } catch (e) {
+        equal(e.errorCode, 1001);
+        equal(e.message, "Xception");
       }
-      return opts;
-    };
-  
-    var execute = function() {
-      console.log('### Apache Thrift Javascript standalone test client');
-      console.log('------------------------------------------------------------');
-  
-      phantom.page.injectJs('thrift.js');
-      phantom.page.injectJs('gen-js/ThriftTest_types.js');
-      phantom.page.injectJs('gen-js/ThriftTest.js');
-  
-      var system = require('system');
-      var opts = parseArgs(system.args.slice(1));
-      var port = opts.port;
-      var transport = new Thrift.Transport('http://localhost:' + port + '/service');
-      var protocol = new Thrift.Protocol(transport);
-      var client = new ThriftTest.ThriftTestClient(protocol);
-  
-  
-      // TODO: Remove duplicate code with test.js.
-      // all Languages in UTF-8
-      var stringTest = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語";
-  
-      function checkRecursively(map1, map2) {
-        if (typeof map1 !== 'function' && typeof map2 !== 'function') {
-          if (!map1 || typeof map1 !== 'object') {
-            equal(map1, map2);
-          } else {
-            for (var key in map1) {
-              checkRecursively(map1[key], map2[key]);
-            }
-          }
-        }
+    });
+
+    test("no Exception", function () {
+      try {
+        client.testException("no Exception");
+      } catch (e) {
+        ok(false, "expected no exception but here was an exception");
       }
-  
-      test('Void', function() {
-        equal(client.testVoid(), undefined);
-      });
-      test('Binary (String)', function() {
-        var binary: string = '';
-        for (var v = 255; v >= 0; --v) {
-          binary += String.fromCharCode(v);
-        }
-        equal(client.testBinary(binary), binary);
-      });
-      test('Binary (Uint8Array)', function() {
-        var binary: string = '';
-        for (var v = 255; v >= 0; --v) {
-          binary += String.fromCharCode(v);
-        }
-        var arr = new Uint8Array(binary.length);
-        for (var i = 0; i < binary.length; ++i) {
-          arr[i] = binary[i].charCodeAt(0);
-        }
-        const hexEncodedString = Array.from(arr, function(byte) {
-            return String.fromCharCode(byte);
-        }).join('')
-        equal(client.testBinary(hexEncodedString), binary);
-      });
-      test('String', function() {
-        equal(client.testString(''), '');
-        equal(client.testString(stringTest), stringTest);
-  
-        var specialCharacters = 'quote: \" backslash:' +
-          ' forwardslash-escaped: \/ ' +
-            ' backspace: \b formfeed: \f newline: \n return: \r tab: ' +
-              ' now-all-of-them-together: "\\\/\b\n\r\t' +
-                ' now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><';
-                equal(client.testString(specialCharacters), specialCharacters);
-      });
-      test('Double', function() {
-        equal(client.testDouble(0), 0);
-        equal(client.testDouble(-1), -1);
-        equal(client.testDouble(3.14), 3.14);
-        equal(client.testDouble(Math.pow(2, 60)), Math.pow(2, 60));
-      });
-      test('Bool', function() {
-        equal(client.testBool(true), true);
-        equal(client.testBool(false), false);
-      });
-      test('I8', function() {
-        equal(client.testByte(0), 0);
-        equal(client.testByte(0x01), 0x01);
-      });
-      test('I32', function() {
-        equal(client.testI32(0), 0);
-        equal(client.testI32(Math.pow(2, 30)), Math.pow(2, 30));
-        equal(client.testI32(-Math.pow(2, 30)), -Math.pow(2, 30));
-      });
-      test('I64', function() {
-        equal(client.testI64(new Int64(0)), 0);
-        equal(client.testI64(int64_2_pow_60), Math.pow(2, 52));
-        equal(client.testI64(int64_minus_2_pow_60), -Math.pow(2, 52));
-      });
-  
-      test('Struct', function() {
-        var structTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct();
-        structTestInput.string_thing = 'worked';
-        structTestInput.byte_thing = 0x01;
-        structTestInput.i32_thing = Math.pow(2, 30);
-        structTestInput.i64_thing = int64_2_pow_60;
-  
-        var structTestOutput: ThriftTest.Xtruct = client.testStruct(structTestInput);
-  
-        equal(structTestOutput.string_thing, structTestInput.string_thing);
-        equal(structTestOutput.byte_thing, structTestInput.byte_thing);
-        equal(structTestOutput.i32_thing, structTestInput.i32_thing);
-        equal(structTestOutput.i64_thing, structTestInput.i64_thing);
-  
-        equal(JSON.stringify(structTestOutput), JSON.stringify(structTestInput));
-      });
-  
-      test('Nest', function() {
-        var xtrTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct();
-        xtrTestInput.string_thing = 'worked';
-        xtrTestInput.byte_thing = 0x01;
-        xtrTestInput.i32_thing = Math.pow(2, 30);
-        xtrTestInput.i64_thing = int64_2_pow_60;
-  
-        var nestTestInput: ThriftTest.Xtruct2 = new ThriftTest.Xtruct2();
-        nestTestInput.byte_thing = 0x02;
-        nestTestInput.struct_thing = xtrTestInput;
-        nestTestInput.i32_thing = Math.pow(2, 15);
-  
-        var nestTestOutput = client.testNest(nestTestInput);
-  
-        equal(nestTestOutput.byte_thing, nestTestInput.byte_thing);
-        equal(nestTestOutput.struct_thing.string_thing, nestTestInput.struct_thing.string_thing);
-        equal(nestTestOutput.struct_thing.byte_thing, nestTestInput.struct_thing.byte_thing);
-        equal(nestTestOutput.struct_thing.i32_thing, nestTestInput.struct_thing.i32_thing);
-        equal(nestTestOutput.struct_thing.i64_thing, nestTestInput.struct_thing.i64_thing);
-        equal(nestTestOutput.i32_thing, nestTestInput.i32_thing);
-  
-        equal(JSON.stringify(nestTestOutput), JSON.stringify(nestTestInput));
-      });
-  
-      test('Map', function() {
-        var mapTestInput: {[k: number]: number;} = {7: 77, 8: 88, 9: 99};
-  
-        var mapTestOutput: {[k: number]: number;} = client.testMap(mapTestInput);
-  
-        for (var key in mapTestOutput) {
-          equal(mapTestOutput[key], mapTestInput[key]);
-        }
-      });
-  
-      test('StringMap', function() {
-        var mapTestInput: {[k: string]: string;} = {
-          'a': '123', 'a b': 'with spaces ', 'same': 'same', '0': 'numeric key',
-          'longValue': stringTest, stringTest: 'long key'
-        };
-  
-        var mapTestOutput: {[k: string]: string;} = client.testStringMap(mapTestInput);
-  
-        for (var key in mapTestOutput) {
-          equal(mapTestOutput[key], mapTestInput[key]);
-        }
-      });
-  
-      test('Set', function() {
-        var setTestInput: number[] = [1, 2, 3];
-        ok(client.testSet(setTestInput), setTestInput);
-      });
-  
-      test('List', function() {
-        var listTestInput: number[] = [1, 2, 3];
-        ok(client.testList(listTestInput), listTestInput);
-      });
-  
-      test('Enum', function() {
-        equal(client.testEnum(ThriftTest.Numberz.ONE), ThriftTest.Numberz.ONE);
-      });
-  
-      test('TypeDef', function() {
-        equal(client.testTypedef(new Int64(69)), 69);
-      });
-  
-      test('MapMap', function() {
-        var mapMapTestExpectedResult: {[K: number]: {[k: number]: number}} = {
-          '4': {'1': 1, '2': 2, '3': 3, '4': 4},
-          '-4': {'-4': -4, '-3': -3, '-2': -2, '-1': -1}
-        };
-  
-        var mapMapTestOutput = client.testMapMap(1);
-  
-  
-        for (var key in mapMapTestOutput) {
-          for (var key2 in mapMapTestOutput[key]) {
-            equal(mapMapTestOutput[key][key2], mapMapTestExpectedResult[key][key2]);
-          }
-        }
-  
-        checkRecursively(mapMapTestOutput, mapMapTestExpectedResult);
-      });
-  
-      test('Xception', function() {
-        try {
-          client.testException('Xception');
-          ok(false, "expected an exception but there was no exception");
-        } catch (e) {
-          equal(e.errorCode, 1001);
-          equal(e.message, 'Xception');
-        }
-      });
-  
-      test('no Exception', function() {
-        try {
-          client.testException('no Exception');
-        } catch (e) {
-          ok(false, "expected no exception but here was an exception");
-        }
-      });
-  
-      test('TException', function() {
-        try {
-          client.testException('TException');
-          ok(false, "expected an exception but there was no exception");
-        } catch (e) {
-          ok(ok, "succesfully got exception");
-        }
-      });
-  
-      const crazy: ThriftTest.Insanity = {
-        'userMap': { '5': new Int64(5), '8': new Int64(8) },
-        'xtructs': [{
-            'string_thing': 'Goodbye4',
-            'byte_thing': 4,
-            'i32_thing': 4,
-            'i64_thing': new Int64(4)
+    });
+
+    test("TException", function () {
+      try {
+        client.testException("TException");
+        ok(false, "expected an exception but there was no exception");
+      } catch (e) {
+        ok(ok, "succesfully got exception");
+      }
+    });
+
+    const crazy: ThriftTest.Insanity = {
+      userMap: { "5": new Int64(5), "8": new Int64(8) },
+      xtructs: [
+        {
+          string_thing: "Goodbye4",
+          byte_thing: 4,
+          i32_thing: 4,
+          i64_thing: new Int64(4),
         },
         {
-            'string_thing': 'Hello2',
-            'byte_thing': 2,
-            'i32_thing': 2,
-            'i64_thing': new Int64(2)
-        }]
+          string_thing: "Hello2",
+          byte_thing: 2,
+          i32_thing: 2,
+          i64_thing: new Int64(2),
+        },
+      ],
     };
-      test('Insanity', function() {
-        const insanity: {[k: number]: (ThriftTest.Insanity | {[k:number]: ThriftTest.Insanity})} = {
-            '1': {
-                '2': crazy,
-                '3': crazy
-            },
-            '2': { '6': new ThriftTest.Insanity() }
-        };
-        var res = client.testInsanity(new ThriftTest.Insanity(crazy));
-        ok(res, JSON.stringify(res));
-        ok(insanity, JSON.stringify(insanity));
-  
-        checkRecursively(res, insanity);
-      });
-  
-      console.log('------------------------------------------------------------');
-      console.log('### All tests succeeded.');
-      return 0;
-    };
-  
-    try {
-      var ret = execute();
-      phantom.exit(ret);
-    } catch (err) {
-      // Catch all and exit to avoid hang.
-      console.error(err);
-      phantom.exit(1);
-    }
-  })();
-  
\ No newline at end of file
+    test("Insanity", function () {
+      const insanity: {
+        [k: number]: ThriftTest.Insanity | { [k: number]: ThriftTest.Insanity };
+      } = {
+        "1": {
+          "2": crazy,
+          "3": crazy,
+        },
+        "2": { "6": new ThriftTest.Insanity() },
+      };
+      var res = client.testInsanity(new ThriftTest.Insanity(crazy));
+      ok(res, JSON.stringify(res));
+      ok(insanity, JSON.stringify(insanity));
+
+      checkRecursively(res, insanity);
+    });
+
+    console.log("------------------------------------------------------------");
+    console.log("### All tests succeeded.");
+    return 0;
+  };
+
+  try {
+    var ret = execute();
+    phantom.exit(ret);
+  } catch (err) {
+    // Catch all and exit to avoid hang.
+    console.error(err);
+    phantom.exit(1);
+  }
+})();
diff --git a/lib/ts/test/server_http.js b/lib/ts/test/server_http.js
index 8380c3a..662a0a7 100644
--- a/lib/ts/test/server_http.js
+++ b/lib/ts/test/server_http.js
@@ -28,28 +28,30 @@
 //  for the es6 environment or for pre-es6 environment.
 //
 
-const thrift = require('../../nodejs/lib/thrift');
-const es6Mode = process.argv.includes('--es6');
-const genFolder = es6Mode ? 'gen-nodejs-es6' : 'gen-nodejs';
+const thrift = require("../../nodejs/lib/thrift");
+const es6Mode = process.argv.includes("--es6");
+const genFolder = es6Mode ? "gen-nodejs-es6" : "gen-nodejs";
 const ThriftTestSvc = require(`./${genFolder}/ThriftTest.js`);
-const ThriftTestHandler = require('./test_handler').ThriftTestHandler;
+const ThriftTestHandler = require("./test_handler").ThriftTestHandler;
 
 const ThriftTestSvcOpt = {
-	transport: thrift.TBufferedTransport,
-	protocol: thrift.TJSONProtocol,
-	processor: ThriftTestSvc,
-	handler: ThriftTestHandler
+  transport: thrift.TBufferedTransport,
+  protocol: thrift.TJSONProtocol,
+  processor: ThriftTestSvc,
+  handler: ThriftTestHandler,
 };
 
 const ThriftWebServerOptions = {
-	files: __dirname,
-	services: {
-		'/service': ThriftTestSvcOpt
-	}
+  files: __dirname,
+  services: {
+    "/service": ThriftTestSvcOpt,
+  },
 };
 
 const server = thrift.createWebServer(ThriftWebServerOptions);
 const port = es6Mode ? 8088 : 8089;
 server.listen(port);
 console.log(`Serving files from: ${__dirname}`);
-console.log(`Http/Thrift Server (ES6 mode ${es6Mode}) running on port: ${port}`);
+console.log(
+  `Http/Thrift Server (ES6 mode ${es6Mode}) running on port: ${port}`,
+);
diff --git a/lib/ts/test/test-int64.ts b/lib/ts/test/test-int64.ts
index 254d8d7..10e5946 100644
--- a/lib/ts/test/test-int64.ts
+++ b/lib/ts/test/test-int64.ts
@@ -16,86 +16,90 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- /* jshint -W100 */
+/* jshint -W100 */
 
 var Int64 = require("node-int64");
 var JSONInt64 = require("json-int64");
 import { Int64Test } from "./gen-js/Int64Test_types";
 
-
 // Work around for old API used by QUnitAdapter of jsTestDriver
-if (typeof QUnit.log == 'function') {
+if (typeof QUnit.log == "function") {
   // When using real QUnit (fron PhantomJS) log failures to console
-  QUnit.log(function(details) {
+  QUnit.log(function (details) {
     if (!details.result) {
-      console.log('======== FAIL ========');
-      console.log('TestName: ' + details.name);
+      console.log("======== FAIL ========");
+      console.log("TestName: " + details.name);
       if (details.message) console.log(details.message);
-      console.log('Expected: ' + details.expected);
-      console.log('Actual  : ' + details.actual);
-      console.log('======================');
+      console.log("Expected: " + details.expected);
+      console.log("Actual  : " + details.actual);
+      console.log("======================");
     }
   });
 }
 
-QUnit.module('Int64');
+QUnit.module("Int64");
 
-  QUnit.test('Int64', function(assert) {
-    console.log('Int64 test -- starts');
-    const EXPECTED_SMALL_INT64_AS_NUMBER: number = 42;
-    const EXPECTED_SMALL_INT64: typeof Int64 = new Int64(42);
-    const EXPECTED_MAX_JS_SAFE_INT64: typeof Int64 = new Int64(Number.MAX_SAFE_INTEGER);
-    const EXPECTED_MIN_JS_SAFE_INT64: typeof Int64 = new Int64(Number.MIN_SAFE_INTEGER);
-    const EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64: typeof Int64 = new Int64("0020000000000000"); // hex-encoded
-    const EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64: typeof Int64 = new Int64("ffe0000000000000"); // hex-encoded 2's complement
-    const EXPECTED_MAX_SIGNED_INT64: typeof Int64 = new Int64("7fffffffffffffff"); // hex-encoded
-    const EXPECTED_MIN_SIGNED_INT64: typeof Int64 = new Int64("8000000000000000"); // hex-encoded 2's complement
-    const EXPECTED_INT64_LIST = [
-      EXPECTED_SMALL_INT64,
-      EXPECTED_MAX_JS_SAFE_INT64,
-      EXPECTED_MIN_JS_SAFE_INT64,
-      EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64,
-      EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64,
-      EXPECTED_MAX_SIGNED_INT64,
-      EXPECTED_MIN_SIGNED_INT64
-    ];
-    assert.ok(EXPECTED_SMALL_INT64.equals(Int64Test.SMALL_INT64));
-    assert.ok(EXPECTED_MAX_JS_SAFE_INT64.equals(Int64Test.MAX_JS_SAFE_INT64));
-    assert.ok(EXPECTED_MIN_JS_SAFE_INT64.equals(Int64Test.MIN_JS_SAFE_INT64));
+QUnit.test("Int64", function (assert) {
+  console.log("Int64 test -- starts");
+  const EXPECTED_SMALL_INT64_AS_NUMBER: number = 42;
+  const EXPECTED_SMALL_INT64: typeof Int64 = new Int64(42);
+  const EXPECTED_MAX_JS_SAFE_INT64: typeof Int64 = new Int64(
+    Number.MAX_SAFE_INTEGER,
+  );
+  const EXPECTED_MIN_JS_SAFE_INT64: typeof Int64 = new Int64(
+    Number.MIN_SAFE_INTEGER,
+  );
+  const EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64: typeof Int64 = new Int64(
+    "0020000000000000",
+  ); // hex-encoded
+  const EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64: typeof Int64 = new Int64(
+    "ffe0000000000000",
+  ); // hex-encoded 2's complement
+  const EXPECTED_MAX_SIGNED_INT64: typeof Int64 = new Int64("7fffffffffffffff"); // hex-encoded
+  const EXPECTED_MIN_SIGNED_INT64: typeof Int64 = new Int64("8000000000000000"); // hex-encoded 2's complement
+  const EXPECTED_INT64_LIST = [
+    EXPECTED_SMALL_INT64,
+    EXPECTED_MAX_JS_SAFE_INT64,
+    EXPECTED_MIN_JS_SAFE_INT64,
+    EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64,
+    EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64,
+    EXPECTED_MAX_SIGNED_INT64,
+    EXPECTED_MIN_SIGNED_INT64,
+  ];
+  assert.ok(EXPECTED_SMALL_INT64.equals(Int64Test.SMALL_INT64));
+  assert.ok(EXPECTED_MAX_JS_SAFE_INT64.equals(Int64Test.MAX_JS_SAFE_INT64));
+  assert.ok(EXPECTED_MIN_JS_SAFE_INT64.equals(Int64Test.MIN_JS_SAFE_INT64));
+  assert.ok(
+    EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64.equals(
+      Int64Test.MAX_JS_SAFE_PLUS_ONE_INT64,
+    ),
+  );
+  assert.ok(
+    EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64.equals(
+      Int64Test.MIN_JS_SAFE_MINUS_ONE_INT64,
+    ),
+  );
+  assert.ok(EXPECTED_MAX_SIGNED_INT64.equals(Int64Test.MAX_SIGNED_INT64));
+  assert.ok(EXPECTED_MIN_SIGNED_INT64.equals(Int64Test.MIN_SIGNED_INT64));
+  assert.equal(
+    EXPECTED_SMALL_INT64_AS_NUMBER,
+    Int64Test.SMALL_INT64.toNumber(),
+  );
+  assert.equal(Number.MAX_SAFE_INTEGER, Int64Test.MAX_JS_SAFE_INT64.toNumber());
+  assert.equal(Number.MIN_SAFE_INTEGER, Int64Test.MIN_JS_SAFE_INT64.toNumber());
+
+  for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i) {
+    assert.ok(EXPECTED_INT64_LIST[i].equals(Int64Test.INT64_LIST[i]));
+  }
+
+  for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i) {
+    let int64Object = EXPECTED_INT64_LIST[i];
     assert.ok(
-      EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64.equals(
-        Int64Test.MAX_JS_SAFE_PLUS_ONE_INT64
-      )
+      Int64Test.INT64_2_INT64_MAP[
+        JSONInt64.toDecimalString(int64Object)
+      ].equals(int64Object),
     );
-    assert.ok(
-      EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64.equals(
-        Int64Test.MIN_JS_SAFE_MINUS_ONE_INT64
-      )
-    );
-    assert.ok(EXPECTED_MAX_SIGNED_INT64.equals(Int64Test.MAX_SIGNED_INT64));
-    assert.ok(EXPECTED_MIN_SIGNED_INT64.equals(Int64Test.MIN_SIGNED_INT64));
-    assert.equal(
-      EXPECTED_SMALL_INT64_AS_NUMBER,
-      Int64Test.SMALL_INT64.toNumber()
-    );
-    assert.equal(
-      Number.MAX_SAFE_INTEGER,
-      Int64Test.MAX_JS_SAFE_INT64.toNumber()
-    );
-    assert.equal(
-      Number.MIN_SAFE_INTEGER,
-      Int64Test.MIN_JS_SAFE_INT64.toNumber()
-    );
+  }
 
-    for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i) {
-      assert.ok(EXPECTED_INT64_LIST[i].equals(Int64Test.INT64_LIST[i]));
-    }
-
-    for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i){
-      let int64Object = EXPECTED_INT64_LIST[i];
-      assert.ok(Int64Test.INT64_2_INT64_MAP[JSONInt64.toDecimalString(int64Object)].equals(int64Object));
-    }
-
-    console.log('Int64 test -- ends');
-  });
-
+  console.log("Int64 test -- ends");
+});
diff --git a/lib/ts/test/test.ts b/lib/ts/test/test.ts
index 31fdcbf..614461d 100644
--- a/lib/ts/test/test.ts
+++ b/lib/ts/test/test.ts
@@ -7,336 +7,365 @@
 
 const transport: Thrift.Transport = new Thrift.Transport("/service");
 const protocol: Thrift.Protocol = new Thrift.Protocol(transport);
-const client: ThriftTest.ThriftTestClient = new ThriftTest.ThriftTestClient(protocol);
+const client: ThriftTest.ThriftTestClient = new ThriftTest.ThriftTestClient(
+  protocol,
+);
 
-const int64_2_pow_60: typeof Int64 = new Int64('1000000000000000');
-const int64_minus_2_pow_60: typeof Int64 = new Int64('f000000000000000');
+const int64_2_pow_60: typeof Int64 = new Int64("1000000000000000");
+const int64_minus_2_pow_60: typeof Int64 = new Int64("f000000000000000");
 
 // Work around for old API used by QUnitAdapter of jsTestDriver
-if (typeof QUnit.log == 'function') {
-    // When using real QUnit (fron PhantomJS) log failures to console
-    QUnit.log(function(details) {
-        if (!details.result) {
-        console.log('======== FAIL ========');
-        console.log('TestName: ' + details.name);
-        if (details.message) console.log(details.message);
-        console.log('Expected: ' + JSONInt64.stringify(details.expected));
-        console.log('Actual  : ' + JSONInt64.stringify(details.actual));
-        console.log('======================');
-        }
-    });
+if (typeof QUnit.log == "function") {
+  // When using real QUnit (fron PhantomJS) log failures to console
+  QUnit.log(function (details) {
+    if (!details.result) {
+      console.log("======== FAIL ========");
+      console.log("TestName: " + details.name);
+      if (details.message) console.log(details.message);
+      console.log("Expected: " + JSONInt64.stringify(details.expected));
+      console.log("Actual  : " + JSONInt64.stringify(details.actual));
+      console.log("======================");
+    }
+  });
 }
 
 // all Languages in UTF-8
-const stringTest: string = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語";
-
+const stringTest: string =
+  "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語";
 
 function checkRecursively(assert, map1: Object, map2: Object): void {
-    if (typeof map1 !== 'function' && typeof map2 !== 'function') {
-        if (!map1 || typeof map1 !== 'object') {
-            assert.equal(map1, map2);
-        } else {
-            for (let key in map1) {
-            checkRecursively(assert, map1[key], map2[key]);
-            }
-        }
+  if (typeof map1 !== "function" && typeof map2 !== "function") {
+    if (!map1 || typeof map1 !== "object") {
+      assert.equal(map1, map2);
+    } else {
+      for (let key in map1) {
+        checkRecursively(assert, map1[key], map2[key]);
+      }
     }
+  }
 }
 
+QUnit.module("Base Types");
 
-QUnit.module('Base Types');
+QUnit.test("Void", function (assert) {
+  assert.equal(client.testVoid(), undefined);
+});
+QUnit.test("Binary (String)", function (assert) {
+  let binary: string = "";
+  for (let v = 255; v >= 0; --v) {
+    binary += String.fromCharCode(v);
+  }
+  assert.equal(client.testBinary(binary), binary);
+});
+QUnit.test("Binary (Uint8Array)", function (assert) {
+  let binary: string = "";
+  for (let v = 255; v >= 0; --v) {
+    binary += String.fromCharCode(v);
+  }
+  const arr: Uint8Array = new Uint8Array(binary.length);
+  for (let i = 0; i < binary.length; ++i) {
+    arr[i] = binary[i].charCodeAt(0);
+  }
+  const hexEncodedString = Array.from(arr, function (byte) {
+    return String.fromCharCode(byte);
+  }).join("");
+  assert.equal(client.testBinary(hexEncodedString), binary);
+});
+QUnit.test("String", function (assert) {
+  assert.equal(client.testString(""), "");
+  assert.equal(client.testString(stringTest), stringTest);
 
-    QUnit.test('Void', function(assert) {
-        assert.equal(client.testVoid(), undefined);
-    });
-    QUnit.test('Binary (String)', function(assert) {
-        let binary: string = '';
-        for (let v = 255; v >= 0; --v) {
-            binary += String.fromCharCode(v);
-        }
-        assert.equal(client.testBinary(binary), binary);
-    });
-    QUnit.test('Binary (Uint8Array)', function(assert) {
-        let binary: string = '';
-        for (let v = 255; v >= 0; --v) {
-            binary += String.fromCharCode(v);
-        }
-        const arr: Uint8Array = new Uint8Array(binary.length);
-        for (let i = 0; i < binary.length; ++i) {
-            arr[i] = binary[i].charCodeAt(0);
-        }
-        const hexEncodedString = Array.from(arr, function(byte) {
-            return String.fromCharCode(byte);
-        }).join('')
-        assert.equal(client.testBinary(hexEncodedString), binary);
-    });
-    QUnit.test('String', function(assert) {
-        assert.equal(client.testString(''), '');
-        assert.equal(client.testString(stringTest), stringTest);
+  const specialCharacters: string =
+    'quote: \" backslash:' +
+    " forwardslash-escaped: \/ " +
+    " backspace: \b formfeed: \f newline: \n return: \r tab: " +
+    ' now-all-of-them-together: "\\\/\b\n\r\t' +
+    " now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><";
+  assert.equal(client.testString(specialCharacters), specialCharacters);
+});
+QUnit.test("Double", function (assert) {
+  assert.equal(client.testDouble(0), 0);
+  assert.equal(client.testDouble(-1), -1);
+  assert.equal(client.testDouble(3.14), 3.14);
+  assert.equal(client.testDouble(Math.pow(2, 60)), Math.pow(2, 60));
+});
+QUnit.test("Byte", function (assert) {
+  assert.equal(client.testByte(0), 0);
+  assert.equal(client.testByte(0x01), 0x01);
+});
+QUnit.test("I32", function (assert) {
+  assert.equal(client.testI32(0), 0);
+  assert.equal(client.testI32(Math.pow(2, 30)), Math.pow(2, 30));
+  assert.equal(client.testI32(-Math.pow(2, 30)), -Math.pow(2, 30));
+});
+QUnit.test("I64", function (assert) {
+  assert.equal(client.testI64(new Int64(0)), 0);
 
-        const specialCharacters: string = 'quote: \" backslash:' +
-            ' forwardslash-escaped: \/ ' +
-            ' backspace: \b formfeed: \f newline: \n return: \r tab: ' +
-            ' now-all-of-them-together: "\\\/\b\n\r\t' +
-            ' now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><';
-        assert.equal(client.testString(specialCharacters), specialCharacters);
-    });
-    QUnit.test('Double', function(assert) {
-        assert.equal(client.testDouble(0), 0);
-        assert.equal(client.testDouble(-1), -1);
-        assert.equal(client.testDouble(3.14), 3.14);
-        assert.equal(client.testDouble(Math.pow(2, 60)), Math.pow(2, 60));
-    });
-    QUnit.test('Byte', function(assert) {
-        assert.equal(client.testByte(0), 0);
-        assert.equal(client.testByte(0x01), 0x01);
-    });
-    QUnit.test('I32', function(assert) {
-        assert.equal(client.testI32(0), 0);
-        assert.equal(client.testI32(Math.pow(2, 30)), Math.pow(2, 30));
-        assert.equal(client.testI32(-Math.pow(2, 30)), -Math.pow(2, 30));
-    });
-    QUnit.test('I64', function(assert) {
-        assert.equal(client.testI64(new Int64(0)), 0);
+  let int64_2_pow_60_result: typeof Int64 = client.testI64(int64_2_pow_60);
+  assert.ok(int64_2_pow_60.equals(int64_2_pow_60_result));
 
-        let int64_2_pow_60_result: typeof Int64 = client.testI64(int64_2_pow_60);
-        assert.ok(int64_2_pow_60.equals(int64_2_pow_60_result));
+  let int64_minus_2_pow_60_result: typeof Int64 =
+    client.testI64(int64_minus_2_pow_60);
+  assert.ok(int64_minus_2_pow_60.equals(int64_minus_2_pow_60_result));
+});
 
-        let int64_minus_2_pow_60_result: typeof Int64 = client.testI64(int64_minus_2_pow_60);
-        assert.ok(int64_minus_2_pow_60.equals(int64_minus_2_pow_60_result));
-    });
+QUnit.module("Structured Types");
 
+QUnit.test("Struct", function (assert) {
+  const structTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct();
+  structTestInput.string_thing = "worked";
+  structTestInput.byte_thing = 0x01;
+  structTestInput.i32_thing = Math.pow(2, 30);
+  structTestInput.i64_thing = int64_2_pow_60;
 
-QUnit.module('Structured Types');
+  const structTestOutput: ThriftTest.Xtruct =
+    client.testStruct(structTestInput);
 
-    QUnit.test('Struct', function(assert) {
-        const structTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct();
-        structTestInput.string_thing = 'worked';
-        structTestInput.byte_thing = 0x01;
-        structTestInput.i32_thing = Math.pow(2, 30);
-        structTestInput.i64_thing = int64_2_pow_60;
+  assert.equal(structTestOutput.string_thing, structTestInput.string_thing);
+  assert.equal(structTestOutput.byte_thing, structTestInput.byte_thing);
+  assert.equal(structTestOutput.i32_thing, structTestInput.i32_thing);
+  assert.ok(structTestOutput.i64_thing.equals(structTestInput.i64_thing));
+  assert.ok(structTestInput.i64_thing.equals(structTestOutput.i64_thing));
 
-        const structTestOutput: ThriftTest.Xtruct = client.testStruct(structTestInput);
+  assert.equal(
+    JSONInt64.stringify(structTestOutput),
+    JSONInt64.stringify(structTestInput),
+  );
+});
 
-        assert.equal(structTestOutput.string_thing, structTestInput.string_thing);
-        assert.equal(structTestOutput.byte_thing, structTestInput.byte_thing);
-        assert.equal(structTestOutput.i32_thing, structTestInput.i32_thing);
-        assert.ok(structTestOutput.i64_thing.equals(structTestInput.i64_thing));
-        assert.ok(structTestInput.i64_thing.equals(structTestOutput.i64_thing));
+QUnit.test("Nest", function (assert) {
+  const xtrTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct();
+  xtrTestInput.string_thing = "worked";
+  xtrTestInput.byte_thing = 0x01;
+  xtrTestInput.i32_thing = Math.pow(2, 30);
+  xtrTestInput.i64_thing = int64_2_pow_60;
 
-        assert.equal(JSONInt64.stringify(structTestOutput), JSONInt64.stringify(structTestInput));
-    });
+  const nestTestInput: ThriftTest.Xtruct2 = new ThriftTest.Xtruct2();
+  nestTestInput.byte_thing = 0x02;
+  nestTestInput.struct_thing = xtrTestInput;
+  nestTestInput.i32_thing = Math.pow(2, 15);
 
-    QUnit.test('Nest', function(assert) {
-        const xtrTestInput: ThriftTest.Xtruct = new ThriftTest.Xtruct();
-        xtrTestInput.string_thing = 'worked';
-        xtrTestInput.byte_thing = 0x01;
-        xtrTestInput.i32_thing = Math.pow(2, 30);
-        xtrTestInput.i64_thing = int64_2_pow_60;
+  const nestTestOutput: ThriftTest.Xtruct2 = client.testNest(nestTestInput);
 
-        const nestTestInput: ThriftTest.Xtruct2 = new ThriftTest.Xtruct2();
-        nestTestInput.byte_thing = 0x02;
-        nestTestInput.struct_thing = xtrTestInput;
-        nestTestInput.i32_thing = Math.pow(2, 15);
+  assert.equal(nestTestOutput.byte_thing, nestTestInput.byte_thing);
+  assert.equal(
+    nestTestOutput.struct_thing.string_thing,
+    nestTestInput.struct_thing.string_thing,
+  );
+  assert.equal(
+    nestTestOutput.struct_thing.byte_thing,
+    nestTestInput.struct_thing.byte_thing,
+  );
+  assert.equal(
+    nestTestOutput.struct_thing.i32_thing,
+    nestTestInput.struct_thing.i32_thing,
+  );
+  assert.ok(
+    nestTestOutput.struct_thing.i64_thing.equals(
+      nestTestInput.struct_thing.i64_thing,
+    ),
+  );
+  assert.equal(nestTestOutput.i32_thing, nestTestInput.i32_thing);
 
-        const nestTestOutput: ThriftTest.Xtruct2 = client.testNest(nestTestInput);
+  assert.equal(
+    JSONInt64.stringify(nestTestOutput),
+    JSONInt64.stringify(nestTestInput),
+  );
+});
 
-        assert.equal(nestTestOutput.byte_thing, nestTestInput.byte_thing);
-        assert.equal(nestTestOutput.struct_thing.string_thing, nestTestInput.struct_thing.string_thing);
-        assert.equal(nestTestOutput.struct_thing.byte_thing, nestTestInput.struct_thing.byte_thing);
-        assert.equal(nestTestOutput.struct_thing.i32_thing, nestTestInput.struct_thing.i32_thing);
-        assert.ok(nestTestOutput.struct_thing.i64_thing.equals(nestTestInput.struct_thing.i64_thing));
-        assert.equal(nestTestOutput.i32_thing, nestTestInput.i32_thing);
+QUnit.test("Map", function (assert) {
+  const mapTestInput: { [k: number]: number } = { 7: 77, 8: 88, 9: 99 };
 
-        assert.equal(JSONInt64.stringify(nestTestOutput), JSONInt64.stringify(nestTestInput));
-    });
-    
-    QUnit.test('Map', function(assert) {
-        const mapTestInput: {[k: number]: number;} = {7: 77, 8: 88, 9: 99};
-    
-        const mapTestOutput: {[k: number]: number;} = client.testMap(mapTestInput);
-    
-        for (let key in mapTestOutput) {
-            assert.equal(mapTestOutput[key], mapTestInput[key]);
-        }
-    });
-    
-    QUnit.test('StringMap', function(assert) {
-        const mapTestInput: {[k: string]: string;} = {
-            'a': '123', 'a b': 'with spaces ', 'same': 'same', '0': 'numeric key',
-            'longValue': stringTest, stringTest: 'long key'
-        };
-    
-        const mapTestOutput: {[k: string]: string;} = client.testStringMap(mapTestInput);
-    
-        for (let key in mapTestOutput) {
-            assert.equal(mapTestOutput[key], mapTestInput[key]);
-        }
-    });
-    
-    QUnit.test('Set', function(assert) {
-        const setTestInput: number[] = [1, 2, 3];
-        assert.ok(client.testSet(setTestInput), setTestInput);
-    });
-    
-    QUnit.test('List', function(assert) {
-        const listTestInput: number[] = [1, 2, 3];
-        assert.ok(client.testList(listTestInput), listTestInput);
-    });
-    
-    QUnit.test('Enum', function(assert) {
-        assert.equal(client.testEnum(ThriftTest.Numberz.ONE), ThriftTest.Numberz.ONE);
-    });
-    
-    QUnit.test('TypeDef', function(assert) {
-        assert.equal(client.testTypedef(new Int64(69)), 69);
-    });
+  const mapTestOutput: { [k: number]: number } = client.testMap(mapTestInput);
 
+  for (let key in mapTestOutput) {
+    assert.equal(mapTestOutput[key], mapTestInput[key]);
+  }
+});
 
-QUnit.module('deeper!');
+QUnit.test("StringMap", function (assert) {
+  const mapTestInput: { [k: string]: string } = {
+    a: "123",
+    "a b": "with spaces ",
+    same: "same",
+    "0": "numeric key",
+    longValue: stringTest,
+    stringTest: "long key",
+  };
 
-    QUnit.test('MapMap', function(assert) {
-        const mapMapTestExpectedResult: {[K: number]: {[k: number]: number}} = {
-            '4': {'1': 1, '2': 2, '3': 3, '4': 4},
-            '-4': {'-4': -4, '-3': -3, '-2': -2, '-1': -1}
-        };
-    
-        const mapMapTestOutput = client.testMapMap(1);
-    
-    
-        for (let key in mapMapTestOutput) {
-            for (let key2 in mapMapTestOutput[key]) {
-                assert.equal(mapMapTestOutput[key][key2], mapMapTestExpectedResult[key][key2]);
-            }
-        }
-    
-        checkRecursively(assert, mapMapTestOutput, mapMapTestExpectedResult);
-    });
+  const mapTestOutput: { [k: string]: string } =
+    client.testStringMap(mapTestInput);
 
+  for (let key in mapTestOutput) {
+    assert.equal(mapTestOutput[key], mapTestInput[key]);
+  }
+});
 
-QUnit.module('Exception');
+QUnit.test("Set", function (assert) {
+  const setTestInput: number[] = [1, 2, 3];
+  assert.ok(client.testSet(setTestInput), setTestInput);
+});
 
-    QUnit.test('Xception', function(assert) {
-        assert.expect(2);
-        const done = assert.async();
-        try {
-            client.testException('Xception');
-            assert.ok(false);
-        }catch (e) {
-            assert.equal(e.errorCode, 1001);
-            assert.equal(e.message, 'Xception');
-            done();
-        }
-    });
-  
-    QUnit.test('no Exception', function(assert) {
-        assert.expect(1);
-        try {
-            client.testException('no Exception');
-            assert.ok(true);
-        }catch (e) {
-            assert.ok(false);
-        }
-    });
-  
-    QUnit.test('TException', function(assert) {
-        //ThriftTest does not list TException as a legal exception so it will
-        // generate an exception on the server that does not propagate back to
-        // the client. This test has been modified to equate to "no exception"
-        assert.expect(1);
-        try {
-            client.testException('TException');
-        } catch (e) {
-            //assert.ok(false);
-        }
-        assert.ok(true);
-    });
+QUnit.test("List", function (assert) {
+  const listTestInput: number[] = [1, 2, 3];
+  assert.ok(client.testList(listTestInput), listTestInput);
+});
 
+QUnit.test("Enum", function (assert) {
+  assert.equal(client.testEnum(ThriftTest.Numberz.ONE), ThriftTest.Numberz.ONE);
+});
 
-QUnit.module('Insanity');
+QUnit.test("TypeDef", function (assert) {
+  assert.equal(client.testTypedef(new Int64(69)), 69);
+});
 
-    const crazy: ThriftTest.Insanity = {
-        'userMap': { '5': new Int64(5), '8': new Int64(8) },
-        'xtructs': [{
-            'string_thing': 'Goodbye4',
-            'byte_thing': 4,
-            'i32_thing': 4,
-            'i64_thing': new Int64(4)
-        },
-        {
-            'string_thing': 'Hello2',
-            'byte_thing': 2,
-            'i32_thing': 2,
-            'i64_thing': new Int64(2)
-        }]
-    };
-    QUnit.test('testInsanity', function(assert) {
-        const insanity: {[k: number]: (ThriftTest.Insanity | {[k:number]: ThriftTest.Insanity})} = {
-            '1': {
-                '2': crazy,
-                '3': crazy
-            },
-            '2': { '6': new ThriftTest.Insanity() }
-        };
-        const res = client.testInsanity(new ThriftTest.Insanity(crazy));
-        assert.ok(res, JSONInt64.stringify(res));
-        assert.ok(insanity, JSONInt64.stringify(insanity));
-    
-        checkRecursively(assert, res, insanity);
-    });
+QUnit.module("deeper!");
 
+QUnit.test("MapMap", function (assert) {
+  const mapMapTestExpectedResult: { [K: number]: { [k: number]: number } } = {
+    "4": { "1": 1, "2": 2, "3": 3, "4": 4 },
+    "-4": { "-4": -4, "-3": -3, "-2": -2, "-1": -1 },
+  };
+
+  const mapMapTestOutput = client.testMapMap(1);
+
+  for (let key in mapMapTestOutput) {
+    for (let key2 in mapMapTestOutput[key]) {
+      assert.equal(
+        mapMapTestOutput[key][key2],
+        mapMapTestExpectedResult[key][key2],
+      );
+    }
+  }
+
+  checkRecursively(assert, mapMapTestOutput, mapMapTestExpectedResult);
+});
+
+QUnit.module("Exception");
+
+QUnit.test("Xception", function (assert) {
+  assert.expect(2);
+  const done = assert.async();
+  try {
+    client.testException("Xception");
+    assert.ok(false);
+  } catch (e) {
+    assert.equal(e.errorCode, 1001);
+    assert.equal(e.message, "Xception");
+    done();
+  }
+});
+
+QUnit.test("no Exception", function (assert) {
+  assert.expect(1);
+  try {
+    client.testException("no Exception");
+    assert.ok(true);
+  } catch (e) {
+    assert.ok(false);
+  }
+});
+
+QUnit.test("TException", function (assert) {
+  //ThriftTest does not list TException as a legal exception so it will
+  // generate an exception on the server that does not propagate back to
+  // the client. This test has been modified to equate to "no exception"
+  assert.expect(1);
+  try {
+    client.testException("TException");
+  } catch (e) {
+    //assert.ok(false);
+  }
+  assert.ok(true);
+});
+
+QUnit.module("Insanity");
+
+const crazy: ThriftTest.Insanity = {
+  userMap: { "5": new Int64(5), "8": new Int64(8) },
+  xtructs: [
+    {
+      string_thing: "Goodbye4",
+      byte_thing: 4,
+      i32_thing: 4,
+      i64_thing: new Int64(4),
+    },
+    {
+      string_thing: "Hello2",
+      byte_thing: 2,
+      i32_thing: 2,
+      i64_thing: new Int64(2),
+    },
+  ],
+};
+QUnit.test("testInsanity", function (assert) {
+  const insanity: {
+    [k: number]: ThriftTest.Insanity | { [k: number]: ThriftTest.Insanity };
+  } = {
+    "1": {
+      "2": crazy,
+      "3": crazy,
+    },
+    "2": { "6": new ThriftTest.Insanity() },
+  };
+  const res = client.testInsanity(new ThriftTest.Insanity(crazy));
+  assert.ok(res, JSONInt64.stringify(res));
+  assert.ok(insanity, JSONInt64.stringify(insanity));
+
+  checkRecursively(assert, res, insanity);
+});
 
 //////////////////////////////////
 //Run same tests asynchronously
 
-QUnit.module('Async');
+QUnit.module("Async");
 
-    QUnit.test('Double', function(assert) {
-        assert.expect(1);
+QUnit.test("Double", function (assert) {
+  assert.expect(1);
 
-        const done = assert.async();
-        client.testDouble(3.14159265, function(result) {
-            assert.equal(result, 3.14159265);
-            done();
-        });
-    });
+  const done = assert.async();
+  client.testDouble(3.14159265, function (result) {
+    assert.equal(result, 3.14159265);
+    done();
+  });
+});
 
-    QUnit.test('Byte', function(assert) {
-        assert.expect(1);
+QUnit.test("Byte", function (assert) {
+  assert.expect(1);
 
-        const done = assert.async();
-        client.testByte(0x01, function(result) {
-            assert.equal(result, 0x01);
-            done();
-        });
-    });
+  const done = assert.async();
+  client.testByte(0x01, function (result) {
+    assert.equal(result, 0x01);
+    done();
+  });
+});
 
-    QUnit.test('I32', function(assert) {
-        assert.expect(2);
+QUnit.test("I32", function (assert) {
+  assert.expect(2);
 
-        const done = assert.async(2);
-        client.testI32(Math.pow(2, 30), function(result) {
-            assert.equal(result, Math.pow(2, 30));
-            done();
-        });
+  const done = assert.async(2);
+  client.testI32(Math.pow(2, 30), function (result) {
+    assert.equal(result, Math.pow(2, 30));
+    done();
+  });
 
-        client.testI32(Math.pow(-2, 31), function(result) {
-            assert.equal(result, Math.pow(-2, 31));
-            done();
-        });
-    });
+  client.testI32(Math.pow(-2, 31), function (result) {
+    assert.equal(result, Math.pow(-2, 31));
+    done();
+  });
+});
 
-    QUnit.test('I64', function(assert) {
-        assert.expect(2);
+QUnit.test("I64", function (assert) {
+  assert.expect(2);
 
-        const done = assert.async(2);
-        client.testI64(int64_2_pow_60, function(result) {
-            assert.ok(int64_2_pow_60.equals(result));
-            done();
-        });
+  const done = assert.async(2);
+  client.testI64(int64_2_pow_60, function (result) {
+    assert.ok(int64_2_pow_60.equals(result));
+    done();
+  });
 
-        client.testI64(int64_minus_2_pow_60, function(result) {
-            assert.ok(int64_minus_2_pow_60.equals(result));
-            done();
-        });
-    });
+  client.testI64(int64_minus_2_pow_60, function (result) {
+    assert.ok(int64_minus_2_pow_60.equals(result));
+    done();
+  });
+});
diff --git a/lib/ts/test/test_handler.js b/lib/ts/test/test_handler.js
index 8ba296b..825c567 100644
--- a/lib/ts/test/test_handler.js
+++ b/lib/ts/test/test_handler.js
@@ -20,87 +20,87 @@
 //This is the server side Node test handler for the standard
 //  Apache Thrift test service.
 
-const es6Mode = process.argv.includes('--es6');
-const genFolder = es6Mode ? 'gen-nodejs-es6' : 'gen-nodejs';
+const es6Mode = process.argv.includes("--es6");
+const genFolder = es6Mode ? "gen-nodejs-es6" : "gen-nodejs";
 const ttypes = require(`./${genFolder}/ThriftTest_types`);
-const TException = require('../../nodejs/lib/thrift').TException;
-const Int64 = require('node-int64');
+const TException = require("../../nodejs/lib/thrift").TException;
+const Int64 = require("node-int64");
 
 exports.ThriftTestHandler = {
-  testVoid: function(result) {
-    console.log('testVoid()');
+  testVoid: function (result) {
+    console.log("testVoid()");
     result(null);
   },
-  testString: function(thing, result) {
-    console.log('testString(\'' + thing + '\')');
+  testString: function (thing, result) {
+    console.log("testString('" + thing + "')");
     result(null, thing);
   },
-  testByte: function(thing, result) {
-    console.log('testByte(' + thing + ')');
+  testByte: function (thing, result) {
+    console.log("testByte(" + thing + ")");
     result(null, thing);
   },
-  testI32: function(thing, result) {
-    console.log('testI32(' + thing + ')');
+  testI32: function (thing, result) {
+    console.log("testI32(" + thing + ")");
     result(null, thing);
   },
-  testI64: function(thing, result) {
-    console.log('testI64(' + thing + ')');
+  testI64: function (thing, result) {
+    console.log("testI64(" + thing + ")");
     result(null, thing);
   },
-  testDouble: function(thing, result) {
-    console.log('testDouble(' + thing + ')');
+  testDouble: function (thing, result) {
+    console.log("testDouble(" + thing + ")");
     result(null, thing);
   },
-  testBinary: function(thing, result) {
-    console.log('testBinary(\'' + thing + '\')');
+  testBinary: function (thing, result) {
+    console.log("testBinary('" + thing + "')");
     result(null, thing);
   },
-  testStruct: function(thing, result) {
-    console.log('testStruct(');
+  testStruct: function (thing, result) {
+    console.log("testStruct(");
     console.log(thing);
-    console.log(')');
+    console.log(")");
     result(null, thing);
   },
-  testNest: function(nest, result) {
-    console.log('testNest(');
+  testNest: function (nest, result) {
+    console.log("testNest(");
     console.log(nest);
-    console.log(')');
+    console.log(")");
     result(null, nest);
   },
-  testMap: function(thing, result) {
-    console.log('testMap(');
+  testMap: function (thing, result) {
+    console.log("testMap(");
     console.log(thing);
-    console.log(')');
+    console.log(")");
     result(null, thing);
   },
-  testStringMap: function(thing, result) {
-    console.log('testStringMap(');
+  testStringMap: function (thing, result) {
+    console.log("testStringMap(");
     console.log(thing);
-    console.log(')');
+    console.log(")");
     result(null, thing);
   },
-  testSet: function(thing, result) {
-    console.log('testSet(');
+  testSet: function (thing, result) {
+    console.log("testSet(");
     console.log(thing);
-    console.log(')');
+    console.log(")");
     result(null, thing);
   },
-  testList: function(thing, result) {
-    console.log('testList(');
+  testList: function (thing, result) {
+    console.log("testList(");
     console.log(thing);
-    console.log(')');
+    console.log(")");
     result(null, thing);
   },
-  testEnum: function(thing, result) {
-    console.log('testEnum(' + thing + ')');
+  testEnum: function (thing, result) {
+    console.log("testEnum(" + thing + ")");
     result(null, thing);
   },
-  testTypedef: function(thing, result) {
-    console.log('testTypedef(' + thing + ')');
+  testTypedef: function (thing, result) {
+    console.log("testTypedef(" + thing + ")");
     result(null, thing);
   },
-  testMapMap: function(hello, result) {
-    console.log('testMapMap(' + hello + ')');
+  testMapMap: function (hello, result) {
+    console.log("testMapMap(" + hello + ")");
 
     const mapmap = [];
     const pos = [];
@@ -114,19 +114,19 @@
 
     result(null, mapmap);
   },
-  testInsanity: function(argument, result) {
-    console.log('testInsanity(');
+  testInsanity: function (argument, result) {
+    console.log("testInsanity(");
     console.log(argument);
-    console.log(')');
+    console.log(")");
 
     const hello = new ttypes.Xtruct();
-    hello.string_thing = 'Hello2';
+    hello.string_thing = "Hello2";
     hello.byte_thing = 2;
     hello.i32_thing = 2;
     hello.i64_thing = new Int64(2);
 
     const goodbye = new ttypes.Xtruct();
-    goodbye.string_thing = 'Goodbye4';
+    goodbye.string_thing = "Goodbye4";
     goodbye.byte_thing = 4;
     goodbye.i32_thing = 4;
     goodbye.i64_thing = new Int64(4);
@@ -150,45 +150,45 @@
     insane[1] = first_map;
     insane[2] = second_map;
 
-    console.log('insane result:');
+    console.log("insane result:");
     console.log(insane);
     result(null, insane);
   },
-  testMulti: function(arg0, arg1, arg2, arg3, arg4, arg5, result) {
-    console.log('testMulti()');
+  testMulti: function (arg0, arg1, arg2, arg3, arg4, arg5, result) {
+    console.log("testMulti()");
 
     const hello = new ttypes.Xtruct();
-    hello.string_thing = 'Hello2';
+    hello.string_thing = "Hello2";
     hello.byte_thing = arg0;
     hello.i32_thing = arg1;
     hello.i64_thing = arg2;
     result(null, hello);
   },
-  testException: function(arg, result) {
-    console.log('testException(' + arg + ')');
-    if (arg === 'Xception') {
+  testException: function (arg, result) {
+    console.log("testException(" + arg + ")");
+    if (arg === "Xception") {
       const x = new ttypes.Xception();
       x.errorCode = 1001;
       x.message = arg;
       result(x);
-    } else if (arg === 'TException') {
+    } else if (arg === "TException") {
       result(new TException(arg));
     } else {
       result(null);
     }
   },
-  testMultiException: function(arg0, arg1, result) {
-    console.log('testMultiException(' + arg0 + ', ' + arg1 + ')');
-    if (arg0 === ('Xception')) {
+  testMultiException: function (arg0, arg1, result) {
+    console.log("testMultiException(" + arg0 + ", " + arg1 + ")");
+    if (arg0 === "Xception") {
       const x = new ttypes.Xception();
       x.errorCode = 1001;
-      x.message = 'This is an Xception';
+      x.message = "This is an Xception";
       result(x);
-    } else if (arg0 === ('Xception2')) {
+    } else if (arg0 === "Xception2") {
       const x2 = new ttypes.Xception2();
       x2.errorCode = 2002;
       x2.struct_thing = new ttypes.Xtruct();
-      x2.struct_thing.string_thing = 'This is an Xception2';
+      x2.struct_thing.string_thing = "This is an Xception2";
       result(x2);
     }
 
@@ -196,7 +196,9 @@
     res.string_thing = arg1;
     result(null, res);
   },
-  testOneway: function(sleepFor, result) {
-    console.log('testOneway(' + sleepFor + ') => JavaScript (like Rust) never sleeps!');
-  }
-};   //ThriftTestSvcHandler
+  testOneway: function (sleepFor, result) {
+    console.log(
+      "testOneway(" + sleepFor + ") => JavaScript (like Rust) never sleeps!",
+    );
+  },
+}; //ThriftTestSvcHandler
diff --git a/lib/ts/thrift.d.ts b/lib/ts/thrift.d.ts
index 0ba46c9..8e9d565 100644
--- a/lib/ts/thrift.d.ts
+++ b/lib/ts/thrift.d.ts
@@ -29,7 +29,7 @@
    * @property {number}  VOID   - No value (only legal for return types).
    * @property {number}  BOOL   - True/False integer.
    * @property {number}  BYTE   - Signed 8 bit integer.
-   * @property {number}  I08    - Signed 8 bit integer.     
+   * @property {number}  I08    - Signed 8 bit integer.
    * @property {number}  DOUBLE - 64 bit IEEE 854 floating point.
    * @property {number}  I16    - Signed 16 bit integer.
    * @property {number}  I32    - Signed 32 bit integer.
@@ -44,23 +44,23 @@
    * @property {number}  UTF16  - Array of bytes representing a string of UTF16 encoded characters.
    */
   interface Type {
-    'STOP': number;
-    'VOID': number;
-    'BOOL': number;
-    'BYTE': number;
-    'I08': number;
-    'DOUBLE': number;
-    'I16': number;
-    'I32': number;
-    'I64': number;
-    'STRING': number;
-    'UTF7': number;
-    'STRUCT': number;
-    'MAP': number;
-    'SET': number;
-    'LIST': number;
-    'UTF8': number;
-    'UTF16': number;
+    STOP: number;
+    VOID: number;
+    BOOL: number;
+    BYTE: number;
+    I08: number;
+    DOUBLE: number;
+    I16: number;
+    I32: number;
+    I64: number;
+    STRING: number;
+    UTF7: number;
+    STRUCT: number;
+    MAP: number;
+    SET: number;
+    LIST: number;
+    UTF8: number;
+    UTF16: number;
   }
   var Type: Type;
 
@@ -72,10 +72,10 @@
    * @property {number}  ONEWAY    - Oneway RPC call from client to server with no response.
    */
   interface MessageType {
-    'CALL': number;
-    'REPLY': number;
-    'EXCEPTION': number;
-    'ONEWAY': number;
+    CALL: number;
+    REPLY: number;
+    EXCEPTION: number;
+    ONEWAY: number;
   }
   var MessageType: MessageType;
 
@@ -92,7 +92,11 @@
    * @param {function} superConstructor - Contstructor function to set as base.
    * @param {string} [name] - Type name to set as name property in derived prototype.
    */
-  function inherits(constructor: Function, superConstructor: Function, name?: string): void;
+  function inherits(
+    constructor: Function,
+    superConstructor: Function,
+    name?: string,
+  ): void;
 
   /**
    * TException is the base class for all Thrift exceptions types.
@@ -129,17 +133,17 @@
    * @property {number}  UNSUPPORTED_CLIENT_TYPE - Unused.
    */
   interface TApplicationExceptionType {
-    'UNKNOWN': number;
-    'UNKNOWN_METHOD': number;
-    'INVALID_MESSAGE_TYPE': number;
-    'WRONG_METHOD_NAME': number;
-    'BAD_SEQUENCE_ID': number;
-    'MISSING_RESULT': number;
-    'INTERNAL_ERROR': number;
-    'PROTOCOL_ERROR': number;
-    'INVALID_TRANSFORM': number;
-    'INVALID_PROTOCOL': number;
-    'UNSUPPORTED_CLIENT_TYPE': number;
+    UNKNOWN: number;
+    UNKNOWN_METHOD: number;
+    INVALID_MESSAGE_TYPE: number;
+    WRONG_METHOD_NAME: number;
+    BAD_SEQUENCE_ID: number;
+    MISSING_RESULT: number;
+    INTERNAL_ERROR: number;
+    PROTOCOL_ERROR: number;
+    INVALID_TRANSFORM: number;
+    INVALID_PROTOCOL: number;
+    UNSUPPORTED_CLIENT_TYPE: number;
   }
   var TApplicationExceptionType: TApplicationExceptionType;
 
@@ -179,7 +183,7 @@
   /**
    * The Apache Thrift Transport layer performs byte level I/O between RPC
    * clients and servers. The JavaScript Transport object type uses Http[s]/XHR and is
-   * the sole browser based Thrift transport. Target servers must implement the http[s] 
+   * the sole browser based Thrift transport. Target servers must implement the http[s]
    * transport (see: node.js example server).
    */
   class TXHRTransport {
@@ -208,7 +212,7 @@
     /**
      * Sends the current XRH request if the transport was created with a URL and
      * the async parameter if false. If the transport was not created with a URL
-     * or the async parameter is True or the URL is an empty string, the current 
+     * or the async parameter is True or the URL is an empty string, the current
      * send buffer is returned.
      * @param {object} async - If true the current send buffer is returned.
      * @param {function} callback - Optional async completion callback.
@@ -224,7 +228,12 @@
      * @param {function} recv_method - The Thrift Service Client receive method for the call.
      * @returns {object} A new jQuery XHR object.
      */
-    jqRequest(client: Object, postData: any, args: Function, recv_method: Function): Object;
+    jqRequest(
+      client: Object,
+      postData: any,
+      args: Function,
+      recv_method: Function,
+    ): Object;
 
     /**
      * Sets the buffer to use when receiving server responses.
@@ -281,22 +290,22 @@
   /**
    * Old alias of the TXHRTransport for backwards compatibility.
    */
-  class Transport extends TXHRTransport { }
+  class Transport extends TXHRTransport {}
 
   /**
-   * The Apache Thrift Transport layer performs byte level I/O 
-   * between RPC clients and servers. The JavaScript TWebSocketTransport object 
+   * The Apache Thrift Transport layer performs byte level I/O
+   * between RPC clients and servers. The JavaScript TWebSocketTransport object
    * uses the WebSocket protocol. Target servers must implement WebSocket.
    */
   class TWebSocketTransport {
-    url: string;           //Where to connect
-    socket: any;           //The web socket
+    url: string; //Where to connect
+    socket: any; //The web socket
     callbacks: Function[]; //Pending callbacks
-    send_pending: any[];   //Buffers/Callback pairs waiting to be sent
-    send_buf: string;      //Outbound data, immutable until sent
-    recv_buf: string;      //Inbound data
-    rb_wpos: number;       //Network write position in receive buffer
-    rb_rpos: number;       //Client read position in receive buffer
+    send_pending: any[]; //Buffers/Callback pairs waiting to be sent
+    send_buf: string; //Outbound data, immutable until sent
+    recv_buf: string; //Inbound data
+    rb_wpos: number; //Network write position in receive buffer
+    rb_rpos: number; //Client read position in receive buffer
 
     /**
      * Constructor Function for the WebSocket transport.
@@ -307,12 +316,12 @@
     __reset(url: string): void;
 
     /**
-     * Sends the current WS request and registers callback. The async 
-     * parameter is ignored (WS flush is always async) and the callback 
+     * Sends the current WS request and registers callback. The async
+     * parameter is ignored (WS flush is always async) and the callback
      * function parameter is required.
      * @param {object} async - Ignored.
      * @param {function} callback - The client completion callback.
-     * @returns {undefined|string} Nothing (undefined) 
+     * @returns {undefined|string} Nothing (undefined)
      */
     flush(async: any, callback: Function): string;
 
@@ -332,7 +341,7 @@
 
     /**
      * Returns true if the transport is open
-     * @returns {boolean} 
+     * @returns {boolean}
      */
     isOpen(): boolean;
 
@@ -374,8 +383,8 @@
   }
 
   /**
-   * Apache Thrift Protocols perform serialization which enables cross 
-   * language RPC. The Protocol type is the JavaScript browser implementation 
+   * Apache Thrift Protocols perform serialization which enables cross
+   * language RPC. The Protocol type is the JavaScript browser implementation
    * of the Apache Thrift TJSONProtocol.
    */
   class TJSONProtocol {
@@ -401,17 +410,17 @@
     /**
      * Thrift IDL type string to Id mapping.
      * The mapping table looks as follows:
-     * "tf"  -> Thrift.Type.BOOL  
-     * "i8"  -> Thrift.Type.BYTE  
-     * "i16" -> Thrift.Type.I16   
-     * "i32" -> Thrift.Type.I32   
-     * "i64" -> Thrift.Type.I64   
+     * "tf"  -> Thrift.Type.BOOL
+     * "i8"  -> Thrift.Type.BYTE
+     * "i16" -> Thrift.Type.I16
+     * "i32" -> Thrift.Type.I32
+     * "i64" -> Thrift.Type.I64
      * "dbl" -> Thrift.Type.DOUBLE
      * "rec" -> Thrift.Type.STRUCT
      * "str" -> Thrift.Type.STRING
-     * "map" -> Thrift.Type.MAP   
-     * "lst" -> Thrift.Type.LIST  
-     * "set" -> Thrift.Type.SET   
+     * "map" -> Thrift.Type.MAP
+     * "lst" -> Thrift.Type.LIST
+     * "set" -> Thrift.Type.SET
      */
     RType: { [k: string]: number };
 
@@ -542,8 +551,8 @@
        @property {Thrift.MessageType} mtype - The type of message call.
        @property {number} rseqid - The sequence number of the message (0 in Thrift RPC).
      */
-    /** 
-     * Deserializes the beginning of a message. 
+    /**
+     * Deserializes the beginning of a message.
      * @returns {AnonReadMessageBeginReturn}
      */
     readMessageBegin(): { fname: string; mtype: number; rseqid: number };
@@ -551,8 +560,8 @@
     /** Deserializes the end of a message. */
     readMessageEnd(): void;
 
-    /** 
-     * Deserializes the beginning of a struct. 
+    /**
+     * Deserializes the beginning of a struct.
      * @param {string} [name] - The name of the struct (ignored).
      * @returns {object} - An object with an empty string fname property.
      */
@@ -568,8 +577,8 @@
        @property {Thrift.Type} ftype - The data type of the field.
        @property {number} fid - The unique identifier of the field.
      */
-    /** 
-     * Deserializes the beginning of a field. 
+    /**
+     * Deserializes the beginning of a field.
      * @returns {AnonReadFieldBeginReturn}
      */
     readFieldBegin(): { fname: string; ftype: number; fid: number };
@@ -584,8 +593,8 @@
        @property {Thrift.Type} vtype - The data type of the value.
        @property {number} size - The number of elements in the map.
      */
-    /** 
-     * Deserializes the beginning of a map. 
+    /**
+     * Deserializes the beginning of a map.
      * @returns {AnonReadMapBeginReturn}
      */
     readMapBegin(): { ktype: number; vtype: number; size: number };
@@ -599,8 +608,8 @@
        @property {Thrift.Type} etype - The data type of the element.
        @property {number} size - The number of elements in the collection.
      */
-    /** 
-     * Deserializes the beginning of a list. 
+    /**
+     * Deserializes the beginning of a list.
      * @returns {AnonReadColBeginReturn}
      */
     readListBegin(): { etype: number; size: number };
@@ -608,19 +617,22 @@
     /** Deserializes the end of a list. */
     readListEnd(): void;
 
-    /** 
-     * Deserializes the beginning of a set. 
+    /**
+     * Deserializes the beginning of a set.
      * @param {Thrift.Type} elemType - The data type of the elements (ignored).
      * @param {number} size - The number of elements in the list (ignored).
      * @returns {AnonReadColBeginReturn}
      */
-    readSetBegin(elemType?: number, size?: number): { etype: number; size: number };
+    readSetBegin(
+      elemType?: number,
+      size?: number,
+    ): { etype: number; size: number };
 
     /** Deserializes the end of a set. */
     readSetEnd(): void;
 
-    /** Returns an object with a value property set to 
-     *  False unless the next number in the protocol buffer 
+    /** Returns an object with a value property set to
+     *  False unless the next number in the protocol buffer
      *  is 1, in which case the value property is True. */
     readBool(): Object;
 
@@ -652,7 +664,7 @@
         next value found in the protocol buffer. */
     readBinary(): Object;
 
-    /** 
+    /**
      * Method to arbitrarily skip over data (not implemented).
      */
     skip(type: number): void;
@@ -661,7 +673,7 @@
   /**
    * Old alias of the TXHRTransport for backwards compatibility.
    */
-  class Protocol extends TJSONProtocol { }
+  class Protocol extends TJSONProtocol {}
 
   class MultiplexProtocol extends TJSONProtocol {
     serviceName: string;
@@ -673,7 +685,12 @@
      * @param {any} [strictRead]
      * @param {any} [strictWrite]
      */
-    constructor(srvName: string, trans: Object, strictRead?: any, strictWrite?: any);
+    constructor(
+      srvName: string,
+      trans: Object,
+      strictRead?: any,
+      strictWrite?: any,
+    );
 
     /**
      * Override writeMessageBegin method of prototype
