content: {-# LANGUAGE OverloadedStrings #-}
  
  module Camfort.Analysis.ImplicitNoneSpec (spec) where
  
  import           Camfort.Analysis hiding (describe)
  import           Camfort.Analysis.Simple
  import           Camfort.Analysis.TestUtils
  import           Control.Lens
  import           Language.Fortran.AST (ProgramUnitName(..))
  import           System.FilePath ((</>))
  import           Test.Hspec hiding (Spec)
  import qualified Test.Hspec as Test
  
  spec :: Test.Spec
  spec = do
    let f n = testInputSources $ fixturesDir </> n
    let g a = (generalizePureAnalysis . checkImplicitNone a)
    describe "implicitNone" $ do
      it "basic" $ do
        testSingleFileAnalysis (f "implicitnone1.f90") (g False) $ \ report ->
          let ImplicitNoneReport ls = (report ^?! arResult . _ARSuccess) in
          map fst ls `shouldBe` [Named "s"]
      it "misplaced statements" $ do
        testSingleFileAnalysis (f "implicitnone2.f90") (g False) $ \ report ->
          let ImplicitNoneReport ls = (report ^?! arResult . _ARSuccess) in
          map fst ls `shouldBe` [Named "implicitnone1", Named "implicitnone2"]
      it "interfaces are separate scope" $ do
        testSingleFileAnalysis (f "implicitnone3.f90") (g False) $ \ report ->
          let ImplicitNoneReport ls = (report ^?! arResult . _ARSuccess) in
          map fst ls `shouldBe` [Named "s"]
    describe "implicitNoneAll" $ do
      it "basic" $ do
        testSingleFileAnalysis (f "implicitnone1.f90") (g True) $ \ report ->
          let ImplicitNoneReport ls = (report ^?! arResult . _ARSuccess) in
          map fst ls `shouldBe` [Named "f", Named "s"]
      it "misplaced statements" $ do
        testSingleFileAnalysis (f "implicitnone2.f90") (g True) $ \ report ->
          let ImplicitNoneReport ls = (report ^?! arResult . _ARSuccess) in
          map fst ls `shouldBe` [Named "implicitnone1", Named "f", Named "implicitnone2", Named "f"]
      it "interfaces are separate scope" $ do
        testSingleFileAnalysis (f "implicitnone3.f90") (g True) $ \ report ->
          let ImplicitNoneReport ls = (report ^?! arResult . _ARSuccess) in
          map fst ls `shouldBe` [Named "s"]
  
  fixturesDir :: FilePath
  fixturesDir = "tests" </> "fixtures"
  