htestu-0.1.1.0: app/TestGen.hs
{-# OPTIONS_GHC -Wall #-}
module Main ( main ) where
import System.Random ( newStdGen, next )
import System.Random.TF ( newTFGen )
-- import qualified System.Random.PCG.Fast.Pure as PCG
import qualified System.Random.MWC as MWC
import System.Random.Mersenne.Pure64 ( newPureMT )
-- import Control.Monad ( join )
import System.Random ( RandomGen )
import Test.HTestU (TestResult, runBatteryToResults, c_smallCrush)
import Test.HTestU.Streaming (nextStreamFromGen)
import Test.HTestU.Wrapping (Battery)
import Control.Monad.Primitive
import System.IO.Unsafe
-- Actions for running batteries on a newly generated instance of a PRNG
runCrush :: (RandomGen g) =>
Battery -> IO g -> IO [TestResult]
runCrush crush gen = (\g -> runBatteryToResults nextStreamFromGen g crush ) `fmap`
gen
runSmallCrushStd :: IO [TestResult]
runSmallCrushStd = runCrush c_smallCrush newStdGen
runSmallCrushTF :: IO [TestResult]
runSmallCrushTF = runCrush c_smallCrush newTFGen
-- runSmallCrushPCG :: IO [TestResult]
-- runSmallCrushPCG = runCrush c_smallCrush (join $ fmap PCG.save PCG.create)
data MWCRNG = MWCRNG (MWC.Gen (PrimState IO))
instance RandomGen MWCRNG where
next g@(MWCRNG gen) = unsafeDupablePerformIO $
do v <- MWC.uniform gen
return (v, g)
runSmallCrushMWC :: IO [TestResult]
runSmallCrushMWC = do
s <- MWC.create
runCrush c_smallCrush (return $ MWCRNG s)
runSmallCrushMT :: IO [TestResult]
runSmallCrushMT = runCrush c_smallCrush newPureMT
main :: IO ()
main = do
rStd <- runSmallCrushStd
putStrLn "Standard"
putStrLn $ show rStd
rTF <- runSmallCrushTF
putStrLn "TF"
putStrLn $ show rTF
-- rPCG <- runSmallCrushPCG
-- putStrLn "PCG"
-- putStrLn $ show rPCG
rMWC <- runSmallCrushMWC
putStrLn "MWC"
putStrLn $ show rMWC
rMT <- runSmallCrushMT
putStrLn "MT"
putStrLn $ show rMT