HUnit-Diff-0.1: Test/HUnit/Diff.hs
{- | Very basic support for diffing with HUnit.
Limitations:
* Prints the whole value, not just the difference with a few lines of
context.
* Relies on the similarity of pretty-printed 'show' results which
sorta-kinda works much of the time but may sometimes highlight
differences too eagerly.
* Always colors the differences for ANSI terminals, regardless of output
target.
Despite these limitations, I find it more useful than HUnit's defaults.
-}
module Test.HUnit.Diff ((@?==), (@==?)) where
import Data.Functor ( (<$>) )
import Data.Algorithm.Diff ( getDiff, DI(B, F, S) )
import System.Console.ANSI ( Color(Green, Red), ColorIntensity(Dull)
, ConsoleLayer(Foreground), SGR(SetColor, Reset)
, setSGRCode )
import Test.HUnit ( Assertion, assertBool, (@?=), (@=?) )
import Text.Groom ( groom )
-- | Like '@?=' but producing a colored diff on failure.
(@?==) :: (Eq a, Show a) => a -> a -> Assertion
x @?== y =
assertBool ('\n':msg) (x == y)
where
msg = unlines $ fmt <$> getDiff (lines . groom $ x)
(lines . groom $ y)
fmt (B,s) = ' ' : s
fmt (F,s) = color Green $ '+' : s
fmt (S,s) = color Red $ '-' : s
color c s = setSGRCode [SetColor Foreground Dull c]
++ s ++
setSGRCode [Reset]
-- | Like '@=?' but producing a colored diff on failure.
(@==?) :: (Eq a, Show a) => a -> a -> Assertion
y @==? x = x @?== y