ce8a3573c3f92edaf0c5efa4a523be83479625a9
[opengl.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     it "can get initialize response" $ runSession "hie --lsp" "test/data/renamePass" $ do
40       rsp <- getInitializeResponse
41       liftIO $ rsp ^. result `shouldNotBe` Nothing
42   
43   describe "replay session" $ do
44     it "passes a test" $
45       replaySession "hie --lsp" "test/data/renamePass" `shouldReturn` True
46     it "fails a test" $
47       replaySession "hie --lsp" "test/data/renameFail" `shouldReturn` False
48
49   describe "manual javascript session" $
50     it "passes a test" $
51       runSession "javascript-typescript-stdio" "test/data/javascriptPass" $ do
52         doc <- openDoc "test.js" "javascript"
53         
54         checkNoDiagnostics
55
56         rspSymbols <- documentSymbols doc
57
58         let (List symbols) = fromJust (rspSymbols ^. result)
59             fooSymbol = head symbols
60         liftIO $ do
61           fooSymbol ^. name `shouldBe` "foo"
62           fooSymbol ^. kind `shouldBe` SkFunction
63   
64   parsingSpec
65
66 checkNoDiagnostics :: Session ()
67 checkNoDiagnostics = do
68   diagsNot <- notification :: Session PublishDiagnosticsNotification
69   liftIO $ diagsNot ^. params . diagnostics `shouldBe` List []
70
71 documentSymbols :: TextDocumentIdentifier -> Session DocumentSymbolsResponse
72 documentSymbols doc = do
73   sendRequest TextDocumentDocumentSymbol (DocumentSymbolParams doc)
74   response