packages feed

halves-0.1.0.0: tests/Props.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes        #-}

import           Control.Lens
import           Control.Monad  (unless)
import           Data.Halves
import           Hedgehog
import qualified Hedgehog.Gen   as Gen
import qualified Hedgehog.Range as Range
import           System.Exit    (exitFailure)
import           System.IO

isoToFrom ::
  (MonadTest m, Eq a, Show a) =>
  Iso' a b ->
  a ->
  m ()
isoToFrom i a =
  a ^. i ^. from i === a

prop_iso ::
  (Halves a b, Eq a, Show a) =>
  Gen a ->
  Property
prop_iso g =
  property $ forAll g >>= isoToFrom halves

prop_word16 ::
  Property
prop_word16 =
  prop_iso $ Gen.word16 Range.linearBounded

prop_word32 ::
  Property
prop_word32 =
  prop_iso $ Gen.word32 Range.linearBounded

prop_word64 ::
  Property
prop_word64 =
  prop_iso $ Gen.word64 Range.linearBounded

prop_int16 ::
  Property
prop_int16 =
  prop_iso $ Gen.int16 Range.linearBounded

prop_int32 ::
  Property
prop_int32 =
  prop_iso $ Gen.int32 Range.linearBounded

prop_int64 ::
  Property
prop_int64 =
  prop_iso $ Gen.int64 Range.linearBounded

main :: IO ()
main = do
  hSetBuffering stdout LineBuffering
  hSetBuffering stderr LineBuffering
  result <- checkParallel $ Group "Props"
    [ ("prop_word16", prop_word16)
    , ("prop_word32", prop_word32)
    , ("prop_word64", prop_word64)
    , ("prop_int16",  prop_int16)
    , ("prop_int32",  prop_int32)
    , ("prop_int64",  prop_int64)
    ]
  unless result $ exitFailure