blob: 76783905a3bc9b60e5b58afdbdf592e88afb4f74 [file] [log] [blame]
Henry Schreinerd8c7ee02020-07-20 13:35:21 -04001# -*- coding: utf-8 -*-
Jason Rhinelander391c7542017-07-25 16:47:36 -04002from pybind11_tests import chrono as m
3import datetime
Yannick Jadoul6a192782020-08-28 15:21:43 +02004import pytest
5
6import env # noqa: F401
Trent Houliston352149e2016-08-25 23:08:04 +10007
8
9def test_chrono_system_clock():
Trent Houliston352149e2016-08-25 23:08:04 +100010
11 # Get the time from both c++ and datetime
Henry Schreiner3a89bff2020-08-31 14:28:07 -040012 date0 = datetime.datetime.today()
Jason Rhinelander391c7542017-07-25 16:47:36 -040013 date1 = m.test_chrono1()
Trent Houliston352149e2016-08-25 23:08:04 +100014 date2 = datetime.datetime.today()
15
16 # The returned value should be a datetime
17 assert isinstance(date1, datetime.datetime)
18
19 # The numbers should vary by a very small amount (time it took to execute)
Henry Schreiner3a89bff2020-08-31 14:28:07 -040020 diff_python = abs(date2 - date0)
Trent Houliston352149e2016-08-25 23:08:04 +100021 diff = abs(date1 - date2)
22
Henry Schreinera876aac2020-08-16 11:18:47 -040023 # There should never be a days difference
Trent Houliston352149e2016-08-25 23:08:04 +100024 assert diff.days == 0
Trent Houliston352149e2016-08-25 23:08:04 +100025
Henry Schreinera876aac2020-08-16 11:18:47 -040026 # Since datetime.datetime.today() calls time.time(), and on some platforms
Henry Schreiner3a89bff2020-08-31 14:28:07 -040027 # that has 1 second accuracy, we compare this way
28 assert diff.seconds <= diff_python.seconds
Trent Houliston352149e2016-08-25 23:08:04 +100029
30
31def test_chrono_system_clock_roundtrip():
Trent Houliston352149e2016-08-25 23:08:04 +100032 date1 = datetime.datetime.today()
33
34 # Roundtrip the time
Jason Rhinelander391c7542017-07-25 16:47:36 -040035 date2 = m.test_chrono2(date1)
Trent Houliston352149e2016-08-25 23:08:04 +100036
37 # The returned value should be a datetime
38 assert isinstance(date2, datetime.datetime)
39
40 # They should be identical (no information lost on roundtrip)
41 diff = abs(date1 - date2)
42 assert diff.days == 0
43 assert diff.seconds == 0
44 assert diff.microseconds == 0
45
46
phil-zxxc6b699d2019-07-19 10:28:48 +010047def test_chrono_system_clock_roundtrip_date():
48 date1 = datetime.date.today()
49
50 # Roundtrip the time
51 datetime2 = m.test_chrono2(date1)
52 date2 = datetime2.date()
53 time2 = datetime2.time()
54
55 # The returned value should be a datetime
56 assert isinstance(datetime2, datetime.datetime)
57 assert isinstance(date2, datetime.date)
58 assert isinstance(time2, datetime.time)
59
60 # They should be identical (no information lost on roundtrip)
61 diff = abs(date1 - date2)
62 assert diff.days == 0
63 assert diff.seconds == 0
64 assert diff.microseconds == 0
65
66 # Year, Month & Day should be the same after the round trip
67 assert date1.year == date2.year
68 assert date1.month == date2.month
69 assert date1.day == date2.day
70
71 # There should be no time information
72 assert time2.hour == 0
73 assert time2.minute == 0
74 assert time2.second == 0
75 assert time2.microsecond == 0
76
77
Yannick Jadoul6a192782020-08-28 15:21:43 +020078SKIP_TZ_ENV_ON_WIN = pytest.mark.skipif(
79 "env.WIN", reason="TZ environment variable only supported on POSIX"
80)
81
82
83@pytest.mark.parametrize("time1", [
84 datetime.datetime.today().time(),
85 datetime.time(0, 0, 0),
86 datetime.time(0, 0, 0, 1),
87 datetime.time(0, 28, 45, 109827),
88 datetime.time(0, 59, 59, 999999),
89 datetime.time(1, 0, 0),
90 datetime.time(5, 59, 59, 0),
91 datetime.time(5, 59, 59, 1),
92])
93@pytest.mark.parametrize("tz", [
94 None,
95 pytest.param("Europe/Brussels", marks=SKIP_TZ_ENV_ON_WIN),
96 pytest.param("Asia/Pyongyang", marks=SKIP_TZ_ENV_ON_WIN),
97 pytest.param("America/New_York", marks=SKIP_TZ_ENV_ON_WIN),
98])
99def test_chrono_system_clock_roundtrip_time(time1, tz, monkeypatch):
100 if tz is not None:
101 monkeypatch.setenv("TZ", "/usr/share/zoneinfo/{}".format(tz))
phil-zxxc6b699d2019-07-19 10:28:48 +0100102
103 # Roundtrip the time
104 datetime2 = m.test_chrono2(time1)
105 date2 = datetime2.date()
106 time2 = datetime2.time()
107
108 # The returned value should be a datetime
109 assert isinstance(datetime2, datetime.datetime)
110 assert isinstance(date2, datetime.date)
111 assert isinstance(time2, datetime.time)
112
113 # Hour, Minute, Second & Microsecond should be the same after the round trip
114 assert time1.hour == time2.hour
115 assert time1.minute == time2.minute
116 assert time1.second == time2.second
117 assert time1.microsecond == time2.microsecond
118
119 # There should be no date information (i.e. date = python base date)
120 assert date2.year == 1970
121 assert date2.month == 1
122 assert date2.day == 1
123
124
Trent Houliston352149e2016-08-25 23:08:04 +1000125def test_chrono_duration_roundtrip():
Trent Houliston352149e2016-08-25 23:08:04 +1000126
Dean Moldovanbad17402016-11-20 21:21:54 +0100127 # Get the difference between two times (a timedelta)
Trent Houliston352149e2016-08-25 23:08:04 +1000128 date1 = datetime.datetime.today()
129 date2 = datetime.datetime.today()
130 diff = date2 - date1
131
132 # Make sure this is a timedelta
133 assert isinstance(diff, datetime.timedelta)
134
Jason Rhinelander391c7542017-07-25 16:47:36 -0400135 cpp_diff = m.test_chrono3(diff)
Trent Houliston352149e2016-08-25 23:08:04 +1000136
137 assert cpp_diff.days == diff.days
138 assert cpp_diff.seconds == diff.seconds
139 assert cpp_diff.microseconds == diff.microseconds
140
141
142def test_chrono_duration_subtraction_equivalence():
Trent Houliston352149e2016-08-25 23:08:04 +1000143
144 date1 = datetime.datetime.today()
145 date2 = datetime.datetime.today()
146
147 diff = date2 - date1
Jason Rhinelander391c7542017-07-25 16:47:36 -0400148 cpp_diff = m.test_chrono4(date2, date1)
Trent Houliston352149e2016-08-25 23:08:04 +1000149
150 assert cpp_diff.days == diff.days
151 assert cpp_diff.seconds == diff.seconds
152 assert cpp_diff.microseconds == diff.microseconds
153
154
phil-zxxc6b699d2019-07-19 10:28:48 +0100155def test_chrono_duration_subtraction_equivalence_date():
156
157 date1 = datetime.date.today()
158 date2 = datetime.date.today()
159
160 diff = date2 - date1
161 cpp_diff = m.test_chrono4(date2, date1)
162
163 assert cpp_diff.days == diff.days
164 assert cpp_diff.seconds == diff.seconds
165 assert cpp_diff.microseconds == diff.microseconds
166
167
Trent Houliston352149e2016-08-25 23:08:04 +1000168def test_chrono_steady_clock():
Jason Rhinelander391c7542017-07-25 16:47:36 -0400169 time1 = m.test_chrono5()
Trent Houliston2f597682016-09-13 20:40:28 +1000170 assert isinstance(time1, datetime.timedelta)
Trent Houliston352149e2016-08-25 23:08:04 +1000171
172
173def test_chrono_steady_clock_roundtrip():
Trent Houliston2f597682016-09-13 20:40:28 +1000174 time1 = datetime.timedelta(days=10, seconds=10, microseconds=100)
Jason Rhinelander391c7542017-07-25 16:47:36 -0400175 time2 = m.test_chrono6(time1)
Trent Houliston352149e2016-08-25 23:08:04 +1000176
Trent Houliston2f597682016-09-13 20:40:28 +1000177 assert isinstance(time2, datetime.timedelta)
Trent Houliston352149e2016-08-25 23:08:04 +1000178
179 # They should be identical (no information lost on roundtrip)
Trent Houliston2f597682016-09-13 20:40:28 +1000180 assert time1.days == time2.days
181 assert time1.seconds == time2.seconds
182 assert time1.microseconds == time2.microseconds
183
184
185def test_floating_point_duration():
Jason Rhinelander391c7542017-07-25 16:47:36 -0400186 # Test using a floating point number in seconds
187 time = m.test_chrono7(35.525123)
Trent Houliston2f597682016-09-13 20:40:28 +1000188
189 assert isinstance(time, datetime.timedelta)
190
191 assert time.seconds == 35
Trent Houliston253e41c2016-09-28 00:59:21 +1000192 assert 525122 <= time.microseconds <= 525123
Jason Rhinelandere5456c22017-03-11 22:29:25 -0400193
Jason Rhinelander391c7542017-07-25 16:47:36 -0400194 diff = m.test_chrono_float_diff(43.789012, 1.123456)
Jason Rhinelandere5456c22017-03-11 22:29:25 -0400195 assert diff.seconds == 42
196 assert 665556 <= diff.microseconds <= 665557
Alexander Gagarinb3bf2482019-06-13 12:17:10 +0500197
198
199def test_nano_timepoint():
200 time = datetime.datetime.now()
201 time1 = m.test_nano_timepoint(time, datetime.timedelta(seconds=60))
202 assert(time1 == time + datetime.timedelta(seconds=60))