var vows = require('vows');
var assert = require('assert');
var suite = vows.describe('jStat.distribution');

require('../env.js');

var tol = 0.0000001;

suite.addBatch({
    'cauchy pdf': {
        'topic': function() {
            return jStat;
        },
        'check pdf calculation': function(jStat) {
            var pdf = jStat.cauchy.pdf;

            assert.epsilon(tol, pdf(1, 0, 1), 1 / (2 * Math.PI));
            assert.epsilon(tol, pdf(3, 0, 1), 1 / (10 * Math.PI));
            assert.epsilon(tol, pdf(-2, 0, 1), 1 / (5 * Math.PI));

            //Location parameter
            assert.epsilon(tol, pdf(1, 1, 1), 1 / Math.PI);
            assert.epsilon(tol, pdf(0, -3, 1), 1 / (10 * Math.PI));

            //Scale parameter
            assert.epsilon(tol, pdf(0, 1, 3), 1 / ((10 / 3) * Math.PI));
            assert.epsilon(tol, pdf(0, 1, 0.5), 1 / (2.5 * Math.PI));

            //Negative test cases
            assert.epsilon(tol, pdf(0, 0, -3), 0);
        },
        'check cdf calculations': function(jStat) {
            var cdf = jStat.cauchy.cdf;

            assert.epsilon(tol, cdf(0, 0, 1), 0.5);
            assert.epsilon(tol, cdf(3, 0, 1), (Math.atan(3) / Math.PI) + 0.5);

            assert.epsilon(tol, cdf(0, 1, 1), (Math.atan(-1) / Math.PI) + 0.5);
            assert.epsilon(tol, cdf(3, 1, 1), (Math.atan(2) / Math.PI) + 0.5);

            assert.epsilon(tol, cdf(0, 1, 2), (Math.atan(-0.5) / Math.PI) + 0.5);
            assert.epsilon(tol, cdf(1, 0, 0.5), (Math.atan(2) / Math.PI) + 0.5);
        },
        'median': function(jStat) {
            var median = jStat.cauchy.median;

            assert.epsilon(tol, median(0, 1), 0);
            assert.epsilon(tol, median(0, 4), 0);
            assert.epsilon(tol, median(-2, 1), -2);
        },
        'mode': function(jStat) {
            var mode = jStat.cauchy.mode;

            assert.epsilon(tol, mode(0, 1), 0);
            assert.epsilon(tol, mode(0, 4), 0);
            assert.epsilon(tol, mode(-2, 1), -2);
        }
    }
});

suite.export(module);