packages feed

cron-0.7.2: test/System/Test/Cron/Describe.hs

{-# LANGUAGE OverloadedStrings #-}

module System.Test.Cron.Describe (tests) where

import           SpecHelper
-------------------------------------------------------------------------------


tests :: TestTree
tests = testGroup "System.Cron.Describe"
  [ describeDisplayCronSchedule
  ]


-------------------------------------------------------------------------------
describeDisplayCronSchedule :: TestTree
describeDisplayCronSchedule = testGroup "describeCronSchedule"
  [
      testGroup "describes all stars" [
        testCase "verbose" $
          "Every minute, every hour, every day, every day of the week" @=? describeV "* * * * *"

      , testCase "non-verbose" $
          "Every minute" @=? describeNV "* * * * *"
    ]
    , testGroup "describes specific values" [
        testCase "verbose" $
          "At 02:01, on day 3 of the month, every day of the week" @=? describeV "1 2 3 * *"

      , testCase "non-verbose" $
          "At 02:01, on day 3 of the month" @=? describeNV "1 2 3 * *"

      , testCase "12-hour (verbose)" $
          "At 02:01 AM, on day 3 of the month, every day of the week" @=? describe12 "1 2 3 * *"
    ]
    , testGroup "describes list values" [
        testCase "verbose" $
          "Every minute, every hour, on days 3 and 5 of the month, every day of the week" @=? describeV "* * 3,5 * *"

      , testCase "non-verbose" $
          "Every minute, on days 3 and 5 of the month" @=? describeNV "* * 3,5 * *"
    ]
    , testGroup "describes range values" [
        testCase "verbose" $
          "Every minute, every hour, between days 3 and 4 of the month, every day of the week" @=? describeV "* * 3-4 * *"

      , testCase "non-verbose" $
          "Every minute, between days 3 and 4 of the month" @=? describeNV "* * 3-4 * *"
    ]
    , testGroup "describes step values" [
        testCase "verbose" $
          "Every 2 minutes, every hour, every 4 days, between days 2 and 10 of the month, every day of the week" @=? describeV "*/2 * 2-10/4 * *"

      , testCase "non-verbose" $
          "Every 2 minutes, every 4 days, between days 2 and 10 of the month" @=? describeNV "*/2 * 2-10/4 * *"
    ]
    , testGroup "describes other values" [
        testCase "verbose" $
          "Every 2 minutes, minutes 1 through 59 past the hour, every hour, every day, Wednesday through Friday, only in February" @=? describeV "1-59/2 * * 2 3-5"

      , testCase "non-verbose" $
          "Every 2 minutes, minutes 1 through 59 past the hour, Wednesday through Friday, only in February" @=? describeNV "1-59/2 * * 2 3-5"
    ]
    , testGroup "handles Sunday weirdness" [
        testCase "range of values (Sunday at 0)" $
          "Every minute, every hour, every day, Sunday through Friday" @=? describeV "* * * * 0-5"

      , testCase "range of values (Sunday at 7)" $
          "Every minute, every hour, every day, Friday through Sunday" @=? describeV "* * * * 5-7"

      , testCase "range of values" $
          "Every minute, every hour, every day, Sunday through Sunday" @=? describeV "* * * * 0-7"
    ]
    , testGroup "describes complicated times" [
        testCase "describes specific times - twenty four hour" $
          "At 13:01, every day, every day of the week" @=? describeV "1 13 * * *"

      , testCase "describes specific times - twelve hour" $
        "At 01:01 PM, every day, every day of the week" @=? describe12 "1 13 * * *"

      , testCase "describes a range of minutes - twenty four hour" $
          "Every minute between 12:01 and 12:10, every day, every day of the week" @=? describeV "1-10 12 * * *"

      , testCase "describes a range of minutes - twelve hour" $
          "Every minute between 12:01 PM and 12:10 PM, every day, every day of the week" @=? describe12 "1-10 12 * * *"

      , testGroup "describes times for lists of hours" [
          testCase "simple list of hours - twenty four hour" $
            "At 02:01 and 03:01, every day, every day of the week" @=? describeV "1 2,3 * * *"

        , testCase "simple list of hours - twelve hour" $
          "At 02:01 AM and 03:01 AM, every day, every day of the week" @=? describe12 "1 2,3 * * *"

        , testCase "list of hours, and range - twenty four hour" $
            "At 02:01, 03:01 and at 1 minutes past the hour between 04:00 and 13:00, every day, every day of the week" @=?
            describeV "1 2,3,4-13 * * *"

        , testCase "list of hours, and range - twelve hour" $
            "At 02:01 AM, 03:01 AM and at 1 minutes past the hour between 04:00 AM and 01:00 PM, every day, every day of the week" @=?
            describe12 "1 2,3,4-13 * * *"

        , testCase "list of hours, and star" $
            "At 1 minutes past the hour, every hour, every day, every day of the week" @=? describeV "1 2,* * * *"
      ]
    , testGroup "describes other times" [
        testCase "range of minutes, range of hours" $
          "Minutes 10 through 15 past the hour, between 01:00 and 03:00, every day, every day of the week" @=?
          describeV "10-15 1-3 * * *"

      , testCase "range of minutes, every hour" $
          "Minutes 10 through 15 past the hour, every hour, every day, every day of the week" @=?
          describeV "10-15 * * * *"

      , testCase "range of minutes, interval of hours" $
          "Minutes 10 through 15 past the hour, every 3 hours, starting at 03:00, every day, every day of the week" @=?
          describeV "10-15 3/3 * * *"

      , testCase "list of minutes, at an hour" $
          "Every minute, at 03:00, every day, every day of the week" @=?
          describeV "2,* 3 * * *"

      , testCase "step minutes, step hours" $
          "Every 3 minutes, minutes 10 through 15 past the hour, every 5 hours, starting at 10:00, every day, every day of the week" @=?
          describeV "10-15/3 10/5 * * *"
      ]
    ]
  ]
  where
    mkCronSchedule t = let cs = either error id $ parseCronSchedule t in cs
    describeNV = describe (twentyFourHourFormat <> notVerbose) . mkCronSchedule
    describeV  = describe (twentyFourHourFormat <> verbose) . mkCronSchedule
    describe12 = describe verbose . mkCronSchedule