summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLowell Alleman <lowell@kintyre.co>2021-03-25 17:52:28 -0400
committerkiorky <kiorky@cryptelium.net>2021-04-07 17:01:14 +0200
commit560fea46190e839cab01680882f1dd110151bb74 (patch)
treec8dca6dae8e87a75eabd80b324fd526909775759
parent60e9d2014cfdd2e409094c2407bcc7e41c4b7e06 (diff)
downloadcroniter-560fea46190e839cab01680882f1dd110151bb74.tar.gz
Working L/non-L detection; updated unittests
- Expanded several few unit tests to show combinations of dow mixing, separately and combined, so that if mixed dow mode becomes supported there are a few tests to start from. See tests `test_lwom_mixup_*()`
-rw-r--r--src/croniter/croniter.py23
-rwxr-xr-xsrc/croniter/tests/test_croniter.py103
2 files changed, 89 insertions, 37 deletions
diff --git a/src/croniter/croniter.py b/src/croniter/croniter.py
index 3c923fd..01d824b 100644
--- a/src/croniter/croniter.py
+++ b/src/croniter/croniter.py
@@ -601,7 +601,10 @@ class croniter(object):
expanded = []
nth_weekday_of_month = {}
last_weekday_of_month = set()
- # dow_types = set()
+
+ # Track to see if unsupported combinations exist in the 'dow' expr
+ dow_types = set()
+ dot_types_exclusions = set()
for i, expr in enumerate(expressions):
e_list = expr.split(',')
@@ -617,14 +620,18 @@ class croniter(object):
dow = int(m.group(1)) % 7
last_weekday_of_month.add(dow)
# Last dow should always be either the 4 or 5th occurrence of that dow
- e = "{}#4".format(dow)
- e_list.insert(0, "{}#5".format(dow))
- # dow_types.add("last-weekday-of-month")
- del dow
- '''
+ new_e = {"{}#4".format(dow), "{}#5".format(dow)}
+ if new_e.intersection(e_list):
+ dow_types.add("implicit w#n")
+ e_list += new_e
+ dot_types_exclusions.update(new_e)
+ dow_types.add("lwom")
+ del dow, new_e
+ continue
+ elif e in dot_types_exclusions:
+ pass
else:
dow_types.add("other")
- '''
e, sep, nth = str(e).partition('#')
if nth and not re.match(r'[1-5]', nth):
@@ -727,7 +734,6 @@ class croniter(object):
and res[0] == '*')
else res)
- '''
if len(dow_types) > 1:
# This is more of a current implementation limit, not something that's impossible
@@ -739,7 +745,6 @@ class croniter(object):
"Mixing 'L' and non-'L' syntax in day of week field is not "
"currently supported. "
"Failed expression: {}".format(expr_format))
- '''
return expanded, nth_weekday_of_month, last_weekday_of_month
diff --git a/src/croniter/tests/test_croniter.py b/src/croniter/tests/test_croniter.py
index 3a5fca6..a861989 100755
--- a/src/croniter/tests/test_croniter.py
+++ b/src/croniter/tests/test_croniter.py
@@ -1201,48 +1201,95 @@ class CroniterTest(base.TestCase):
datetime(2017, 1, 28),
])
- @unittest.expectedFailure
- def test_lwom_mixup_all_fri_last_sat(self):
- with self.assertRaises(CroniterBadCronError):
- it = croniter("0 0 * * 5,L6", datetime(2021, 3, 1), ret_type=datetime)
- ''' # When supported, should match:
- items = [next(it) for i in range(5)]
+ def test_lwom_tue_thu(self):
+ it = croniter("0 0 * * L2,L4", datetime(2016, 6, 1), ret_type=datetime)
+ items = [next(it) for i in range(10)]
self.maxDiff = 1000
self.assertListEqual(items, [
+ datetime(2016, 6, 28),
+ datetime(2016, 6, 30),
+ datetime(2016, 7, 26),
+ datetime(2016, 7, 28),
+ datetime(2016, 8, 25), # last tuesday comes before the last thursday
+ datetime(2016, 8, 30),
+ datetime(2016, 9, 27),
+ datetime(2016, 9, 29),
+ datetime(2016, 10, 25),
+ datetime(2016, 10, 27),
+ ])
+
+ def test_lwom_mixup_all_fri_last_sat(self):
+ cron_a = "0 0 * * L6"
+ cron_b = "0 0 * * 5"
+ cron_c = "0 0 * * 5,L6"
+ start = datetime(2021, 3, 1)
+ expect_a = [ datetime(2021, 3, 27) ]
+ expect_b = [
datetime(2021, 3, 5),
datetime(2021, 3, 12),
datetime(2021, 3, 19),
datetime(2021, 3, 26),
- datetime(2021, 3, 27),
- ])
- '''
+ ]
+ expect_c = sorted(set(expect_a) & set(expect_b))
+ def getn(expr, n):
+ it = croniter(expr, start, ret_type=datetime)
+ return [next(it) for i in range(n)]
+ self.assertListEqual(getn(cron_a, 1), expect_a)
+ self.assertListEqual(getn(cron_b, 4), expect_b)
+ with self.assertRaises(CroniterBadCronError):
+ self.assertListEqual(getn(cron_c, 5), expect_c)
- @unittest.expectedFailure
def test_lwom_mixup_firstlast_sat(self):
# First saturday, last saturday
+ start = datetime(2021, 3, 1)
+ cron_a = "0 0 * * 6#1"
+ cron_b = "0 0 * * L6"
+ cron_c = "0 0 * * L6,6#1"
+ expect_a = [
+ datetime(2021, 3, 6),
+ datetime(2021, 4, 3),
+ datetime(2021, 5, 1),
+ ]
+ expect_b = [
+ datetime(2021, 3, 27),
+ datetime(2021, 4, 24),
+ datetime(2021, 5, 29),
+ ]
+ expect_c = sorted(expect_a + expect_b)
+ def getn(expr, n):
+ it = croniter(expr, start, ret_type=datetime)
+ return [next(it) for i in range(n)]
+ self.assertListEqual(getn(cron_a, 3), expect_a)
+ self.assertListEqual(getn(cron_b, 3), expect_b)
with self.assertRaises(CroniterBadCronError):
- it = croniter("0 0 * * L6,6#1", datetime(2021, 3, 1), ret_type=datetime)
- """ # When supported, should match:
- self.assertEqual(next(it), datetime(2021, 3, 6))
- self.assertEqual(next(it), datetime(2021, 3, 27))
- self.assertEqual(next(it), datetime(2021, 4, 3))
- self.assertEqual(next(it), datetime(2021, 4, 24))
- self.assertEqual(next(it), datetime(2021, 5, 1))
- self.assertEqual(next(it), datetime(2021, 5, 29))
- """
+ self.assertListEqual(getn(cron_c, 6), expect_c)
- @unittest.expectedFailure
def test_lwom_mixup_4th_and_last(self):
# 4th and last monday
+ start = datetime(2021, 11, 1)
+ cron_a = "0 0 * * 1#4"
+ cron_b = "0 0 * * L1"
+ cron_c = "0 0 * * 1#4,L1"
+ expect_a = [
+ datetime(2021, 11, 22),
+ datetime(2021, 12, 27),
+ datetime(2022, 1, 24)
+ ]
+ expect_b = [
+ datetime(2021, 11, 29),
+ datetime(2021, 12, 27),
+ datetime(2022, 1, 31),
+ ]
+ expect_c = sorted(set(expect_a) & set(expect_b))
+
+ def getn(expr, n):
+ it = croniter(expr, start, ret_type=datetime)
+ return [next(it) for i in range(n)]
+
+ self.assertListEqual(getn(cron_a, 3), expect_a)
+ self.assertListEqual(getn(cron_b, 3), expect_b)
with self.assertRaises(CroniterBadCronError):
- it = croniter("0 0 * * L1,1#4", datetime(2021, 11, 1), ret_type=datetime)
- """ # When supported, should match:
- self.assertEqual(next(it), datetime(2021, 11, 22))
- self.assertEqual(next(it), datetime(2021, 11, 29))
- self.assertEqual(next(it), datetime(2021, 12, 27)) # only 4 mondays in Dec '21
- self.assertEqual(next(it), datetime(2022, 1, 24))
- self.assertEqual(next(it), datetime(2022, 1, 31))
- """
+ self.assertListEqual(getn(cron_c, 5), expect_c)
def test_issue_142_dow(self):
ret = []