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