X-Git-Url: http://git.lukelau.me/?a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest%2FExceptions.hs;h=b1e0635e31b435b6a8e480e19b83b43fdab6802b;hb=76034cba7ecf34ce9098d46f7e7bccea2b66c81f;hp=b337f0bee70032fc1b7595247966ca5a1ca6bedf;hpb=e2ae28cd825653b0cb8b982d113497e9ac795059;p=lsp-test.git diff --git a/src/Language/Haskell/LSP/Test/Exceptions.hs b/src/Language/Haskell/LSP/Test/Exceptions.hs index b337f0b..b1e0635 100644 --- a/src/Language/Haskell/LSP/Test/Exceptions.hs +++ b/src/Language/Haskell/LSP/Test/Exceptions.hs @@ -4,14 +4,20 @@ 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 +-- | An exception that can be thrown during a 'Haskell.LSP.Test.Session.Session' data SessionException = Timeout | UnexpectedMessage String FromServerMessage | ReplayOutOfOrder FromServerMessage [FromServerMessage] | UnexpectedDiagnostics | IncorrectApplyEditRequest String | UnexpectedResponseError LspIdRsp ResponseError + | UnexpectedServerTermination deriving Eq instance Exception SessionException @@ -23,15 +29,22 @@ instance Show SessionException where "Was parsing: " ++ expected ++ "\n" ++ "Last message received: " ++ show lastMsg show (ReplayOutOfOrder received expected) = - "Replay is out of order:\n" ++ + 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) + "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" +-- | A predicate that matches on any 'SessionException' anySessionException :: SessionException -> Bool anySessionException = const True