import qualified Data.Map as Map
import System.IO
import Text.Printf
+import System.Random
+import Data.Word
+import Test.HUnit.Utils
(@=?) :: (Eq a, Show a) => a -> a -> Result
expected @=? actual =
keysToMap :: Ord k => [k] -> Map.Map k ()
keysToMap = foldl (\map k -> Map.insert k () map) Map.empty
-emptymap :: (Eq k, Ord k) => Map.Map k ()
+emptymap :: (Eq k, Ord k, Show v) => Map.Map k v
emptymap = Map.empty
-instance (Arbitrary k, Eq k, Ord k) => Arbitrary (Map.Map k ()) where
+instance (Arbitrary k, Arbitrary v, Eq k, Ord k) => Arbitrary (Map.Map k v) where
arbitrary =
do items <- arbitrary
- return $ keysToMap items
+ return $ Map.fromList items
coarbitrary = coarbitrary . Map.keys
+instance Arbitrary Word8 where
+ arbitrary = sized $ \n -> choose (0, min (fromIntegral n) maxBound)
+ coarbitrary n = variant (if n >= 0 then 2 * x else 2 * x + 1)
+ where x = abs . fromIntegral $ n
+
+instance Random Word8 where
+ randomR (a, b) g = (\(x, y) -> (fromInteger x, y)) $
+ randomR (toInteger a, toInteger b) g
+ random g = randomR (minBound, maxBound) g
+
+instance Arbitrary Char where
+ arbitrary = sized $ \n -> choose (toEnum 0, min (toEnum n) maxBound)
+ coarbitrary n = variant (if (fromEnum n) >= 0 then toEnum (2 * x) else toEnum (2 * x + 1))
+ where x = (abs . fromEnum $ n)::Int
+
-- Modified from HUnit
runVerbTestText :: HU.PutText st -> HU.Test -> IO (HU.Counts, st)
runVerbTestText (HU.PutText put us) t = do
us'' <- put (HU.showCounts counts) True us'
return (counts, us'')
where
- reportStart ss us = do hPrintf stderr "\rTesting %-68s\n" (HU.showPath (HU.path ss))
+ reportStart ss us = do hPrintf stdout "\rTesting %-68s\n" (HU.showPath (HU.path ss))
put (HU.showCounts (HU.counts ss)) False us
reportError = reportProblem "Error:" "Error in: "
reportFailure = reportProblem "Failure:" "Failure in: "
kind = if null path' then p0 else p1
path' = HU.showPath (HU.path ss)
+q :: Testable a => String -> a -> HU.Test
+q = qccheck (defaultConfig {configMaxTest = 250, configMaxFail = 10000,
+ configEvery = \_ _ -> ""})
+ -- configEvery = testCount for displaying a running test counter
+ where testCountBase n = " (test " ++ show n ++ "/250)"
+ testCount n _ = testCountBase n ++
+ replicate (length (testCountBase n)) '\b'
+