import Control.Monad.IO.Class
-main = runSession "test/recordings/renamePass" $ do
+main = runSession "hie" "test/recordings/renamePass" $ do
docItem <- getDocItem "Desktop/simple.hs" "haskell"
docId <- TextDocumentIdentifier <$> getDocUri "Desktop/simple.hs"
import Language.Haskell.LSP.Test.Parsing
-- | Starts a new session.
-runSession :: FilePath -- ^ The filepath to the root directory for the session.
+runSession :: FilePath -- ^ The filepath to the server executable.
+ -> FilePath -- ^ The filepath to the root directory for the session.
-> Session a -- ^ The session to run.
-> IO ()
-runSession rootDir session = do
+runSession serverExe rootDir session = do
pid <- getProcessID
absRootDir <- canonicalizePath rootDir
def
(Just TraceOff)
- runSessionWithHandler listenServer rootDir $ do
+ runSessionWithHandler listenServer serverExe rootDir $ do
-- Wrap the session around initialize and shutdown calls
sendRequest Initialize initializeParams
-- | 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 ())
+ -> FilePath
-> FilePath
-> Session a
-> IO a
-runSessionWithHandler serverHandler rootDir session = do
+runSessionWithHandler serverHandler serverExe rootDir session = do
absRootDir <- canonicalizePath rootDir
(Just serverIn, Just serverOut, Nothing, serverProc) <- createProcess
- (proc "hie" ["--lsp", "-d", "-l", "/tmp/hie-test.log"])
+ (proc serverExe ["--lsp", "-d", "-l", "/tmp/hie-test.log"])
{ std_in = CreatePipe, std_out = CreatePipe }
hSetBuffering serverIn NoBuffering
-- makes sure it matches up with an expected response.
-- The session directory should have a captured session file in it
-- named "session.log".
-replaySession :: FilePath -- ^ The recorded session directory.
+replaySession :: FilePath -- ^ The filepath to the server executable.
+ -> FilePath -- ^ The recorded session directory.
-> IO Bool
-replaySession sessionDir = do
+replaySession serverExe sessionDir = do
entries <- B.lines <$> B.readFile (sessionDir </> "session.log")
threadId <- forkIO $
runSessionWithHandler (listenServer serverMsgs requestMap reqSema rspSema passVar)
+ serverExe
sessionDir
(sendMessages clientMsgs reqSema rspSema)
main = hspec $ do
describe "manual session" $ do
it "passes a test" $
- runSession "test/recordings/renamePass" $ do
+ runSession "hie" "test/recordings/renamePass" $ do
doc <- openDoc "Desktop/simple.hs" "haskell"
skipMany loggingNotification
it "fails a test" $
-- TODO: Catch the exception in haskell-lsp-test and provide nicer output
- let session = runSession "test/recordings/renamePass" $ do
+ let session = runSession "hie" "test/recordings/renamePass" $ do
openDoc "Desktop/simple.hs" "haskell"
skipMany loggingNotification
anyRequest
describe "replay session" $ do
it "passes a test" $
- replaySession "test/recordings/renamePass" `shouldReturn` True
+ replaySession "hie" "test/recordings/renamePass" `shouldReturn` True
it "fails a test" $
- replaySession "test/recordings/renameFail" `shouldReturn` False
+ replaySession "hie" "test/recordings/renameFail" `shouldReturn` False
parsingSpec