[commit: packages/time] master: parse single-letter "military" time zones; test parsing of all defaultLocale time zones. Test failure: "EAST" is there twice. (2e0c3f8)
git at git.haskell.org
git at git.haskell.org
Fri Jan 23 23:02:10 UTC 2015
Repository : ssh://git@git.haskell.org/time
On branch : master
Link : http://git.haskell.org/packages/time.git/commitdiff/2e0c3f84f91a22e6c7cf9ee77d3f823a3aeb9355
>---------------------------------------------------------------
commit 2e0c3f84f91a22e6c7cf9ee77d3f823a3aeb9355
Author: Ashley Yakeley <ashley at yakeley.org>
Date: Mon Sep 1 20:34:22 2014 -0700
parse single-letter "military" time zones; test parsing of all defaultLocale time zones. Test failure: "EAST" is there twice.
>---------------------------------------------------------------
2e0c3f84f91a22e6c7cf9ee77d3f823a3aeb9355
lib/Data/Time/Format/Locale.hs | 2 --
lib/Data/Time/Format/Parse.hs | 16 +++++++++++++++-
test/ShowDefaultTZAbbreviations.hs | 9 +++++++++
test/Test/TestParseTime.hs | 32 ++++++++++++++++++++++++++++++++
time.cabal | 8 ++++++++
5 files changed, 64 insertions(+), 3 deletions(-)
diff --git a/lib/Data/Time/Format/Locale.hs b/lib/Data/Time/Format/Locale.hs
index 3708b8e..399cb25 100644
--- a/lib/Data/Time/Format/Locale.hs
+++ b/lib/Data/Time/Format/Locale.hs
@@ -210,8 +210,6 @@ _TIMEZONES_ =
-- Universal Coordinated Time
,("UTC", (readTzOffset "+00:00", False))
-- Same as UTC
- ,("Z", (readTzOffset "+00:00", False))
- -- Same as UTC
,("ZULU", (readTzOffset "+00:00", False))
-- Western European Time
,("WET", (readTzOffset "+00:00", False))
diff --git a/lib/Data/Time/Format/Parse.hs b/lib/Data/Time/Format/Parse.hs
index 0064dda..07dc5b2 100644
--- a/lib/Data/Time/Format/Parse.hs
+++ b/lib/Data/Time/Format/Parse.hs
@@ -410,6 +410,18 @@ mkPico i f = fromInteger i + fromRational (f % 1000000000000)
instance ParseTime LocalTime where
buildTime l xs = LocalTime (buildTime l xs) (buildTime l xs)
+enumDiff :: (Enum a) => a -> a -> Int
+enumDiff a b = (fromEnum a) - (fromEnum b)
+
+getMilZoneHours :: Char -> Maybe Int
+getMilZoneHours c | c < 'A' = Nothing
+getMilZoneHours c | c <= 'I' = Just $ 1 + enumDiff c 'A'
+getMilZoneHours 'J' = Nothing
+getMilZoneHours c | c <= 'M' = Just $ 10 + enumDiff c 'K'
+getMilZoneHours c | c <= 'Y' = Just $ (enumDiff 'N' c) - 1
+getMilZoneHours 'Z' = Just 0
+getMilZoneHours _ = Nothing
+
instance ParseTime TimeZone where
buildTime l = foldl f (minutesToTimeZone 0)
where
@@ -420,7 +432,9 @@ instance ParseTime TimeZone where
| isAlpha (head x) -> let y = up x in
case find (\tz -> y == timeZoneName tz) (knownTimeZones l) of
Just tz -> tz
- Nothing -> TimeZone offset dst y
+ Nothing -> case y of
+ [yc] | Just hours <- getMilZoneHours yc -> TimeZone (hours * 60) False y
+ _ -> TimeZone offset dst y
| otherwise -> zone
_ -> t
where zone = TimeZone (readTzOffset x) dst name
diff --git a/test/ShowDefaultTZAbbreviations.hs b/test/ShowDefaultTZAbbreviations.hs
new file mode 100644
index 0000000..fc24783
--- /dev/null
+++ b/test/ShowDefaultTZAbbreviations.hs
@@ -0,0 +1,9 @@
+module Main where
+
+import Data.Time
+
+showTZ :: TimeZone -> String
+showTZ tz = (formatTime defaultTimeLocale "%Z %z " tz) ++ show (timeZoneSummerOnly tz)
+
+main :: IO ()
+main = mapM_ (\tz -> putStrLn (showTZ tz)) (knownTimeZones defaultTimeLocale)
diff --git a/test/Test/TestParseTime.hs b/test/Test/TestParseTime.hs
index b0e9ef2..26ee67d 100644
--- a/test/Test/TestParseTime.hs
+++ b/test/Test/TestParseTime.hs
@@ -27,6 +27,9 @@ testParseTime = testGroup "testParseTime"
simpleFormatTests,
extests,
particularParseTests,
+ badParseTests,
+ defaultTimeZoneTests,
+ militaryTimeZoneTests,
testGroup "properties" (fmap (\(n,prop) -> testProperty n prop) properties)
]
@@ -156,6 +159,12 @@ particularParseTests = testGroup "particular"
spacingTests (TimeZone (-480) False "PST") "%Z" "PST"
]
+badParseTests :: Test
+badParseTests = testGroup "bad"
+ [
+ parseTest False (Nothing :: Maybe Day) "%Y" ""
+ ]
+
parseYMD :: Day -> Test
parseYMD day = case toGregorian day of
(y,m,d) -> parseTest False (Just day) "%Y%m%d" ((show y) ++ (show2 m) ++ (show2 d))
@@ -200,6 +209,29 @@ readsTest :: forall t. (Show t, Eq t, ParseTime t) => Maybe t -> String -> Strin
readsTest (Just e) = readsTest' [(e,"")]
readsTest Nothing = readsTest' ([] :: [(t,String)])
-}
+
+enumAdd :: (Enum a) => Int -> a -> a
+enumAdd i a = toEnum (i + fromEnum a)
+
+getMilZoneLetter :: Int -> Char
+getMilZoneLetter 0 = 'Z'
+getMilZoneLetter h | h < 0 = enumAdd (negate h) 'M'
+getMilZoneLetter h | h < 10 = enumAdd (h - 1) 'A'
+getMilZoneLetter h = enumAdd (h - 10) 'K'
+
+getMilZone :: Int -> TimeZone
+getMilZone hour = TimeZone (hour * 60) False [getMilZoneLetter hour]
+
+testParseTimeZone :: TimeZone -> Test
+testParseTimeZone tz = parseTest False (Just tz) "%Z" (timeZoneName tz)
+
+defaultTimeZoneTests :: Test
+defaultTimeZoneTests = testGroup "default time zones" (fmap testParseTimeZone (knownTimeZones defaultTimeLocale))
+
+militaryTimeZoneTests :: Test
+militaryTimeZoneTests = testGroup "military time zones" (fmap (testParseTimeZone . getMilZone) [-12 .. 12])
+
+
parse :: ParseTime t => Bool -> String -> String -> Maybe t
parse sp f t = parseTimeM sp defaultTimeLocale f t
diff --git a/time.cabal b/time.cabal
index 383267f..b5c1638 100644
--- a/time.cabal
+++ b/time.cabal
@@ -89,6 +89,14 @@ library
HsTime.h
HsTimeConfig.h
+test-suite ShowDefaultTZAbbreviations
+ hs-source-dirs: test
+ type: exitcode-stdio-1.0
+ build-depends:
+ base,
+ time == 1.5
+ main-is: ShowDefaultTZAbbreviations.hs
+
test-suite tests
hs-source-dirs: test
type: exitcode-stdio-1.0
More information about the ghc-commits
mailing list