1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
{-# LANGUAGE FlexibleContexts, CPP #-}
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
#ifdef MIN_TIME_15
import Data.Time (parseTimeM, defaultTimeLocale)
#else
import Data.Time (parseTime)
import System.Locale(defaultTimeLocale)
#endif
import Database.HDBC.Locale (iso8601DateFormat)
import qualified System.Time as ST
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"
rowdata t = [[SqlInt32 100, toSql t, SqlNull]]
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 (testIt dbh) (do commit dbh
run dbh "DROP TABLE hdbctesttime" []
commit dbh
)
where testIt 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 label inputdata convfunc toComparable =
TestLabel label (testDTType inputdata convfunc toComparable)
tests = TestList $
((TestLabel "Non-frac" $ testIt testZonedTime) :
if supportsFracTime then [TestLabel "Frac" $ testIt testZonedTimeFrac] else [])
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
, mkTest "ClockTime" baseClockTime toSql id
, mkTest "CalendarTime" baseCalendarTime toSql ST.toClockTime
, mkTest "TimeDiff" baseTimeDiff toSql 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
baseTimeDiff :: ST.TimeDiff
baseTimeDiff = convert baseDiffTime
-- No fractional parts for these two
baseClockTime :: ST.ClockTime
baseClockTime = convert testZonedTime
baseCalendarTime :: ST.CalendarTime
baseCalendarTime = convert testZonedTime
#if MIN_TIME_15
parseTime' = parseTimeM True
#else
parseTime' = parseTime
#endif
|