{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
module SumTypes.THSpec (spec) where
import Test.Hspec
import SumTypes.TH
data TypeA = TypeA deriving (Show, Eq)
data TypeB = TypeB deriving (Show, Eq)
data TypeC = TypeC deriving (Show, Eq)
constructSumType "MySum" defaultSumTypeOptions [''TypeA, ''TypeB, ''TypeC]
constructSumType "OtherSum" defaultSumTypeOptions [''TypeA, ''TypeB]
sumTypeConverter "otherSumToMySum" ''OtherSum ''MySum
partialSumTypeConverter "mySumToOtherSum" ''MySum ''OtherSum
deriving instance Show MySum
deriving instance Eq MySum
deriving instance Show OtherSum
deriving instance Eq OtherSum
spec :: Spec
spec = do
describe "constructSumType" $ do
it "compiles without breaking" $ do
-- The real utility in this test is the fact that it compiles
length [MySumTypeA TypeA, MySumTypeB TypeB, MySumTypeC TypeC] `shouldBe` 3
describe "sumTypeConverter" $ do
it "properly converts between types" $ do
otherSumToMySum (OtherSumTypeA TypeA) `shouldBe` MySumTypeA TypeA
otherSumToMySum (OtherSumTypeB TypeB) `shouldBe` MySumTypeB TypeB
describe "partialSumTypeConverter" $ do
it "properly converts between types" $ do
mySumToOtherSum (MySumTypeA TypeA) `shouldBe` Just (OtherSumTypeA TypeA)
mySumToOtherSum (MySumTypeB TypeB) `shouldBe` Just (OtherSumTypeB TypeB)
mySumToOtherSum (MySumTypeC TypeC) `shouldBe` Nothing