{-# OPTIONS_GHC -Wno-orphans #-}
module System.Nix.Arbitrary.UTCTime where
import Data.Time (Day(..), DiffTime, UTCTime(..))
import Test.QuickCheck (Arbitrary(..))
instance Arbitrary Day where
arbitrary :: Gen Day
arbitrary = Integer -> Day
ModifiedJulianDay (Integer -> Day) -> (Integer -> Integer) -> Integer -> Day
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Integer
2000 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+) (Integer -> Day) -> Gen Integer -> Gen Day
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Integer
forall a. Arbitrary a => Gen a
arbitrary
shrink :: Day -> [Day]
shrink = (Integer -> Day
ModifiedJulianDay (Integer -> Day) -> [Integer] -> [Day]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) ([Integer] -> [Day]) -> (Day -> [Integer]) -> Day -> [Day]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> [Integer]
forall a. Arbitrary a => a -> [a]
shrink (Integer -> [Integer]) -> (Day -> Integer) -> Day -> [Integer]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Day -> Integer
Data.Time.toModifiedJulianDay
instance Arbitrary DiffTime where
arbitrary :: Gen DiffTime
arbitrary = Integer -> DiffTime
forall a. Num a => Integer -> a
fromInteger (Integer -> DiffTime)
-> (Integer -> Integer) -> Integer -> DiffTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Integer
forall a. Num a => a -> a
abs (Integer -> DiffTime) -> Gen Integer -> Gen DiffTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Integer
forall a. Arbitrary a => Gen a
arbitrary
instance Arbitrary UTCTime where
arbitrary :: Gen UTCTime
arbitrary =
Day -> DiffTime -> UTCTime
UTCTime
(Day -> DiffTime -> UTCTime)
-> Gen Day -> Gen (DiffTime -> UTCTime)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Day
forall a. Arbitrary a => Gen a
arbitrary
Gen (DiffTime -> UTCTime) -> Gen DiffTime -> Gen UTCTime
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen DiffTime
forall a. Arbitrary a => Gen a
arbitrary
shrink :: UTCTime -> [UTCTime]
shrink ut :: UTCTime
ut@(UTCTime Day
day DiffTime
dayTime) =
[ UTCTime
ut { Data.Time.utctDay = d' } | Day
d' <- Day -> [Day]
forall a. Arbitrary a => a -> [a]
shrink Day
day ]
[UTCTime] -> [UTCTime] -> [UTCTime]
forall a. [a] -> [a] -> [a]
++ [ UTCTime
ut { Data.Time.utctDayTime = t' } | DiffTime
t' <- DiffTime -> [DiffTime]
forall a. Arbitrary a => a -> [a]
shrink DiffTime
dayTime ]