{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleContexts #-}
module Main ( main ) where
import Control.Eff
import Control.Eff.State
import System.Random.Effect
import Control.Monad (void)
import Data.Word
import Data.Typeable
import Test.Framework (defaultMain, testGroup)
import Test.Framework.Providers.HUnit
import Test.Framework.Providers.QuickCheck2
import Test.HUnit hiding (State)
import Test.QuickCheck
main :: IO ()
main = defaultMain tests
runWithSeed :: Word64 -> Eff (State Random :> ()) a -> a
runWithSeed seed = run . runRandomState (mkRandom seed)
checkRange :: (Integer, Integer) -> Integer -> Bool
checkRange (low, high) x =
x >= low && x <= high
testUniformRandom :: Integer -> Integer -> Word64 -> Bool
testUniformRandom a b seed =
let low = min a b
high = max a b
in checkRange (low, high) . runWithSeed seed $ do
uniformIntDist a b
testDiscreteDistributionInRange :: [Word64] -> Word64 -> Bool
testDiscreteDistributionInRange xs seed =
let ddh = buildDDH xs
minVal = 0
maxVal = length xs - 1
in length xs == 0 || sum xs == 0 ||
((\x -> x >= minVal && x <= maxVal) . runWithSeed seed $
discreteDist ddh)
testNoZeroDiscreteDistributionPick :: [Word64] -> Word64 -> Bool
testNoZeroDiscreteDistributionPick xs seed =
let ddh = buildDDH xs
minVal = 0
maxVal = length xs - 1
in length xs == 0 || sum xs == 0 ||
((\x -> (xs !! x) /= 0) . runWithSeed seed $
discreteDist ddh)
tests =
[ testProperty "random range" testUniformRandom
, testProperty "discrete dist range" testDiscreteDistributionInRange
, testProperty "no non-zero discrete dist pick" testNoZeroDiscreteDistributionPick
]