112391Sjason@lowepower.comfrom pybind11_tests import chrono as m
212391Sjason@lowepower.comimport datetime
311986Sandreas.sandberg@arm.com
411986Sandreas.sandberg@arm.com
511986Sandreas.sandberg@arm.comdef test_chrono_system_clock():
611986Sandreas.sandberg@arm.com
711986Sandreas.sandberg@arm.com    # Get the time from both c++ and datetime
812391Sjason@lowepower.com    date1 = m.test_chrono1()
911986Sandreas.sandberg@arm.com    date2 = datetime.datetime.today()
1011986Sandreas.sandberg@arm.com
1111986Sandreas.sandberg@arm.com    # The returned value should be a datetime
1211986Sandreas.sandberg@arm.com    assert isinstance(date1, datetime.datetime)
1311986Sandreas.sandberg@arm.com
1411986Sandreas.sandberg@arm.com    # The numbers should vary by a very small amount (time it took to execute)
1511986Sandreas.sandberg@arm.com    diff = abs(date1 - date2)
1611986Sandreas.sandberg@arm.com
1711986Sandreas.sandberg@arm.com    # There should never be a days/seconds difference
1811986Sandreas.sandberg@arm.com    assert diff.days == 0
1911986Sandreas.sandberg@arm.com    assert diff.seconds == 0
2011986Sandreas.sandberg@arm.com
2111986Sandreas.sandberg@arm.com    # We test that no more than about 0.5 seconds passes here
2211986Sandreas.sandberg@arm.com    # This makes sure that the dates created are very close to the same
2311986Sandreas.sandberg@arm.com    # but if the testing system is incredibly overloaded this should still pass
2411986Sandreas.sandberg@arm.com    assert diff.microseconds < 500000
2511986Sandreas.sandberg@arm.com
2611986Sandreas.sandberg@arm.com
2711986Sandreas.sandberg@arm.comdef test_chrono_system_clock_roundtrip():
2811986Sandreas.sandberg@arm.com    date1 = datetime.datetime.today()
2911986Sandreas.sandberg@arm.com
3011986Sandreas.sandberg@arm.com    # Roundtrip the time
3112391Sjason@lowepower.com    date2 = m.test_chrono2(date1)
3211986Sandreas.sandberg@arm.com
3311986Sandreas.sandberg@arm.com    # The returned value should be a datetime
3411986Sandreas.sandberg@arm.com    assert isinstance(date2, datetime.datetime)
3511986Sandreas.sandberg@arm.com
3611986Sandreas.sandberg@arm.com    # They should be identical (no information lost on roundtrip)
3711986Sandreas.sandberg@arm.com    diff = abs(date1 - date2)
3811986Sandreas.sandberg@arm.com    assert diff.days == 0
3911986Sandreas.sandberg@arm.com    assert diff.seconds == 0
4011986Sandreas.sandberg@arm.com    assert diff.microseconds == 0
4111986Sandreas.sandberg@arm.com
4211986Sandreas.sandberg@arm.com
4314299Sbbruce@ucdavis.edudef test_chrono_system_clock_roundtrip_date():
4414299Sbbruce@ucdavis.edu    date1 = datetime.date.today()
4514299Sbbruce@ucdavis.edu
4614299Sbbruce@ucdavis.edu    # Roundtrip the time
4714299Sbbruce@ucdavis.edu    datetime2 = m.test_chrono2(date1)
4814299Sbbruce@ucdavis.edu    date2 = datetime2.date()
4914299Sbbruce@ucdavis.edu    time2 = datetime2.time()
5014299Sbbruce@ucdavis.edu
5114299Sbbruce@ucdavis.edu    # The returned value should be a datetime
5214299Sbbruce@ucdavis.edu    assert isinstance(datetime2, datetime.datetime)
5314299Sbbruce@ucdavis.edu    assert isinstance(date2, datetime.date)
5414299Sbbruce@ucdavis.edu    assert isinstance(time2, datetime.time)
5514299Sbbruce@ucdavis.edu
5614299Sbbruce@ucdavis.edu    # They should be identical (no information lost on roundtrip)
5714299Sbbruce@ucdavis.edu    diff = abs(date1 - date2)
5814299Sbbruce@ucdavis.edu    assert diff.days == 0
5914299Sbbruce@ucdavis.edu    assert diff.seconds == 0
6014299Sbbruce@ucdavis.edu    assert diff.microseconds == 0
6114299Sbbruce@ucdavis.edu
6214299Sbbruce@ucdavis.edu    # Year, Month & Day should be the same after the round trip
6314299Sbbruce@ucdavis.edu    assert date1.year == date2.year
6414299Sbbruce@ucdavis.edu    assert date1.month == date2.month
6514299Sbbruce@ucdavis.edu    assert date1.day == date2.day
6614299Sbbruce@ucdavis.edu
6714299Sbbruce@ucdavis.edu    # There should be no time information
6814299Sbbruce@ucdavis.edu    assert time2.hour == 0
6914299Sbbruce@ucdavis.edu    assert time2.minute == 0
7014299Sbbruce@ucdavis.edu    assert time2.second == 0
7114299Sbbruce@ucdavis.edu    assert time2.microsecond == 0
7214299Sbbruce@ucdavis.edu
7314299Sbbruce@ucdavis.edu
7414299Sbbruce@ucdavis.edudef test_chrono_system_clock_roundtrip_time():
7514299Sbbruce@ucdavis.edu    time1 = datetime.datetime.today().time()
7614299Sbbruce@ucdavis.edu
7714299Sbbruce@ucdavis.edu    # Roundtrip the time
7814299Sbbruce@ucdavis.edu    datetime2 = m.test_chrono2(time1)
7914299Sbbruce@ucdavis.edu    date2 = datetime2.date()
8014299Sbbruce@ucdavis.edu    time2 = datetime2.time()
8114299Sbbruce@ucdavis.edu
8214299Sbbruce@ucdavis.edu    # The returned value should be a datetime
8314299Sbbruce@ucdavis.edu    assert isinstance(datetime2, datetime.datetime)
8414299Sbbruce@ucdavis.edu    assert isinstance(date2, datetime.date)
8514299Sbbruce@ucdavis.edu    assert isinstance(time2, datetime.time)
8614299Sbbruce@ucdavis.edu
8714299Sbbruce@ucdavis.edu    # Hour, Minute, Second & Microsecond should be the same after the round trip
8814299Sbbruce@ucdavis.edu    assert time1.hour == time2.hour
8914299Sbbruce@ucdavis.edu    assert time1.minute == time2.minute
9014299Sbbruce@ucdavis.edu    assert time1.second == time2.second
9114299Sbbruce@ucdavis.edu    assert time1.microsecond == time2.microsecond
9214299Sbbruce@ucdavis.edu
9314299Sbbruce@ucdavis.edu    # There should be no date information (i.e. date = python base date)
9414299Sbbruce@ucdavis.edu    assert date2.year == 1970
9514299Sbbruce@ucdavis.edu    assert date2.month == 1
9614299Sbbruce@ucdavis.edu    assert date2.day == 1
9714299Sbbruce@ucdavis.edu
9814299Sbbruce@ucdavis.edu
9911986Sandreas.sandberg@arm.comdef test_chrono_duration_roundtrip():
10011986Sandreas.sandberg@arm.com
10111986Sandreas.sandberg@arm.com    # Get the difference between two times (a timedelta)
10211986Sandreas.sandberg@arm.com    date1 = datetime.datetime.today()
10311986Sandreas.sandberg@arm.com    date2 = datetime.datetime.today()
10411986Sandreas.sandberg@arm.com    diff = date2 - date1
10511986Sandreas.sandberg@arm.com
10611986Sandreas.sandberg@arm.com    # Make sure this is a timedelta
10711986Sandreas.sandberg@arm.com    assert isinstance(diff, datetime.timedelta)
10811986Sandreas.sandberg@arm.com
10912391Sjason@lowepower.com    cpp_diff = m.test_chrono3(diff)
11011986Sandreas.sandberg@arm.com
11111986Sandreas.sandberg@arm.com    assert cpp_diff.days == diff.days
11211986Sandreas.sandberg@arm.com    assert cpp_diff.seconds == diff.seconds
11311986Sandreas.sandberg@arm.com    assert cpp_diff.microseconds == diff.microseconds
11411986Sandreas.sandberg@arm.com
11511986Sandreas.sandberg@arm.com
11611986Sandreas.sandberg@arm.comdef test_chrono_duration_subtraction_equivalence():
11711986Sandreas.sandberg@arm.com
11811986Sandreas.sandberg@arm.com    date1 = datetime.datetime.today()
11911986Sandreas.sandberg@arm.com    date2 = datetime.datetime.today()
12011986Sandreas.sandberg@arm.com
12111986Sandreas.sandberg@arm.com    diff = date2 - date1
12212391Sjason@lowepower.com    cpp_diff = m.test_chrono4(date2, date1)
12311986Sandreas.sandberg@arm.com
12411986Sandreas.sandberg@arm.com    assert cpp_diff.days == diff.days
12511986Sandreas.sandberg@arm.com    assert cpp_diff.seconds == diff.seconds
12611986Sandreas.sandberg@arm.com    assert cpp_diff.microseconds == diff.microseconds
12711986Sandreas.sandberg@arm.com
12811986Sandreas.sandberg@arm.com
12914299Sbbruce@ucdavis.edudef test_chrono_duration_subtraction_equivalence_date():
13014299Sbbruce@ucdavis.edu
13114299Sbbruce@ucdavis.edu    date1 = datetime.date.today()
13214299Sbbruce@ucdavis.edu    date2 = datetime.date.today()
13314299Sbbruce@ucdavis.edu
13414299Sbbruce@ucdavis.edu    diff = date2 - date1
13514299Sbbruce@ucdavis.edu    cpp_diff = m.test_chrono4(date2, date1)
13614299Sbbruce@ucdavis.edu
13714299Sbbruce@ucdavis.edu    assert cpp_diff.days == diff.days
13814299Sbbruce@ucdavis.edu    assert cpp_diff.seconds == diff.seconds
13914299Sbbruce@ucdavis.edu    assert cpp_diff.microseconds == diff.microseconds
14014299Sbbruce@ucdavis.edu
14114299Sbbruce@ucdavis.edu
14211986Sandreas.sandberg@arm.comdef test_chrono_steady_clock():
14312391Sjason@lowepower.com    time1 = m.test_chrono5()
14411986Sandreas.sandberg@arm.com    assert isinstance(time1, datetime.timedelta)
14511986Sandreas.sandberg@arm.com
14611986Sandreas.sandberg@arm.com
14711986Sandreas.sandberg@arm.comdef test_chrono_steady_clock_roundtrip():
14811986Sandreas.sandberg@arm.com    time1 = datetime.timedelta(days=10, seconds=10, microseconds=100)
14912391Sjason@lowepower.com    time2 = m.test_chrono6(time1)
15011986Sandreas.sandberg@arm.com
15111986Sandreas.sandberg@arm.com    assert isinstance(time2, datetime.timedelta)
15211986Sandreas.sandberg@arm.com
15311986Sandreas.sandberg@arm.com    # They should be identical (no information lost on roundtrip)
15411986Sandreas.sandberg@arm.com    assert time1.days == time2.days
15511986Sandreas.sandberg@arm.com    assert time1.seconds == time2.seconds
15611986Sandreas.sandberg@arm.com    assert time1.microseconds == time2.microseconds
15711986Sandreas.sandberg@arm.com
15811986Sandreas.sandberg@arm.com
15911986Sandreas.sandberg@arm.comdef test_floating_point_duration():
16012391Sjason@lowepower.com    # Test using a floating point number in seconds
16112391Sjason@lowepower.com    time = m.test_chrono7(35.525123)
16211986Sandreas.sandberg@arm.com
16311986Sandreas.sandberg@arm.com    assert isinstance(time, datetime.timedelta)
16411986Sandreas.sandberg@arm.com
16511986Sandreas.sandberg@arm.com    assert time.seconds == 35
16611986Sandreas.sandberg@arm.com    assert 525122 <= time.microseconds <= 525123
16712037Sandreas.sandberg@arm.com
16812391Sjason@lowepower.com    diff = m.test_chrono_float_diff(43.789012, 1.123456)
16912037Sandreas.sandberg@arm.com    assert diff.seconds == 42
17012037Sandreas.sandberg@arm.com    assert 665556 <= diff.microseconds <= 665557
17114299Sbbruce@ucdavis.edu
17214299Sbbruce@ucdavis.edu
17314299Sbbruce@ucdavis.edudef test_nano_timepoint():
17414299Sbbruce@ucdavis.edu    time = datetime.datetime.now()
17514299Sbbruce@ucdavis.edu    time1 = m.test_nano_timepoint(time, datetime.timedelta(seconds=60))
17614299Sbbruce@ucdavis.edu    assert(time1 == time + datetime.timedelta(seconds=60))
177