{-# LANGUAGE CPP              #-}
{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Test.QuickCheck.Instances.OldTime () where

import Prelude ()
import Test.QuickCheck.Instances.CustomPrelude

import Data.Int (Int32)

import Test.QuickCheck

import qualified System.Time as OldTime

-------------------------------------------------------------------------------
-- old-time
-------------------------------------------------------------------------------

instance Arbitrary OldTime.Month where
    arbitrary :: Gen Month
arbitrary = forall a. (Bounded a, Enum a) => Gen a
arbitraryBoundedEnum

instance CoArbitrary OldTime.Month where
    coarbitrary :: forall b. Month -> Gen b -> Gen b
coarbitrary = forall a b. Enum a => a -> Gen b -> Gen b
coarbitraryEnum

instance Arbitrary OldTime.Day where
    arbitrary :: Gen Day
arbitrary = forall a. (Bounded a, Enum a) => Gen a
arbitraryBoundedEnum

instance CoArbitrary OldTime.Day where
    coarbitrary :: forall b. Day -> Gen b -> Gen b
coarbitrary = forall a b. Enum a => a -> Gen b -> Gen b
coarbitraryEnum

instance Arbitrary OldTime.ClockTime where
    arbitrary :: Gen ClockTime
arbitrary =
        Integer -> Integer -> ClockTime
OldTime.TOD forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Random a => (a, a) -> Gen a
choose (Integer
0, forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Bounded a => a
maxBound :: Int32))
                    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Random a => (a, a) -> Gen a
choose (Integer
0, Integer
1000000000000 forall a. Num a => a -> a -> a
- Integer
1)
    shrink :: ClockTime -> [ClockTime]
shrink (OldTime.TOD Integer
s Integer
p) =
        [ Integer -> Integer -> ClockTime
OldTime.TOD Integer
s' Integer
p  | Integer
s' <- forall a. Arbitrary a => a -> [a]
shrink Integer
s ] forall a. [a] -> [a] -> [a]
++
        [ Integer -> Integer -> ClockTime
OldTime.TOD Integer
s  Integer
p' | Integer
p' <- forall a. Arbitrary a => a -> [a]
shrink Integer
p ]

instance CoArbitrary OldTime.ClockTime where
    coarbitrary :: forall b. ClockTime -> Gen b -> Gen b
coarbitrary (OldTime.TOD Integer
s Integer
p) =
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Integer
s forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Integer
p

instance Arbitrary OldTime.TimeDiff where
    -- a bit of a cheat ...
    arbitrary :: Gen TimeDiff
arbitrary =
        TimeDiff -> TimeDiff
OldTime.normalizeTimeDiff forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
           (ClockTime -> ClockTime -> TimeDiff
OldTime.diffClockTimes forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => Gen a
arbitrary forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Arbitrary a => Gen a
arbitrary)
    shrink :: TimeDiff -> [TimeDiff]
shrink td :: TimeDiff
td@(OldTime.TimeDiff Int
year Int
month Int
day Int
hour Int
minute Int
sec Integer
picosec) =
        [ TimeDiff
td { tdYear :: Int
OldTime.tdYear    = Int
y' } | Int
y' <- forall a. Arbitrary a => a -> [a]
shrink Int
year    ] forall a. [a] -> [a] -> [a]
++
        [ TimeDiff
td { tdMonth :: Int
OldTime.tdMonth   = Int
m' } | Int
m' <- forall a. Arbitrary a => a -> [a]
shrink Int
month   ] forall a. [a] -> [a] -> [a]
++
        [ TimeDiff
td { tdDay :: Int
OldTime.tdDay     = Int
d' } | Int
d' <- forall a. Arbitrary a => a -> [a]
shrink Int
day     ] forall a. [a] -> [a] -> [a]
++
        [ TimeDiff
td { tdHour :: Int
OldTime.tdHour    = Int
h' } | Int
h' <- forall a. Arbitrary a => a -> [a]
shrink Int
hour    ] forall a. [a] -> [a] -> [a]
++
        [ TimeDiff
td { tdMin :: Int
OldTime.tdMin     = Int
m' } | Int
m' <- forall a. Arbitrary a => a -> [a]
shrink Int
minute  ] forall a. [a] -> [a] -> [a]
++
        [ TimeDiff
td { tdSec :: Int
OldTime.tdSec     = Int
s' } | Int
s' <- forall a. Arbitrary a => a -> [a]
shrink Int
sec     ] forall a. [a] -> [a] -> [a]
++
        [ TimeDiff
td { tdPicosec :: Integer
OldTime.tdPicosec = Integer
p' } | Integer
p' <- forall a. Arbitrary a => a -> [a]
shrink Integer
picosec ]

instance CoArbitrary OldTime.TimeDiff where
    coarbitrary :: forall b. TimeDiff -> Gen b -> Gen b
coarbitrary (OldTime.TimeDiff Int
year Int
month Int
day Int
hour Int
minute Int
sec Integer
picosec) =
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
year    forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
month   forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
day     forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
hour    forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
minute  forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
sec     forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Integer
picosec

-- UTC only
instance Arbitrary OldTime.CalendarTime where
    arbitrary :: Gen CalendarTime
arbitrary = ClockTime -> CalendarTime
OldTime.toUTCTime forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => Gen a
arbitrary

instance CoArbitrary OldTime.CalendarTime where
    coarbitrary :: forall b. CalendarTime -> Gen b -> Gen b
coarbitrary (OldTime.CalendarTime
                        Int
year Month
month Int
day Int
hour Int
minute Int
sec Integer
picosec
                        Day
wDay Int
yDay String
tzName Int
tz Bool
isDST) =
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
year    forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Month
month   forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
day     forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
hour    forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
minute  forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
sec     forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Integer
picosec forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Day
wDay    forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
yDay    forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary String
tzName  forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
tz      forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Bool
isDST