shaker-0.5.1: src/Shaker/TestTH.hs
-- | Allow to dynamically construct a list of
-- quickcheck properties and Hunit test with template haskell
module Shaker.TestTH
where
import Control.Arrow
import Language.Haskell.TH
import Shaker.ModuleData
import Shaker.Type
-- | List all test group of the project.
-- see "Shaker.TestTH"
listAllTestFrameworkGroupList :: ShakerInput -> ExpQ
listAllTestFrameworkGroupList = shakerModuleData >>> removeNonTestModules >>> listTestFrameworkGroupList
-- | List all test group for test-framework from the list of modules
listTestFrameworkGroupList :: [ModuleData] -> ExpQ
listTestFrameworkGroupList = return . ListE . map getSingleTestFrameworkGroup
-- * Test framework integration
-- | Generate a test group for a given module
getSingleTestFrameworkGroup :: ModuleData -> Exp
getSingleTestFrameworkGroup moduleData = foldl1 AppE [process_to_group_exp, test_case_tuple_list, list_assertion, list_prop]
where process_to_group_exp = AppE (VarE .mkName $ "processToTestGroup") (LitE (StringL $ moduleDataName moduleData))
list_prop = ListE $ map getSingleFrameworkQuickCheck $ moduleDataProperties moduleData
list_assertion = ListE $ map getSingleFrameworkHunit $ moduleDataAssertions moduleData
test_case_tuple_list = convertHunitTestCaseToTuples (moduleDataTestCase moduleData)
convertHunitTestCaseToTuples :: [String] -> Exp
convertHunitTestCaseToTuples = ListE . map convertToTuple
where convertToTuple name = TupE [LitE (StringL name), VarE $ mkName name ]
-- | Generate an expression for a single hunit test
getSingleFrameworkHunit :: String -> Exp
getSingleFrameworkHunit hunitName = AppE testcase_with_name_exp assertion_exp
where testcase_with_name_exp = AppE ( VarE $ mkName "testCase") (LitE $ StringL hunitName)
assertion_exp = VarE . mkName $ hunitName
-- | Generate an expression for a single quickcheck property
getSingleFrameworkQuickCheck :: String -> Exp
getSingleFrameworkQuickCheck propName = AppE testproperty_with_name_exp property_exp
where canonical_name = tail . dropWhile (/= '_') $ propName
testproperty_with_name_exp = AppE ( VarE $ mkName "testProperty") (LitE $ StringL canonical_name)
property_exp = VarE . mkName $ propName