import Data.IORef
import Data.Text (Text)
import Prelude
import Test.Tasty
import Test.Tasty.ExpectedFailure
import Test.Tasty.HUnit
import Test.Tasty.MGolden
import Test.Tasty.Providers.ConsoleFormat
import qualified Data.Text.IO as Text
import qualified System.Exit as Exit
import qualified System.Process.Typed as Process
main :: IO ()
main = defaultMain tests
tests :: TestTree
tests = testGroup "mgolden tests"
[ goldenTest path path $ pure "foo\nbar\n"
, expectFail $ goldenTest path path $ pure "foo\nbaz\n"
, testFormat
, testWorkflow
]
where
path :: String
path = "test/expected/example.txt"
testFormat :: TestTree
testFormat = testCase "diff format" $ do
ioRef <- newIORef id
runPrinter $ printDetails (fakePutStrLn ioRef) "foo\nbar" "foo\nbaz"
assertEqual "expected diff format" [" foo", "-bar", "+baz"] =<< readPuts ioRef
fakePutStrLn :: IORef ([Text] -> [Text]) -> Text -> IO ()
fakePutStrLn ioRef text =
modifyIORef ioRef $ \current -> current . (text :)
readPuts :: IORef ([Text] -> [Text]) -> IO [Text]
readPuts ioRef = ($ []) <$> readIORef ioRef
runPrinter :: ResultDetailsPrinter -> IO ()
runPrinter (ResultDetailsPrinter action) = action 0 (const id)
testWorkflow :: TestTree
testWorkflow =
testCase "usage workflow" $ do
reset
assertEqual "initialy exits with tatus 1" (Exit.ExitFailure 1) =<< run []
assertEqual "exits 0 with update flag" Exit.ExitSuccess =<< run ["--update"]
assertEqual "has updated contents" "foo\nbaz\n" =<< Text.readFile "example/example-b.txt"
reset
run :: [String] -> IO Exit.ExitCode
run arguments = do
(status, _, _) <-
Process.readProcess
$ Process.proc "stack"
(["exec", "--", "tasty-mgolden-example"] <> arguments)
pure status
reset :: IO ()
reset = do
Text.writeFile "example/example-a.txt" "foo\nbar"
Text.writeFile "example/example-b.txt" "foo\nbar"