+ describe "manual session" $ do
+ it "fails a test" $
+ -- TODO: Catch the exception in haskell-lsp-test and provide nicer output
+ let session = runSession "hie --lsp" "test/data/renamePass" $ do
+ openDoc "Desktop/simple.hs" "haskell"
+ skipMany loggingNotification
+ anyRequest
+ in session `shouldThrow` anyException
+ it "can get initialize response" $ runSession "hie --lsp" "test/data/renamePass" $ do
+ rsp <- initializeResponse
+ liftIO $ rsp ^. result `shouldNotBe` Nothing
+
+ it "can register specific capabilities" $
+ runSessionWithConfig (def { capabilities = didChangeCaps })
+ "hie --lsp" "test/data/renamePass" $ return ()
+
+ describe "withTimeout" $ do
+ it "times out" $
+ let sesh = runSession "hie --lsp" "test/data/renamePass" $ do
+ openDoc "Desktop/simple.hs" "haskell"
+ -- won't receive a request - will timeout
+ -- incoming logging requests shouldn't increase the
+ -- timeout
+ withTimeout 5 $ skipManyTill anyMessage message :: Session ApplyWorkspaceEditRequest
+ -- wait just a bit longer than 5 seconds so we have time
+ -- to open the document
+ in timeout 6000000 sesh `shouldThrow` anySessionException
+
+ it "doesn't time out" $
+ let sesh = runSession "hie --lsp" "test/data/renamePass" $ do
+ openDoc "Desktop/simple.hs" "haskell"
+ withTimeout 5 $ skipManyTill anyMessage publishDiagnosticsNotification
+ in void $ timeout 6000000 sesh
+
+ it "further timeout messages are ignored" $ runSession "hie --lsp" "test/data/renamePass" $ do
+ doc <- openDoc "Desktop/simple.hs" "haskell"
+ withTimeout 3 $ getDocumentSymbols doc
+ liftIO $ threadDelay 5000000
+ -- shouldn't throw an exception
+ getDocumentSymbols doc
+ return ()
+
+ it "overrides global message timeout" $
+ let sesh =
+ runSessionWithConfig (def { messageTimeout = 5 }) "hie --lsp" "test/data/renamePass" $ do
+ doc <- openDoc "Desktop/simple.hs" "haskell"
+ -- shouldn't time out in here since we are overriding it
+ withTimeout 10 $ liftIO $ threadDelay 7000000
+ getDocumentSymbols doc
+ return True
+ in sesh `shouldReturn` True