d10-1: test/safe.hs
import Prelude hiding (fail, (+), (-), (*))
import D10.Safe
import D10.Safe.Arithmetic
import qualified D10.Predicate as Predicate
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import Control.Applicative ((<|>))
import Control.Monad (when)
import Control.Monad.Fail (MonadFail (fail))
import Data.Maybe (isJust)
import System.Exit (exitFailure)
import AssertQFails (qFails)
import Fallible (Fallible)
main :: IO ()
main =
do
ok <- checkParallel $$(discover)
when (not ok) exitFailure
genD10 :: Gen D10
genD10 = Gen.enumBounded
prop_bounds_examples :: Property
prop_bounds_examples = withTests 1 $ property $ do
minBound === D0
maxBound === D9
prop_enumeration_examples :: Property
prop_enumeration_examples = withTests 1 $ property $ do
[ D5 .. ] === [D5,D6,D7,D8,D9]
[ D4 .. D7 ] === [D4,D5,D6,D7]
[ D5, D4 .. ] === [D5,D4,D3,D2,D1,D0]
[ D1, D3 .. ] === [D1,D3,D5,D7,D9]
[ minBound .. maxBound ] === [D0,D1,D2,D3,D4,D5,D6,D7,D8,D9]
prop_d10Char_examples :: Property
prop_d10Char_examples = withTests 1 $ property $ do
d10Char D7 === '7'
prop_d10Str :: Property
prop_d10Str = property $ do
x <- forAll genD10
d10Str x === [d10Char x]
prop_d10Str_examples :: Property
prop_d10Str_examples = withTests 1 $ property $ do
d10Str D7 === "7"
prop_d10Nat_examples :: Property
prop_d10Nat_examples = withTests 1 $ property $ do
d10Nat D7 === 7
prop_d10Integer_examples :: Property
prop_d10Integer_examples = withTests 1 $ property $ do
d10Integer D7 === 7
prop_d10Int_examples :: Property
prop_d10Int_examples = withTests 1 $ property $ do
d10Int D7 === 7
prop_d10Num_examples :: Property
prop_d10Num_examples = withTests 1 $ property $ do
d10Num D7 === (7 :: Integer)
prop_natMod10_examples :: Property
prop_natMod10_examples = withTests 1 $ property $ do
natMod10 56 === D6
prop_integerMod10_examples :: Property
prop_integerMod10_examples = withTests 1 $ property $ do
integerMod10 56 === D6
integerMod10 (-56) === D4
prop_intMod10_examples :: Property
prop_intMod10_examples = withTests 1 $ property $ do
intMod10 56 === D6
intMod10 (-56) === D4
prop_integralMod10_examples :: Property
prop_integralMod10_examples = withTests 1 $ property $ do
integralMod10 (56 :: Integer) === D6
integralMod10 ((-56) :: Integer) === D4
prop_charD10Maybe :: Property
prop_charD10Maybe = property $ do
x <- forAll (Gen.digit <|> Gen.alpha)
Predicate.isD10Char x === isJust (charD10Maybe x)
prop_charD10Maybe_examples :: Property
prop_charD10Maybe_examples = withTests 1 $ property $ do
charD10Maybe '5' === Just D5
charD10Maybe 'a' === Nothing
prop_strD10Maybe :: Property
prop_strD10Maybe = property $ do
x <- forAll $ Gen.string (Range.linear 0 5) (Gen.digit <|> Gen.alpha)
Predicate.isD10Str x === isJust (strD10Maybe x)
prop_strD10Maybe_examples :: Property
prop_strD10Maybe_examples = withTests 1 $ property $ do
strD10Maybe "5" === Just D5
strD10Maybe "a" === Nothing
strD10Maybe "58" === Nothing
prop_strD10ListMaybe :: Property
prop_strD10ListMaybe = property $ do
x <- forAll $ Gen.string (Range.linear 0 5) (Gen.digit <|> Gen.alpha)
Predicate.isD10ListStr x === isJust (strD10ListMaybe x)
prop_strD10ListMaybe_examples :: Property
prop_strD10ListMaybe_examples = withTests 1 $ property $ do
strD10ListMaybe "5" === Just [D5]
strD10ListMaybe "a" === Nothing
strD10ListMaybe "58" === Just [D5,D8]
prop_natD10Maybe :: Property
prop_natD10Maybe = property $ do
x <- forAll $ Gen.integral (Range.linear 0 20)
Predicate.isD10Nat x === isJust (natD10Maybe x)
prop_natD10Maybe_examples :: Property
prop_natD10Maybe_examples = withTests 1 $ property $ do
natD10Maybe 5 === Just D5
natD10Maybe 12 === Nothing
prop_integerD10Maybe :: Property
prop_integerD10Maybe = property $ do
x <- forAll $ Gen.integral (Range.linearFrom 0 (-5) 15)
Predicate.isD10Integer x === isJust (integerD10Maybe x)
prop_integerD10Maybe_examples :: Property
prop_integerD10Maybe_examples = withTests 1 $ property $ do
integerD10Maybe 5 === Just D5
integerD10Maybe 12 === Nothing
integerD10Maybe (-5) === Nothing
prop_intD10Maybe :: Property
prop_intD10Maybe = property $ do
x :: Int <- forAll $ Gen.integral (Range.linearFrom 0 (-5) 15)
Predicate.isD10Int x === isJust (intD10Maybe x)
prop_intD10Maybe_examples :: Property
prop_intD10Maybe_examples = withTests 1 $ property $ do
intD10Maybe 5 === Just D5
intD10Maybe 12 === Nothing
intD10Maybe (-5) === Nothing
prop_integralD10Maybe :: Property
prop_integralD10Maybe = property $ do
x :: Integer <- forAll $ Gen.integral (Range.linearFrom 0 (-5) 15)
Predicate.isD10Integer x === isJust (integralD10Maybe x)
prop_integralD10Maybe_examples :: Property
prop_integralD10Maybe_examples = withTests 1 $ property $ do
integralD10Maybe (5 :: Integer) === Just D5
integralD10Maybe (12 :: Integer) === Nothing
integralD10Maybe ((-5) :: Integer) === Nothing
prop_charD10Either_examples :: Property
prop_charD10Either_examples = withTests 1 $ property $ do
charD10Either '5' === Right D5
charD10Either 'a' === Left "d10 must be between 0 and 9"
prop_strD10Either_examples :: Property
prop_strD10Either_examples = withTests 1 $ property $ do
strD10Either "5" === Right D5
strD10Either "a" === Left "d10 must be between 0 and 9"
strD10Either "58" === Left "d10 must be a single character"
prop_strD10ListEither_examples :: Property
prop_strD10ListEither_examples = withTests 1 $ property $ do
strD10ListEither "5" === Right [D5]
strD10ListEither "a" === Left "d10 must be between 0 and 9"
strD10ListEither "58" === Right [D5,D8]
prop_natD10Either_examples :: Property
prop_natD10Either_examples = withTests 1 $ property $ do
natD10Either 5 === Right D5
natD10Either 12 === Left "d10 must be less than 10"
prop_integerD10Either_examples :: Property
prop_integerD10Either_examples = withTests 1 $ property $ do
integerD10Either 5 === Right D5
integerD10Either 12 === Left "d10 must be between 0 and 9"
integerD10Either (-5) === Left "d10 must be between 0 and 9"
prop_intD10Either_examples :: Property
prop_intD10Either_examples = withTests 1 $ property $ do
intD10Either 5 === Right D5
intD10Either 12 === Left "d10 must be between 0 and 9"
intD10Either (-5) === Left "d10 must be between 0 and 9"
prop_integralD10Either_examples :: Property
prop_integralD10Either_examples = withTests 1 $ property $ do
integralD10Either (5 :: Integer) === Right D5
integralD10Either (12 :: Integer) === Left "d10 must be between 0 and 9"
integralD10Either (-5 :: Integer) === Left "d10 must be between 0 and 9"
prop_charD10Fail_examples :: Property
prop_charD10Fail_examples = withTests 1 $ property $ do
(charD10Fail '5' :: Fallible D10) === return D5
(charD10Fail 'a' :: Fallible D10) === fail "d10 must be between 0 and 9"
prop_strD10Fail_examples :: Property
prop_strD10Fail_examples = withTests 1 $ property $ do
(strD10Fail "5" :: Fallible D10) === return D5
(strD10Fail "a" :: Fallible D10) === fail "d10 must be between 0 and 9"
(strD10Fail "58" :: Fallible D10) === fail "d10 must be a single character"
prop_strD10ListFail_examples :: Property
prop_strD10ListFail_examples = withTests 1 $ property $ do
(strD10ListFail "5" :: Fallible [D10]) === return [D5]
(strD10ListFail "a" :: Fallible [D10]) === fail "d10 must be between 0 and 9"
(strD10ListFail "58" :: Fallible [D10]) === return [D5,D8]
prop_natD10Fail_examples :: Property
prop_natD10Fail_examples = withTests 1 $ property $ do
(natD10Fail 5 :: Fallible D10) === return D5
(natD10Fail 12 :: Fallible D10) === fail "d10 must be less than 10"
prop_integerD10Fail_examples :: Property
prop_integerD10Fail_examples = withTests 1 $ property $ do
(integerD10Fail 5 :: Fallible D10) === return D5
(integerD10Fail 12 :: Fallible D10) === fail "d10 must be between 0 and 9"
(integerD10Fail (-5) :: Fallible D10) === fail "d10 must be between 0 and 9"
prop_intD10Fail_examples :: Property
prop_intD10Fail_examples = withTests 1 $ property $ do
(intD10Fail 5 :: Fallible D10) === return D5
(intD10Fail 12 :: Fallible D10) === fail "d10 must be between 0 and 9"
(intD10Fail (-5) :: Fallible D10) === fail "d10 must be between 0 and 9"
prop_integralD10Fail_examples :: Property
prop_integralD10Fail_examples = withTests 1 $ property $ do
(integralD10Fail (5 :: Integer) :: Fallible D10) === return D5
(integralD10Fail (12 :: Integer) :: Fallible D10) === fail "d10 must be between 0 and 9"
(integralD10Fail (-5 :: Integer) :: Fallible D10) === fail "d10 must be between 0 and 9"
prop_d10ListExp_examples :: Property
prop_d10ListExp_examples = withTests 1 $ property $ do
$(d10ListExp "") === ([] :: [D10])
$(d10ListExp "5") === [D5]
$(d10ListExp "58") === [D5,D8]
qFails (d10ListExp "a")
prop_d10ListPat_examples :: Property
prop_d10ListPat_examples = withTests 1 $ property $ do
"B" === case id [D5, D6] of
$(d10ListPat "42") -> "A"
$(d10ListPat "56") -> "B"
_ -> "C"
qFails (d10ListPat "a")
prop_qqExp_examples :: Property
prop_qqExp_examples = withTests 1 $ property $ do
[d10list||] === ([] :: [D10])
[d10list|5|] === [D5]
[d10list|58|] === [D5,D8]
prop_qqPat_examples :: Property
prop_qqPat_examples = withTests 1 $ property $ do
"B" === case id [D5, D6] of
[d10list|41|] -> "A"
[d10list|56|] -> "B"
_ -> "C"
prop_arithmetic_examples :: Property
prop_arithmetic_examples = withTests 1 $ property $ do
D2 + D3 === D5
D6 + D7 === D3
D7 - D5 === D2
D3 - D7 === D6
D2 * D4 === D8
D7 * D8 === D6