// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

var test = require('prova');
var Promise = require('../../src/lib/promise');
var asyncCall = require('../../src/lib/async-call');
var InspectableFunction = require('../../src/lib/inspectable-function');

test('Test async validate call that returns a resolving promise',
  function(t) {
  function promiseResolver(a, b) {
    t.equal(a, 'A', 'expected A');
    t.equal(b, 'B', 'expected B');
    return Promise.resolve();
  }
  var inspectFn = new InspectableFunction(promiseResolver);
  asyncCall(null, null, inspectFn, 0, ['A', 'B'], function(err, res) {
    t.notOk(err, 'err should be falsy');
    t.deepEqual(res, [], 'Expected empty list result');
    t.end();
  });
});

test('Test async call that returns a rejecting promise', function(t) {
  function promiseRejector() {
    return Promise.reject('BadLuck');
  }
  var inspectFn = new InspectableFunction(promiseRejector);
  asyncCall(null, null, inspectFn, 0, [], function(err) {
    t.deepEqual(err, new Error('BadLuck'), 'Expected same rejection result');
    t.end();
  });
});

test('Test async call that uses success callback', function(t) {
  function succeedingCallback(a, b, cb) {
    t.equal(a, 'A', 'expected A');
    t.equal(b, 'B', 'expected B');
    cb(null, 'O');
  }
  var inspectFn = new InspectableFunction(succeedingCallback);
  asyncCall(null, null, inspectFn, 1, ['A', 'B'], function(err, res) {
    t.notOk(err, 'err should be falsy');
    t.deepEqual(res, ['O'], 'expected single item output');
    t.end();
  });
});

test('Test async call that uses failing callback', function(t) {
  function failingCallback(cb) {
    cb(new Error('failingMessage'));
  }
  var inspectFn = new InspectableFunction(failingCallback);
  asyncCall(null, null, inspectFn, 1, [], function(err) {
    t.deepEqual(err, new Error('failingMessage'),
    'Expected same rejection result');
    t.end();
  });
});

test('Test async call that throws', function(t) {
  function asyncThrow() {
    throw 'thrown val';
  }
  var inspectFn = new InspectableFunction(asyncThrow);
  asyncCall(null, null, inspectFn, 0, [], function(err) {
    t.deepEqual(err, new Error('thrown val'),
      'expected to get thrown value as error arg in callback');
      t.end();
  });
});

test('Test no results with callback', function(t) {
  function noResCallback(cb) {
    cb(null);
  }
  var inspectFn = new InspectableFunction(noResCallback);
  asyncCall(null, null, inspectFn, 0, [], function(err, res) {
    t.deepEqual(res, [], 'expected empty list when no results');
    t.end();
  });
});

test('Test single result with callback', function(t) {
  function singleResCallback(cb) {
    cb(null, 'A');
  }
  var inspectFn = new InspectableFunction(singleResCallback);
  asyncCall(null, null, inspectFn, 1, [], function(err, res) {
    t.deepEqual(res, ['A'], 'expected single item list');
    t.end();
  });
});

test('Test multiple results with callback', function(t) {
  function multiCallback(cb) {
    cb(null, 'A', 'B', 'C');
  }
  var inspectFn = new InspectableFunction(multiCallback);
  asyncCall(null, null, inspectFn, 3, [], function(err, res) {
    t.deepEqual(res, ['A', 'B', 'C'], 'expected all args in array');
    t.end();
  });
});

test('Test fewer than expected results with callback', function(t) {
  function fewerCallback(cb) {
    cb(null, 'A', 'B');
  }
  var inspectFn = new InspectableFunction(fewerCallback);
  asyncCall(null, null, inspectFn, 3, [], function(err, res) {
    t.deepEqual(res, ['A', 'B'].concat(new Array(1)),
    'expected unspecified args to be undefined');
    t.end();
  });
});

test('Test greater than expected results with callback', function(t) {
  function greaterCallback(cb) {
    cb(null, 'A', 'B', 'C', 'D');
  }
  var inspectFn = new InspectableFunction(greaterCallback);
  asyncCall(null, null, inspectFn, 3, [], function(err, res) {
    t.deepEqual(res, ['A', 'B', 'C'],
    'expected extra args to be ignored');
    t.end();
  });
});

test('Test no results with promise', function(t) {
  function noResPromise() {
    return Promise.resolve();
  }
  var inspectFn = new InspectableFunction(noResPromise);
  asyncCall(null, null, inspectFn, 0, [], function(err, res) {
    t.deepEqual(res, [], 'expected empty list when no results');
    t.end();
  });
});

