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

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

suite.addBatch({
  'tukey cdf': {
    'topic': function() {
      return jStat;
    },
    'check cdf calculation': function(jStat) {
      var tol = 0.0000001;
      // Answers obtained from R's ptukey()
      var q = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
      var k2v2 = [0.0000000, 0.4472266, 0.7071328, 0.8320894, 0.8944794, 0.9285421, 0.9487620, 0.9616160, 0.9702482, 0.9763065];
      var k2v100 = [0.0000000, 0.5188553, 0.8395949, 0.9636331, 0.9943478, 0.9993817, 0.9999506, 0.9999970, 0.9999999, 1.0000000];
      var k100v100 = [0.000000e+00, 0.000000e+00, 0.000000e+00, 5.654157e-05, 5.078565e-02, 5.034959e-01, 9.022779e-01, 9.906062e-01, 9.994254e-01, 9.999738e-01];
      var k100v500 = [0.000000e+00, 0.000000e+00, 0.000000e+00, 7.227379e-06, 3.438621e-02, 5.170646e-01, 9.304461e-01, 9.960479e-01, 9.998819e-01, 9.999979e-01];
      for (var i = 0; i < q.length; ++i) {
        assert.epsilon(tol, jStat.tukey.cdf(q[i], 2, 2), k2v2[i]);
        assert.epsilon(tol, jStat.tukey.cdf(q[i], 2, 100), k2v100[i]);
        assert.epsilon(tol, jStat.tukey.cdf(q[i], 100, 100), k100v100[i]);
        assert.epsilon(tol, jStat.tukey.cdf(q[i], 100, 500), k100v500[i]);
      }
    }
  },
  'tukey inv': {
    'topic': function() {
      return jStat;
    },
    'check inv calculation': function(jStat) {
      var tol = 0.0001;
      // Answers obtained from R's qtukey()
      var p = [0.9, 0.95, 0.997, 0.9995];
      var k2v2 = [4.128183, 6.079637, 24.226336, 40.514830];
      var k2v100 = [2.347926, 2.805759, 4.302286, 5.088820];
      var k100v100 = [5.988671, 6.312643, 7.424273, 8.046847];
      var k100v500 = [5.848500, 6.130686, 7.084854, 7.607542];
      for (var i = 0; i < p.length; ++i) {
        assert.epsilon(tol, jStat.tukey.inv(p[i], 2, 2), k2v2[i]);
        assert.epsilon(tol, jStat.tukey.inv(p[i], 2, 100), k2v100[i]);
        assert.epsilon(tol, jStat.tukey.inv(p[i], 100, 100), k100v100[i]);
        assert.epsilon(tol, jStat.tukey.inv(p[i], 100, 500), k100v500[i]);
      }
    }
  }
});

suite.export(module);