{-# OPTIONS_GHC -fno-warn-orphans #-}
module ConfigTest where
import Data.List (isInfixOf)
import qualified Data.Map.Strict as M
import Test.Tasty.Config
import Test.Tasty.Discover (ModuleTree (..), findTests,
generateTestDriver, mkModuleTree,
showTests)
import Test.Tasty.Generator (Test (..), mkTest)
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
unit_noModuleSuffixEmptyList :: IO ()
unit_noModuleSuffixEmptyList = do
actual <- findTests "test/SubMod/" (defaultConfig { moduleSuffix = Just "DoesntExist"})
actual @?= []
unit_differentGeneratedModule :: Assertion
unit_differentGeneratedModule = assertBool "" ("FunkyModuleName" `isInfixOf` generatedModule)
where generatedModule = generateTestDriver defaultConfig "FunkyModuleName" [] "test/" []
unit_ignoreAModule :: IO ()
unit_ignoreAModule = do
actual <- findTests "test/SubMod/" (defaultConfig { ignoredModules = ["PropTest"] })
actual @?= []
unit_noModuleSuffix :: IO ()
unit_noModuleSuffix = do
actual1 <- findTests "test/SubMod/" defaultConfig
actual1 @?= [mkTest "PropTest" "prop_additionAssociative"]
actual2 <- findTests "test/SubMod/" (defaultConfig { noModuleSuffix = True })
let expected = [ mkTest "FooBaz" "prop_additionCommutative"
, mkTest "FooBaz" "prop_multiplationDistributiveOverAddition"
, mkTest "PropTest" "prop_additionAssociative" ]
assertBool "" $ all (`elem` expected) actual2
unit_noModuleSuffixRecurseDirs :: IO ()
unit_noModuleSuffixRecurseDirs = do
tests <- findTests "test/" (defaultConfig { noModuleSuffix = True })
assertBool "" $ elem (mkTest "SubMod/FooBaz" "prop_additionCommutative") tests
unit_noTreeDisplayDefault :: IO ()
unit_noTreeDisplayDefault = do
let config = defaultConfig { noModuleSuffix = True }
tests <- findTests "test/SubMod/" config
let testNumVars = map (('t' :) . show) [(0::Int)..]
trees = showTests config tests testNumVars
length trees @?= 3
unit_treeDisplay :: IO ()
unit_treeDisplay = do
let config = defaultConfig { noModuleSuffix = True, treeDisplay = True }
tests <- findTests "test/SubMod/" config
let testNumVars = map (('t' :) . show) [(0::Int)..]
trees = showTests config tests testNumVars
length trees @?= 2
prop_mkModuleTree :: ModuleTree -> Property
prop_mkModuleTree mtree =
let (tests, testVars) = unzip $ flattenTree mtree
in mkModuleTree tests testVars === mtree
where
flattenTree (ModuleTree mp) = M.assocs mp >>= flattenModule
flattenModule (mdl, (subTree, testVars)) = concat
[ map (\(Test subMdl _, tVar) -> (Test (mdl ++ '.':subMdl) "-", tVar)) (flattenTree subTree)
, map (\tVar -> (Test mdl "-", tVar)) testVars ]
instance Arbitrary ModuleTree where
arbitrary = sized $ \size ->
resize (min size 12) (ModuleTree . M.fromList <$> listOf1 mdlGen)
where
mdlGen = sized $ \size -> do
mdl <- listOf1 (elements ['a'..'z'])
subTree <- if size == 0
then pure $ ModuleTree M.empty
else resize (size `div` 2) arbitrary
tVars <- listOf1 (listOf1 arbitrary)
pure (mdl, (subTree, tVars))