|
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
|