packages feed

Z-Data-1.0.0.0: test/Z/Data/Parser/TimeSpec.hs

{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Z.Data.Parser.TimeSpec where

import qualified Data.List                as List
import           Data.Word
import           Data.Int
import           GHC.Float
import           Data.Time.Format
import qualified Z.Data.Builder           as B
import qualified Z.Data.Parser            as P
import qualified Z.Data.Parser.Time       as P
import qualified Z.Data.Text as T
import           Test.QuickCheck
import           Test.QuickCheck.Function
import           Test.QuickCheck.Property
import           Test.QuickCheck.Instances.Time
import           Test.Hspec
import           Test.Hspec.QuickCheck
import           Data.Time.LocalTime
import           Data.Time.Calendar

spec :: Spec
spec = describe "parser time" . modifyMaxSuccess (*10) . modifyMaxSize (*10) $ do
        prop "utcTime roundtrip" $ \ t ->
            Right t === (P.parse' P.utcTime . B.build $ B.utcTime t)

        prop "localTime roundtrip" $ \ t ->
            Right t === (P.parse' P.localTime . B.build $ B.localTime t)

        prop "zonedTime roundtrip" $ \ t0 z0 ->
            let z = abs z0 `div` 1440
                t = ZonedTime t0 (minutesToTimeZone z)
            in (zonedTimeToUTC <$> Right t) === (zonedTimeToUTC <$> (P.parse' P.zonedTime . B.build $ B.zonedTime t))

        modifyMaxSuccess (*100) . modifyMaxSize (*100) . prop "fromGregorianValidInt64 == fromGregorianValid" $ \ y m d ->
            P.fromGregorianValid' y m d == fromGregorianValid y m d