packages feed

crypto-rng-effectful-1.0.0.0: tests/Main.hs

module Main where

import Control.Monad
import Crypto.RNG
import Data.ByteString
import Effectful
import Effectful.Reader.Static
import Test.Tasty
import Test.Tasty.HUnit

import Effectful.Crypto.RNG

main :: IO ()
main = do
  defaultMain $ testGroup "Crypto-RNG Bindings"
    [ testCase "Genering random bytes wrapped in a newtype" testRandomBytes
    , testCase "Generating a random number within a range from Reader" testRandomNumber
    ]

testRandomNumber :: Assertion
testRandomNumber = runEff $ do
  cryptoState <- newCryptoRNGState
  void . runCryptoRNG cryptoState
       . runReader ((10, 20) :: (Int, Int))
       $ generatingRandomNumber

generatingRandomNumber :: (RNG :> es, Reader (Int, Int) :> es) => Eff es Int
generatingRandomNumber = do
  bounds <- ask
  randomR bounds

---

testRandomBytes :: Assertion
testRandomBytes = runEff $ do
  cryptoState <- newCryptoRNGState
  void $ runCryptoRNG cryptoState generateUID

newtype UID = UID ByteString
  deriving newtype (Show, Eq, Ord)

generateUID :: RNG :> es => Eff es UID
generateUID = do
  bytes <- randomBytes 8
  pure $ UID bytes