{-# LANGUAGE TemplateHaskell #-} module Main (main) where import qualified Data.Time as T import Options import Options.Time import Test.Chell test_Duration :: Test test_Duration = assertions "duration" $ do let parse = optionTypeParse optionType_duration let format = optionTypeShow optionType_duration $expect $ equal (parse "10h9m8s7ms6us5ns4ps") (Right (sum [ 10*60*60 , 9*60 , 8 , 7*0.001 , 6*0.000001 , 5*0.000000001 , 4*0.000000000001 ])) $expect $ equal (parse "1h9s") (Right 3609) $expect $ equal (parse "1h9ms") (Right 3600.009) $expect $ equal (parse "0") (Right 0) $expect $ equal (parse "-1h9s") (Right (-3609)) $expect $ equal (parse "1s2us3ns") (parse "1s2\181s3ns") $expect $ equal (parse "bogus") (Left "\"bogus\" could not be parsed as a duration.") $expect $ equal (parse "1ps2ps") (Left "\"1ps2ps\" could not be parsed as a duration.") $expect $ equal (format (sum [ 10*60*60 , 9*60 , 8 , 7*0.001 , 6*0.000001 , 5*0.000000001 , 4*0.000000000001 ])) "10h9m8s7ms6us5ns4ps" $expect $ equal (format 0) "0s" $expect $ equal (format 3609) "1h9s" $expect $ equal (format (-3609)) "-1h9s" test_Date :: Test test_Date = assertions "date" $ do let parse = optionTypeParse optionType_date let format = optionTypeShow optionType_date $expect $ equal (parse "2011-12-13") (Right (T.fromGregorian 2011 12 13)) $expect $ equal (parse "20111213") (Right (T.fromGregorian 2011 12 13)) $expect $ equal (parse "2011-347") (Right (T.fromGregorian 2011 12 13)) $expect $ equal (parse "bogus") (Left "\"bogus\" could not be parsed as a date.") $expect $ equal (parse "2011-10-32") (Left "\"2011-10-32\" could not be parsed as a date.") $expect $ equal (format (T.fromGregorian 2011 12 13)) "2011-12-13" test_Time :: Test test_Time = assertions "time" $ do let parse = optionTypeParse optionType_time let format = optionTypeShow optionType_time $expect $ equal (parse "10:11") (Right (T.TimeOfDay 10 11 0)) $expect $ equal (parse "20:21") (Right (T.TimeOfDay 20 21 0)) $expect $ equal (parse "20:21:22") (Right (T.TimeOfDay 20 21 22)) $expect $ equal (parse "20:21:22.232425") (Right (T.TimeOfDay 20 21 22.232425)) $expect $ equal (parse "bogus") (Left "\"bogus\" could not be parsed as a time.") $expect $ equal (parse "25:21:00") (Left "\"25:21:00\" could not be parsed as a time.") $expect $ equal (parse "20:21:60") (Right (T.TimeOfDay 20 21 60)) $expect $ equal (parse "20:21:61") (Left "\"20:21:61\" could not be parsed as a time.") $expect $ equal (format (T.TimeOfDay 20 21 0)) "20:21:00" $expect $ equal (format (T.TimeOfDay 20 21 22.232425)) "20:21:22.232425" test_LocalTime :: Test test_LocalTime = assertions "local time" $ do let parse = optionTypeParse optionType_localTime let format = optionTypeShow optionType_localTime let lt y mo d h mi s = T.LocalTime (T.fromGregorian y mo d) (T.TimeOfDay h mi s) let rlt y mo d h mi s = Right (lt y mo d h mi s) $expect $ equal (parse "2011-12-13 14:15") (rlt 2011 12 13 14 15 0) $expect $ equal (parse "2011-12-13 14:15:16") (rlt 2011 12 13 14 15 16) $expect $ equal (parse "2011-12-13 14:15:16.1718") (rlt 2011 12 13 14 15 16.1718) $expect $ equal (parse "2011-347 14:15") (rlt 2011 12 13 14 15 0) $expect $ equal (parse "20111213 14:15") (rlt 2011 12 13 14 15 0) $expect $ equal (parse "20111213T141516") (rlt 2011 12 13 14 15 16) $expect $ equal (parse "20111213T141516.1718") (rlt 2011 12 13 14 15 16.1718) $expect $ equal (parse "bogus") (Left "\"bogus\" could not be parsed as a local time.") $expect $ equal (format (lt 2011 12 13 14 15 0)) "2011-12-13 14:15:00" $expect $ equal (format (lt 2011 12 13 14 15 16)) "2011-12-13 14:15:16" $expect $ equal (format (lt 2011 12 13 14 15 16.1718)) "2011-12-13 14:15:16.1718" test_UtcTime :: Test test_UtcTime = assertions "utc time" $ do let parse = optionTypeParse optionType_utcTime let format = optionTypeShow optionType_utcTime let ut y mo d h mi s = T.UTCTime (T.fromGregorian y mo d) (h*60*60 + mi*60 + s) let rut y mo d h mi s = Right (ut y mo d h mi s) $expect $ equal (parse "2011-12-13 14:15") (rut 2011 12 13 14 15 0) $expect $ equal (parse "2011-12-13 14:15:16") (rut 2011 12 13 14 15 16) $expect $ equal (parse "2011-12-13 14:15:16.1718") (rut 2011 12 13 14 15 16.1718) $expect $ equal (parse "2011-347 14:15") (rut 2011 12 13 14 15 0) $expect $ equal (parse "20111213 14:15") (rut 2011 12 13 14 15 0) $expect $ equal (parse "20111213T141516") (rut 2011 12 13 14 15 16) $expect $ equal (parse "20111213T141516.1718") (rut 2011 12 13 14 15 16.1718) $expect $ equal (parse "2011-12-13 23:59:60") (rut 2011 12 13 23 59 60) $expect $ equal (parse "bogus") (Left "\"bogus\" could not be parsed as a UTC time.") $expect $ equal (parse "2011-12-13 23:59:61") (Left "\"2011-12-13 23:59:61\" could not be parsed as a UTC time.") $expect $ equal (format (ut 2011 12 13 14 15 0)) "2011-12-13 14:15:00" $expect $ equal (format (ut 2011 12 13 14 15 16)) "2011-12-13 14:15:16" $expect $ equal (format (ut 2011 12 13 14 15 16.1718)) "2011-12-13 14:15:16.1718" test_ZonedTime :: Test test_ZonedTime = assertions "zoned time" $ do let parse = optionTypeParse optionType_zonedTime let format = optionTypeShow optionType_zonedTime let zt y mo d h mi s tz = T.ZonedTime (T.LocalTime (T.fromGregorian y mo d) (T.TimeOfDay h mi s)) tz let rzt y mo d h mi s tz = Right (zt y mo d h mi s tz) let noZone = T.TimeZone 0 False "" let tzPlus60 = T.TimeZone 60 False "" let tzMinus60 = T.TimeZone (-60) False "" let tzABC = T.TimeZone 0 False "ABC" $expect $ equal (parse "2011-12-13 14:15") (rzt 2011 12 13 14 15 0 noZone) $expect $ equal (parse "2011-12-13 14:15Z") (rzt 2011 12 13 14 15 0 T.utc) $expect $ equal (parse "2011-12-13 14:15+0100") (rzt 2011 12 13 14 15 0 tzPlus60) $expect $ equal (parse "2011-12-13 14:15 +0100") (rzt 2011 12 13 14 15 0 tzPlus60) $expect $ equal (parse "2011-12-13 14:15-0100") (rzt 2011 12 13 14 15 0 tzMinus60) $expect $ equal (parse "2011-12-13 14:15 -0100") (rzt 2011 12 13 14 15 0 tzMinus60) $expect $ equal (parse "2011-12-13 14:15 ABC") (rzt 2011 12 13 14 15 0 tzABC) $expect $ equal (parse "2011-12-13 14:15") (rzt 2011 12 13 14 15 0 noZone) $expect $ equal (parse "2011-12-13 14:15:16") (rzt 2011 12 13 14 15 16 noZone) $expect $ equal (parse "2011-12-13 14:15:16.1718") (rzt 2011 12 13 14 15 16.1718 noZone) $expect $ equal (parse "2011-347 14:15") (rzt 2011 12 13 14 15 0 noZone) $expect $ equal (parse "20111213 14:15") (rzt 2011 12 13 14 15 0 noZone) $expect $ equal (parse "20111213T141516") (rzt 2011 12 13 14 15 16 noZone) $expect $ equal (parse "20111213T141516.1718") (rzt 2011 12 13 14 15 16.1718 noZone) $expect $ equal (parse "bogus") (Left "\"bogus\" could not be parsed as a zoned time.") $expect $ equal (format (zt 2011 12 13 14 15 0 noZone)) "2011-12-13 14:15:00 +0000" $expect $ equal (format (zt 2011 12 13 14 15 0 T.utc)) "2011-12-13 14:15:00 UTC" $expect $ equal (format (zt 2011 12 13 14 15 0 tzPlus60)) "2011-12-13 14:15:00 +0100" $expect $ equal (format (zt 2011 12 13 14 15 0 tzMinus60)) "2011-12-13 14:15:00 -0100" $expect $ equal (format (zt 2011 12 13 14 15 16 noZone)) "2011-12-13 14:15:16 +0000" $expect $ equal (format (zt 2011 12 13 14 15 16.1718 noZone)) "2011-12-13 14:15:16.1718 +0000" instance Eq T.ZonedTime where x == y = key x == key y where key t = (T.zonedTimeToLocalTime t, T.zonedTimeZone t) main :: IO () main = Test.Chell.defaultMain [suite "tests" [ test_Duration , test_Date , test_Time , test_LocalTime , test_UtcTime , test_ZonedTime ]]