// 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, [], ['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, [], [], 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, ['a'], ['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, ['a'], [], 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, [], [], 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, [], [], 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, ['a'], [], 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, ['a', 'b', 'c'], [], 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, ['a', 'b', 'c'], [], function(err, res) {
    t.ok(err,
      'expected error when providing too few results with callback');
    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, ['a', 'b', 'c'], [], function(err, res) {
    t.ok(err,
      'expected error when providing too many results with callback');
    t.end();
  });
});

test('Test no results with promise', function(t) {
  function noResPromise() {
    return Promise.resolve();
  }
  var inspectFn = new InspectableFunction(noResPromise);
  asyncCall(null, null, inspectFn, [], [], 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, ['a'], [], 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, ['a', 'b', 'c'], [], 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, ['a', 'b', 'c'], [], function(err) {
    t.ok(err,
      'expected error when providing too few 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, ['a', 'b', 'c'], [], function(err, res) {
    t.ok(err,
      'expected error when providing too many results with promise');
    t.end();
  });
});


test('Test no results returning directly', function(t) {
  function noRes() {
  }
  var inspectFn = new InspectableFunction(noRes);
  asyncCall(null, null, inspectFn, [], [], 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, ['a'], [], 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, ['a', 'b', 'c'], [], 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, ['a', 'b', 'c'], [], function(err) {
    t.ok(err,
      'expected error when providing too few 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, ['a', 'b', 'c'], [], function(err, res) {
    t.ok(err,
      'expected error when providing too many 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, [], [], function(err) {
    t.ok((''+err).indexOf(
      'Expected 0 results, but got 1') !== -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, ['a'], [], 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, [], [], function(err) {
    t.notOk(err, 'did not expect error');
    t.equal(obj.set, true, 'should set to true');
    t.end();
  });
});
