packages feed

timerep-2.0.1.0: test/Main.hs

import           Data.Fixed            (E12, Fixed (..))
import           Data.Maybe
import           Data.Text
import           Data.Time.Calendar
import           Data.Time.LocalTime
import           Data.Time.RFC2822
import           Data.Time.RFC3339
import           Data.Time.RFC822

import           Test.QuickCheck       hiding (Fixed)
import           Test.Tasty
import           Test.Tasty.HUnit
import           Test.Tasty.QuickCheck


instance Arbitrary TimeOfDay where
  arbitrary = TimeOfDay <$> choose (0, 23) <*> choose (0, 59) <*> pure 0

instance Arbitrary Day where
  arbitrary = ModifiedJulianDay <$> arbitrary

instance Arbitrary LocalTime where
  arbitrary = LocalTime <$> arbitrary <*> arbitrary

instance Arbitrary TimeZone where
  arbitrary = TimeZone <$> arbitrary <*> arbitrary <*> elements timeZones
              where timeZones = [ "ACDT", "ACST", "ACT", "ACT", "ADT", "AEDT"
                                , "AEST", "AFT", "AKDT", "AKST", "AMST", "AMST"
                                , "AMT", "AMT", "ART", "AST", "AST", "AWDT", "AWST"
                                , "AZOST", "AZT", "BDT", "BIOT", "BIT", "BOT"
                                , "BRST", "BRT", "BST", "BST", "BTT", "CAT", "CCT"
                                , "CDT", "CDT", "CEDT", "CEST", "CET", "CHADT"
                                , "CHAST", "CHOT", "ChST", "CHUT", "CIST", "CIT"
                                , "CKT", "CLST", "CLT", "COST", "COT", "CST", "CST"
                                , "CST", "CST", "CST", "CT", "CVT", "CWST", "CXT"
                                , "DAVT", "DDUT", "DFT", "EASST", "EAST", "EAT"
                                , "ECT", "ECT", "EDT", "EEDT", "EEST", "EET"
                                , "EGST", "EGT", "EIT", "EST", "EST", "FET", "FJT"
                                , "FKST", "FKST", "FKT", "FNT", "GALT", "GAMT"
                                , "GET", "GFT", "GILT", "GIT", "GMT", "GST", "GST"
                                , "GYT", "HADT", "HAEC", "HAST", "HKT", "HMT"
                                , "HOVT", "HST", "ICT", "IDT", "IOT", "IRDT"
                                , "IRKT", "IRST", "IST", "IST", "IST", "JST", "KGT"
                                , "KOST", "KRAT", "KST", "LHST", "LHST", "LINT"
                                , "MAGT", "MART", "MAWT", "MDT", "MET", "MEST"
                                , "MHT", "MIST", "MIT", "MMT", "MSK", "MST", "MST"
                                , "MST", "MUT", "MVT", "MYT", "NCT", "NDT", "NFT"
                                , "NPT", "NST", "NT", "NUT", "NZDT", "NZST", "OMST"
                                , "ORAT", "PDT", "PET", "PETT", "PGT", "PHOT"
                                , "PKT", "PMDT", "PMST", "PONT", "PST", "PST"
                                , "PYST", "PYT", "RET", "ROTT", "SAKT", "SAMT"
                                , "SAST", "SBT", "SCT", "SGT", "SLST", "SRET"
                                , "SRT", "SST", "SST", "SYOT", "TAHT", "THA", "TFT"
                                , "TJT", "TKT", "TLT", "TMT", "TOT", "TVT", "UCT"
                                , "ULAT", "USZ1", "UTC", "UYST", "UYT", "UZT"
                                , "VET", "VLAT", "VOLT", "VOST", "VUT", "WAKT"
                                , "WAST", "WAT", "WEDT", "WEST", "WET", "WIT"
                                , "WST", "YAKT", "YEKT", "Z" ]

instance Arbitrary ZonedTime where
  arbitrary = ZonedTime <$> arbitrary <*> arbitrary


main :: IO ()
main = defaultMain $ testGroup "Tests" [unitTests, properties]


unitTests :: TestTree
unitTests = testGroup "Unit tests" [casesRFC3339 , casesRFC2822, casesRFC822]

