import nimcrypto/sysrand, nimcrypto/utils
import unittest

when defined(nimHasUsed): {.used.}

suite "OS random source Tests":
  test "Availability test":
    var buffer: array[1024, uint8]
    let count = randomBytes(addr buffer[0], 1024)
    check:
      count == 1024
      buffer.isFullZero() == false
  test "OpenArray[T] test":
    var buffer1: array[256, uint8]
    var buffer2: array[128, uint16]
    var buffer4: array[64, uint32]
    var buffer8: array[32, uint64]
    let count1 = randomBytes(buffer1)
    let count2 = randomBytes(buffer2)
    let count4 = randomBytes(buffer4)
    let count8 = randomBytes(buffer8)
    check:
      count1 == 256
      count2 == 128
      count4 == 64
      count8 == 32
      buffer1.isFullZero() == false
      buffer2.isFullZero() == false
      buffer4.isFullZero() == false
      buffer8.isFullZero() == false
      equalMem(addr buffer1[0], addr buffer2[0], 256) != true
      equalMem(addr buffer1[0], addr buffer4[0], 256) != true
      equalMem(addr buffer1[0], addr buffer8[0], 256) != true
      equalMem(addr buffer2[0], addr buffer4[0], 256) != true
      equalMem(addr buffer2[0], addr buffer8[0], 256) != true
      equalMem(addr buffer4[0], addr buffer8[0], 256) != true
  test "Issue #33 test":
    proc test(): bool {.raises:[].} =
      var test: array[8, byte]
      if randomBytes(test) == 8:
        result = true

    check test() == true