/*
 * 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
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
 /* jshint -W100 */

/*
 * JavaScript test suite for ThriftTest.thrift. These tests
 * will run only with jQuery (-gen js:jquery) Apache Thrift
 * interfaces. To create client code:
 *      $ thrift -gen js:jquery ThriftTest.thrift
 *
 * See also:
 * ++ test.js for generic tests
 * ++ test-nojq.js for "-gen js" only tests
 */


//////////////////////////////////
//jQuery asynchronous tests
jQuery.ajaxSetup({ timeout: 0 });

QUnit.module('jQ Async Manual');

  QUnit.test('testI32', function(assert) {
    assert.expect(2);
    const done = assert.async(2);

    const transport = new Thrift.Transport();
    const protocol = new Thrift.Protocol(transport);
    const client = new ThriftTest.ThriftTestClient(protocol);

    const 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);
        assert.equal(client.recv_testI32(), Math.pow(-2, 31));
        done();
      },
      error: function() { assert.ok(false); },
      complete: function() {
        assert.ok(true);
        done();
      }
    });
  });

  QUnit.test('testI64', function(assert) {
    assert.expect(2);
    const done = assert.async(2);

    const transport = new Thrift.Transport();
    const protocol = new Thrift.Protocol(transport);
    const client = new ThriftTest.ThriftTestClient(protocol);

    jQuery.ajax({
      url: '/service',
      //This is usually 2^61 but JS cannot represent anything over 2^52 accurately
      data: client.send_testI64(Math.pow(-2, 52)),
      type: 'POST',
      cache: false,
      dataType: 'text',
      success: function(res) {
        transport.setRecvBuffer(res);
        //This is usually 2^61 but JS cannot represent anything over 2^52 accurately
        assert.equal(client.recv_testI64(), Math.pow(-2, 52));
        done();
      },
      error: function() { assert.ok(false); },
      complete: function() {
        assert.ok(true);
        done();
      }
    });
  });


QUnit.module('jQ Async');
  QUnit.test('I32', function(assert) {
    assert.expect(3);

    const done = assert.async(3);
    client.testI32(Math.pow(2, 30), function(result) {
      assert.equal(result, Math.pow(2, 30));
      done();
    });

    const jqxhr = client.testI32(Math.pow(-2, 31), function(result) {
      assert.equal(result, Math.pow(-2, 31));
      done();
    });

    jqxhr.success(function(result) {
      assert.equal(result, Math.pow(-2, 31));
      done();
    });
  });

  QUnit.test('I64', function(assert) {
    assert.expect(4);

    const done = assert.async(4);
    //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
    client.testI64(Math.pow(2, 52), function(result) {
      assert.equal(result, Math.pow(2, 52));
      done();
    });

    //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
    client.testI64(Math.pow(-2, 52), function(result) {
      assert.equal(result, Math.pow(-2, 52));
      done();
    })
    .error(function(xhr, status, e) { assert.ok(false, e.message); })
    .success(function(result) {
      //This is usually 2^60 but JS cannot represent anything over 2^52 accurately
      assert.equal(result, Math.pow(-2, 52));
      done();
    })
    .complete(function() {
      assert.ok(true);
      done();
    });
  });

  QUnit.test('Xception', function(assert) {
    assert.expect(2);

    const done = assert.async(2);

    const dfd = client.testException('Xception', function(result) {
      assert.ok(false);
      done();
    })
    .error(function(xhr, status, e) {
      assert.equal(e.errorCode, 1001);
      assert.equal(e.message, 'Xception');
      done();
      $(document).ajaxError( function() { done(); } );
    });
  });