module TypeDefinition (tests) where import Control.Lens ((^.)) import Control.Monad.IO.Class import Language.Haskell.LSP.Test import Language.Haskell.LSP.Types import qualified Language.Haskell.LSP.Types.Lens as L import System.Directory import System.FilePath (()) import Test.Hls.Util import Test.Tasty import Test.Tasty.HUnit tests :: TestTree tests = testGroup "type definitions" [ testCase "finds local definition of record variable" $ getTypeDefinitionTest' (11, 23) 8 , testCase "finds local definition of newtype variable" $ getTypeDefinitionTest' (16, 21) 13 , testCase "finds local definition of sum type variable" $ getTypeDefinitionTest' (21, 13) 18 , knownBrokenForGhcVersions [GHC88] "Definition of sum type not found from data constructor in GHC 8.8.x" $ testCase "finds local definition of sum type constructor" $ getTypeDefinitionTest' (24, 7) 18 , testCase "finds non-local definition of type def" $ getTypeDefinitionTest' (30, 17) 27 , testCase "find local definition of type def" $ getTypeDefinitionTest' (35, 16) 32 , testCase "find type-definition of type def in component" $ getTypeDefinitionTest "src/Lib2.hs" (13, 20) "src/Lib.hs" 8 , testCase "find definition of parameterized data type" $ getTypeDefinitionTest' (40, 19) 37 ] getTypeDefinitionTest :: String -> (Int, Int) -> String -> Int -> Assertion getTypeDefinitionTest symbolFile symbolPosition definitionFile definitionLine = failIfSessionTimeout . runSession hlsCommand fullCaps "test/testdata/gototest" $ do doc <- openDoc symbolFile "haskell" _ <- openDoc definitionFile "haskell" defs <- getTypeDefinitions doc $ toPos symbolPosition fp <- liftIO $ canonicalizePath $ "test/testdata/gototest" definitionFile liftIO $ do length defs == 1 @? "Expecting a list containing one location, but got: " ++ show defs let [def] = defs def ^. L.uri @?= filePathToUri fp def ^. L.range . L.start . L.line @?= definitionLine - 1 def ^. L.range . L.end . L.line @?= definitionLine - 1 getTypeDefinitionTest' :: (Int, Int) -> Int -> Assertion getTypeDefinitionTest' symbolPosition definitionLine = getTypeDefinitionTest "src/Lib.hs" symbolPosition "src/Lib.hs" definitionLine --NOTE: copied from Haskell.Ide.Engine.ArtifactMap toPos :: (Int,Int) -> Position toPos (l,c) = Position (l-1) (c-1)