packages feed

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