1 {-# LANGUAGE KindSignatures #-}
2 {-# LANGUAGE OverloadedStrings #-}
3 {-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-}
4 module Language.Haskell.LSP.Test.Machine where
6 import Control.Monad.Catch
8 import Language.Haskell.LSP.Test
9 import qualified Language.Haskell.LSP.Types as L
11 import qualified Hedgehog.Gen as Gen
12 import qualified Hedgehog.Range as Range
13 import Control.Monad.IO.Class
14 import Control.Monad.Trans.Class
17 data ModelState (v :: * -> *) = TDocClose | TDocOpen | TDocWaited
18 deriving (Eq, Ord, Show)
20 data OpenDoc (v :: * -> *) = OpenDoc
23 instance HTraversable OpenDoc where
24 htraverse _ OpenDoc = pure OpenDoc
26 s_openDoc_init :: (Monad n) => Command n PropertySession ModelState
28 let gen TDocClose = Just $ pure OpenDoc
30 execute OpenDoc = openDoc "Format.hs" "haskell"
31 in Command gen execute [
32 Require $ \s OpenDoc -> s == TDocClose
33 , Update $ \_s OpenDoc o -> TDocOpen
34 , Ensure $ \before after OpenDoc o -> do
36 let L.TextDocumentIdentifier uri = o
37 uri === L.Uri "file:///Users/luke/Source/haskell-lsp-test/test/data/Format.hs"
41 data WaitDiags (v :: * -> *) = WaitDiags
44 instance HTraversable WaitDiags where
45 htraverse _ WaitDiags = pure WaitDiags
47 s_diagnostics :: Monad n => Command n PropertySession ModelState
49 let gen TDocOpen = Just $ pure WaitDiags
51 execute WaitDiags = waitForDiagnostics
52 in Command gen execute [
53 Require $ \s WaitDiags -> s == TDocOpen
54 , Update $ \s WaitDiags o -> TDocWaited
55 , Ensure $ \before after WaitDiags o -> o === []
58 data CloseDoc (v :: * -> *) = CloseDoc
61 instance HTraversable CloseDoc where
62 htraverse _ CloseDoc = pure CloseDoc
64 s_closeDoc :: Monad n => Command n PropertySession ModelState
66 let gen TDocOpen = Just $ pure CloseDoc
67 gen TDocWaited = Just $ pure CloseDoc
69 execute CloseDoc = closeDoc (L.TextDocumentIdentifier (L.Uri "file:///Users/luke/Source/haskell-lsp-test/test/data/Format.hs"))
70 in Command gen execute [
71 Require $ \s CloseDoc -> s == TDocOpen || s == TDocWaited
72 , Update $ \_s CloseDoc o -> TDocClose
75 type PropertySession = SessionT (PropertyT IO)
77 instance MonadThrow m => MonadCatch (SessionT m) where
80 instance MonadTest PropertySession where
81 liftTest = lift . liftTest
83 initialState :: ModelState v
84 initialState = TDocClose
87 prop_doc = property $ do
89 Gen.sequential (Range.constant 1 100) initialState
94 runSessionWithConfig (def { logMessages = True }) "hie --lsp" def "test/data" $
95 executeSequential initialState actions