packages feed

enum-subset-generate-0.1.0.0: test/Spec.hs

{-# 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