Add javascript langserver testing
[lsp-test.git] / test / Test.hs
1 {-# LANGUAGE DuplicateRecordFields #-}
2 {-# LANGUAGE OverloadedStrings #-}
3 import           Test.Hspec
4 import           Data.Maybe
5 import           Control.Monad.IO.Class
6 import           Control.Lens hiding (List)
7 import           Language.Haskell.LSP.Test
8 import           Language.Haskell.LSP.Test.Replay
9 import           Language.Haskell.LSP.Types
10 import           ParsingTests
11
12 main = hspec $ do
13   describe "manual session" $ do
14     it "passes a test" $
15       runSession "hie --lsp" "test/data/renamePass" $ do
16         doc <- openDoc "Desktop/simple.hs" "haskell"
17
18         skipMany loggingNotification
19
20         checkNoDiagnostics
21         
22         rspSymbols <- documentSymbols doc
23         
24         liftIO $ do
25           let (List symbols) = fromJust (rspSymbols ^. result)
26               mainSymbol = head symbols
27           mainSymbol ^. name `shouldBe` "main"
28           mainSymbol ^. kind `shouldBe` SkFunction
29           mainSymbol ^. location . range `shouldBe` Range (Position 3 0) (Position 3 4)
30           mainSymbol ^. containerName `shouldBe` Nothing
31     
32     it "fails a test" $
33       -- TODO: Catch the exception in haskell-lsp-test and provide nicer output
34       let session = runSession "hie --lsp" "test/data/renamePass" $ do
35                       openDoc "Desktop/simple.hs" "haskell"
36                       skipMany loggingNotification
37                       anyRequest
38         in session `shouldThrow` anyException
39   
40   describe "replay session" $ do
41     it "passes a test" $
42       replaySession "hie --lsp" "test/data/renamePass" `shouldReturn` True
43     it "fails a test" $
44       replaySession "hie --lsp" "test/data/renameFail" `shouldReturn` False
45
46   describe "manual javascript session" $
47     it "passes a test" $
48       runSession "javascript-typescript-stdio" "test/data/javascriptPass" $ do
49         doc <- openDoc "test.js" "javascript"
50         
51         checkNoDiagnostics
52
53         rspSymbols <- documentSymbols doc
54
55         let (List symbols) = fromJust (rspSymbols ^. result)
56             fooSymbol = head symbols
57         liftIO $ do
58           fooSymbol ^. name `shouldBe` "foo"
59           fooSymbol ^. kind `shouldBe` SkFunction
60   
61   parsingSpec
62
63 checkNoDiagnostics :: Session ()
64 checkNoDiagnostics = do
65   diagsNot <- notification :: Session PublishDiagnosticsNotification
66   liftIO $ diagsNot ^. params . diagnostics `shouldBe` List []
67
68 documentSymbols :: TextDocumentIdentifier -> Session DocumentSymbolsResponse
69 documentSymbols doc = do
70   sendRequest TextDocumentDocumentSymbol (DocumentSymbolParams doc)
71   response