{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE DeriveGeneric #-} import Generic.Random import GHC.Generics(Generic) import Test.Hspec import Test.QuickCheck import Data.MakeEnum import Data.MakeEnum.Options import Enum makeEnumWith ''OtherModuleEnum ['OMEUnknown] defaultOptions { newEnumName = Just "OtherModuleEnumDerived" , deriveClasses = [''Eq, ''Ord, ''Show, ''Generic] } instance Arbitrary OtherModuleEnumDerived where arbitrary = genericArbitrary uniform data SameModuleEnum = SMEUnknown | SMEVar1 | SMEVar2 | SMEVar3 deriving (Eq, Ord, Show) makeEnumWith ''SameModuleEnum ['SMEUnknown] defaultOptions { newEnumName = Just "SameModuleEnumDerived" , ctorNameModifier = ("Der" ++) , deriveClasses = [''Eq, ''Ord, ''Show, ''Generic] } instance Arbitrary SameModuleEnumDerived where arbitrary = genericArbitrary uniform data EnumWithFields = EWFVar1 String | EWFVar2 Int Int | EWFUnknown deriving (Eq, Ord, Show) makeEnumWith ''EnumWithFields ['EWFUnknown] defaultOptions { newEnumName = Just "EnumWithFieldsDerived" , ctorNameModifier = ("Der" ++) , deriveClasses = [''Eq, ''Ord, ''Show, ''Generic] } instance Arbitrary EnumWithFieldsDerived where arbitrary = genericArbitrary uniform runTest :: (Arbitrary d, Eq d, Show d) => String -> s -> (s -> Maybe d) -> (d -> s) -> SpecWith () runTest str missing from to = describe str $ do it "maps missing cases correctly" $ from missing `shouldBe` Nothing it "converts the subset fine" $ property $ \x -> from (to x) == Just x main :: IO () main = hspec $ do runTest "OtherModuleEnum" OMEUnknown fromOtherModuleEnum toOtherModuleEnum runTest "SameModuleEnum" SMEUnknown fromSameModuleEnum toSameModuleEnum runTest "EnumWithFields" EWFUnknown fromEnumWithFields toEnumWithFields