8 import dateparse.dateparse_utils as du
9 import unittest_utils as uu
12 class TestDateparseUtils(unittest.TestCase):
14 @uu.check_method_for_perf_regressions
15 def test_dateparsing(self):
17 override_now_for_test_purposes = datetime.datetime(2021, 7, 2)
19 parsable_expressions = [
21 datetime.datetime(2021, 7, 2)),
23 datetime.datetime(2021, 7, 3)),
25 datetime.datetime(2021, 7, 1)),
27 datetime.datetime(2021, 7, 2, 21, 30, 0, 0)),
29 datetime.datetime(2021, 7, 2, 0, 1, 0, 0)),
31 datetime.datetime(2021, 7, 2, 12, 2, 0, 0)),
33 datetime.datetime(2021, 7, 2, 0, 3, 0, 0)),
35 datetime.datetime(2021, 6, 30)),
37 datetime.datetime(2021, 7, 7)),
39 datetime.datetime(2021, 7, 14)),
41 datetime.datetime(2021, 7, 6)),
43 datetime.datetime(2021, 6, 28)),
45 datetime.datetime(2021, 6, 28)),
47 datetime.datetime(2021, 6, 7)),
49 datetime.datetime(2021, 3, 2)),
51 datetime.datetime(2021, 6, 29)),
53 datetime.datetime(2021, 10, 1)),
55 datetime.datetime(2022, 7, 2)),
57 datetime.datetime(2021, 7, 30)),
59 datetime.datetime(2021, 6, 12)),
60 ('4 months from today',
61 datetime.datetime(2021, 11, 2)),
62 ('4 years from yesterday',
63 datetime.datetime(2025, 7, 1)),
64 ('4 weeks from tomorrow',
65 datetime.datetime(2021, 7, 31)),
67 datetime.datetime(2005, 4, 15)),
69 datetime.datetime(2021, 4, 14)),
70 ('9:30am on last wednesday',
71 datetime.datetime(2021, 6, 30, 9, 30)),
73 datetime.datetime(2005, 4, 15)),
75 datetime.datetime(2005, 4, 15)),
76 ('the 1st wednesday in may',
77 datetime.datetime(2021, 5, 5)),
79 datetime.datetime(2021, 6, 27)),
81 datetime.datetime(2021, 4, 4)),
83 datetime.datetime(2020, 12, 25)),
85 datetime.datetime(2020, 12, 25)),
87 datetime.datetime(1999, 12, 25)),
89 datetime.datetime(2022, 1, 17)),
91 datetime.datetime(2020, 10, 31)),
92 ('5 work days after independence day',
93 datetime.datetime(2021, 7, 12)),
94 ('50 working days from last wed',
95 datetime.datetime(2021, 9, 10)),
96 ('25 working days before columbus day',
97 datetime.datetime(2021, 9, 3)),
99 datetime.datetime(2021, 7, 9)),
101 datetime.datetime(2021, 6, 13)),
102 ('4 weeks before xmas, 1999',
103 datetime.datetime(1999, 11, 27)),
104 ('3 days before new years eve, 2000',
105 datetime.datetime(2000, 12, 28)),
107 datetime.datetime(2021, 7, 4)),
108 ('the ides of march',
109 datetime.datetime(2021, 3, 15)),
110 ('the nones of april',
111 datetime.datetime(2021, 4, 5)),
112 ('the kalends of may',
113 datetime.datetime(2021, 5, 1)),
115 datetime.datetime(2001, 9, 11)),
116 ('4 sundays before veterans\' day',
117 datetime.datetime(2021, 10, 17)),
119 datetime.datetime(2021, 12, 24)),
120 ('this friday at 5pm',
121 datetime.datetime(2021, 7, 9, 17, 0, 0)),
123 datetime.datetime(2021, 2, 15)),
124 ('memorial day, 1921',
125 datetime.datetime(1921, 5, 30)),
126 ('today -4 wednesdays',
127 datetime.datetime(2021, 6, 9)),
129 datetime.datetime(2021, 11, 25)),
131 datetime.datetime(2021, 6, 13)),
133 datetime.datetime(2021, 2, 23)),
135 datetime.datetime(2021, 5, 13)),
136 ('1st tuesday in nov, 2024',
137 datetime.datetime(2024, 11, 5)),
138 ('2 days before last xmas at 3:14:15.92a',
139 datetime.datetime(2020, 12, 23, 3, 14, 15, 92)),
140 ('3 weeks after xmas, 1995 at midday',
141 datetime.datetime(1996, 1, 15, 12, 0, 0)),
142 ('4 months before easter, 1992 at midnight',
143 datetime.datetime(1991, 12, 19)),
144 ('5 months before halloween, 1995 at noon',
145 datetime.datetime(1995, 5, 31, 12)),
146 ('4 days before last wednesday',
147 datetime.datetime(2021, 6, 26)),
148 ('44 months after today',
149 datetime.datetime(2025, 3, 2)),
150 ('44 years before today',
151 datetime.datetime(1977, 7, 2)),
153 datetime.datetime(2020, 8, 28)),
154 ('15 minutes to 3am',
155 datetime.datetime(2021, 7, 2, 2, 45)),
157 datetime.datetime(2021, 7, 2, 16, 15)),
159 datetime.datetime(2021, 7, 2, 9, 30)),
160 ('4 seconds to midnight',
161 datetime.datetime(2021, 7, 1, 23, 59, 56)),
162 ('4 seconds to midnight, tomorrow',
163 datetime.datetime(2021, 7, 2, 23, 59, 56)),
164 ('2021/apr/15T21:30:44.55',
165 datetime.datetime(2021, 4, 15, 21, 30, 44, 55)),
166 ('2021/apr/15 at 21:30:44.55',
167 datetime.datetime(2021, 4, 15, 21, 30, 44, 55)),
168 ('2021/4/15 at 21:30:44.55',
169 datetime.datetime(2021, 4, 15, 21, 30, 44, 55)),
170 ('2021/04/15 at 21:30:44.55',
171 datetime.datetime(2021, 4, 15, 21, 30, 44, 55)),
172 ('2021/04/15 at 21:30:44.55Z',
173 datetime.datetime(2021, 4, 15, 21, 30, 44, 55,
174 tzinfo=pytz.timezone('UTC'))),
175 ('2021/04/15 at 21:30:44.55EST',
176 datetime.datetime(2021, 4, 15, 21, 30, 44, 55,
177 tzinfo=pytz.timezone('EST'))),
178 ('13 days after last memorial day at 12 seconds before 4pm',
179 datetime.datetime(2020, 6, 7, 15, 59, 48)),
180 (' 2 days before yesterday at 9am ',
181 datetime.datetime(2021, 6, 29, 9)),
182 ('-3 days before today',
183 datetime.datetime(2021, 7, 5)),
184 ('3 days before yesterday at midnight EST',
185 datetime.datetime(2021, 6, 28, tzinfo=pytz.timezone('EST'))),
188 for (txt, expected_dt) in parsable_expressions:
191 actual_dt = dp.parse(txt)
192 self.assertIsNotNone(actual_dt)
196 f'"{txt}", got "{actual_dt}" while expecting "{expected_dt}"'
198 except du.ParseException:
199 self.fail(f'Expected "{txt}" to parse successfully.')
202 if __name__ == '__main__':