module Main(main) where { import Data.Maybe; import Data.Foldable; import Control.Exception; import System.Environment; import System.Directory; import Test.Tasty; import Test.Tasty.HUnit; import Test.Tasty.Golden; import Data.Time; import Data.Time.Clock.LeapSeconds; import Data.Time.LocalTime.TimeZone.Series; import Data.Time.LocalTime.TimeZone.Unix; testCountryCodes :: TestTree; testCountryCodes = testCase "getCountryCodes" $ do { codes <- getCountryCodes; assertBool "at least 200 countries" $ length codes >= 200; }; testZoneDescriptions :: [ZoneDescription] -> TestTree; testZoneDescriptions zones = testCase "getZoneDescriptions" $ do { assertBool "at least 300 zones" $ length zones >= 300; forM_ zones $ \MkZoneDescription{zoneLocation=(lat,long,acc),..} -> do { assertBool "zoneCountries length" $ length zoneCountries >= 1; forM_ zoneCountries $ \zc -> assertEqual "zoneCountries member length" 2 $ length zc; _ <- evaluate lat; _ <- evaluate long; _ <- evaluate acc; _ <- evaluate zoneName; _ <- evaluate zoneComment; return (); } }; testGetTimeZoneSeries :: Maybe TimeZoneSpec -> TestTree; testGetTimeZoneSeries mname = testCase "getTimeZoneSeriesForZone" $ getTimeZoneSeriesForZone mname >> return (); testGetOlsonData :: Maybe TimeZoneSpec -> TestTree; testGetOlsonData mname = testCase "getOlsonDataForZone" $ getOlsonDataForZone mname >> return (); testLoadZones :: [TimeZoneSpec] -> TestTree; testLoadZones names = testGroup "load" $ fmap (\mname -> testGroup (fromMaybe "default" mname) [ testGetTimeZoneSeries mname, testGetOlsonData mname ]) (Nothing : (fmap Just names)); testUnknownZoneName :: TestTree; testUnknownZoneName = testCase "unknown TimeZoneSpec" $ do { setEnv "TZ" "unknown"; tzs <- getCurrentTimeZoneSeries; assertEqual "default TimeZoneSpec" (TimeZoneSeries utc []) tzs; }; testGetLeapSecondList :: TestTree; testGetLeapSecondList = testGroup "getLeapSecondList" [ testCase "values" $ do { lsl <- getLeapSecondList; assertBool "expiration is later than version" $ lslExpiration lsl > lslVersion lsl; }, goldenVsFile "leap-seconds" "test/leap-seconds.ref" "test/leap-seconds.out" $ do { lsl <- getLeapSecondList; -- just look at the first 26, since the list will grow. writeBinaryFile "test/leap-seconds.out" $ concat $ fmap (\(d,n) -> show d ++ " " ++ show n ++ "\n") $ take 26 $ lslTransitions lsl; } ]; main :: IO (); main = do { ls_exists <- doesFileExist "/usr/share/zoneinfo/leap-seconds.list"; -- workaround for Travis, which doesn't have this file zones <- getZoneDescriptions; let { names = fmap zoneName zones; }; defaultMain $ testGroup "timezone-unix" $ [ testCountryCodes, testZoneDescriptions zones, testLoadZones names, testUnknownZoneName ] ++ if ls_exists then [testGetLeapSecondList] else []; }; }