THRIFT-2350 Add async calls to normal JavaScript
Patch: Randy Abernethy
diff --git a/lib/js/test/test.js b/lib/js/test/test.js
index b0904a9..7351fd9 100755
--- a/lib/js/test/test.js
+++ b/lib/js/test/test.js
@@ -1,4 +1,4 @@
-/*
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements. See the NOTICE file
  * distributed with this work for additional information
@@ -19,7 +19,32 @@
  /* jshint -W100 */
  
 /*
- * JavaScript test suite
+ * JavaScript test suite for ThriftTest.thrift. These tests
+ * will run against Normal (-gen js) and jQuery (-gen js:jquery)
+ * Apache Thrift interfaces.
+ *
+ * Synchronous blocking calls should be identical in both 
+ * Normal and jQuery interfaces. All synchronous tests belong
+ * here.
+ * 
+ * Asynchronous sucess callbacks passed as the last parameter 
+ * of an RPC call should be identical in both Normal and jQuery
+ * interfaces. Async success tests belong here.
+ * 
+ * Asynchronous exception processing is different in Normal
+ * and jQuery interfaces. Such tests belong in the test-nojq.js
+ * or test-jq.js files respectively. jQuery specific XHR object
+ * tests also belong in test-jq.js. Do not create any jQuery 
+ * dependencies in this file or in test-nojq.js
+ *
+ * To compile client code for this test use:
+ *      $ thrift -gen js ThriftTest.thrift
+ *      -- or --
+ *      $ thrift -gen js:jquery ThriftTest.thrift
+ *
+ * See also:
+ * ++ test-nojq.js for "-gen js" only tests  
+ * ++ test-jq.js for "-gen js:jquery" only tests
  */
 
 var transport = new Thrift.Transport("/service");
@@ -74,8 +99,9 @@
   });
   test("I64", function() {
     equal(client.testI64(0), 0);
-    equal(client.testI64(Math.pow(2,60)), Math.pow(2,60));
-    equal(client.testI64(-Math.pow(2,60)), -Math.pow(2,60));
+    //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
+    equal(client.testI64(Math.pow(2,52)), Math.pow(2,52));
+    equal(client.testI64(-Math.pow(2,52)), -Math.pow(2,52));
   });
 
 
@@ -86,7 +112,8 @@
     structTestInput.string_thing = 'worked';
     structTestInput.byte_thing = 0x01;
     structTestInput.i32_thing = Math.pow(2,30);
-    structTestInput.i64_thing = Math.pow(2,60);
+    //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
+    structTestInput.i64_thing = Math.pow(2,52);
 
     var structTestOutput = client.testStruct(structTestInput);
 
@@ -103,7 +130,8 @@
     xtrTestInput.string_thing = 'worked';
     xtrTestInput.byte_thing = 0x01;
     xtrTestInput.i32_thing = Math.pow(2,30);
-    xtrTestInput.i64_thing = Math.pow(2,60);
+    //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
+    xtrTestInput.i64_thing = Math.pow(2,52);
     
     var nestTestInput = new ThriftTest.Xtruct2();
     nestTestInput.byte_thing = 0x02;
@@ -206,12 +234,16 @@
   });
 
   test("TException", function() {
+    //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"
     expect(1);
     try{
       client.testException("TException");
     } catch(e) {
-      ok(true);
+      //ok(false);
     }
+    ok(true);
   });
 
 
@@ -265,64 +297,6 @@
 
 //////////////////////////////////
 //Run same tests asynchronously
-jQuery.ajaxSetup({ timeout: 0 });
-$(document).ajaxError( function() { QUnit.start(); } );
-
-module("Async Manual");
-
-  test("testI32", function() {
-    expect( 2 );
-    QUnit.stop();
-
-    var transport = new Thrift.Transport();
-    var protocol  = new Thrift.Protocol(transport);
-    var client    = new ThriftTest.ThriftTestClient(protocol);
-
-    var jqxhr = jQuery.ajax({
-      url: "/service",
-      data: client.send_testI32(Math.pow(-2,31)),
-      type: "POST",
-      cache: false,
-      dataType: "text",
-      success: function(res){
-        transport.setRecvBuffer( res );
-        equal(client.recv_testI32(), Math.pow(-2,31));
-      },
-      error: function() { ok(false); },
-      complete: function() {
-        ok(true);
-        QUnit.start();
-      }
-    });
-  });
-
-
-  test("testI64", function() {
-    expect( 2 );
-    QUnit.stop();
-
-    var transport = new Thrift.Transport();
-    var protocol  = new Thrift.Protocol(transport);
-    var client    = new ThriftTest.ThriftTestClient(protocol);
-
-    jQuery.ajax({
-      url: "/service",
-      data: client.send_testI64(Math.pow(-2,61)),
-      type: "POST",
-      cache: false,
-      dataType: "text",
-      success: function(res){
-        transport.setRecvBuffer( res );
-        equal(client.recv_testI64(), Math.pow(-2,61));
-      },
-      error: function() { ok(false); },
-      complete: function() {
-        ok(true);
-        QUnit.start();
-      }
-    });
-  });
-
 
 module("Async");
 
@@ -347,7 +321,7 @@
   });
 
   test("I32", function() {
-    expect( 3 );
+    expect( 2 );
 
     QUnit.stop();
     client.testI32(Math.pow(2,30), function(result) {
@@ -356,53 +330,26 @@
     });
 
     QUnit.stop();
-    var jqxhr = client.testI32(Math.pow(-2,31), function(result) {
-      equal(result, Math.pow(-2,31));
-    });
-
-    jqxhr.success(function(result) {
+    client.testI32(Math.pow(-2,31), function(result) {
       equal(result, Math.pow(-2,31));
       QUnit.start();
     });
   });
 
   test("I64", function() {
-    expect( 4 );
-
-    QUnit.stop();
-    client.testI64(Math.pow(2,60), function(result) {
-      equal(result, Math.pow(2,60));
-      QUnit.start();
-    });
-
-    QUnit.stop();
-    client.testI64(Math.pow(-2,61), function(result) {
-      equal(result, Math.pow(-2,61));
-    })
-    .error( function(xhr, status, e) {  ok(false, e.message); } )
-    .success(function(result) {
-      equal(result, Math.pow(-2,61));
-    })
-    .complete(function() {
-      ok(true);
-      QUnit.start();
-    });
-  });
-
-  test("Xception", function() {
     expect( 2 );
 
     QUnit.stop();
-
-    var dfd = client.testException("Xception", function(result) {
-      ok(false);
+    //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
+    client.testI64(Math.pow(2,52), function(result) {
+      equal(result, Math.pow(2,52));
       QUnit.start();
-    })
-    .error(function(xhr, status, e){
-      equal(e.errorCode, 1001);
-      equal(e.message, "Xception");
-      //QUnit.start();
-      //Note start is not required here because:
-      //$(document).ajaxError( function() { QUnit.start(); } );
+    });
+
+    QUnit.stop();
+    //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
+    client.testI64(Math.pow(-2,52), function(result) {
+      equal(result, Math.pow(-2,52));
+      QUnit.start();
     });
   });