packages feed

pcapng-0.1.0.0: test/Test/Validity/Enum.hs

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE RankNTypes          #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}
module Test.Validity.Enum where

import           Data.WordString32               as WS

import qualified Data.ByteString                 as BS
import qualified Data.ByteString.Arbitrary       as ABS
import           Data.Typeable
import           Test.Hspec
import           Test.Hspec.QuickCheck           (prop)
import           Test.QuickCheck
import           Test.QuickCheck.Arbitrary
import           Test.QuickCheck.Gen
import           Test.Validity
import           Test.Validity.Arbitrary
import           Test.Validity.Eq
import           Test.Validity.Functions.Inverse
import           Test.Validity.Monoid
import           Test.Validity.Ord
import           Test.Validity.Utils

enumSpec :: forall    a
         . (Arbitrary a
           ,Typeable  a
           ,Enum      a
           ,Show      a
           ,Eq        a
           ) => Spec
enumSpec = enumSpecOnGen (arbitrary :: Gen a)
                         "arbitrary"
                         (shrink :: a -> [a])

enumSpecOnGen :: (Enum     a
                 ,Eq       a
                 ,Show     a
                 ,Typeable a)
              =>  Gen a  -- generator
              ->  String -- generator name
              -> (a -> [a]) -- shrinker
              ->  Spec
enumSpecOnGen (gen :: Gen a) genName shrinker =
    describe ("Enum " <> name <> " on " <> genName) $ do
      prop "toEnum . fromEnum == id" $
        inverseFunctionsOnGen fromEnum (toEnum :: Int -> a) gen shrinker
        --(toEnum :: Int -> a) fromEnum
  where
    name = nameOf @a

--toEnumInvertsFromEnumOnGen :: _
toEnumInvertsFromEnumOnGen gen = do
  x <- gen
  toEnum (fromEnum x) `shouldBe` x