packages feed

exact-real-0.12.0: test/Random.hs

{-# LANGUAGE ScopedTypeVariables #-}

module Random
  ( random
  ) where

import Test.Tasty (testGroup, TestTree)
import Test.Tasty.QuickCheck (testProperty, Arbitrary, (==>))
import System.Random (Random, randoms, randomRs, mkStdGen)

random :: forall a. (Arbitrary a, Show a, Ord a, Fractional a, Random a) => a -> TestTree
random _ = testGroup "Test Random instance" ts
  where ts = [ testProperty "randomR range"
                 (\s l u -> let rs = take 100 (randomRs (l :: a, u) (mkStdGen s))
                            in l <= u ==> (all (>= l) rs && all (<= u) rs))
             , testProperty "randomR zero bounds"
                 (\s l -> let rs = take 100 (randomRs (l :: a, l) (mkStdGen s))
                          in all (== l) rs)
             , testProperty "random range"
                 (\s -> let rs = take 100 (randoms (mkStdGen s)) :: [a]
                        in all (>= 0) rs && all (< 1) rs)
             ]