-# lsp-test [![Build Status](https://travis-ci.com/bubba/lsp-test.svg?branch=master)](https://travis-ci.com/bubba/lsp-test) [![Hackage](https://img.shields.io/hackage/v/lsp-test.svg)](https://hackage.haskell.org/package/lsp-test-0.1.0.0)
+# lsp-test [![Actions Status](https://github.com/bubba/lsp-test/workflows/Haskell%20CI/badge.svg)](https://github.com/bubba/lsp-test/actions) [![Hackage](https://img.shields.io/hackage/v/lsp-test.svg)](https://hackage.haskell.org/package/lsp-test-0.1.0.0)
lsp-test is a functional testing framework for Language Server Protocol servers.
```haskell
`npm i -g javascript-typescript-langserver`
Then run the tests with `stack test` or `cabal new-test`.
+
+ ## Troubleshooting
+ Seeing funny stuff when running lsp-test via stack? If your server is built upon Haskell tooling, [keep in mind that stack sets some environment variables related to GHC, and you may want to unset them.](https://github.com/alanz/haskell-ide-engine/blob/bfb16324d396da71000ef81d51acbebbdaa854ab/test/utils/TestUtils.hs#L290-L298)
import Control.Lens hiding (List)
import GHC.Generics
import Language.Haskell.LSP.Messages
-import Language.Haskell.LSP.Test
+import Language.Haskell.LSP.Test hiding (runSession)
import Language.Haskell.LSP.Test.Replay
import Language.Haskell.LSP.Types
import Language.Haskell.LSP.Types.Lens as LSP hiding
{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
{-# ANN module ("HLint: ignore Unnecessary hiding" :: String) #-}
+runSession = runSessionWithConfig (defaultConfig { logStdErr = True })
+
main = hspec $ do
describe "Session" $ do
it "fails a test" $
describe "withTimeout" $ do
it "times out" $
- let sesh = runSession "hie" fullCaps "test/data/renamePass" $ do
+ let sesh = runSession "hie -d --bios-verbose" fullCaps "test/data/renamePass" $ do
openDoc "Desktop/simple.hs" "haskell"
-- won't receive a request - will timeout
-- incoming logging requests shouldn't increase the
noDiagnostics
noDiagnostics
- item:_ <- getCompletions doc (Position 5 5)
+ comps <- getCompletions doc (Position 5 5)
+ let item = head (filter (\x -> x ^. label == "interactWithUser") comps)
liftIO $ do
item ^. label `shouldBe` "interactWithUser"
item ^. kind `shouldBe` Just CiFunction
describe "waitForDiagnosticsSource" $
it "works" $ runSession "hie" fullCaps "test/data" $ do
openDoc "Error.hs" "haskell"
- [diag] <- waitForDiagnosticsSource "ghcmod"
+ [diag] <- waitForDiagnosticsSource "bios"
liftIO $ do
diag ^. severity `shouldBe` Just DsError
- diag ^. source `shouldBe` Just "ghcmod"
+ diag ^. source `shouldBe` Just "bios"
describe "rename" $
it "works" $ runSession "hie" fullCaps "test/data" $ do