summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_capi/test_time.py71
-rw-r--r--Lib/test/test_time.py17
2 files changed, 77 insertions, 11 deletions
diff --git a/Lib/test/test_capi/test_time.py b/Lib/test/test_capi/test_time.py
new file mode 100644
index 0000000..10b7fbf
--- /dev/null
+++ b/Lib/test/test_capi/test_time.py
@@ -0,0 +1,71 @@
+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 check_clock(self, c_func, py_func):
+ t1 = c_func()
+ t2 = py_func()
+ self.assertAlmostEqual(t1, t2, delta=CLOCK_RES)
+
+ 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 test_monotonic(self):
+ # Test PyTime_Monotonic()
+ self.check_clock(_testcapi.PyTime_Monotonic, time.monotonic)
+
+ def test_perf_counter(self):
+ # Test PyTime_PerfCounter()
+ self.check_clock(_testcapi.PyTime_PerfCounter, time.perf_counter)
+
+ def test_time(self):
+ # Test PyTime_time()
+ self.check_clock(_testcapi.PyTime_Time, time.time)
diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py
index 3b5640a..a0aeea5 100644
--- a/Lib/test/test_time.py
+++ b/Lib/test/test_time.py
@@ -43,8 +43,8 @@ class _PyTime(enum.IntEnum):
ROUND_UP = 3
# _PyTime_t is int64_t
-_PyTime_MIN = -2 ** 63
-_PyTime_MAX = 2 ** 63 - 1
+PyTime_MIN = -2 ** 63
+PyTime_MAX = 2 ** 63 - 1
# Rounding modes supported by PyTime
ROUNDING_MODES = (
@@ -934,7 +934,7 @@ class TestCPyTime(CPyTimeTestCase, unittest.TestCase):
_PyTime_FromSecondsObject(float('nan'), time_rnd)
def test_AsSecondsDouble(self):
- from _testinternalcapi import _PyTime_AsSecondsDouble
+ from _testcapi import PyTime_AsSecondsDouble
def float_converter(ns):
if abs(ns) % SEC_TO_NS == 0:
@@ -942,15 +942,10 @@ class TestCPyTime(CPyTimeTestCase, unittest.TestCase):
else:
return float(ns) / SEC_TO_NS
- self.check_int_rounding(lambda ns, rnd: _PyTime_AsSecondsDouble(ns),
+ self.check_int_rounding(lambda ns, rnd: PyTime_AsSecondsDouble(ns),
float_converter,
NS_TO_SEC)
- # test nan
- for time_rnd, _ in ROUNDING_MODES:
- with self.assertRaises(TypeError):
- _PyTime_AsSecondsDouble(float('nan'))
-
def create_decimal_converter(self, denominator):
denom = decimal.Decimal(denominator)
@@ -1009,7 +1004,7 @@ class TestCPyTime(CPyTimeTestCase, unittest.TestCase):
tv_sec_max = self.time_t_max
tv_sec_min = self.time_t_min
- for t in (_PyTime_MIN, _PyTime_MAX):
+ for t in (PyTime_MIN, PyTime_MAX):
ts = _PyTime_AsTimeval_clamp(t, _PyTime.ROUND_CEILING)
with decimal.localcontext() as context:
context.rounding = decimal.ROUND_CEILING
@@ -1028,7 +1023,7 @@ class TestCPyTime(CPyTimeTestCase, unittest.TestCase):
def test_AsTimespec_clamp(self):
from _testinternalcapi import _PyTime_AsTimespec_clamp
- for t in (_PyTime_MIN, _PyTime_MAX):
+ for t in (PyTime_MIN, PyTime_MAX):
ts = _PyTime_AsTimespec_clamp(t)
tv_sec, tv_nsec = divmod(t, NS_TO_SEC)
if self.time_t_max < tv_sec: