timezone-detect-0.2.0.0: test/TimezoneDetectSpec.hs
module TimezoneDetectSpec (spec) where
import Data.Time
import Data.Time.LocalTime.TimeZone.Detect
import Test.Hspec
zoneFile :: FilePath
zoneFile = "./test/tz_db/timezone21.bin"
lookupTimeZoneName' :: Double -> Double -> Maybe TimeZoneName
lookupTimeZoneName' = lookupTimeZoneName zoneFile
localTimeFromString :: String -> IO LocalTime
localTimeFromString =
parseTimeM True defaultTimeLocale "%Y-%-m-%-d %T"
utcFromString :: String -> IO UTCTime
utcFromString =
parseTimeM True defaultTimeLocale "%Y-%-m-%-d %T"
timeAtPointToUTC' :: Double -> Double -> LocalTime -> IO UTCTime
timeAtPointToUTC' = timeAtPointToUTC zoneFile
spec :: Spec
spec = do
describe "lookupTimeZoneName" $ do
it "calculates coordinates for known locations" $ do
let newYork = lookupTimeZoneName' 40.7831 (-73.9712)
let tegucigalpa = lookupTimeZoneName' 14.0650 (-87.1715)
newYork `shouldBe` (Just "America/New_York")
tegucigalpa `shouldBe` (Just "America/Tegucigalpa")
it "returns an error value when given an invalid timezone file path" $ do
let wrong = lookupTimeZoneName "bogus" 0.0 0.0
wrong `shouldBe` Nothing -- invalid DB file
it "returns an error value when given invalid coordinates" $ do
let outOfThisWorld = lookupTimeZoneName' 40000000.7 (-73.97)
outOfThisWorld `shouldBe` Nothing -- invalid coordinates
describe "timeAtPointToUTC" $ do
it "calculates a UTC instant at a point in time and space in New York" $ do
localWinter <- localTimeFromString "2019-12-25 00:30:00"
localSummer <- localTimeFromString "2019-08-25 00:30:00"
utcWinter <- utcFromString "2019-12-25 05:30:00"
utcSummer <- utcFromString "2019-08-25 04:30:00"
atPointWinter <- timeAtPointToUTC' 40.7831 (-73.9712) localWinter
atPointSummer <- timeAtPointToUTC' 40.7831 (-73.9712) localSummer
atPointWinter `shouldBe` utcWinter
atPointSummer `shouldBe` utcSummer
it "calculates a UTC instant at a point in time and space in Tegucigalpa (no DST)" $ do
localWinter <- localTimeFromString "2019-12-25 00:30:00"
localSummer <- localTimeFromString "2019-08-25 00:30:00"
utcWinter <- utcFromString "2019-12-25 06:30:00"
utcSummer <- utcFromString "2019-08-25 06:30:00"
atPointWinter <- timeAtPointToUTC' 14.0650 (-87.1715) localWinter
atPointSummer <- timeAtPointToUTC' 14.0650 (-87.1715) localSummer
atPointWinter `shouldBe` utcWinter
atPointSummer `shouldBe` utcSummer