On Sun, Aug 5, 2012 at 12:32 AM, Henk-Jan van Tuyl <[email protected]> wrote: > On Sun, 05 Aug 2012 03:21:39 +0200, Matthew <[email protected]> wrote: > >> I've got a function which takes in two chars, describing a playing >> card and a suit. An example would be 4C or TH for a 4 of Clubs or a >> Ten of Hearts. I need to be able to compare the ranks of a card (e.g. >> a King is 13), so a Card is a tuple of rank and suit. The function >> which parses a Card is type String -> Maybe Card. >> >> I'm writing unit tests for this using HUnit, and ideally I'd go with a >> table-driven[1] approach, where each test case is a tuple of the input >> and the expected output. (Possibly I could expand this to a triple, or >> simply a list, to allow for an error message for each test case.) Then >> all the test function has to do is run through each case and assert as >> necessary. Example: [("TH", Just (Hearts, 10)), ("XH", Nothing)]. > > > A simple solution: > >> parseCard :: String -> Maybe Card >> parseCard string = <your function to test> >> test :: Bool >> test = all testEqual [("TH", Just (Hearts, 10)), ("XH", Nothing)] >> where >> testEqual (input, output) = parseCard input == output > > > For a description of 'all', see: > http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:all
Thanks for the response. The one problem I have with this is that it will not be at all obvious which test case (or cases!) failed. That said, maybe I could do something similar, with a Writer? A passed test writes "", but a failed one writes a test-specific failure message. Then the test itself uses this string as the assert message. > > Regards, > Henk-Jan van Tuyl > > > -- > http://Van.Tuyl.eu/ > http://members.chello.nl/hjgtuyl/tourdemonad.html > Haskell programming > -- _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
