var test = require('tape')
var crypto = require('../')
var randomBytes = require('randombytes')
var randomBytesFunctions = {
  randomBytes: randomBytes,
  pseudoRandomBytes: crypto.pseudoRandomBytes
}
for (var randomBytesName in randomBytesFunctions) {
  // Both randomBytes and pseudoRandomBytes should provide the same interface
  var randomBytes = randomBytesFunctions[randomBytesName];
  test('get error message', function (t) {
  
    try {
      var b = randomBytes(10)
      t.ok(Buffer.isBuffer(b))
      t.end()
    } catch (err) {
      t.ok(/not supported/.test(err.message), '"not supported"  is in error message')
      t.end()
    }
  
  })
  
  test(randomBytesName, function (t) {
      t.plan(5);
      t.equal(randomBytes(10).length, 10);
      t.ok(Buffer.isBuffer(randomBytes(10)))
      randomBytes(10, function(ex, bytes) {
          t.error(ex);
          t.equal(bytes.length, 10);
          t.ok(Buffer.isBuffer(bytes))
          t.end();
    });
  });
  
  test(randomBytesName + ' seem random', function (t) {
  
    var L = 1000
    var b = randomBytes(L)
  
    var mean = [].reduce.call(b, function (a, b) { return a + b}, 0) / L
  
    // test that the random numbers are plausably random.
    // Math.random() will pass this, but this will catch
    // terrible mistakes such as this blunder:
    // https://github.com/dominictarr/crypto-browserify/commit/3267955e1df7edd1680e52aeede9a89506ed2464#commitcomment-7916835
  
    // this doesn't check that the bytes are in a random *order*
    // but it's better than nothing.
  
    var expected = 256/2
    var smean = Math.sqrt(mean)
    //console.log doesn't work right on testling, *grumble grumble*
    console.log(JSON.stringify([expected - smean, mean, expected + smean]))
    t.ok(mean < expected + smean)
    t.ok(mean > expected - smean)
  
    t.end()
  
  })
}

