th-utilities-0.1.1.0: test/TH/Derive/StorableSpec.hs
{-# LANGUAGE TemplateHaskell #-}
module TH.Derive.StorableSpec (spec) where
import Control.Monad (when)
import Data.Int
import qualified Data.Vector.Storable as SV
import Foreign.Storable
import TH.Derive
import TH.Derive.Storable ()
import Test.Hspec
data ADataType
= Con0
| Con1 Int32
| Con2 Int32 Int64
deriving (Eq, Show)
$($(derive [d| instance Deriving (Storable ADataType) |]))
spec :: Spec
spec = describe "th-storable" $
it "can roundtrip a data type" $ do
roundTrips Con0
roundTrips (Con1 minBound)
roundTrips (Con1 0)
roundTrips (Con1 maxBound)
roundTrips (Con2 maxBound minBound)
roundTrips (Con2 maxBound 0)
roundTrips (Con2 maxBound maxBound)
roundTrips :: (Storable a, Show a, Eq a) => a -> IO ()
roundTrips x =
when (SV.head (SV.singleton x) /= x) $
fail ("Failed to roundtrip " ++ show x)
-- Regression test for generating peek on single-constructor data types.
data SingleCons = SingleCons
$($(derive [d| instance Deriving (Storable SingleCons) |]))