Add diff to replay error output
authorLuke Lau <luke_lau@icloud.com>
Tue, 31 Jul 2018 10:35:07 +0000 (11:35 +0100)
committerLuke Lau <luke_lau@icloud.com>
Tue, 31 Jul 2018 10:35:07 +0000 (11:35 +0100)
.gitignore
haskell-lsp-test.cabal
src/Language/Haskell/LSP/Test/Exceptions.hs

index f78eac276c8334321aeeb525a251487b8a2260b1..e6ad272600f4e4807589e1b9da4d1c98207d17f7 100644 (file)
@@ -1,5 +1,7 @@
 .stack-work
 dist
+.cabal-sandbox
+cabal.sandbox.config
 dist-newstyle
 cabal.project.local*
 .ghc.environment.*
index d3ef9402ab39ed547f9280c63b50791dc04a98de..ec769ac9b7544c78014bbe2ff8f088599bf691e3 100644 (file)
@@ -33,6 +33,7 @@ library
                      , conduit-parse
                      , containers
                      , data-default
+                     , Diff
                      , directory
                      , filepath
                      , lens
index b337f0bee70032fc1b7595247966ca5a1ca6bedf..28903dc76d46ea1d9a4a9c2d7b5202793beeb8f7 100644 (file)
@@ -3,7 +3,10 @@ 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 = Timeout
@@ -23,10 +26,14 @@ 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" ++
+       "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