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 import Test.HUnit.Utils
30 (@=?) :: (Eq a, Show a) => a -> a -> Result
32 Result {ok = Just (expected == actual),
33 arguments = ["Result: expected " ++ show expected ++ ", got " ++ show actual],
36 (@?=) :: (Eq a, Show a) => a -> a -> Result
39 keysToMap :: Ord k => [k] -> Map.Map k ()
40 keysToMap = foldl (\map k -> Map.insert k () map) Map.empty
42 emptymap :: (Eq k, Ord k, Show v) => Map.Map k v
45 instance (Arbitrary k, Arbitrary v, Eq k, Ord k) => Arbitrary (Map.Map k v) where
48 return $ Map.fromList items
49 coarbitrary = coarbitrary . Map.keys
51 instance Arbitrary Word8 where
52 arbitrary = sized $ \n -> choose (0, min (fromIntegral n) maxBound)
53 coarbitrary n = variant (if n >= 0 then 2 * x else 2 * x + 1)
54 where x = abs . fromIntegral $ n
56 instance Random Word8 where
57 randomR (a, b) g = (\(x, y) -> (fromInteger x, y)) $
58 randomR (toInteger a, toInteger b) g
59 random g = randomR (minBound, maxBound) g
61 instance Arbitrary Char where
62 arbitrary = sized $ \n -> choose (toEnum 0, min (toEnum n) maxBound)
63 coarbitrary n = variant (if (fromEnum n) >= 0 then toEnum (2 * x) else toEnum (2 * x + 1))
64 where x = (abs . fromEnum $ n)::Int
66 -- Modified from HUnit
67 runVerbTestText :: HU.PutText st -> HU.Test -> IO (HU.Counts, st)
68 runVerbTestText (HU.PutText put us) t = do
69 (counts, us') <- HU.performTest reportStart reportError reportFailure us t
70 us'' <- put (HU.showCounts counts) True us'
73 reportStart ss us = do hPrintf stdout "\rTesting %-68s\n" (HU.showPath (HU.path ss))
74 put (HU.showCounts (HU.counts ss)) False us
75 reportError = reportProblem "Error:" "Error in: "
76 reportFailure = reportProblem "Failure:" "Failure in: "
77 reportProblem p0 p1 msg ss us = put line True us
78 where line = "### " ++ kind ++ path' ++ '\n' : msg
79 kind = if null path' then p0 else p1
80 path' = HU.showPath (HU.path ss)
82 q :: Testable a => String -> a -> HU.Test
83 q = qccheck (defaultConfig {configMaxTest = 250, configMaxFail = 5000})