{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
import Data.Void (Void)
import Test.Tasty
import Test.Tasty.HUnit
import Language.Haskell.TH.TestUtils
import TH
main :: IO ()
main = defaultMain $ testGroup "th-test-utils"
[ testFirstConstrForType
, testExplode
]
testFirstConstrForType :: TestTree
testFirstConstrForType = testGroup "firstConstrForType"
[ testCase "tryQ Maybe" $
$(tryQ $ firstConstrForType "Maybe") @?= (Right "Nothing" :: Either String String)
, testCase "tryQErr Maybe" $
$(tryQErr $ firstConstrForType "Maybe") @?= (Nothing :: Maybe String)
, testCase "tryQ NonExistent" $
$(tryQ $ firstConstrForType "NonExistent") @?= (Left "Type does not exist: NonExistent" :: Either String String)
, testCase "tryQErr Show" $
$(tryQErr $ firstConstrForType "Show") @?= Just "Not a data type: Show"
, testCase "tryQErr' Void" $
$(tryQErr' $ firstConstrForType "Void") @?= "Data type has no constructors: Void"
]
testExplode :: TestTree
testExplode = testGroup "explode"
[ testCase "abc" $
$(tryQ $ explode "abc") @?= (Right ["a", "b", "c"] :: Either String [String])
, testCase "\"\"" $
$(tryQ $ explode "") @?= (Left "Cannot explode empty string" :: Either String [String])
]