packages feed

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