2 Copyright (C) 2002-2008 John Goerzen <jgoerzen@complete.org>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 module TestInfrastructure where
20 import Test.QuickCheck
21 import Test.QuickCheck.Batch
22 import qualified Test.HUnit as HU
23 import qualified Data.Map as Map
28 (@=?) :: (Eq a, Show a) => a -> a -> Result
30 Result {ok = Just (expected == actual),
31 arguments = ["Result: expected " ++ show expected ++ ", got " ++ show actual],
34 (@?=) :: (Eq a, Show a) => a -> a -> Result
37 keysToMap :: Ord k => [k] -> Map.Map k ()
38 keysToMap = foldl (\map k -> Map.insert k () map) Map.empty
40 emptymap :: (Eq k, Ord k, Show v) => Map.Map k v
43 instance (Arbitrary k, Arbitrary v, Eq k, Ord k) => Arbitrary (Map.Map k v) where
46 return $ Map.fromList items
47 coarbitrary = coarbitrary . Map.keys
49 instance Arbitrary Word8 where
50 arbitrary = sized $ \n -> choose (0, min (fromIntegral n) maxBound)
51 coarbitrary n = variant (if n >= 0 then 2 * x else 2 * x + 1)
52 where x = abs . fromIntegral $ n
54 instance Random Word8 where
55 randomR (a, b) g = (\(x, y) -> (fromInteger x, y)) $
56 randomR (toInteger a, toInteger b) g
57 random g = randomR (minBound, maxBound) g
59 -- Modified from HUnit
60 runVerbTestText :: HU.PutText st -> HU.Test -> IO (HU.Counts, st)
61 runVerbTestText (HU.PutText put us) t = do
62 (counts, us') <- HU.performTest reportStart reportError reportFailure us t
63 us'' <- put (HU.showCounts counts) True us'
66 reportStart ss us = do hPrintf stderr "\rTesting %-68s\n" (HU.showPath (HU.path ss))
67 put (HU.showCounts (HU.counts ss)) False us
68 reportError = reportProblem "Error:" "Error in: "
69 reportFailure = reportProblem "Failure:" "Failure in: "
70 reportProblem p0 p1 msg ss us = put line True us
71 where line = "### " ++ kind ++ path' ++ '\n' : msg
72 kind = if null path' then p0 else p1
73 path' = HU.showPath (HU.path ss)