// Require the dependencies
var assert = require("assert");
var promisify = require(".");

// Start the tests
describe('Test without arguments', function() {
    var asyncMethod = function(callback) {
        callback(null, "Hello world!");
    };

    var fn = promisify(asyncMethod);

    it("should assert the string to match the original (callback version)", function(done) {
        fn(function(err, str) {
            assert.equal(null, err);
            assert.equal("Hello world!", str);
            done();
        });
    });

    it("should assert the string to match the original (promise version)", function(done) {
        fn()
        .then(function(str) {
            assert.equal("Hello world!", str);
        })
        .catch(function(err) {
            assert.equal(null, str);
        })
        .then(done);
    });
});

describe('Sum two arguments, using the err and value args', function() {
    var asyncMethod = function(num1, num2, callback) {
        callback(num1, num2);
    };

    var fn = promisify(asyncMethod);

    it("should assert the num to be equally to 15", function(done) {
        fn(3, 12, function(err, value) {
            assert.equal(15, err + value);
            done();
        });
    });

    it("should assert the promise to the exact numbers", function(done) {
        fn(3, 12)
        .then(function(value) {
            assert.equal(12, value);
        })
        .catch(function(err) {
            assert.equal(3, err);
        })
        .then(done);
    });
});

describe('Promisify a native Node module', function() {
    var fs = promisify(require("fs"));
    var crypto = require("crypto");

    it("should assert the hashed content of the LICENSE file", function() {
        return fs.readFile("./LICENSE")
        .then(function(content) {
            var hash = crypto
                    .createHash("sha1")
                    .update(content)
                    .digest("hex");

            assert.equal("504af7b48f92e3f9d6d96cf8913bfa60514eefde", hash);
        });
    });
});

describe('callback handling', function() {
  it('should throw error if using a callback', function(done) {
    var failMe = promisify(function(msg, cb) {
      throw new Error(msg);
    });

    try {
      failMe('fail', function () {});
    } catch (err) {
      assert.equal(err.message, 'fail')
      done();
    }
  });
});
