mkStates [] = Passed
mkStates ((n, f, msgs):xs) = State n f msgs (mkStates xs)
-runMachine :: String -> [(String, FromServerMessage -> Bool, [Session ()])] -> IO String
-runMachine rootDir encodedStates =
- runSession "hie --lsp" rootDir $ do
+runMachine :: String -> FilePath -> [(String, FromServerMessage -> Bool, [Session ()])] -> IO Bool
+runMachine cmd rootDir encodedStates =
+ runSession cmd rootDir $ do
let f Passed = return Passed
f s = Received <$> anyMessage >>= advance s >>= f
initState = mkStates encodedStates
res <- f initState
case res of
- Passed -> return "passed"
- _ -> return "failed"
+ Passed -> return True
+ _ -> return False
import System.Environment
import System.FilePath
import System.Directory
+import System.Exit
import Language.Haskell.LSP.Test.Machine
-import Language.Haskell.LSP.Test.Parsing ( toJSONMsg )
+import Language.Haskell.LSP.Test.Parsing
+ ( toJSONMsg )
+import Language.Haskell.LSP.Test.Replay
import Language.Haskell.LSP.Messages
import qualified Language.Haskell.LSP.Types as LSP
main = do
- fileName <- head <$> getArgs
- blocks <- parseScript <$> readFile fileName
- print blocks
- rootDir <- getCurrentDirectory
- runBlocks rootDir blocks
-
-runBlocks :: FilePath -> [Block] -> IO ()
-runBlocks rootDir blocks = runMachine rootDir (map convertBlock blocks) >>= putStrLn
+ args <- getArgs
+ curDir <- getCurrentDirectory
+ case args of
+ ["replay", cmd] -> replaySession cmd curDir
+ [file, cmd] -> do
+ blocks <- parseScript <$> readFile file
+ success <- runBlocks cmd curDir blocks
+ if success
+ then putStrLn "Success ✅"
+ else putStrLn "Failed ❌" >> exitFailure
+ _ -> putStrLn "usage: lsp-test (replay <cmd>)|(<file> <cmd>)"
+
+runBlocks :: String -> FilePath -> [Block] -> IO Bool
+runBlocks cmd rootDir blocks = runMachine cmd rootDir (map convertBlock blocks)
where
convertBlock :: Block -> (String, FromServerMessage -> Bool, [Session ()])
convertBlock (Block name w actions) = (name, mkWait w, map mkAction actions)
-"start" { wait for any then open "src/Lib.hs" "haskell" }
+"start" { wait for any then open "Test.hs" "haskell" }
"get the symbols" {
wait for
method == "textDocument/publishDiagnostics"
then
- open "src/Lib.hs" "haskell"
+ open "Test.hs" "haskell"
id1: request "textDocument/documentSymbol" {
textDocument: {
- uri: uri "src/Lib.hs"
+ uri: uri "Test.hs"
}
}
}
wait for
id == 1
then
- open "src/Lib.hs" "haskell"
+ open "Test.hs" "haskell"
}