{-# LANGUAGE TypeApplications #-}
module AnalysisSpec
( spec
)
where
import Test.Hspec
import Data.Maybe ( isJust )
import Language.Fortran.AST ( A0
, ProgramFile
, Expression(..)
, Statement(..)
, Value(..)
)
import Language.Fortran.Analysis ( Analysis )
import Language.Fortran.Version ( FortranVersion(..) )
import Language.Fortran.Extras.Analysis
( versionedProgramAnalysis
, versionedExpandedProgramAnalysis
)
import Language.Fortran.Util.Files
( flexReadFile )
import Data.Generics.Uniplate.Data ( universeBi )
wasIncluded :: ProgramFile (Analysis A0) -> String -> Bool
wasIncluded pa filename = any
isJust
[ included
| StInclude _ _ (ExpValue _ _ (ValString incFilename)) included <- (universeBi pa :: [Statement (Analysis A0)])
, incFilename == filename
]
spec :: Spec
spec = describe "ProgramAnalysis" $ do
it "versionedProgramAnalysis - no includes expansion" $ do
let path = "test/input_data/analysis/relative_include/include.f"
pa <- versionedProgramAnalysis Fortran77Legacy path <$> flexReadFile path
wasIncluded pa "includee.f" `shouldBe` False
it "versionedExpandedProgramAnalysis - with expanded includes" $ do
let path = "test/input_data/analysis/with_include_path/include.f"
idirs = ["test/input_data/analysis/with_include_path/includes"]
contents <- flexReadFile path
pa <- versionedExpandedProgramAnalysis Fortran77Legacy idirs path contents
wasIncluded pa "includee.f" `shouldBe` True
it "versionedExpandedProgramAnalysis - with expanded relative includes" $ do
let path = "test/input_data/analysis/relative_include/include.f"
contents <- flexReadFile path
pa <- versionedExpandedProgramAnalysis Fortran77Legacy [] path contents
wasIncluded pa "includee.f" `shouldBe` True