test-framework-th-prime-0.0.1: Template Haskell for test framework

Safe HaskellNone



Template Haskell to generate defaultMain with a list of Test from "doc_test", "case_<somthing>", and "prop_<somthing>".

An example of source code (Data/MySet.hs):

 { -| Creating a set from a list. O(N log N)

 >>> empty == fromList []
 >>> singleton 'a' == fromList ['a']
 >>> fromList [5,3,5] == fromList [5,3]
 - }

 fromList :: Ord a => [a] -> RBTree a
 fromList = foldl' (flip insert) empty

The spaces of comment symbols are due to limitation of haddock.

An example of test code in the src directory (test/Test.hs):

 { -# LANGUAGE TemplateHaskell #- }
 module Main where

 import Test.Framework.TH.Prime
 import Test.Framework.Providers.DocTest
 import Test.Framework.Providers.HUnit
 import Test.Framework.Providers.QuickCheck2
 import Test.QuickCheck2
 import Test.HUnit

 import Data.MySet

 main :: IO ()
 main = $(defaultMainGenerator)

 doc_test :: DocTests
 doc_test = docTest ["../Data/MySet.hs"] ["-i.."]

 prop_toList :: [Int] -> Bool
 prop_toList xs = ordered ys
     ys = toList . fromList $ xs
     ordered (x:y:xys) = x <= y && ordered (y:xys)
     ordered _         = True

 case_ticket4242 :: Assertion
 case_ticket4242 = (valid $ deleteMin $ deleteMin $ fromList [0,2,5,1,6,4,8,9,7,11,10,3]) @?= True

And run:

 test% runghc -i.. Test.hs

defaultMainGenerator generates the following:

 main = do
     TestGroup _ doctests <- docTest ["../Data/MySet.hs"] ["-i.."]
     defaultMain [
         testGroup "Doc tests" doctests
       , testGroup "Unit tests" [
              testCase "case_ticket4242" case_ticket4242
       , testGroup "Property tests" [
              testProperty "prop_toList" prop_toList

Note: examples in haddock document is only used as unit tests at this moment. I hope that properties of QuickCheck2 can also be specified in haddock document in the future. I guess it's Haskell way of Behavior Driven Development.



defaultMainGenerator :: ExpQSource

Generating defaultMain with a list of Test from "doc_test", "case_*", and "prop_".

type DocTests = IO TestSource

Type for "doc_test".