# Revision history for lsp-test
+## 0.8.2.0 -- 2019-11-17
+
+* Expose `satisfyMaybe` (@cocreature)
+
+## 0.8.1.0 -- 2019-11-17
+
+* Update to haskell-lsp-0.18.0.0 (@mpickering, @alanz)
+* Tests now require hie-bios based hie
+
## 0.8.0.0 -- 2019-10-18
* Make `Session` a newtype
`npm i -g javascript-typescript-langserver`
Then run the tests with `stack test` or `cabal new-test`.
+
+## Troubleshooting
+Seeing funny stuff when running lsp-test via stack? If your server is built upon Haskell tooling, [keep in mind that stack sets some environment variables related to GHC, and you may want to unset them.](https://github.com/alanz/haskell-ide-engine/blob/bfb16324d396da71000ef81d51acbebbdaa854ab/test/utils/TestUtils.hs#L290-L298)
name: lsp-test
-version: 0.8.0.0
+version: 0.8.2.0
synopsis: Functional test framework for LSP servers.
description:
A test framework for writing tests against
, parser-combinators:Control.Applicative.Combinators
default-language: Haskell2010
build-depends: base >= 4.10 && < 5
- , haskell-lsp == 0.17.*
+ , haskell-lsp == 0.18.*
, aeson
, aeson-pretty
, ansi-terminal
, bytestring
, conduit
, conduit-parse == 0.2.*
- , containers
+ , containers >= 0.5.9
, data-default
, Diff
, directory
build-depends: base >= 4.10 && < 5
, hspec
, lens
- , haskell-lsp == 0.17.*
+ , haskell-lsp == 0.18.*
, lsp-test
, data-default
, aeson
documentContents :: TextDocumentIdentifier -> Session T.Text
documentContents doc = do
vfs <- vfs <$> get
- let file = vfs Map.! toNormalizedUri (doc ^. uri)
+ let file = vfsMap vfs Map.! toNormalizedUri (doc ^. uri)
return $ Rope.toText $ Language.Haskell.LSP.VFS._text file
-- | Parses an ApplyEditRequest, checks that it is for the passed document
n :: DidOpenTextDocumentNotification
n = NotificationMessage "2.0" TextDocumentDidOpen params'
oldVFS <- vfs <$> get
- newVFS <- liftIO $ openVFS oldVFS n
+ let (newVFS,_) = openVFS oldVFS n
modify (\s -> s { vfs = newVFS })
sendMessage n
n :: DidCloseTextDocumentNotification
n = NotificationMessage "2.0" TextDocumentDidClose params'
oldVFS <- vfs <$> get
- newVFS <- liftIO $ closeVFS oldVFS n
+ let (newVFS,_) = closeVFS oldVFS n
modify (\s -> s { vfs = newVFS })
sendMessage n
n :: DidChangeTextDocumentNotification
n = NotificationMessage "2.0" TextDocumentDidChange params'
oldVFS <- vfs <$> get
- newVFS <- liftIO $ changeFromClientVFS oldVFS n
+ let (newVFS,_) = changeFromClientVFS oldVFS n
modify (\s -> s { vfs = newVFS })
sendMessage n
-- | Adds the current version to the document, as tracked by the session.
getVersionedDoc :: TextDocumentIdentifier -> Session VersionedTextDocumentIdentifier
getVersionedDoc (TextDocumentIdentifier uri) = do
- fs <- vfs <$> get
+ fs <- vfsMap . vfs <$> get
let ver =
case fs Map.!? toNormalizedUri uri of
- Just (VirtualFile v _ _) -> Just v
+ Just (VirtualFile v _) -> Just v
_ -> Nothing
return (VersionedTextDocumentIdentifier uri ver)
module Language.Haskell.LSP.Test.Parsing
( -- $receiving
satisfy
+ , satisfyMaybe
, message
, anyRequest
, anyResponse
mainThreadId <- myThreadId
let context = SessionContext serverIn absRootDir messageChan reqMap initRsp config caps
- initState = SessionState (IdInt 0) mempty mempty 0 False Nothing
- runSession' = runSession context initState
+ initState vfs = SessionState (IdInt 0) vfs
+ mempty 0 False Nothing
+ runSession' ses = initVFS $ \vfs -> runSession context (initState vfs) ses
errorHandler = throwTo mainThreadId :: SessionException -> IO()
serverListenerLauncher =
forM_ bumpedVersions $ \(VersionedTextDocumentIdentifier uri v) ->
modify $ \s ->
let oldVFS = vfs s
- update (VirtualFile oldV t mf) = VirtualFile (fromMaybe oldV v) t mf
- newVFS = Map.adjust update (toNormalizedUri uri) oldVFS
+ update (VirtualFile oldV t) = VirtualFile (fromMaybe oldV v) t
+ newVFS = updateVFS (Map.adjust update (toNormalizedUri uri)) oldVFS
in s { vfs = newVFS }
where checkIfNeedsOpened uri = do
ctx <- ask
-- if its not open, open it
- unless (toNormalizedUri uri `Map.member` oldVFS) $ do
+ unless (toNormalizedUri uri `Map.member` (vfsMap oldVFS)) $ do
let fp = fromJust $ uriToFilePath uri
contents <- liftIO $ T.readFile fp
let item = TextDocumentItem (filePathToUri fp) "" 0 contents
liftIO $ B.hPut (serverIn ctx) $ addHeader (encode msg)
modifyM $ \s -> do
- newVFS <- liftIO $ openVFS (vfs s) msg
+ let (newVFS,_) = openVFS (vfs s) msg
return $ s { vfs = newVFS }
getParams (TextDocumentEdit docId (List edits)) =
noDiagnostics
noDiagnostics
- item:_ <- getCompletions doc (Position 5 5)
+ comps <- getCompletions doc (Position 5 5)
+ let item = head (filter (\x -> x ^. label == "interactWithUser") comps)
liftIO $ do
item ^. label `shouldBe` "interactWithUser"
item ^. kind `shouldBe` Just CiFunction
describe "waitForDiagnosticsSource" $
it "works" $ runSession "hie" fullCaps "test/data" $ do
openDoc "Error.hs" "haskell"
- [diag] <- waitForDiagnosticsSource "ghcmod"
+ [diag] <- waitForDiagnosticsSource "bios"
liftIO $ do
diag ^. severity `shouldBe` Just DsError
- diag ^. source `shouldBe` Just "ghcmod"
+ diag ^. source `shouldBe` Just "bios"
describe "rename" $
it "works" $ runSession "hie" fullCaps "test/data" $ do