mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	(cherry picked from commit dbc1752d41)
Co-authored-by: kalyanr <kalyan.ben10@live.com>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Victor Stinner <vstinner@python.org>
		
	
			
		
			
				
	
	
		
			78 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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()
 |