casesRFC3339, casesRFC2822 :: TestTree
casesRFC3339 = testCase "RFC 3339 cases" $ do
  isJust (parseTimeRFC3339 "1985-04-12T23:20:50.52Z") @?= True
  isJust (parseTimeRFC3339 "1996-12-19T16:39:57-08:00") @?= True
  isJust (parseTimeRFC3339 "1990-12-31T23:59:60Z") @?= True
  isJust (parseTimeRFC3339 "1990-12-31T15:59:60-08:00") @?= True
  isJust (parseTimeRFC3339 "1937-01-01T12:00:27.87+00:20") @?= True
  isJust (parseDateRFC3339 "1985-04-12") @?= True
  isJust (parseDateRFC3339 "1996-12-19") @?= True
  isJust (parseDateRFC3339 "1990-12-31") @?= True
  isJust (parseDateRFC3339 "1937-01-01") @?= True
casesRFC2822 = testCase "RFC 2822 cases" $ do
  isJust (parseTimeRFC2822 "Fri, 21 Nov 1997 09:55:06 -0600") @?= True
  isJust (parseTimeRFC2822 "Tue, 15 Nov 1994 12:45:26 GMT") @?= True
  isJust (parseTimeRFC2822 "Tue, 1 Jul 2003 10:52:37 +0200") @?= True
  isJust (parseTimeRFC2822 "Thu, 13 Feb 1969 23:32:54 -0330") @?= True
  isJust (parseTimeRFC2822 "Mon, 24 Nov 1997 14:22:01 -0800") @?= True
  isJust (parseTimeRFC2822 "Thu,          13\n     Feb\n  1969\n        23:32\n     -0330") @?= True
  isJust (parseTimeRFC2822 "Thu,          13\n     Feb\n  1969\n        23:32\n     -0330 (Newfoundland Time)") @?= False
  isJust (parseTimeRFC2822 "24 Nov 1997 14:22:01 -0800") @?= True
  isJust (parseTimeRFC2822 "15 Nov 1994 12:45:26 GMT") @?= True
  isJust (parseTimeRFC2822 "Mon,24 Nov 1997 14:22:01 -0800") @?= False
  isJust (parseTimeRFC2822 "Thu,\t13\n     Feb\n  1969\n        23:32\n     -0330 (Newfoundland Time)") @?= False
  isJust (parseTimeRFC2822 "Thu, 13 Feb 1969 23:32 -0330 (Newfoundland Time)") @?= False
casesRFC822 = testCase "RFC 822 cases" $ do
  isJust (parseTimeRFC822 "Wed, 02 Oct 2002 13:00:00 GMT") @?= True
  isJust (parseTimeRFC822 "Wed, 02 Oct 2002 13:00:00 +0100") @?= True
  isJust (parseTimeRFC822 "Wed, 02 Oct 2002 13:00 +0100") @?= True
  isJust (parseTimeRFC822 "Wed, 2 Oct 2002 13:00 +0100") @?= True
  isJust (parseTimeRFC822 "02 Oct 2002 13:00 +0100") @?= True
  isJust (parseTimeRFC822 "02 Oct 02 13:00 +0100") @?= True
  isJust (parseTimeRFC822 "2 Oct 02 13:00 +0100") @?= True


properties :: TestTree
properties = testGroup "Properties"
  [ inverseTimeRFC3339Property
  , inverseDateRFC3339Property
  , inverseRFC2822Property
  , inverseRFC822Property
  ]

inverseTimeRFC3339Property, inverseDateRFC3339Property, inverseRFC2822Property, inverseRFC822Property :: TestTree
inverseTimeRFC3339Property = testProperty "parse . format = id (RFC3339 date-time)" $ \zonedTime ->
  (fmap zonedTimeToUTC . parseTimeRFC3339 . asText . formatTimeRFC3339) zonedTime == Just (zonedTimeToUTC zonedTime)
inverseDateRFC3339Property = testProperty "parse . format = id (RFC3339 date)" $ \day ->
  (parseDateRFC3339 . asText . formatDateRFC3339) day == Just day
inverseRFC2822Property = testProperty "parse . format = id (RFC2822)" $ \zonedTime ->
  (fmap zonedTimeToUTC . parseTimeRFC2822 . asText . formatTimeRFC2822) zonedTime == Just (zonedTimeToUTC zonedTime)
inverseRFC822Property = testProperty "parse . format = id (RFC822)" $ \zonedTime ->
  (fmap zonedTimeToUTC . parseTimeRFC822 . asText . formatTimeRFC822) zonedTime == Just (zonedTimeToUTC zonedTime)

asText :: Text -> Text
asText = id