mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
	
	
		
			72 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
	
		
			2 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 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)
							 |