packages feed

real-dice-0.1.0.0: test/RealDice/DieSpec.hs

{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}

{-# HLINT ignore "Use camelCase" #-}
module RealDice.DieSpec
  ( returns_many_unique_rolls,
    returns_0_for_inputs_under_1,
  )
where

import Control.Monad.State
import RealDice.Die (DieGen, mkDieGen, roll1d)
import Test.QuickCheck

data DieSt where
  DieSt :: {generator :: DieGen} -> DieSt

generateRolls :: Int -> [Int]
generateRolls n =
  evalState (generateRollsSinglePass 10 []) (DieSt (mkDieGen n))

generateRollsSinglePass :: Int -> [Int] -> State DieSt [Int]
generateRollsSinglePass 0 generatedRolls = return generatedRolls
generateRollsSinglePass i generatedRolls = do
  randomSt <- get
  let (randomInteger, gen') = roll1d 1000 (generator randomSt)
  put DieSt {generator = gen'}
  generateRollsSinglePass (i - 1) (randomInteger : generatedRolls)

returns_many_unique_rolls :: Int -> Property
returns_many_unique_rolls n =
  n
    > 0
    ==> head (generateRolls n)
      `notElem` tail (generateRolls n)

returns_0_for_inputs_under_1 :: Int -> Property
returns_0_for_inputs_under_1 n = n < 1 ==> head (generateRolls n) == 0