/*
 *   Test utils.betterErrors. utils.betterErrors should provide sensible error messages even when the error does not
 *   contain expected, actual or operator.
 */
var assert = require("../lib/assert");
var should = require("should");
var types = require("../lib/types");
var util = require('util');
var utils = require("../lib/utils");

function betterErrorStringFromError(error) {
    var assertion = types.assertion({error: error});
    var better = utils.betterErrors(assertion);
    return better.error.stack.toString();
}

function performBasicChecks(betterErrorString) {
    betterErrorString.should.include("AssertionError");
    betterErrorString.should.include("test-bettererrors");
    //betterErrorString.should.not.include("undefined");
}

/**
 * Control test. Provide an AssertionError that contains actual, expected operator values.
 * @param test the test object from nodeunit
 */
exports.testEqual = function (test) {
    try {
        assert.equal(true, false);
    } catch (error) {
        var betterErrorString = betterErrorStringFromError(error);
        performBasicChecks(betterErrorString);
        betterErrorString.should.include("true");
        betterErrorString.should.include("false");
        betterErrorString.should.include("==");
        test.done();
    }
};

/**
 * Test an AssertionError that does not contain actual, expected or operator values.
 * @param test the test object from nodeunit
 */
exports.testAssertThrows = function (test) {
    try {
        assert.throws(function () {
        });
    } catch (error) {
        var betterErrorString = betterErrorStringFromError(error);
        performBasicChecks(betterErrorString);
        test.done();
    }
};

/**
 * Test with an error that is not an AssertionError.
 *
 * This function name MUST NOT include "AssertionError" because one of the
 * tests it performs asserts that the returned error string does not contain
 * the "AssertionError" term. If this function name does include that term, it
 * will show up in the stack trace and the test will fail!
 * @param test the test object from nodeunit
 */
exports.testErrorIsNotAssertion = function (test) {
    try {
        throw new Error("test error");
    } catch (error) {
        var betterErrorString = betterErrorStringFromError(error);
        betterErrorString.should.not.include("AssertionError");
        betterErrorString.should.include("Error");
        betterErrorString.should.include("test error");
        betterErrorString.should.include("test-bettererrors");
        betterErrorString.should.not.include("undefined");
        test.done();
    }
};
