
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].
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"