packages feed

static-ls-0.1.0: test/StaticLS/IDE/DefinitionSpec.hs

module StaticLS.IDE.DefinitionSpec (spec) where

import StaticLS.IDE.Definition
import StaticLS.StaticEnv
import StaticLS.StaticEnv.Options
import Test.Hspec
import qualified TestImport as Test
import qualified TestImport.Assert as Test
import qualified TestImport.TestData as Test

spec :: Spec
spec =
    describe "Correctly retrieves definitions" $ do
        describe "All available sources" $ do
            it "retrieves the myFun definition from a different module" $ do
                staticEnv <- Test.initStaticEnv
                locs <- runStaticLs staticEnv $ uncurry getDefinition Test.myFunRef1TdiAndPosition
                defnLoc <- Test.assertHead "no definition loc found" locs
                expectedLoc <- Test.myFunDefLocation
                defnLoc `shouldBe` expectedLoc

        describe "Missing sources" $ do
            describe "Finding sources with only hie files" $ do
                it "Missing hiedb" $ do
                    let emptyOpts =
                            StaticEnvOptions
                                { optionHieDbPath = Nothing
                                , optionHieFilesPath = Just "test/TestData/.hiefiles"
                                }
                    staticEnv <- Test.initStaticEnvOpts emptyOpts
                    locs <- runStaticLs staticEnv $ uncurry getDefinition Test.myFunRef1TdiAndPosition
                    defnLoc <- Test.assertHead "no definition loc found" locs
                    expectedLoc <- Test.myFunDefLocation
                    defnLoc `shouldBe` expectedLoc

                it "empty hiedb" $ do
                    let emptyOpts =
                            StaticEnvOptions
                                { optionHieDbPath = Just "./TestData/not-a-real-hiedb-file"
                                , optionHieFilesPath = Just "test/TestData/.hiefiles"
                                }
                    staticEnv <- Test.initStaticEnvOpts emptyOpts
                    locs <- runStaticLs staticEnv $ uncurry getDefinition Test.myFunRef1TdiAndPosition
                    defnLoc <- Test.assertHead "no definition loc found" locs
                    expectedLoc <- Test.myFunDefLocation
                    defnLoc `shouldBe` expectedLoc

            it "does not crash with missing all sources" $ do
                let emptyOpts =
                        StaticEnvOptions
                            { optionHieDbPath = Nothing
                            , optionHieFilesPath = Nothing
                            }
                staticEnv <- Test.initStaticEnvOpts emptyOpts
                locs <- runStaticLs staticEnv $ uncurry getDefinition Test.myFunRef1TdiAndPosition
                locs `shouldBe` []