packages feed

camfort-0.905: tests/Camfort/Transformation/CommonSpec.hs

module Camfort.Transformation.CommonSpec (spec) where

import           System.Directory
import           System.FilePath

import           Test.Hspec

import           Camfort.Analysis.Logger (LogLevel (..))
import           Camfort.Functionality

samplesBase :: FilePath
samplesBase = "tests" </> "fixtures" </> "Transformation"

data Example = Example FilePath FilePath

readSample :: FilePath -> IO String
readSample filename = do
  let path = samplesBase </> filename
  readFile path

removeSample filename = do
  let path = samplesBase </> filename
  removeFile path

spec :: Spec
spec =
  describe "Common block integration test" $
    context "common.f90 into common.expect.f90 and foo.f90" $ do
      expected    <- runIO $ readSample "common.expected.f90"
      expectedMod <- runIO $ readSample "cmn.expected.f90"

      let outFile = samplesBase </> "common.f90.out"
          commonFile = samplesBase </> "common.f90"

          env = CamfortEnv
            { ceInputSources = commonFile
            , ceIncludeDir = Just (takeDirectory commonFile)
            , ceExcludeFiles = []
            , ceLogLevel = LogDebug
            }

      runIO $ common outFile env

      actual    <- runIO $ readSample "common.f90.out"
      actualMod <- runIO $ readSample "cmn.f90"
      runIO $ removeSample "common.f90.out"
      runIO $ removeSample "cmn.f90"
      it "it eliminates common statement" $
         actual `shouldBe` expected
      it "it produces a correct module file" $
         actualMod `shouldBe` expectedMod