1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
|
from __future__ import annotations
import unittest
from cronsim.explain import explain
class TestBase(unittest.TestCase):
"""
* * * 1 * | Every minute in January
"""
def test(self) -> None:
for line in self.__doc__.split("\n"):
if "|" not in line:
continue
expr, desc = line.split("|")
expr, desc = expr.strip(), desc.strip()
with self.subTest():
self.assertEqual(explain(expr), desc, expr)
class TestSecondField(TestBase):
"""
* * * * * * | Every second
0,0 * * * * * | Every minute
*/5 * * * * * | Every fifth second of every minute
"""
class TestEveryMinute(TestBase):
"""
* * * * * | Every minute
*/1 * * * * | Every minute
0/1 * * * * | Every minute
0-59 * * * * | Every minute
* * 1/1 * * | Every minute
* * * JAN-DEC * | Every minute
"""
class TestMinuteField(TestBase):
"""
0 * * * * | At the start of every hour
0,0 * * * * | At the start of every hour
0,0 */1 * * * | At the start of every hour
0,0 0/1 * * * | At the start of every hour
5 * * * * | At minute 5 of every hour
5,5 * * * * | At minute 5 of every hour
5,10 * * * * | At minutes 5 and 10 of every hour
5,7,9 * * * * | At minutes 5, 7, and 9 of every hour
*/5 * * * * | Every fifth minute of every hour
0/5 * * * * | Every fifth minute of every hour
*/5,*/5 * * * * | Every fifth minute of every hour
0-30/5 * * * * | Every fifth minute from 0 through 30 of every hour
0-59/5 * * * * | Every fifth minute of every hour
1/5 * * * * | Every fifth minute from 1 through 59 of every hour
1,*/5 * * * * | At minute 1 and every fifth minute of every hour
*/5,1 * * * * | At every fifth minute and minute 1 of every hour
0-10 * * * * | Every minute from 0 through 10 of every hour
0-10,20-30 * * * * | Every minute from 0 through 10 and every minute from 20 through 30 of every hour
20-30,*/15 * * * * | Every minute from 20 through 30 and every 15th minute of every hour
1,20-30,*/15 * * * * | At minute 1, every minute from 20 through 30, and every 15th minute of every hour
"""
class TestHourField(TestBase):
"""
* 0 * * * | Every minute from 00:00 through 00:59
0-59 0 * * * | Every minute from 00:00 through 00:59
* 2,4 * * * | Every minute past hours 2 and 4
* */2 * * * | Every minute past every second hour
* 0/2 * * * | Every minute past every second hour
* */2,*/2 * * * | Every minute past every second hour
* */3 * * * | Every minute past every third hour
* */4 * * * | Every minute past every fourth hour
* 1/4 * * * | Every minute past every fourth hour from 1 through 23
* 1-10/4 * * * | Every minute past every fourth hour from 1 through 10
* 1,*/4 * * * | Every minute past hour 1 and every fourth hour
* 1-4 * * * | Every minute from 01:00 through 04:59
* 0-4,23 * * * | Every minute past every hour from 0 through 4 and hour 23
* 0-7,18-23 * * * | Every minute past every hour from 0 through 7 and every hour from 18 through 23
* 1,9-12,*/4 * * * | Every minute past hour 1, every hour from 9 through 12, and every fourth hour
0 */3 * * * | At minute 0 past every third hour
0 * * * * | At the start of every hour
0 */1 * * * | At the start of every hour
0 0/1 * * * | At the start of every hour
10 9-17 * * * | At minute 10 past every hour from 9 through 17
"""
class TestDayField(TestBase):
"""
0 0 1 * * | At 00:00 on the first day of every month
0 0 1,1 * * | At 00:00 on the first day of every month
0 0 1,15 * * | At 00:00 on the first and the 15th day of month
0 0 1,3,5 * * | At 00:00 on the first, the third, and the fifth day of month
0 0 1,3,10-20 * * | At 00:00 on the first day of month, the third day of month, and every day of month from 10 through 20
0 0 1-15 * * | At 00:00 on every day of month from 1 through 15
0 0 1-15,30 * * | At 00:00 on every day of month from 1 through 15 and the 30th day of month
0 0 */5 * * | At 00:00 on every fifth day of month
0 0 0/5 * * | At 00:00 on every fifth day of month
0 0 1/5 * * | At 00:00 on every fifth day of month
0 0 2/5 * * | At 00:00 on every fifth day of month from 2 through 31
0 0 2-10/5 * * | At 00:00 on every fifth day of month from 2 through 10
0 0 1-5,*/5 * * | At 00:00 on every day of month from 1 through 5 and every fifth day of month
0 0 1,L * * | At 00:00 on the first and the last day of month
0 0 1,2,L * * | At 00:00 on the first, the second, and the last day of month
0 0 L * * | At 00:00 on the last day of every month
0 0 L/2 * * | At 00:00 on the last day of every month
0 0 L * MON | At 00:00 on the last day of the month and on Monday
0 0 LW * * | At 00:00 on the last weekday of every month
0 0 LW/2 * * | At 00:00 on the last weekday of every month
0 0 LW * MON | At 00:00 on the last weekday of the month and on Monday
0 0 L,LW * * | At 00:00 on the last day of the month and the last weekday of the month
"""
class TestMonthField(TestBase):
"""
* * * 1 * | Every minute in January
* * 15 JAN-FEB * | Every minute on the 15th day of January and February
0 0 * 1 * | At 00:00 every day in January
0 0 * 1,1 * | At 00:00 every day in January
0 0 * JAN * | At 00:00 every day in January
0 0 * 1-2 * | At 00:00 every day in January and February
0 0 * JAN-FEB * | At 00:00 every day in January and February
0 0 15 JAN-FEB * | At 00:00 on the 15th day of January and February
0 0 * 1-3 * | At 00:00 in every month from January through March
0 0 * */2 * | At 00:00 in every second month
0 0 * 1/1 * | At 00:00 every day
0 0 * 1/2 * | At 00:00 in every second month
0 0 * 3/2 * | At 00:00 in every second month from March through December
0 0 * 1-6/2 * | At 00:00 in every second month from January through June
0 0 * 1-2,12 * | At 00:00 every day in January, February, and December
0 0 * 1-3,12 * | At 00:00 in every month from January through March and December
"""
class TestSingleDateInMonth(TestBase):
"""
0 0 1 1-2 * | At 00:00 on the first day of January and February
0 0 1 JAN-FEB * | At 00:00 on the first day of January and February
0 0 1 1-3 * | At 00:00 on the first day of every month from January through March
0 0 1 */2 * | At 00:00 on the first day of every second month
0 0 1 1/2 * | At 00:00 on the first day of every second month
0 0 1 3/2 * | At 00:00 on the first day of every second month from March through December
0 0 1 1-6/2 * | At 00:00 on the first day of every second month from January through June
0 0 1 1-2,12 * | At 00:00 on the first day of January, February, and December
0 0 1 1-3,12 * | At 00:00 on the first day of every month from January through March and December
0 0 1 1 1 | At 00:00 on the first day of month and on Monday in January
0 0 1 1 1-5 | At 00:00 on the first day of month and on Monday through Friday in January
0 0 1-2 1 1-5 | At 00:00 on the first and the second day of month and on Monday through Friday in January
"""
class TestWeekdayField(TestBase):
"""
* * * * 1#2 | Every minute on the second Monday of the month
* * * * 1L | Every minute on the last Monday of the month
0 0 * * 1 | At 00:00 on Monday
0 0 * * 1,1 | At 00:00 on Monday
0 0 * * MON | At 00:00 on Monday
0 0 * * 1#2 | At 00:00 on the second Monday of the month
0 0 * * MON#2 | At 00:00 on the second Monday of the month
0 0 * * 1L | At 00:00 on the last Monday of the month
0 0 * * 1-2 | At 00:00 on Monday and Tuesday
0 0 * * 1,2 | At 00:00 on Monday and Tuesday
0 0 * * MON,TUE | At 00:00 on Monday and Tuesday
0 0 * * 1-3 | At 00:00 on Monday through Wednesday
0 0 * * MON-WED | At 00:00 on Monday through Wednesday
0 0 * * 1-3,5 | At 00:00 on Monday through Wednesday and Friday
0 0 * * */2 | At 00:00 on every second day of week
0 0 * * 0/2 | At 00:00 on every second day of week
0 0 * * 1/2 | At 00:00 on every second day of week from Monday through Sunday
0 0 * * 1-7 | At 00:00 on Monday through Sunday
0 0 * * 1-7/1 | At 00:00 on Monday through Sunday
0 0 * * 0-6 | At 00:00 on Sunday through Saturday
0 0 * * 0-6/1 | At 00:00 on Sunday through Saturday
"""
class TestDateCombinations(TestBase):
"""
0 0 15 * * | At 00:00 on the 15th day of every month
0 0 15 1 1 | At 00:00 on the 15th day of month and on Monday in January
0 0 * 1 1 | At 00:00 on Monday in January
0 0 * JAN-FEB * | At 00:00 every day in January and February
0 0 * JAN-MAR * | At 00:00 in every month from January through March
0 0 15 JAN-FEB * | At 00:00 on the 15th day of January and February
0 0 1 JAN-FEB * | At 00:00 on the first day of January and February
0 0 1,2 JAN-FEB * | At 00:00 on the first and the second day of month in January and February
0 0 * * 1-5 | At 00:00 on Monday through Friday
0 0 L JAN * | At 00:00 on the last day of January
0 0 LW JAN * | At 00:00 on the last weekday of January
"""
class TestSpecificTimes(TestBase):
"""
0 0 * * * | At 00:00 every day
0 2 * * * | At 02:00 every day
33 22 11 * * * | At 11:22:33 every day
0,30 13,14 * * * | At 13:00, 13:30, 14:00, and 14:30 every day
0,15,30,45 2 * * * | At 02:00, 02:15, 02:30, and 02:45 every day
0,30 0 12 * * * | At 12:00:00 and 12:00:30 every day
15,45 0 12 * * * | At 12:00:15 and 12:00:45 every day
0,15,30,45 2,3 * * * | At minutes 0, 15, 30, and 45 past hours 2 and 3
0-10 11 * * * | Every minute from 11:00 through 11:10
* 9-17 * * * | Every minute from 09:00 through 17:59
*/2 9-17 * * * | Every second minute from 09:00 through 17:59
"""
class TestSpecificDates(TestBase):
"""
0 0 1 1 * | At 00:00 on January 1
0 0 15 1 * | At 00:00 on January 15
0 0 L 1 * | At 00:00 on the last day of January
0 0 LW 1 * | At 00:00 on the last weekday of January
"""
class TestFunkySchedules(TestBase):
"""
0 0 1-7 * */7 | At 00:00 on every day of month from 1 through 7 if it's on every seventh day of week
0 0 */100,1-7 * MON | At 00:00 on every 100th day of month and every day of month from 1 through 7 if it's on Monday
"""
class TestSmoke(TestBase):
"""
30-59/5 2,4,6 1-10 1-3 * | Every fifth minute from 30 through 59 past hours 2, 4, and 6 on every day of month from 1 through 10 in every month from January through March
0/15 9-17 1,10 * * | Every 15th minute from 09:00 through 17:59 on the first and the 10th day of month
* * * * 1,2,3 | Every minute on Monday, Tuesday, and Wednesday
0 0 1 1/2 * | At 00:00 on the first day of every second month
0 0 1 1/2,12 * | At 00:00 on the first day of every second month and December
"""
if __name__ == "__main__":
unittest.main()
|