test_chrono.py revision 12391
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
4311986Sandreas.sandberg@arm.comdef test_chrono_duration_roundtrip():
4411986Sandreas.sandberg@arm.com
4511986Sandreas.sandberg@arm.com    # Get the difference between two times (a timedelta)
4611986Sandreas.sandberg@arm.com    date1 = datetime.datetime.today()
4711986Sandreas.sandberg@arm.com    date2 = datetime.datetime.today()
4811986Sandreas.sandberg@arm.com    diff = date2 - date1
4911986Sandreas.sandberg@arm.com
5011986Sandreas.sandberg@arm.com    # Make sure this is a timedelta
5111986Sandreas.sandberg@arm.com    assert isinstance(diff, datetime.timedelta)
5211986Sandreas.sandberg@arm.com
5312391Sjason@lowepower.com    cpp_diff = m.test_chrono3(diff)
5411986Sandreas.sandberg@arm.com
5511986Sandreas.sandberg@arm.com    assert cpp_diff.days == diff.days
5611986Sandreas.sandberg@arm.com    assert cpp_diff.seconds == diff.seconds
5711986Sandreas.sandberg@arm.com    assert cpp_diff.microseconds == diff.microseconds
5811986Sandreas.sandberg@arm.com
5911986Sandreas.sandberg@arm.com
6011986Sandreas.sandberg@arm.comdef test_chrono_duration_subtraction_equivalence():
6111986Sandreas.sandberg@arm.com
6211986Sandreas.sandberg@arm.com    date1 = datetime.datetime.today()
6311986Sandreas.sandberg@arm.com    date2 = datetime.datetime.today()
6411986Sandreas.sandberg@arm.com
6511986Sandreas.sandberg@arm.com    diff = date2 - date1
6612391Sjason@lowepower.com    cpp_diff = m.test_chrono4(date2, date1)
6711986Sandreas.sandberg@arm.com
6811986Sandreas.sandberg@arm.com    assert cpp_diff.days == diff.days
6911986Sandreas.sandberg@arm.com    assert cpp_diff.seconds == diff.seconds
7011986Sandreas.sandberg@arm.com    assert cpp_diff.microseconds == diff.microseconds
7111986Sandreas.sandberg@arm.com
7211986Sandreas.sandberg@arm.com
7311986Sandreas.sandberg@arm.comdef test_chrono_steady_clock():
7412391Sjason@lowepower.com    time1 = m.test_chrono5()
7511986Sandreas.sandberg@arm.com    assert isinstance(time1, datetime.timedelta)
7611986Sandreas.sandberg@arm.com
7711986Sandreas.sandberg@arm.com
7811986Sandreas.sandberg@arm.comdef test_chrono_steady_clock_roundtrip():
7911986Sandreas.sandberg@arm.com    time1 = datetime.timedelta(days=10, seconds=10, microseconds=100)
8012391Sjason@lowepower.com    time2 = m.test_chrono6(time1)
8111986Sandreas.sandberg@arm.com
8211986Sandreas.sandberg@arm.com    assert isinstance(time2, datetime.timedelta)
8311986Sandreas.sandberg@arm.com
8411986Sandreas.sandberg@arm.com    # They should be identical (no information lost on roundtrip)
8511986Sandreas.sandberg@arm.com    assert time1.days == time2.days
8611986Sandreas.sandberg@arm.com    assert time1.seconds == time2.seconds
8711986Sandreas.sandberg@arm.com    assert time1.microseconds == time2.microseconds
8811986Sandreas.sandberg@arm.com
8911986Sandreas.sandberg@arm.com
9011986Sandreas.sandberg@arm.comdef test_floating_point_duration():
9112391Sjason@lowepower.com    # Test using a floating point number in seconds
9212391Sjason@lowepower.com    time = m.test_chrono7(35.525123)
9311986Sandreas.sandberg@arm.com
9411986Sandreas.sandberg@arm.com    assert isinstance(time, datetime.timedelta)
9511986Sandreas.sandberg@arm.com
9611986Sandreas.sandberg@arm.com    assert time.seconds == 35
9711986Sandreas.sandberg@arm.com    assert 525122 <= time.microseconds <= 525123
9812037Sandreas.sandberg@arm.com
9912391Sjason@lowepower.com    diff = m.test_chrono_float_diff(43.789012, 1.123456)
10012037Sandreas.sandberg@arm.com    assert diff.seconds == 42
10112037Sandreas.sandberg@arm.com    assert 665556 <= diff.microseconds <= 665557
102