[Haskell-beginners] hunit question

Daniel Fischer daniel.is.fischer at web.de
Tue Feb 2 16:34:54 EST 2010


Am Dienstag 02 Februar 2010 22:18:50 schrieb Joe Van Dyk:
> I have a little binary search function and am trying to write tests
> for it in hunit.
>
> The below approach doesn't compile, because I'm attempting to build a
> list of tuples of different types, which isn't working for me.
>
> What's the appropriate way to do this test?

QuickCheck, I'd say. Let that create more testcases than you could bother 
to write out.

Anyway, for testing lists of different types, you'd need separate tests 
(properties/assertions).

*But* you don't need that. Because the algorithm is general (works the same 
way for all types in Ord), the only way it could be correct on one type but 
not on another is if the Ord instance of one (or both) of the types is 
incorrect.

So it's sufficient to test on [Int].

>
> http://gist.github.com/293031
>
> import Test.HUnit
> import JoeBinarySearch
> -- Note:
> -- JoeBinarySearch.binary_search :: (Ord a) => [a] -> a -> Maybe Int
>
> assertions = [
>   ([1],       1, (Just 0)),
>   ([1, 3],    1, (Just 0)),
>   ([1, 3, 4], 4, (Just 2)),
>   ([1,2,4,6,8,9,12,15,17,20], 17, (Just 8)),
>   ([1,2,4,6,8,9,12,15,17,20], 20, (Just 9)),
>   ("hello",                 'l', (Just 2)), -- BOOM
>   ([0.0, 1.5, 3.0],         3.0, (Just 2)),
>   ([],                      1, Nothing),
>   ([1,3],                   2, Nothing),
>   ([1,4,6,8,9,12,15,17,20], 2, Nothing),
>   ([1,4,6,8,9,12,15,17,20], 100, Nothing),
>   ([1,4,6,8,9,12,15,17,20], (-100), Nothing)]
>
> test_list = TestList test_cases
>   where
>     test_cases = map test_func assertions
>     test_func (lst, input, expected) = TestCase $ assert_equal' (
> binary_search lst  input ) expected
>     assert_equal' = assertEqual "should equal"
>
> main :: IO ()
> main = do
>   runTestTT test_list
>   print "DONE"



More information about the Beginners mailing list