module Main ( main ) where ------------------------------------------------------------------------------- import Control.Exception import Control.Monad import Data.Monoid import System.Directory import System.Exit import System.IO import Test.Tasty import Test.Tasty.Golden import Test.Tasty.HUnit import Test.Tasty.Ingredients import Test.Tasty.Options import Test.Tasty.Runners.TAP ------------------------------------------------------------------------------- import Test.Tasty.Ingredients.FailFast ------------------------------------------------------------------------------- import Prelude ------------------------------------------------------------------------------- main :: IO () main = do tmpDir <- getTemporaryDirectory defaultMain (tests tmpDir) ------------------------------------------------------------------------------- tests :: FilePath -> TestTree tests tmpDir = testGroup "tasty-fail-fast" [ let tmpPath = tmpDir ++ "/simple.tap" in goldenVsFileDiff "simple.tap" diffCmd (goldenPath "simple.tap") tmpPath (mkSimple tmpPath) ] ------------------------------------------------------------------------------- diffCmd :: FilePath -> FilePath -> [String] diffCmd ref new = ["diff", "-u", ref, new] ------------------------------------------------------------------------------- mkSimple :: FilePath -> IO () mkSimple tmpPath = bracket (openFile tmpPath WriteMode) hClose $ \h -> do let Just runner = tryIngredients [failFast (tapRunner' h)] opts exampleTests void runner `catch` interceptExit where interceptExit :: ExitCode -> IO () interceptExit _ = return () opts = setOption (FailFast True) mempty ------------------------------------------------------------------------------- exampleTests :: TestTree exampleTests = testGroup "some example tests" [ testCase "trivial pass" (True @?= True) , testCase "first failure" (True @?= False) , testCase "another pass" (True @?= True) , testCase "second failure" (True @?= False) , testCase "yet another pass" (True @?= True) ] ------------------------------------------------------------------------------- goldenPath :: FilePath -> FilePath goldenPath fp = "test/golden/" ++ fp