module System.Test.Cron.Internal.Schedule ( tests, ) where ------------------------------------------------------------------------------- import Hedgehog ------------------------------------------------------------------------------- import SpecHelper import System.Cron.Internal.Schedule ------------------------------------------------------------------------------- tests :: TestTree tests = testGroup "System.Cron.Schedule" [ describeFindNextMinuteDelay' ] describeFindNextMinuteDelay' :: TestTree describeFindNextMinuteDelay' = testGroup "findNextMinuteDelay'" [ testCase "should find next minute of arbitrary time." $ let now = UTCTime {utctDay = ModifiedJulianDay 58906, utctDayTime = picosecondsToDiffTime 29085749437046123} -- 2020-02-27 08:04:45.749437046 UTC nextMinute = UTCTime {utctDay = ModifiedJulianDay 58906, utctDayTime = picosecondsToDiffTime 29100000000000000} -- 2020-02-27 08:05:00.000000000 UTC in findNextMinuteDelay' now @?= (nextMinute, 14250563), testCase "should find next minute of 59 minutes." $ let now = UTCTime {utctDay = ModifiedJulianDay 58906, utctDayTime = picosecondsToDiffTime 32357749437046123} -- 2020-02-27 08:59:17.749437046123 UTC nextMinute = UTCTime {utctDay = ModifiedJulianDay 58906, utctDayTime = picosecondsToDiffTime 32400000000000000} -- 2020-02-27 09:00:00.000000000 UTC in findNextMinuteDelay' now @?= (nextMinute, 42250563), testCase "should find next minute of 0 minute." $ let now = UTCTime {utctDay = ModifiedJulianDay 58906, utctDayTime = picosecondsToDiffTime 32400123456789012} -- 2020-02-27 09:00:00.123456789012 UTC nextMinute = UTCTime {utctDay = ModifiedJulianDay 58906, utctDayTime = picosecondsToDiffTime 32460000000000000} -- 2020-02-27 09:01:00.000000000 UTC in findNextMinuteDelay' now @?= (nextMinute, 59876543), testCase "should find next minute before midnight." $ let now = UTCTime {utctDay = ModifiedJulianDay 58906, utctDayTime = picosecondsToDiffTime 86387123456789012} -- 2020-02-27 23:59:47.123456789012 UTC nextMinute = UTCTime {utctDay = ModifiedJulianDay 58907, utctDayTime = picosecondsToDiffTime 0} -- 2020-02-28 00:00:00.000000000 UTC in findNextMinuteDelay' now @?= (nextMinute, 12876543), testProperty "invariance: next minute is after and no more than 60s later." $ property $ do now <- forAll gen let (nextMinute, delay) = findNextMinuteDelay' now ((nextMinute > now) && (delay <= 60000000)) === True, testProperty "invariance: next minute after next minute is *exactly* 60s." $ property $ do now <- forAll gen let (nextMinute1, _) = findNextMinuteDelay' now let (nextMinute2, delay) = findNextMinuteDelay' nextMinute1 ((diffUTCTime nextMinute2 nextMinute1 == 60) && (delay == 60000000)) === True ]