canteven-parsedate-1.0.1.2: test/Canteven/TestParseDate.hs
module Canteven.TestParseDate ( tests ) where
import Canteven.ParseDate (parseDate)
import Data.Time.Clock (UTCTime)
import Data.Time.Format (defaultTimeLocale, formatTime)
import Distribution.TestSuite (Progress (..), Result (..), Test (..),
TestInstance (..))
import System.Locale (iso8601DateFormat)
tests :: IO [Test]
tests = return [Group "timezone tests for ISO8601 format" True [testZulu, testFourDigitTZ, test8601StyleTz],
Group "Twitter format tests" True [testTwitterBasic, testTwitterWithTZ],
Group "fractional second tests" True [testFracSecond],
Group "epoch time tests" True [testEpochTime]]
testZulu :: Test
testZulu = Test $ defaultTest {
run = return $ Finished $ "2014-10-01T21:13:00Z" `parseEquals` "2014-10-01T21:13:00",
name = "parsing with Zulu suffix (\"Z\")"
}
testFourDigitTZ :: Test
testFourDigitTZ = Test $ defaultTest {
run = return $ Finished $ "2014-10-01T21:13:00+0400" `parseEquals` "2014-10-01T17:13:00",
name = "parsing with RFC822-style four-digit tz (\"+0400\")"
}
test8601StyleTz :: Test
test8601StyleTz = Test $ defaultTest {
run = return $ Finished $ "2014-10-01T21:13:00+04:00" `parseEquals` "2014-10-01T17:13:00",
name = "parsing with ISO8601-style hh:mm tz (\"+04:00\")"
}
testFracSecond :: Test
testFracSecond = Test $ defaultTest {
run = return $ Finished $ "2014-10-01T21:13:00.000Z" `parseEquals` "2014-10-01T21:13:00",
name = "parsing fractional seconds"
}
testTwitterBasic :: Test
testTwitterBasic = Test $ defaultTest {
run = return $ Finished $ "Fri Aug 21 21:48:25 +0000 2009" `parseEquals` "2009-08-21T21:48:25",
name = "parsing Twitter's basic format"
}
testTwitterWithTZ :: Test
testTwitterWithTZ = Test $ defaultTest {
run = return $ Finished $ "Fri Aug 21 21:48:25 -0200 2009" `parseEquals` "2009-08-21T23:48:25",
name = "parsing Twitter with a tz"
}
testEpochTime :: Test
testEpochTime = Test $ defaultTest {
run = return $ Finished $ "1414180021" `parseEquals` "2014-10-24T19:47:01",
name = "parsing epoch time"
}
defaultTest :: TestInstance
defaultTest = TestInstance {
run = return $ Finished $ Pass,
name = "",
tags = [],
options = [],
setOption = \_ _ -> Right defaultTest -- FIXME
}
parseEquals :: String -> String -> Result
parseEquals src dest = case parseDate src of
Nothing -> Fail $ "couldn't parse " ++ show src
Just t -> case renderDate t == dest of
False -> Fail $ "parsed string " ++ show src ++ " wasn't the same as " ++ show dest ++ ": got " ++ show (renderDate t)
True -> Pass
renderDate :: UTCTime -> String
renderDate = formatTime defaultTimeLocale $ iso8601DateFormat $ Just "%H:%M:%S"