{-# LANGUAGE NoImplicitPrelude #-} module Test.Utility where import Test.QuickCheck (Arbitrary(arbitrary)) import qualified Number.Complex as Complex import qualified Algebra.RealRing as RealRing import qualified Data.List.HT as ListHT import qualified Data.Char as Char import NumericPrelude.Base import NumericPrelude.Numeric equalList :: Eq a => [a] -> Bool equalList xs = and (ListHT.mapAdjacent (==) xs) approxEqual :: (RealRing.C a) => a -> a -> a -> Bool approxEqual eps x y = 2 * abs (x-y) <= eps * (abs x + abs y) approxEqualAbs :: (RealRing.C a) => a -> a -> a -> Bool approxEqualAbs eps x y = abs (x-y) <= eps 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 approxEqualComplex :: (RealRing.C a) => a -> Complex.T a -> Complex.T a -> Bool approxEqualComplex eps x y = 2 * Complex.magnitudeSqr (x-y) <= eps^2 * (Complex.magnitudeSqr x + Complex.magnitudeSqr y) approxEqualComplexAbs :: (RealRing.C a) => a -> Complex.T a -> Complex.T a -> Bool approxEqualComplexAbs eps x y = Complex.magnitudeSqr (x-y) <= eps^2 -- 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)