{-# LANGUAGE CPP #-} import Control.Concurrent.MVar import Control.Monad (unless) import Control.Monad.IO.Class (liftIO) import Data.List (sort) #if !(MIN_VERSION_base(4,8,0)) import Data.Monoid (mempty) #endif import System.Directory import System.FilePath import System.IO.Silently (capture) import System.IO.Temp import Test.Tasty hiding (defaultMain) import Test.Tasty.HUnit import Test.Tasty.Options import Test.Tasty.Runners import Test.Tasty.Silver import Test.Tasty.Silver.Advanced import Test.Tasty.Silver.Filter (checkRF) import Test.Tasty.Silver.Interactive import Test.Tasty.Silver.Internal touch :: FilePath -> IO () touch f = writeFile f "" main :: IO () main = defaultMain $ testGroup "tests" $ testFindByExt : testWithResource : testCheckRF : [] testFindByExt :: TestTree testFindByExt = testCase "findByExtension" $ withSystemTempDirectory "golden-test" $ \basedir -> do setCurrentDirectory basedir createDirectory ("d1") createDirectory ("d1" "d2") touch ("d1" "d2" "h1.c") -- match touch ("d1" "d2" "h1.exe") touch ("d1" "d2" "h1") touch ("d1" "g1.c") -- match touch ("f1.c") -- match touch ("f2.h") -- match touch ("f2.exe") files <- findByExtension [".c", ".h"] "." sort files @?= sort [ "./d1/d2/h1.c" , "./d1/g1.c" , "./f1.c" , "./f2.h" ] -- | Check if resources are properly initialized. testWithResource :: TestTree testWithResource = testCase "withResource" $ case tryIngredients [consoleTestReporter] (singleOption $ AcceptTests True) tree of Just r' -> do (out, success) <- capture r' unless success $ putStr out assertBool "Test should succeed." success Nothing -> assertFailure "Test broken" where tree = withResource acq free test -- Resource acquisition. acq = newMVar True -- Resource release. free v = swapMVar v False >> return () -- Test using resource. test v = goldenTest1 "check res" (return Nothing) -- get the golden value (liftIO $ testAction v) -- get the tested value (\ _ _ -> Equal) -- comparison function (always succeed) (\ _ -> ShowText mempty) -- show the golden/actual value (\ x -> assertBool "Incorrect result" x) -- update the golden file -- Actual test: check whether the MVar contains True. testAction v = do assertBool "Resource not initialized." =<< readMVar =<< v return True testCheckRF :: TestTree testCheckRF = testGroup "Filter.checkRF" [ testCase "empty1a" $ checkRF True [] "/" @?= True , testCase "empty1b" $ checkRF False [] "/" @?= False , testCase "empty2a" $ checkRF True [] "/sdfg" @?= True , testCase "empty2b" $ checkRF False [] "/sdfg" @?= False ]