Lots of changes.
[python_utils.git] / tests / dateparse_utils_test.py
1 #!/usr/bin/env python3
2
3 import datetime
4 import unittest
5
6 import pytz
7
8 import dateparse.dateparse_utils as du
9 import unittest_utils as uu
10
11
12 class TestDateparseUtils(unittest.TestCase):
13
14     @uu.check_method_for_perf_regressions
15     def test_dateparsing(self):
16         dp = du.DateParser(
17             override_now_for_test_purposes = datetime.datetime(2021, 7, 2)
18         )
19         parsable_expressions = [
20             ('today',
21              datetime.datetime(2021, 7, 2)),
22             ('tomorrow',
23              datetime.datetime(2021, 7, 3)),
24             ('yesterday',
25              datetime.datetime(2021, 7, 1)),
26             ('21:30',
27              datetime.datetime(2021, 7, 2, 21, 30, 0, 0)),
28             ('12:01am',
29              datetime.datetime(2021, 7, 2, 0, 1, 0, 0)),
30             ('12:02p',
31              datetime.datetime(2021, 7, 2, 12, 2, 0, 0)),
32             ('0:03',
33              datetime.datetime(2021, 7, 2, 0, 3, 0, 0)),
34             ('last wednesday',
35              datetime.datetime(2021, 6, 30)),
36             ('this wed',
37              datetime.datetime(2021, 7, 7)),
38             ('next wed',
39              datetime.datetime(2021, 7, 14)),
40             ('this coming tues',
41              datetime.datetime(2021, 7, 6)),
42             ('this past monday',
43              datetime.datetime(2021, 6, 28)),
44             ('4 days ago',
45              datetime.datetime(2021, 6, 28)),
46             ('4 mondays ago',
47              datetime.datetime(2021, 6, 7)),
48             ('4 months ago',
49              datetime.datetime(2021, 3, 2)),
50             ('3 days back',
51              datetime.datetime(2021, 6, 29)),
52             ('13 weeks from now',
53              datetime.datetime(2021, 10, 1)),
54             ('1 year from now',
55              datetime.datetime(2022, 7, 2)),
56             ('4 weeks from now',
57              datetime.datetime(2021, 7, 30)),
58             ('3 saturdays ago',
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)),
66             ('april 15, 2005',
67              datetime.datetime(2005, 4, 15)),
68             ('april 14',
69              datetime.datetime(2021, 4, 14)),
70             ('9:30am on last wednesday',
71              datetime.datetime(2021, 6, 30, 9, 30)),
72             ('2005/apr/15',
73              datetime.datetime(2005, 4, 15)),
74             ('2005 apr 15',
75              datetime.datetime(2005, 4, 15)),
76             ('the 1st wednesday in may',
77              datetime.datetime(2021, 5, 5)),
78             ('last sun of june',
79              datetime.datetime(2021, 6, 27)),
80             ('this Easter',
81              datetime.datetime(2021, 4, 4)),
82             ('last christmas',
83              datetime.datetime(2020, 12, 25)),
84             ('last Xmas',
85              datetime.datetime(2020, 12, 25)),
86             ('xmas, 1999',
87              datetime.datetime(1999, 12, 25)),
88             ('next mlk day',
89              datetime.datetime(2022, 1, 17)),
90             ('Halloween, 2020',
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)),
98             ('today +1 week',
99              datetime.datetime(2021, 7, 9)),
100             ('sunday -3 weeks',
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)),
106             ('july 4th',
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)),
114             ('9/11/2001',
115              datetime.datetime(2001, 9, 11)),
116             ('4 sundays before veterans\' day',
117              datetime.datetime(2021, 10, 17)),
118             ('xmas eve',
119              datetime.datetime(2021, 12, 24)),
120             ('this friday at 5pm',
121              datetime.datetime(2021, 7, 9, 17, 0, 0)),
122             ('presidents day',
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)),
128             ('thanksgiving',
129              datetime.datetime(2021, 11, 25)),
130             ('2 sun in jun',
131              datetime.datetime(2021, 6, 13)),
132             ('easter -40 days',
133              datetime.datetime(2021, 2, 23)),
134             ('easter +39 days',
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)),
152             ('44 weeks ago',
153              datetime.datetime(2020, 8, 28)),
154             ('15 minutes to 3am',
155              datetime.datetime(2021, 7, 2, 2, 45)),
156             ('quarter past 4pm',
157              datetime.datetime(2021, 7, 2, 16, 15)),
158             ('half past 9',
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'))),
186         ]
187
188         for (txt, expected_dt) in parsable_expressions:
189             try:
190                 print(f'> {txt}')
191                 actual_dt = dp.parse(txt)
192                 self.assertIsNotNone(actual_dt)
193                 self.assertEqual(
194                     actual_dt,
195                     expected_dt,
196                     f'"{txt}", got "{actual_dt}" while expecting "{expected_dt}"'
197                 )
198             except du.ParseException:
199                 self.fail(f'Expected "{txt}" to parse successfully.')
200
201
202 if __name__ == '__main__':
203     unittest.main()