packages feed

unix-time-0.1.3: test/UnixTimeSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module UnixTimeSpec where

import Control.Applicative
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BS
import Data.Time
import Data.UnixTime
import System.Locale
import Test.Hspec

utcTime0 :: UTCTime
utcTime0 = UTCTime {
    utctDay = ModifiedJulianDay 40587
  , utctDayTime = secondsToDiffTime 0
  }

unixTime0 :: UnixTime
unixTime0 = UnixTime 0 0

{- timezone cannot be parsed by some strptime_l().
jst1970 :: ByteString
jst1970 = "Thu, 01 Jan 1970 09:00:00 +0900"
-}

spec :: Spec
spec = do
    describe "formatUnixTime" $
        it "behaves like the model with utcTime0" $ do
            ans <- formatMailModel utcTime0
            formatUnixTime mailDateFormat unixTime0 `shouldBe` ans

{-
    describe "parseUnixTime" $
        it "parses jst1970 properly" $
            parseUnixTime mailDateFormat jst1970 `shouldBe` unixTime0
-}

    describe "parseUnixTimeGMT & formatUnixTimeGMT" $
        it "inverses the result" $ do
            ut@(UnixTime sec _) <- getUnixTime
            let dt  = formatUnixTimeGMT webDateFormat ut
                ut' = parseUnixTimeGMT  webDateFormat dt
                dt' = formatUnixTimeGMT webDateFormat ut'
            ut' `shouldBe` UnixTime sec 0
            dt `shouldBe` dt'

    describe "addUnixDiffTime & diffUnixTime" $
        it "invrses the result" $ do
            ut0 <- getUnixTime
            ut1 <- getUnixTime
            let ut0' = addUnixDiffTime ut1 $ diffUnixTime ut0 ut1
                ut1' = addUnixDiffTime ut0 $ diffUnixTime ut1 ut0
            ut0' `shouldBe` ut0
            ut1' `shouldBe` ut1

formatMailModel :: UTCTime -> IO BS.ByteString
formatMailModel ut = ans <$> getCurrentTimeZone
  where
   toZoneTime tz = utcToZonedTime tz ut
   fmt = BS.unpack mailDateFormat
   ans tz = BS.pack $ formatTime defaultTimeLocale fmt $ toZoneTime tz