μHAL (v2.8.17)
Part of the IPbus software repository
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
test_chrono.py
Go to the documentation of this file.
1# -*- coding: utf-8 -*-
2import datetime
3
4import pytest
5
6import env # noqa: F401
7from pybind11_tests import chrono as m
8
9
11
12 # Get the time from both c++ and datetime
13 date0 = datetime.datetime.today()
14 date1 = m.test_chrono1()
15 date2 = datetime.datetime.today()
16
17 # The returned value should be a datetime
18 assert isinstance(date1, datetime.datetime)
19
20 # The numbers should vary by a very small amount (time it took to execute)
21 diff_python = abs(date2 - date0)
22 diff = abs(date1 - date2)
23
24 # There should never be a days difference
25 assert diff.days == 0
26
27 # Since datetime.datetime.today() calls time.time(), and on some platforms
28 # that has 1 second accuracy, we compare this way
29 assert diff.seconds <= diff_python.seconds
30
31
33 date1 = datetime.datetime.today()
34
35 # Roundtrip the time
36 date2 = m.test_chrono2(date1)
37
38 # The returned value should be a datetime
39 assert isinstance(date2, datetime.datetime)
40
41 # They should be identical (no information lost on roundtrip)
42 diff = abs(date1 - date2)
43 assert diff == datetime.timedelta(0)
44
45
47 date1 = datetime.date.today()
48
49 # Roundtrip the time
50 datetime2 = m.test_chrono2(date1)
51 date2 = datetime2.date()
52 time2 = datetime2.time()
53
54 # The returned value should be a datetime
55 assert isinstance(datetime2, datetime.datetime)
56 assert isinstance(date2, datetime.date)
57 assert isinstance(time2, datetime.time)
58
59 # They should be identical (no information lost on roundtrip)
60 diff = abs(date1 - date2)
61 assert diff.days == 0
62 assert diff.seconds == 0
63 assert diff.microseconds == 0
64
65 # Year, Month & Day should be the same after the round trip
66 assert date1 == date2
67
68 # There should be no time information
69 assert time2.hour == 0
70 assert time2.minute == 0
71 assert time2.second == 0
72 assert time2.microsecond == 0
73
74
75SKIP_TZ_ENV_ON_WIN = pytest.mark.skipif(
76 "env.WIN", reason="TZ environment variable only supported on POSIX"
77)
78
79
80@pytest.mark.parametrize(
81 "time1",
82 [
83 datetime.datetime.today().time(),
84 datetime.time(0, 0, 0),
85 datetime.time(0, 0, 0, 1),
86 datetime.time(0, 28, 45, 109827),
87 datetime.time(0, 59, 59, 999999),
88 datetime.time(1, 0, 0),
89 datetime.time(5, 59, 59, 0),
90 datetime.time(5, 59, 59, 1),
91 ],
92)
93@pytest.mark.parametrize(
94 "tz",
95 [
96 None,
97 pytest.param("Europe/Brussels", marks=SKIP_TZ_ENV_ON_WIN),
98 pytest.param("Asia/Pyongyang", marks=SKIP_TZ_ENV_ON_WIN),
99 pytest.param("America/New_York", marks=SKIP_TZ_ENV_ON_WIN),
100 ],
101)
102def test_chrono_system_clock_roundtrip_time(time1, tz, monkeypatch):
103 if tz is not None:
104 monkeypatch.setenv("TZ", "/usr/share/zoneinfo/{}".format(tz))
105
106 # Roundtrip the time
107 datetime2 = m.test_chrono2(time1)
108 date2 = datetime2.date()
109 time2 = datetime2.time()
110
111 # The returned value should be a datetime
112 assert isinstance(datetime2, datetime.datetime)
113 assert isinstance(date2, datetime.date)
114 assert isinstance(time2, datetime.time)
115
116 # Hour, Minute, Second & Microsecond should be the same after the round trip
117 assert time1 == time2
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
126
127 # Get the difference between two times (a timedelta)
128 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
135 cpp_diff = m.test_chrono3(diff)
136
137 assert cpp_diff == diff
138
139 # Negative timedelta roundtrip
140 diff = datetime.timedelta(microseconds=-1)
141 cpp_diff = m.test_chrono3(diff)
142
143 assert cpp_diff == diff
144
145
147
148 date1 = datetime.datetime.today()
149 date2 = datetime.datetime.today()
150
151 diff = date2 - date1
152 cpp_diff = m.test_chrono4(date2, date1)
153
154 assert cpp_diff == diff
155
156
158
159 date1 = datetime.date.today()
160 date2 = datetime.date.today()
161
162 diff = date2 - date1
163 cpp_diff = m.test_chrono4(date2, date1)
164
165 assert cpp_diff == diff
166
167
169 time1 = m.test_chrono5()
170 assert isinstance(time1, datetime.timedelta)
171
172
174 time1 = datetime.timedelta(days=10, seconds=10, microseconds=100)
175 time2 = m.test_chrono6(time1)
176
177 assert isinstance(time2, datetime.timedelta)
178
179 # They should be identical (no information lost on roundtrip)
180 assert time1 == time2
181
182
184 # Test using a floating point number in seconds
185 time = m.test_chrono7(35.525123)
186
187 assert isinstance(time, datetime.timedelta)
188
189 assert time.seconds == 35
190 assert 525122 <= time.microseconds <= 525123
191
192 diff = m.test_chrono_float_diff(43.789012, 1.123456)
193 assert diff.seconds == 42
194 assert 665556 <= diff.microseconds <= 665557
195
196
198 time = datetime.datetime.now()
199 time1 = m.test_nano_timepoint(time, datetime.timedelta(seconds=60))
200 assert time1 == time + datetime.timedelta(seconds=60)
201
202
204 resolutions = m.different_resolutions()
205 time = datetime.datetime.now()
206 resolutions.timestamp_h = time
207 resolutions.timestamp_m = time
208 resolutions.timestamp_s = time
209 resolutions.timestamp_ms = time
210 resolutions.timestamp_us = time
bool isinstance(handle obj)
\rst Return true if obj is an instance of T.
Definition: pytypes.h:489
def test_chrono_system_clock()
Definition: test_chrono.py:10
def test_floating_point_duration()
Definition: test_chrono.py:183
def test_chrono_duration_subtraction_equivalence()
Definition: test_chrono.py:146
def test_nano_timepoint()
Definition: test_chrono.py:197
def test_chrono_system_clock_roundtrip_time(time1, tz, monkeypatch)
Definition: test_chrono.py:102
def test_chrono_duration_subtraction_equivalence_date()
Definition: test_chrono.py:157
def test_chrono_duration_roundtrip()
Definition: test_chrono.py:125
def test_chrono_steady_clock_roundtrip()
Definition: test_chrono.py:173
def test_chrono_system_clock_roundtrip()
Definition: test_chrono.py:32
def test_chrono_system_clock_roundtrip_date()
Definition: test_chrono.py:46
def test_chrono_different_resolutions()
Definition: test_chrono.py:203
def test_chrono_steady_clock()
Definition: test_chrono.py:168
std::string abs(const Vector2 &)