X-Git-Url: https://git.lukelau.me/?a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest%2FExceptions.hs;h=b28e256cc0857522c4558dd2d38e3823b6b3efbf;hb=84e2707604b3a64c00062104fa40e2ea76040155;hp=3f122f25281accde8bd063c8d52f6cd6520c8a39;hpb=d8e460543b7cbc32550bed20d20ef4b13d6705a5;p=lsp-test.git diff --git a/src/Language/Haskell/LSP/Test/Exceptions.hs b/src/Language/Haskell/LSP/Test/Exceptions.hs index 3f122f2..b28e256 100644 --- a/src/Language/Haskell/LSP/Test/Exceptions.hs +++ b/src/Language/Haskell/LSP/Test/Exceptions.hs @@ -1,36 +1,59 @@ module Language.Haskell.LSP.Test.Exceptions where import Control.Exception -import Language.Haskell.LSP.Messages import Language.Haskell.LSP.Types import Data.Aeson +import Data.Aeson.Encode.Pretty +import Data.Algorithm.Diff +import Data.Algorithm.DiffOutput +import Data.List import qualified Data.ByteString.Lazy.Char8 as B -data SessionException = TimeoutException - | UnexpectedMessageException String FromServerMessage - | ReplayOutOfOrderException FromServerMessage [FromServerMessage] - | UnexpectedDiagnosticsException - | IncorrectApplyEditRequestException String - | UnexpectedResponseError LspIdRsp ResponseError +-- | An exception that can be thrown during a 'Haskell.LSP.Test.Session.Session' +data SessionException = Timeout (Maybe FromServerMessage) + | NoContentLengthHeader + | UnexpectedMessage String FromServerMessage + | ReplayOutOfOrder FromServerMessage [FromServerMessage] + | UnexpectedDiagnostics + | IncorrectApplyEditRequest String + | UnexpectedResponseError SomeLspId ResponseError + | UnexpectedServerTermination + | IllegalInitSequenceMessage FromServerMessage + deriving Eq instance Exception SessionException instance Show SessionException where - show TimeoutException = "Timed out waiting to receive a message from the server." - show (UnexpectedMessageException expected lastMsg) = + show (Timeout lastMsg) = + "Timed out waiting to receive a message from the server." ++ + case lastMsg of + Just msg -> "\nLast message received:\n" ++ B.unpack (encodePretty msg) + Nothing -> mempty + show NoContentLengthHeader = "Couldn't read Content-Length header from the server." + show (UnexpectedMessage expected lastMsg) = "Received an unexpected message from the server:\n" ++ - "Expected: " ++ expected ++ "\n" ++ - "Last message accepted: " ++ show lastMsg - show (ReplayOutOfOrderException received expected) = - "Replay is out of order:\n" ++ + "Was parsing: " ++ expected ++ "\n" ++ + "But the last message received was:\n" ++ B.unpack (encodePretty lastMsg) + show (ReplayOutOfOrder received expected) = + let expected' = nub expected + getJsonDiff = lines . B.unpack . encodePretty + showExp exp = B.unpack (encodePretty exp) ++ "\nDiff:\n" ++ + ppDiff (getGroupedDiff (getJsonDiff received) (getJsonDiff exp)) + in "Replay is out of order:\n" ++ -- Print json so its a bit easier to update the session logs - "Received from server:\n" ++ B.unpack (encode received) ++ "\n" ++ - "Expected one of:\n" ++ unlines (map (B.unpack . encode) expected) - show UnexpectedDiagnosticsException = "Unexpectedly received diagnostics from the server." - show (IncorrectApplyEditRequestException msgStr) = "ApplyEditRequest didn't contain document, instead received:\n" + "Received from server:\n" ++ B.unpack (encodePretty received) ++ "\n" ++ + "Raw from server:\n" ++ B.unpack (encode received) ++ "\n" ++ + "Expected one of:\n" ++ unlines (map showExp expected') + show UnexpectedDiagnostics = "Unexpectedly received diagnostics from the server." + show (IncorrectApplyEditRequest msgStr) = "ApplyEditRequest didn't contain document, instead received:\n" ++ msgStr show (UnexpectedResponseError lid e) = "Received an exepected error in a response for id " ++ show lid ++ ":\n" ++ show e + show UnexpectedServerTermination = "Language server unexpectedly terminated" + show (IllegalInitSequenceMessage msg) = + "Received an illegal message between the initialize request and response:\n" + ++ B.unpack (encodePretty msg) +-- | A predicate that matches on any 'SessionException' anySessionException :: SessionException -> Bool anySessionException = const True