{-# LANGUAGE CPP #-} {-# LANGUAGE OverloadedStrings #-} import Test.Tasty import Test.Tasty.HUnit import Test.Tasty.Golden import System.IO.Temp import System.FilePath import System.Directory import System.Process import Data.List (sort) touch f = writeFile f "" diff ref new = ["diff", "-u", ref, new] -- Remove a .golden file that a golden test created due to the .golden file not -- existing prior to the start of the test. postCleanup :: String -> (FilePath -> TestTree) -> TestTree postCleanup fileName f = withResource (return ()) (\_ -> removeFile filePath) (\_ -> f filePath) where filePath = "tests/golden" fileName <.> "golden" main = defaultMain $ testGroup "Tests" [ testCase "findByExtension" $ withSystemTempDirectory "golden-test" $ \basedir -> do createDirectory (basedir "d1") createDirectory (basedir "d1" "d2") touch (basedir "f1.c") touch (basedir "f2.h") touch (basedir "f2.exe") touch (basedir "d1" "g1.c") touch (basedir "d1" "d2" "h1.c") touch (basedir "d1" "d2" "h1.exe") touch (basedir "d1" "d2" "h1") files <- findByExtension [".c", ".h"] basedir sort files @?= (sort . map (basedir )) ["d1/d2/h1.c","d1/g1.c","f1.c","f2.h"] , testGroup "Missing golden files" -- Make sure that each entrypoint to tasty-golden can properly create -- golden files if they are not provided. This serves as a regression test -- for #32. [ postCleanup "goldenVsFile" $ \golden -> goldenVsFile "goldenVsFile without golden file" golden "tests/golden/goldenVsFile.actual" (touch "tests/golden/goldenVsFile.actual") , postCleanup "goldenVsFileDiff" $ \golden -> goldenVsFileDiff "goldenVsFileDiff without golden file" diff golden "tests/golden/goldenVsFileDiff.actual" (touch "tests/golden/goldenVsFileDiff.actual") , postCleanup "goldenVsString" $ \golden -> goldenVsString "goldenVsString without golden file" golden (return "") , postCleanup "goldenVsStringDiff" $ \golden -> goldenVsStringDiff "goldenVsStringDiff without golden file" diff golden (return "") ] #ifdef BUILD_EXAMPLE , withResource (do tmp0 <- getCanonicalTemporaryDirectory tmp <- createTempDirectory tmp0 "golden-test" callProcess "cp" ["-r", "example", tmp] return tmp ) ({-removeDirectoryRecursive-}const $ return ()) $ \tmpIO -> testGroup "Example test suite" [ goldenVsFileDiff "before --accept" diff "tests/golden/before-accept.golden" "tests/golden/before-accept.actual" (do tmp <- tmpIO our <- getCurrentDirectory -- The sed invocation is used to get rid of the differences -- caused by random file names in goldenVsStringDiff and by the -- timings. -- -- NB: cannot use multiline literals because of CPP. callCommand ("cd " ++ tmp ++ " && example | " ++ "sed -Ee 's/[[:digit:]-]+\\.actual/.actual/g; s/ \\([[:digit:].]+s\\)//' > " ++ our"tests/golden/before-accept.actual || true") ) , after AllFinish "/before --accept/" $ goldenVsFileDiff "with --accept" diff "tests/golden/with-accept.golden" "tests/golden/with-accept.actual" (do tmp <- tmpIO our <- getCurrentDirectory callCommand ("cd " ++ tmp ++ " && example --accept | sed -Ee 's/ \\([[:digit:].]+s\\)//' > " ++ our "tests/golden/with-accept.actual") ) , after AllFinish "/with --accept/" $ goldenVsFileDiff "after --accept" diff "tests/golden/after-accept.golden" "tests/golden/after-accept.actual" (do tmp <- tmpIO our <- getCurrentDirectory callCommand ("cd " ++ tmp ++ " && example | sed -Ee 's/ \\([[:digit:].]+s\\)//' > " ++ our"tests/golden/after-accept.actual") ) ] #endif ]