
Hi tom, I had problems installing version 0.1.2.1 on GHC 7.4.1: Resolving dependencies...
Downloading rematch-0.1.2.1...
Configuring rematch-0.1.2.1...
Building rematch-0.1.2.1...
Preprocessing library rematch-0.1.2.1...
[1 of 4] Compiling Control.Rematch.Formatting (
Control/Rematch/Formatting.hs, dist/build/Control/Rematch/Formatting.o )
[2 of 4] Compiling Control.Rematch.Run ( Control/Rematch/Run.hs,
dist/build/Control/Rematch/Run.o )
[3 of 4] Compiling Control.Rematch ( Control/Rematch.hs,
dist/build/Control/Rematch.o )
[4 of 4] Compiling Control.Rematch.QuickCheck (
Control/Rematch/QuickCheck.hs, dist/build/Control/Rematch/QuickCheck.o )
Control/Rematch/QuickCheck.hs:19:3:
`exhaustive' is not a (visible) method of class `Testable'
Failed to install rematch-0.1.2.1
cabal: Error: some packages failed to install:
rematch-0.1.2.1 failed during the building phase. The exception was:
ExitFailure 1
I installed v 0.1.2.0 without problems.
Best regards,
Petr
2013/4/16 Tom Crayford
I kept on running into this thing where I was calling error in quickcheck to get good error messages about the things I was comparing. In Java land, this stuff is handled by Hamcrest: a library for composable assertions with good error messages. This library is basically a port of hamcrest's core api, but I've been very pleased with how it turned out.
I've been using this in tests for production code for a month or so now, and I'm very pleased with it.
Running a matcher (in this example in an hunit test) looks like this:
expect [1] (is [1])
The core API is very simple:
data Matcher a = Matcher { match :: a -> Bool -- ^ A function that returns True if the matcher should pass, False if it should fail , description :: String -- ^ A description of the matcher (usually of its success conditions) , describeMismatch :: a -> String -- ^ A description to be shown if the match fails. }
This means you can add/write your own matchers happily, which occasionally means you can write *very* nice test code (here's an example of using a custom matcher for checking the state of an "issue" in a hypothetical issue tracking app):
expect latestIssue (hasState Resolved)
-- I removed the supporting code to make this assertion actually run, -- this email is already pretty long.
There are numerous matchers (and functions for creating matchers) in the rematch library, including some composition functions that provide good failure messages.
There are some shims to hook rematch into the common haskell test frameworks (specifically hunit and quickcheck).
The two libraries are up on hackage: http://hackage.haskell.org/package/rematch http://hackage.haskell.org/package/rematch-text
The code is all up on github:
http://github.com/tcrayford/rematch
I get rather frustrated when my tests give bad failure explanations, and using rematch goes a long way to fix that.
Lastly, rematch is pretty isolated from test frameworks/etc, with a very small and easy to understand surface api. Hopefully it'll help with the thing I've seen in other languages (cough ruby cough) with every test framework reinventing this idea, and not all frameworks having all the matchers I want to use.
Let me know if you have any feedback/thoughts
Tom
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe