1
1
mirror of https://github.com/github/semantic.git synced 2024-12-18 04:11:48 +03:00
semantic/test/Graphing/Calls/Spec.hs

46 lines
1.8 KiB
Haskell
Raw Normal View History

2018-07-16 18:07:40 +03:00
{-# LANGUAGE PackageImports #-}
module Graphing.Calls.Spec ( spec ) where
import Prelude hiding (readFile)
import Prologue
import SpecHelpers hiding (readFile)
import Algebra.Graph
import Data.List (uncons)
2018-07-16 18:12:17 +03:00
import "semantic" Data.Graph (Graph (..), topologicalSort)
import Data.Graph.Vertex
2018-07-16 18:07:40 +03:00
import qualified Data.Language as Language
2018-07-16 18:12:17 +03:00
import Semantic.Config (defaultOptions)
import Semantic.Graph
import Semantic.IO
2018-07-16 18:07:40 +03:00
callGraphPythonProject paths = runTaskWithOptions defaultOptions $ do
let proxy = Proxy @'Language.Python
let lang = Language.Python
blobs <- catMaybes <$> traverse readFile (flip File lang <$> paths)
package <- parsePackage pythonParser (Project (takeDirectory (maybe "/" fst (uncons paths))) blobs lang [])
modules <- topologicalSort <$> runImportGraph proxy package
runCallGraph proxy False modules package
spec :: Spec
spec = describe "call graphing" $ do
it "should work for a simple example" $ do
res <- callGraphPythonProject ["test/fixtures/python/graphing/simple/simple.py"]
unGraph res `shouldSatisfy` hasVertex (Variable "magnus")
2018-07-16 18:12:17 +03:00
it "should evaluate both sides of an if-statement" $ do
res <- callGraphPythonProject ["test/fixtures/python/graphing/conditional/conditional.py"]
unGraph res `shouldSatisfy` hasVertex (Variable "merle")
unGraph res `shouldSatisfy` hasVertex (Variable "taako")
2018-07-16 18:36:17 +03:00
it "should continue even when a type error is encountered" $ do
res <- callGraphPythonProject ["test/fixtures/python/graphing/typeerror/typeerror.py"]
unGraph res `shouldSatisfy` hasVertex (Variable "lup")
it "should continue when an unbound variable is encountered" $ do
res <- callGraphPythonProject ["test/fixtures/python/graphing/unbound/unbound.py"]
unGraph res `shouldSatisfy` hasVertex (Variable "lucretia")