import datetime as dt from cron_next import parse def test_every_minute(): c = parse("* * * * *") t = dt.datetime(2026,1,1,0,0) assert c.next(t) == dt.datetime(2026,1,1,0,1) def test_specific(): c = parse("30 14 * * *") t = dt.datetime(2026,1,1,10,0) assert c.next(t) == dt.datetime(2026,1,1,14,30) def test_dow_restricted(): # Mondays at 09:00 c = parse("0 9 * * 1") # 2026-01-05 is Monday t = dt.datetime(2026,1,4,10,0) assert c.next(t) == dt.datetime(2026,1,5,9,0) def test_dom_and_dow_or(): # dom=1 OR dow=monday c = parse("0 0 1 * 1") # 2026-02-01 is Sunday; next monday is Feb 2; but dom=1 matches Feb1 midnight already? after Jan 2 00:00 t = dt.datetime(2026,1,2,0,1) # next match: Feb1 00:00 (dom) since before Monday Feb2 assert c.next(t) == dt.datetime(2026,1,5,0,0) def test_step_and_range(): c = parse("*/15 9-17 * * *") t = dt.datetime(2026,1,1,8,50) assert c.next(t) == dt.datetime(2026,1,1,9,0) def test_names(): c = parse("0 0 1 jan *") t = dt.datetime(2025,6,1,0,0) assert c.next(t) == dt.datetime(2026,1,1,0,0) def test_invalid_fields(): try: parse("* * * *") assert False except ValueError: pass def test_dow_sunday_7(): c = parse("0 0 * * 7") # sunday t = dt.datetime(2026,1,3,0,1) # sat assert c.next(t) == dt.datetime(2026,1,4,0,0)