{-# LANGUAGE FlexibleContexts #-} module TestTime(tests) where import Test.HUnit import Database.HDBC import TestUtils import Control.Exception import Data.Time (UTCTime, Day, NominalDiffTime) import Data.Time.LocalTime import Data.Time.Clock.POSIX import Data.Maybe import Data.Convertible import SpecificDB import Data.Time (parseTimeM, defaultTimeLocale, TimeLocale) import Database.HDBC.Locale (iso8601DateFormat) instance Eq ZonedTime where a == b = zonedTimeToUTC a == zonedTimeToUTC b testZonedTime :: ZonedTime testZonedTime = fromJust $ parseTime' defaultTimeLocale (iso8601DateFormat (Just "%T %z")) "1989-08-01 15:33:01 -0500" testZonedTimeFrac :: ZonedTime testZonedTimeFrac = fromJust $ parseTime' defaultTimeLocale (iso8601DateFormat (Just "%T%Q %z")) "1989-08-01 15:33:01.536 -0500" testDTType :: (Convertible SqlValue a, Show b, Eq b) => a -> (a -> SqlValue) -> (a -> b) -> Test testDTType inputdata convToSqlValue toComparable = dbTestCase $ \dbh -> do _ <- run dbh ("CREATE TABLE hdbctesttime (testid INTEGER PRIMARY KEY NOT NULL, testvalue " ++ dateTimeTypeOfSqlValue value ++ ")") [] commit dbh finally (testDT dbh) (do commit dbh _ <- run dbh "DROP TABLE hdbctesttime" [] commit dbh ) where testDT dbh = do _ <- run dbh "INSERT INTO hdbctesttime (testid, testvalue) VALUES (?, ?)" [iToSql 5, value] commit dbh r <- quickQuery' dbh "SELECT testid, testvalue FROM hdbctesttime" [] case r of ~[[testidsv, testvaluesv]] -> do assertEqual "testid" (5::Int) (fromSql testidsv) assertEqual "testvalue" (toComparable inputdata) (toComparable$ fromSql testvaluesv) value = convToSqlValue inputdata mkTest :: (Eq b, Show b, Convertible SqlValue a) => String -> a -> (a -> SqlValue) -> (a -> b) -> Test mkTest label inputdata convfunc toComparable = TestLabel label (testDTType inputdata convfunc toComparable) tests :: Test tests = TestList $ ((TestLabel "Non-frac" $ testIt testZonedTime) : if supportsFracTime then [TestLabel "Frac" $ testIt testZonedTimeFrac] else []) testIt :: ZonedTime -> Test testIt baseZonedTime = TestList [ mkTest "Day" baseDay toSql id , mkTest "TimeOfDay" baseTimeOfDay toSql id , mkTest "ZonedTimeOfDay" baseZonedTimeOfDay toSql id , mkTest "LocalTime" baseLocalTime toSql id , mkTest "ZonedTime" baseZonedTime toSql id , mkTest "UTCTime" baseUTCTime toSql id , mkTest "DiffTime" baseDiffTime toSql id , mkTest "POSIXTime" basePOSIXTime posixToSql id ] where baseDay :: Day baseDay = localDay baseLocalTime baseTimeOfDay :: TimeOfDay baseTimeOfDay = localTimeOfDay baseLocalTime baseZonedTimeOfDay :: (TimeOfDay, TimeZone) baseZonedTimeOfDay = fromSql (SqlZonedTime baseZonedTime) baseLocalTime :: LocalTime baseLocalTime = zonedTimeToLocalTime baseZonedTime baseUTCTime :: UTCTime baseUTCTime = convert baseZonedTime baseDiffTime :: NominalDiffTime baseDiffTime = basePOSIXTime basePOSIXTime :: POSIXTime basePOSIXTime = convert baseZonedTime parseTime' :: TimeLocale -> String -> String -> Maybe ZonedTime parseTime' = parseTimeM True