axel-0.0.5: test/Axel/Test/Haskell/GHCSpec.hs
{-# LANGUAGE FlexibleContexts #-}
module Axel.Test.Haskell.GHCSpec where
import Axel.Haskell.GHC as GHC
import Axel.Haskell.Stack as Stack
import qualified Axel.Test.Monad.FileSystemMock as Mock
import qualified Axel.Test.Monad.ProcessMock as Mock
import Control.Lens
import Control.Monad.Except
import System.Exit
import Test.Tasty.Hspec
{-# ANN module "HLint: ignore Redundant do" #-}
spec_GHC :: SpecWith ()
spec_GHC = do
describe "ghcCompile" $ do
it "compiles a file with GHC" $ do
let action = GHC.ghcCompile "projectFoo/app/Main.hs"
let origFSState = Mock.mkFSState []
let origProcState =
Mock.mkProcessState
[]
[ Mock.ProcessResultT
((ExitSuccess, Just ("testStdout", "")), pure ())
]
let expectation stdout (procState, _) = do
stdout `shouldBe` "testStdout"
procState ^. Mock.procExecutionLog `shouldBe`
[ ( "stack"
, [ "--resolver"
, Stack.stackageResolverWithAxel
, "ghc"
, "--"
, "-v0"
, "-ddump-json"
, "projectFoo/app/Main.hs"
]
, Just "")
]
case Mock.runProcess (origProcState, origFSState) $ runExceptT action of
Left err -> expectationFailure err
Right (Left err, _) -> expectationFailure err
Right (Right x, state) -> expectation x state
describe "ghcInterpret" $ do
it "interprets a file with GHC" $ do
let action = GHC.ghcInterpret "projectFoo/app/Main.hs"
let origFSState = Mock.mkFSState []
let origProcState =
Mock.mkProcessState
[]
[ Mock.ProcessResultT
((ExitSuccess, Just ("testStdout", "")), pure ())
]
let expectation stdout (procState, _) = do
stdout `shouldBe` "testStdout"
procState ^. Mock.procExecutionLog `shouldBe`
[ ( "stack"
, [ "--resolver"
, stackageResolverWithAxel
, "runghc"
, "--package"
, axelStackageId
, "--"
, "projectFoo/app/Main.hs"
]
, Just "")
]
case Mock.runProcess (origProcState, origFSState) $ runExceptT action of
Left err -> expectationFailure err
Right (Left err, _) -> expectationFailure err
Right (Right x, state) -> expectation x state