test('Test single result with promise', function(t) {
  function singleResPromise() {
    return Promise.resolve('A');
  }
  var inspectFn = new InspectableFunction(singleResPromise);
  asyncCall(null, null, inspectFn, 1, [], function(err, res) {
    t.deepEqual(res, ['A'], 'expected single item list');
    t.end();
  });
});

test('Test multiple results with promise', function(t) {
  function multiPromise() {
    return Promise.resolve(['A', 'B', 'C']);
  }
  var inspectFn = new InspectableFunction(multiPromise);
  asyncCall(null, null, inspectFn, 3, [], function(err, res) {
    t.deepEqual(res, ['A', 'B', 'C'], 'expected all args in array');
    t.end();
  });
});

test('Test fewer than expected results with promise', function(t) {
  function fewerPromise() {
    return Promise.resolve(['A', 'B']);
  }
  var inspectFn = new InspectableFunction(fewerPromise);
  asyncCall(null, null, inspectFn, 3, [], function(err) {
    t.ok(err,
      'expected error when providing wrong number of results with promise');
    t.end();
  });
});

test('Test greater than expected results with promise', function(t) {
  function greaterPromise() {
    return Promise.resolve(['A', 'B', 'C', 'D']);
  }
  var inspectFn = new InspectableFunction(greaterPromise);
  asyncCall(null, null, inspectFn, 3, [], function(err, res) {
    t.ok(err,
      'expected error when providing wrong number of results with promise');
    t.end();
  });
});


test('Test no results returning directly', function(t) {
  function noRes() {
  }
  var inspectFn = new InspectableFunction(noRes);
  asyncCall(null, null, inspectFn, 0, [], function(err, res) {
    t.deepEqual(res, [], 'expected empty list when no results');
    t.end();
  });
});

test('Test single result returning directly', function(t) {
  function singleRes() {
    return 'A';
  }
  var inspectFn = new InspectableFunction(singleRes);
  asyncCall(null, null, inspectFn, 1, [], function(err, res) {
    t.deepEqual(res, ['A'], 'expected single item list');
    t.end();
  });
});

test('Test multiple results returning directly', function(t) {
  function multiRes() {
    return ['A', 'B', 'C'];
  }
  var inspectFn = new InspectableFunction(multiRes);
  asyncCall(null, null, inspectFn, 3, [], function(err, res) {
    t.deepEqual(res, ['A', 'B', 'C'], 'expected all args in array');
    t.end();
  });
});

test('Test fewer than expected results returning directly', function(t) {
  function fewerRes() {
    return ['A', 'B'];
  }
  var inspectFn = new InspectableFunction(fewerRes);
  asyncCall(null, null, inspectFn, 3, [], function(err) {
    t.ok(err,
      'expected error when providing wrong number of results with promise');
    t.end();
  });
});

test('Test greater than expected results returning directly', function(t) {
  function greaterRes() {
    return ['A', 'B', 'C', 'D'];
  }
  var inspectFn = new InspectableFunction(greaterRes);
  asyncCall(null, null, inspectFn, 3, [], function(err, res) {
    t.ok(err,
      'expected error when providing wrong number of results with promise');
    t.end();
  });
});

test('Test returning non-undefined to zero out arg function fails',
  function(t) {
  function returnNonUndefined() {
    return 5;
  }
  var inspectFn = new InspectableFunction(returnNonUndefined);
  asyncCall(null, null, inspectFn, 0, [], function(err) {
    t.ok((''+err).indexOf(
      'Non-undefined value returned from function with 0 out args') !== -1,
      'Expected error when non-undefined value returned');
    t.end();
  });
});

test('Test callback only called once',
  function(t) {
  function callbackOnce(cb) {
    cb(null, 'A');
    cb(null, 'B');
  }
  var inspectFn = new InspectableFunction(callbackOnce);
  asyncCall(null, null, inspectFn, 1, [], function(err, res) {
    t.deepEqual(res, ['A'], 'expected to get result of first callback');
    t.end();
  });
});

test('Test setting "this" for invocation', function(t) {
  var obj = {
    set: false,
    f: function() {
      this.set = true;
      return Promise.resolve();
    }
  };
  var inspectFn = new InspectableFunction(obj.f);
  asyncCall(null, obj, inspectFn, 0, [], function(err) {
    t.notOk(err, 'did not expect error');
    t.equal(obj.set, true, 'should set to true');
    t.end();
  });
});
