{-# LANGUAGE NoImplicitPrelude #-} module Test.Utility where import Test.QuickCheck (Arbitrary(arbitrary)) import qualified Algebra.RealRing as RealRing import qualified Algebra.Ring as Ring import qualified Data.Char as Char import NumericPrelude.Base import NumericPrelude.Numeric equalList :: Eq a => [a] -> Bool equalList xs = -- 'drop 1' instead of 'take' for suppression of error and (zipWith (==) xs (drop 1 xs)) approxEqual :: (RealRing.C a) => a -> a -> a -> Bool approxEqual eps x y = 2 * abs (x-y) <= eps * (abs x + abs y) approxEqualListRel :: (RealRing.C a) => a -> [a] -> Bool approxEqualListRel eps xs = let n = fromIntegral $ length xs in approxEqualListAbs (eps * n * sum (map abs xs)) xs approxEqualListAbs :: (RealRing.C a) => a -> [a] -> Bool approxEqualListAbs eps xs = let n = fromIntegral $ length xs s = sum xs in sum (map (\x -> abs (n*x-s)) xs) <= eps -- see event-list newtype ArbChar = ArbChar Char deriving (Eq, Ord) instance Show ArbChar where showsPrec n (ArbChar c) = showsPrec n c instance Arbitrary ArbChar where arbitrary = fmap (ArbChar . Char.chr . (32+) . flip mod 96) arbitrary unpackArbString :: [ArbChar] -> String unpackArbString = map (\(ArbChar c) -> c)