var test = require('tape')
var crypto = require('../')

var randomBytesFunctions = {
  randomBytes: require('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()
  })
}
