| 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() |