| import time | |
| import unittest | |
| from test.support import import_helper | |
| _testcapi = import_helper.import_module('_testcapi') | |
| PyTime_MIN = _testcapi.PyTime_MIN | |
| PyTime_MAX = _testcapi.PyTime_MAX | |
| SEC_TO_NS = 10 ** 9 | |
| DAY_TO_SEC = (24 * 60 * 60) | |
| # Worst clock resolution: maximum delta between two clock reads. | |
| CLOCK_RES = 0.050 | |
| class CAPITest(unittest.TestCase): | |
| def test_min_max(self): | |
| # PyTime_t is just int64_t | |
| self.assertEqual(PyTime_MIN, -2**63) | |
| self.assertEqual(PyTime_MAX, 2**63 - 1) | |
| def test_assecondsdouble(self): | |
| # Test PyTime_AsSecondsDouble() | |
| def ns_to_sec(ns): | |
| if abs(ns) % SEC_TO_NS == 0: | |
| return float(ns // SEC_TO_NS) | |
| else: | |
| return float(ns) / SEC_TO_NS | |
| seconds = ( | |
| 0, | |
| 1, | |
| DAY_TO_SEC, | |
| 365 * DAY_TO_SEC, | |
| ) | |
| values = { | |
| PyTime_MIN, | |
| PyTime_MIN + 1, | |
| PyTime_MAX - 1, | |
| PyTime_MAX, | |
| } | |
| for second in seconds: | |
| ns = second * SEC_TO_NS | |
| values.add(ns) | |
| # test nanosecond before/after to test rounding | |
| values.add(ns - 1) | |
| values.add(ns + 1) | |
| for ns in list(values): | |
| if (-ns) > PyTime_MAX: | |
| continue | |
| values.add(-ns) | |
| for ns in sorted(values): | |
| with self.subTest(ns=ns): | |
| self.assertEqual(_testcapi.PyTime_AsSecondsDouble(ns), | |
| ns_to_sec(ns)) | |
| def check_clock(self, c_func, py_func): | |
| t1 = c_func() | |
| t2 = py_func() | |
| self.assertAlmostEqual(t1, t2, delta=CLOCK_RES) | |
| def test_monotonic(self): | |
| # Test PyTime_Monotonic() and PyTime_MonotonicRaw() | |
| self.check_clock(_testcapi.PyTime_Monotonic, time.monotonic) | |
| self.check_clock(_testcapi.PyTime_MonotonicRaw, time.monotonic) | |
| def test_perf_counter(self): | |
| # Test PyTime_PerfCounter() and PyTime_PerfCounterRaw() | |
| self.check_clock(_testcapi.PyTime_PerfCounter, time.perf_counter) | |
| self.check_clock(_testcapi.PyTime_PerfCounterRaw, time.perf_counter) | |
| def test_time(self): | |
| # Test PyTime_Time() and PyTime_TimeRaw() | |
| self.check_clock(_testcapi.PyTime_Time, time.time) | |
| self.check_clock(_testcapi.PyTime_TimeRaw, time.time) | |
| if __name__ == "__main__": | |
| unittest.main() |