packages feed

fortran-src-extras-0.1.0: test/AnalysisSpec.hs

{-# 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