Blame tests/Instances.hs

Packit 9a2dfb
{-# LANGUAGE CPP #-}
Packit 9a2dfb
{-# LANGUAGE FlexibleContexts #-}
Packit 9a2dfb
{-# LANGUAGE FlexibleInstances #-}
Packit 9a2dfb
{-# LANGUAGE OverloadedStrings #-}
Packit 9a2dfb
{-# LANGUAGE RecordWildCards #-}
Packit 9a2dfb
{-# OPTIONS_GHC -fno-warn-orphans #-}
Packit 9a2dfb
Packit 9a2dfb
module Instances () where
Packit 9a2dfb
Packit 9a2dfb
import Prelude ()
Packit 9a2dfb
import Prelude.Compat
Packit 9a2dfb
Packit 9a2dfb
import Control.Applicative (empty)
Packit 9a2dfb
import Control.Monad
Packit 9a2dfb
import Data.Aeson.Types
Packit 9a2dfb
import Data.Function (on)
Packit 9a2dfb
import Data.Time (ZonedTime(..), TimeZone(..))
Packit 9a2dfb
import Data.Time.Clock (UTCTime(..))
Packit 9a2dfb
import Functions
Packit 9a2dfb
import Test.QuickCheck (Arbitrary(..), elements,  oneof)
Packit 9a2dfb
import Types
Packit 9a2dfb
import qualified Data.DList as DList
Packit 9a2dfb
import qualified Data.HashMap.Strict as HM
Packit 9a2dfb
Packit 9a2dfb
import Data.Orphans ()
Packit 9a2dfb
import Test.QuickCheck.Instances ()
Packit 9a2dfb
#if MIN_VERSION_base(4,7,0)
Packit 9a2dfb
import Data.Hashable.Time ()
Packit 9a2dfb
#endif
Packit 9a2dfb
Packit 9a2dfb
-- "System" types.
Packit 9a2dfb
Packit 9a2dfb
instance Arbitrary DotNetTime where
Packit 9a2dfb
    arbitrary = DotNetTime `liftM` arbitrary
Packit 9a2dfb
    shrink = map DotNetTime . shrink . fromDotNetTime
Packit 9a2dfb
Packit 9a2dfb
-- | Compare timezone part only on 'timeZoneMinutes'
Packit 9a2dfb
instance Eq ZonedTime where
Packit 9a2dfb
  ZonedTime a (TimeZone a' _ _) == ZonedTime b (TimeZone b' _ _) =
Packit 9a2dfb
    a == b && a' == b'
Packit 9a2dfb
Packit 9a2dfb
-- Compare equality to within a millisecond, allowing for rounding
Packit 9a2dfb
-- error (ECMA 262 requires milliseconds to rounded to zero, not
Packit 9a2dfb
-- rounded to nearest).
Packit 9a2dfb
instance ApproxEq UTCTime where
Packit 9a2dfb
    a =~ b = ((==) `on` utctDay) a b &&
Packit 9a2dfb
             (approxEqWith 1 1 `on` ((* 1e3) . utctDayTime)) a b
Packit 9a2dfb
Packit 9a2dfb
instance ApproxEq DotNetTime where
Packit 9a2dfb
    (=~) = (=~) `on` fromDotNetTime
Packit 9a2dfb
Packit 9a2dfb
instance ApproxEq Float where
Packit 9a2dfb
    a =~ b
Packit 9a2dfb
      | isNaN a && isNaN b = True
Packit 9a2dfb
      | otherwise          = approxEq a b
Packit 9a2dfb
Packit 9a2dfb
instance ApproxEq Double where
Packit 9a2dfb
    a =~ b
Packit 9a2dfb
      | isNaN a && isNaN b = True
Packit 9a2dfb
      | otherwise          = approxEq a b
Packit 9a2dfb
Packit 9a2dfb
instance (ApproxEq k, Eq v) => ApproxEq (HM.HashMap k v) where
Packit 9a2dfb
    a =~ b = and $ zipWith eq (HM.toList a) (HM.toList b)
Packit 9a2dfb
      where
Packit 9a2dfb
        eq (x,y) (u,v) = x =~ u && y == v
Packit 9a2dfb
Packit 9a2dfb
-- Test-related types.
Packit 9a2dfb
Packit 9a2dfb
instance Arbitrary Foo where
Packit 9a2dfb
    arbitrary = liftM4 Foo arbitrary arbitrary arbitrary arbitrary
Packit 9a2dfb
Packit 9a2dfb
instance Eq Foo where
Packit 9a2dfb
    a == b = fooInt a == fooInt b &&
Packit 9a2dfb
             fooDouble a `approxEq` fooDouble b &&
Packit 9a2dfb
             fooTuple a == fooTuple b
Packit 9a2dfb
Packit 9a2dfb
instance ToJSON Foo where
Packit 9a2dfb
    toJSON Foo{..} = object [ "fooInt" .= fooInt
Packit 9a2dfb
                            , "fooDouble" .= fooDouble
Packit 9a2dfb
                            , "fooTuple" .= fooTuple
Packit 9a2dfb
                            , "fooMap" .= fooMap
Packit 9a2dfb
                            ]
Packit 9a2dfb
Packit 9a2dfb
instance FromJSON Foo where
Packit 9a2dfb
    parseJSON (Object v) = Foo <$>
Packit 9a2dfb
                           v .: "fooInt" <*>
Packit 9a2dfb
                           v .: "fooDouble" <*>
Packit 9a2dfb
                           v .: "fooTuple" <*>
Packit 9a2dfb
                           v .: "fooMap"
Packit 9a2dfb
    parseJSON _ = empty
Packit 9a2dfb
Packit 9a2dfb
instance Arbitrary UFoo where
Packit 9a2dfb
    arbitrary = UFoo <$> arbitrary <*> arbitrary
Packit 9a2dfb
        where _ = uFooInt
Packit 9a2dfb
Packit 9a2dfb
instance Arbitrary OneConstructor where
Packit 9a2dfb
    arbitrary = return OneConstructor
Packit 9a2dfb
Packit 9a2dfb
instance FromJSON OneConstructor
Packit 9a2dfb
instance ToJSON OneConstructor
Packit 9a2dfb
Packit 9a2dfb
instance (Arbitrary a, Arbitrary b) => Arbitrary (Product2 a b) where
Packit 9a2dfb
    arbitrary = liftM2 Product2 arbitrary arbitrary
Packit 9a2dfb
Packit 9a2dfb
instance (FromJSON a, FromJSON b) => FromJSON (Product2 a b)
Packit 9a2dfb
instance (ToJSON a, ToJSON b) => ToJSON (Product2 a b)
Packit 9a2dfb
Packit 9a2dfb
instance (Arbitrary a, Arbitrary b, Arbitrary c, Arbitrary d, Arbitrary e,
Packit 9a2dfb
          Arbitrary f) => Arbitrary (Product6 a b c d e f) where
Packit 9a2dfb
    arbitrary = Product6 <$> arbitrary <*> arbitrary <*> arbitrary <*>
Packit 9a2dfb
                             arbitrary <*> arbitrary <*> arbitrary
Packit 9a2dfb
Packit 9a2dfb
instance (FromJSON a, FromJSON b, FromJSON c, FromJSON d, FromJSON e,
Packit 9a2dfb
          FromJSON f) => FromJSON (Product6 a b c d e f)
Packit 9a2dfb
instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d, ToJSON e,
Packit 9a2dfb
          ToJSON f) => ToJSON (Product6 a b c d e f)
Packit 9a2dfb
Packit 9a2dfb
instance (Arbitrary a, Arbitrary b, Arbitrary c, Arbitrary d)
Packit 9a2dfb
    => Arbitrary (Sum4 a b c d) where
Packit 9a2dfb
    arbitrary = oneof [Alt1 <$> arbitrary, Alt2 <$> arbitrary,
Packit 9a2dfb
                       Alt3 <$> arbitrary, Alt4 <$> arbitrary]
Packit 9a2dfb
Packit 9a2dfb
instance (FromJSON a, FromJSON b, FromJSON c, FromJSON d)
Packit 9a2dfb
    => FromJSON (Sum4 a b c d)
Packit 9a2dfb
instance (ToJSON a, ToJSON b, ToJSON c, ToJSON d) => ToJSON (Sum4 a b c d)
Packit 9a2dfb
Packit 9a2dfb
instance (Arbitrary a) => Arbitrary (Approx a) where
Packit 9a2dfb
    arbitrary = Approx <$> arbitrary
Packit 9a2dfb
Packit 9a2dfb
instance (FromJSON a) => FromJSON (Approx a) where
Packit 9a2dfb
    parseJSON a = Approx <$> parseJSON a
Packit 9a2dfb
Packit 9a2dfb
instance (ToJSON a) => ToJSON (Approx a) where
Packit 9a2dfb
    toJSON = toJSON . fromApprox
Packit 9a2dfb
Packit 9a2dfb
instance Arbitrary Nullary where
Packit 9a2dfb
    arbitrary = elements [C1, C2, C3]
Packit 9a2dfb
Packit 9a2dfb
instance Arbitrary a => Arbitrary (SomeType a) where
Packit 9a2dfb
    arbitrary = oneof [ pure Nullary
Packit 9a2dfb
                      , Unary   <$> arbitrary
Packit 9a2dfb
                      , Product <$> arbitrary <*> arbitrary <*> arbitrary
Packit 9a2dfb
                      , Record  <$> arbitrary <*> arbitrary <*> arbitrary
Packit 9a2dfb
                      , List    <$> arbitrary
Packit 9a2dfb
                      ]
Packit 9a2dfb
Packit 9a2dfb
instance Arbitrary EitherTextInt where
Packit 9a2dfb
    arbitrary = oneof
Packit 9a2dfb
        [ LeftBool <$> arbitrary
Packit 9a2dfb
        , RightInt <$> arbitrary
Packit 9a2dfb
        , BothTextInt <$> arbitrary <*> arbitrary
Packit 9a2dfb
        , pure NoneNullary
Packit 9a2dfb
        ]
Packit 9a2dfb
Packit 9a2dfb
instance Arbitrary (GADT String) where
Packit 9a2dfb
    arbitrary = GADT <$> arbitrary
Packit 9a2dfb
Packit 9a2dfb
instance Arbitrary OptionField where
Packit 9a2dfb
    arbitrary = OptionField <$> arbitrary
Packit 9a2dfb
Packit 9a2dfb
Packit 9a2dfb
instance ApproxEq Char where
Packit 9a2dfb
    (=~) = (==)
Packit 9a2dfb
Packit 9a2dfb
instance (ApproxEq a) => ApproxEq [a] where
Packit 9a2dfb
    a =~ b = length a == length b && all (uncurry (=~)) (zip a b)
Packit 9a2dfb
Packit 9a2dfb
instance Arbitrary a => Arbitrary (DList.DList a) where
Packit 9a2dfb
    arbitrary = DList.fromList <$> arbitrary