22
33from datetime import datetime , timedelta
44
5+ import numpy as np
56import pytest
67from cftime import datetime as cftime_datetime
78from hypothesis import given
89from hypothesis import strategies as st
910
1011from parcels ._core .utils .time import TimeInterval
1112
12- calendar_strategy = st .sampled_from (["gregorian" , "proleptic_gregorian" , "365_day" , "360_day" , "julian" , "366_day" ])
13+ calendar_strategy = st .sampled_from (
14+ ["gregorian" , "proleptic_gregorian" , "365_day" , "360_day" , "julian" , "366_day" , np .datetime64 , datetime ]
15+ )
1316
1417
1518@st .composite
16- def cftime_datetime_strategy (draw , calendar = None ):
19+ def datetime_strategy (draw , calendar = None ):
1720 year = draw (st .integers (1900 , 2100 ))
1821 month = draw (st .integers (1 , 12 ))
1922 day = draw (st .integers (1 , 28 ))
2023 if calendar is None :
2124 calendar = draw (calendar_strategy )
25+ if calendar is datetime :
26+ return datetime (year , month , day )
27+ if calendar is np .datetime64 :
28+ return np .datetime64 (datetime (year , month , day ))
29+
2230 return cftime_datetime (year , month , day , calendar = calendar )
2331
2432
2533@st .composite
26- def cftime_interval_strategy (draw , left = None , calendar = None ):
34+ def time_interval_strategy (draw , left = None , calendar = None ):
2735 if left is None :
28- left = draw (cftime_datetime_strategy (calendar = calendar ))
36+ left = draw (datetime_strategy (calendar = calendar ))
2937 right = left + draw (
3038 st .timedeltas (
3139 min_value = timedelta (seconds = 1 ),
@@ -41,6 +49,8 @@ def cftime_interval_strategy(draw, left=None, calendar=None):
4149 (cftime_datetime (2023 , 1 , 1 , calendar = "gregorian" ), cftime_datetime (2023 , 1 , 2 , calendar = "gregorian" )),
4250 (cftime_datetime (2023 , 6 , 1 , calendar = "365_day" ), cftime_datetime (2023 , 6 , 2 , calendar = "365_day" )),
4351 (cftime_datetime (2023 , 12 , 1 , calendar = "360_day" ), cftime_datetime (2023 , 12 , 2 , calendar = "360_day" )),
52+ (datetime (2023 , 12 , 1 ), datetime (2023 , 12 , 2 )),
53+ (np .datetime64 (datetime (2023 , 12 , 1 )), np .datetime64 (datetime (2023 , 12 , 2 ))),
4454 ],
4555)
4656def test_time_interval_initialization (left , right ):
@@ -53,7 +63,7 @@ def test_time_interval_initialization(left, right):
5363 TimeInterval (right , left )
5464
5565
56- @given (cftime_interval_strategy ())
66+ @given (time_interval_strategy ())
5767def test_time_interval_contains (interval ):
5868 left = interval .left
5969 right = interval .right
@@ -64,12 +74,12 @@ def test_time_interval_contains(interval):
6474 assert middle in interval
6575
6676
67- @given (cftime_interval_strategy (calendar = "365_day" ), cftime_interval_strategy (calendar = "365_day" ))
77+ @given (time_interval_strategy (calendar = "365_day" ), time_interval_strategy (calendar = "365_day" ))
6878def test_time_interval_intersection_commutative (interval1 , interval2 ):
6979 assert interval1 .intersection (interval2 ) == interval2 .intersection (interval1 )
7080
7181
72- @given (cftime_interval_strategy ())
82+ @given (time_interval_strategy ())
7383def test_time_interval_intersection_with_self (interval ):
7484 assert interval .intersection (interval ) == interval
7585
@@ -81,7 +91,7 @@ def test_time_interval_repr():
8191 assert repr (interval ) == expected
8292
8393
84- @given (cftime_interval_strategy ())
94+ @given (time_interval_strategy ())
8595def test_time_interval_equality (interval ):
8696 assert interval == interval
8797
0 commit comments