@@ -215,6 +215,178 @@ def test_large_date_range():
215215 assert len (intervals ) == len (cid ) == 100
216216
217217
218+ def test_leap_year_handling_len1_totuple ():
219+ cid = DateIntervalCycler ([(2 , 29 )], dt (2019 , 1 , 1 ), dt (2019 , 2 , 1 ))
220+ date_series = cid .totuple ()
221+ assert len (date_series ) == 1 + 1
222+ assert len (date_series ) == len (cid ) + 1
223+ assert date_series == tuple ((dt (2019 , 1 , 1 ), dt (2019 , 2 , 1 )))
224+
225+ cid = DateIntervalCycler ([(2 , 29 )], dt (2020 , 1 , 1 ), dt (2020 , 2 , 1 ))
226+ date_series = cid .totuple ()
227+ assert len (date_series ) == 2
228+ assert len (date_series ) == len (cid ) + 1
229+ assert date_series == tuple ((dt (2020 , 1 , 1 ), dt (2020 , 2 , 1 )))
230+
231+
232+ def test_leap_year_handling_len2_totuple ():
233+ cid = DateIntervalCycler ([(2 , 29 )], dt (2019 , 1 , 1 ), dt (2020 , 1 , 1 ))
234+ date_series = cid .totuple ()
235+ assert len (date_series ) == 2 + 1
236+ assert len (date_series ) == len (cid ) + 1
237+ assert date_series == tuple (
238+ (dt (2019 , 1 , 1 ), dt (2019 , 2 , 28 ), dt (2020 , 1 , 1 )),
239+ )
240+ cid = DateIntervalCycler ([(2 , 29 )], dt (2020 , 1 , 1 ), dt (2021 , 1 , 1 ))
241+ date_series = cid .totuple ()
242+ assert len (date_series ) == 2 + 1
243+ assert len (date_series ) == len (cid ) + 1
244+ assert date_series == tuple (
245+ (dt (2020 , 1 , 1 ), dt (2020 , 2 , 29 ), dt (2021 , 1 , 1 )),
246+ )
247+
248+
249+ def test_leap_year_handling_len3_totuple ():
250+ cid = DateIntervalCycler ([(2 , 29 )], dt (2019 , 1 , 1 ), dt (2021 , 1 , 1 ))
251+ date_series = cid .totuple ()
252+ assert len (date_series ) == 3 + 1
253+ assert len (date_series ) == len (cid ) + 1
254+ assert date_series == tuple (
255+ (dt (2019 , 1 , 1 ), dt (2019 , 2 , 28 ), dt (2020 , 2 , 29 ), dt (2021 , 1 , 1 )),
256+ )
257+
258+ cid = DateIntervalCycler ([(2 , 29 )], dt (2020 , 1 , 1 ), dt (2022 , 1 , 1 ))
259+ date_series = cid .totuple ()
260+ assert len (date_series ) == 3 + 1
261+ assert len (date_series ) == len (cid ) + 1
262+ assert date_series == tuple (
263+ (dt (2020 , 1 , 1 ), dt (2020 , 2 , 29 ), dt (2021 , 2 , 28 ), dt (2022 , 1 , 1 )),
264+ )
265+
266+
267+ def test_leap_year_handling_len4_totuple ():
268+ cid = DateIntervalCycler ([(2 , 29 )], dt (2019 , 1 , 1 ), dt (2022 , 1 , 1 ))
269+ date_series = cid .totuple ()
270+ assert len (date_series ) == 4 + 1
271+ assert len (date_series ) == len (cid ) + 1
272+ assert date_series == tuple (
273+ (dt (2019 , 1 , 1 ), dt (2019 , 2 , 28 ), dt (2020 , 2 , 29 ), dt (2021 , 2 , 28 ), dt (2022 , 1 , 1 )),
274+ )
275+
276+
277+ def test_leap_year_handling_len6_totuple ():
278+ cid = DateIntervalCycler ([(2 , 29 )], dt (2019 , 1 , 1 ), dt (2024 , 1 , 1 ))
279+ date_series = cid .totuple ()
280+ assert len (date_series ) == 6 + 1
281+ assert len (date_series ) == len (cid ) + 1
282+ assert date_series == tuple (
283+ (
284+ dt (2019 , 1 , 1 ),
285+ dt (2019 , 2 , 28 ),
286+ dt (2020 , 2 , 29 ),
287+ dt (2021 , 2 , 28 ),
288+ dt (2022 , 2 , 28 ),
289+ dt (2023 , 2 , 28 ),
290+ dt (2024 , 1 , 1 ),
291+ ),
292+ )
293+
294+
295+ def test_leap_year_handling_len7_totuple ():
296+ cid = DateIntervalCycler ([(2 , 29 )], dt (2019 , 1 , 1 ), dt (2025 , 1 , 1 ))
297+ date_series = cid .totuple ()
298+ assert len (date_series ) == 7 + 1
299+ assert len (date_series ) == len (cid ) + 1
300+ assert date_series == tuple (
301+ (
302+ dt (2019 , 1 , 1 ),
303+ dt (2019 , 2 , 28 ),
304+ dt (2020 , 2 , 29 ),
305+ dt (2021 , 2 , 28 ),
306+ dt (2022 , 2 , 28 ),
307+ dt (2023 , 2 , 28 ),
308+ dt (2024 , 2 , 29 ),
309+ dt (2025 , 1 , 1 ),
310+ ),
311+ )
312+
313+
314+ def test_leap_year_handling_len8_totuple ():
315+ cid = DateIntervalCycler ([(2 , 29 )], dt (2019 , 1 , 1 ), dt (2026 , 1 , 1 ))
316+ date_series = cid .totuple ()
317+ assert len (date_series ) == 8 + 1
318+ assert len (date_series ) == len (cid ) + 1
319+ assert date_series == tuple (
320+ (
321+ dt (2019 , 1 , 1 ),
322+ dt (2019 , 2 , 28 ),
323+ dt (2020 , 2 , 29 ),
324+ dt (2021 , 2 , 28 ),
325+ dt (2022 , 2 , 28 ),
326+ dt (2023 , 2 , 28 ),
327+ dt (2024 , 2 , 29 ),
328+ dt (2025 , 2 , 28 ),
329+ dt (2026 , 1 , 1 ),
330+ ),
331+ )
332+
333+
334+ def test_leap_year_handling_totuple ():
335+ cid = DateIntervalCycler ([(2 , 29 )], dt (2019 , 1 , 1 ), dt (2021 , 1 , 1 ))
336+ date_series = cid .totuple ()
337+ assert len (date_series ) == 4
338+ assert len (date_series ) == len (cid ) + 1
339+ assert date_series == tuple (
340+ (dt (2019 , 1 , 1 ), dt (2019 , 2 , 28 ), dt (2020 , 2 , 29 ), dt (2021 , 1 , 1 )),
341+ )
342+
343+
344+ def test_cycle_on_year_edge_totuple ():
345+ cid = DateIntervalCycler ([(1 , 1 ), (12 , 31 )], dt (2020 , 1 , 1 ), dt (2021 , 1 , 1 ))
346+ date_series = cid .totuple ()
347+ assert len (date_series ) == 3
348+ assert len (date_series ) == len (cid ) + 1
349+ assert date_series == tuple (
350+ (dt (2020 , 1 , 1 ), dt (2020 , 12 , 31 ), dt (2021 , 1 , 1 )),
351+ )
352+
353+
354+ def test_monthly_cycle_totuple ():
355+ cid = DateIntervalCycler ([(1 , 15 ), (2 , 15 )], dt (2020 , 1 , 1 ), dt (2021 , 1 , 1 ))
356+ date_series = cid .totuple ()
357+ assert len (date_series ) == 4
358+ assert len (date_series ) == len (cid ) + 1
359+ assert date_series == tuple (
360+ (dt (2020 , 1 , 1 ), dt (2020 , 1 , 15 ), dt (2020 , 2 , 15 ), dt (2021 , 1 , 1 )),
361+ )
362+
363+
364+ def test_one_day_cycle_totuple ():
365+ cid = DateIntervalCycler ([(1 , 1 )], dt (2020 , 1 , 1 ), dt (2020 , 1 , 2 ))
366+ date_series = cid .totuple ()
367+ assert len (date_series ) == 2
368+ assert date_series == tuple ((dt (2020 , 1 , 1 ), dt (2020 , 1 , 2 )))
369+
370+ cid = DateIntervalCycler ([(1 , 1 ), (1 , 2 )], dt (2020 , 1 , 1 ), dt (2020 , 1 , 3 ))
371+ date_series = cid .totuple ()
372+ assert len (date_series ) == 3
373+ assert date_series == tuple ((dt (2020 , 1 , 1 ), dt (2020 , 1 , 2 ), dt (2020 , 1 , 3 )))
374+
375+
376+ def test_large_date_range_totuple ():
377+ cid = DateIntervalCycler ([(1 , 1 )], dt (2000 , 1 , 1 ), dt (2100 , 1 , 1 ))
378+ date_series = cid .totuple ()
379+ assert len (date_series ) == len (cid ) + 1 == 100 + 1
380+
381+ cid = DateIntervalCycler ([(1 , 1 )], dt (2000 , 1 , 1 ), dt (2100 , 1 , 2 ))
382+ date_series = cid .totuple ()
383+ assert len (date_series ) == len (cid ) + 1 == 101 + 1 # extra interval for (dt(2100, 1, 1), dt(2100, 1, 2))
384+
385+ cid = DateIntervalCycler ([(1 , 1 )], dt (2000 , 1 , 30 ), dt (2100 , 1 , 1 ))
386+ date_series = cid .totuple ()
387+ assert len (date_series ) == len (cid ) + 1 == 100 + 1
388+
389+
218390def test_invalid_month ():
219391 with pytest .raises (ValueError ):
220392 DateIntervalCycler ([(13 , 1 )], dt (2020 , 1 , 1 ), dt (2021 , 1 , 1 ))
0 commit comments