hedn-0.1.8.1: tests/Data/EDN/Test/QuickCheck.hs
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.EDN.Test.QuickCheck where
import Data.EDN.Test.QuickCheck.TH
import Data.Time (UTCTime)
import qualified Data.Time.Calendar as Calendar
import Data.Time.Clock (UTCTime (..), UniversalTime (..),
secondsToDiffTime)
import Data.Time.LocalTime (localTimeToUT1, localTimeToUTC,
ut1ToLocalTime, utc,
utcToLocalTime)
import qualified Test.QuickCheck as QC
-- * UTCTime Arbitrary instance ------------------------------------------------
fromGregorian :: Integer -> Int -> Int -> Int -> Int -> Int -> UTCTime
fromGregorian year month day hours minutes seconds =
UTCTime day' (secondsToDiffTime . fromIntegral $ seconds')
where
day' = Calendar.fromGregorian year month day
seconds' = 3600 * hours + 60 * minutes + seconds
fromUniversalTime :: UniversalTime -> UTCTime
fromUniversalTime = localTimeToUTC utc . ut1ToLocalTime 0
toUniversalTime :: UTCTime -> UniversalTime
toUniversalTime = localTimeToUT1 0 . utcToLocalTime utc
fromGregorian' :: Integer -> Int -> Int -> UTCTime
fromGregorian' y m d = fromGregorian y m d 0 0 0
startOfTime :: UTCTime
startOfTime = fromGregorian' 1970 1 1
fromMJD :: Rational -> UTCTime
fromMJD = fromUniversalTime . ModJulianDate
fromMJD' :: Float -> UTCTime
fromMJD' = fromMJD . realToFrac
startOfTimeMJD :: Rational
startOfTimeMJD = toMJD startOfTime
toMJD :: UTCTime -> Rational
toMJD = getModJulianDate . toUniversalTime
instance QC.Arbitrary UTCTime where
-- coarbitrary = undefined
arbitrary = do
offset <- QC.choose (0, 20000) :: QC.Gen Float
return . fromMJD' $ offset + fromRational startOfTimeMJD
--------------------------------------------------------------------------------
type MUTCTime = Maybe UTCTime
type Tuple = (Int, Int)
type Triple = (Int, String, UTCTime)
type Tuple4 = (Int, String, [Maybe UTCTime], [Maybe Bool])
type Tuple5 = (Int, [String], [Maybe UTCTime], [Maybe Bool], (Bool, Bool))
$(mkSerializeSpecs [ ''Char
, ''Double
, ''String
, ''UTCTime
, ''MUTCTime
, ''Tuple
, ''Triple
, ''Tuple4
, ''Tuple5
])