Change runSession return result from passed session instead of ()
[lsp-test.git] / src / Language / Haskell / LSP / Test.hs
index 17a39c5a9702a9e2146514c65165220270ff516f..4f3094f87d58034d5fc2b0d11c87973464ddd7d4 100644 (file)
@@ -54,6 +54,7 @@ module Language.Haskell.LSP.Test
   , (<|>)
   , satisfy
   -- * Utilities
+  , getInitializeResponse
   , openDoc
   , getDocItem
   , getDocUri
@@ -84,7 +85,7 @@ import Language.Haskell.LSP.Test.Parsing
 runSession :: String -- ^ The command to run the server.
            -> FilePath -- ^ The filepath to the root directory for the session.
            -> Session a -- ^ The session to run.
-           -> IO ()
+           -> IO a
 runSession serverExe rootDir session = do
   pid <- getProcessID
   absRootDir <- canonicalizePath rootDir
@@ -100,16 +101,23 @@ runSession serverExe rootDir session = do
 
     -- Wrap the session around initialize and shutdown calls
     sendRequest Initialize initializeParams
-    initRsp <- response :: Session InitializeResponse
-    liftIO $ maybe (return ()) (putStrLn . ("Error while initializing: " ++) . show ) (initRsp ^. LSP.error)
+    initRspMsg <- response :: Session InitializeResponse
+
+    liftIO $ maybe (return ()) (putStrLn . ("Error while initializing: " ++) . show ) (initRspMsg ^. LSP.error)
+
+    initRspVar <- initRsp <$> ask
+    liftIO $ putMVar initRspVar initRspMsg
+    
 
     sendNotification Initialized InitializedParams
 
     -- Run the actual test
-    session
+    result <- session
 
     sendNotification Exit ExitParams
 
+    return result
+
 -- | An internal version of 'runSession' that allows for a custom handler to listen to the server.
 -- It also does not automatically send initialize and exit messages.
 runSessionWithHandler :: (Handle -> Session ())
@@ -129,8 +137,9 @@ runSessionWithHandler serverHandler serverExe rootDir session = do
   reqMap <- newMVar newRequestMap
   messageChan <- newChan
   meaninglessChan <- newChan
+  initRsp <- newEmptyMVar
 
-  let context = SessionContext serverIn absRootDir messageChan reqMap
+  let context = SessionContext serverIn absRootDir messageChan reqMap initRsp
       initState = SessionState (IdInt 9)
 
   threadId <- forkIO $ void $ runSession' meaninglessChan context initState (serverHandler serverOut)
@@ -224,6 +233,12 @@ sendMessage msg = do
   h <- serverIn <$> ask
   liftIO $ B.hPut h $ addHeader (encode msg)
 
+-- | Returns the initialize response that was received from the server.
+-- The initialize requests and responses are not included the session,
+-- so if you need to test it use this.
+getInitializeResponse :: Session InitializeResponse
+getInitializeResponse = initRsp <$> ask >>= (liftIO . readMVar)
+
 -- | Opens a text document and sends a notification to the client.
 openDoc :: FilePath -> String -> Session TextDocumentIdentifier
 openDoc file languageId = do