17db96d56Sopenharmony_cifrom test import support
27db96d56Sopenharmony_cifrom test.support import warnings_helper
37db96d56Sopenharmony_ciimport decimal
47db96d56Sopenharmony_ciimport enum
57db96d56Sopenharmony_ciimport locale
67db96d56Sopenharmony_ciimport math
77db96d56Sopenharmony_ciimport platform
87db96d56Sopenharmony_ciimport sys
97db96d56Sopenharmony_ciimport sysconfig
107db96d56Sopenharmony_ciimport time
117db96d56Sopenharmony_ciimport threading
127db96d56Sopenharmony_ciimport unittest
137db96d56Sopenharmony_citry:
147db96d56Sopenharmony_ci    import _testcapi
157db96d56Sopenharmony_ciexcept ImportError:
167db96d56Sopenharmony_ci    _testcapi = None
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_cifrom test.support import skip_if_buggy_ucrt_strfptime
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci# Max year is only limited by the size of C int.
217db96d56Sopenharmony_ciSIZEOF_INT = sysconfig.get_config_var('SIZEOF_INT') or 4
227db96d56Sopenharmony_ciTIME_MAXYEAR = (1 << 8 * SIZEOF_INT - 1) - 1
237db96d56Sopenharmony_ciTIME_MINYEAR = -TIME_MAXYEAR - 1 + 1900
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ciSEC_TO_US = 10 ** 6
267db96d56Sopenharmony_ciUS_TO_NS = 10 ** 3
277db96d56Sopenharmony_ciMS_TO_NS = 10 ** 6
287db96d56Sopenharmony_ciSEC_TO_NS = 10 ** 9
297db96d56Sopenharmony_ciNS_TO_SEC = 10 ** 9
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ciclass _PyTime(enum.IntEnum):
327db96d56Sopenharmony_ci    # Round towards minus infinity (-inf)
337db96d56Sopenharmony_ci    ROUND_FLOOR = 0
347db96d56Sopenharmony_ci    # Round towards infinity (+inf)
357db96d56Sopenharmony_ci    ROUND_CEILING = 1
367db96d56Sopenharmony_ci    # Round to nearest with ties going to nearest even integer
377db96d56Sopenharmony_ci    ROUND_HALF_EVEN = 2
387db96d56Sopenharmony_ci    # Round away from zero
397db96d56Sopenharmony_ci    ROUND_UP = 3
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci# _PyTime_t is int64_t
427db96d56Sopenharmony_ci_PyTime_MIN = -2 ** 63
437db96d56Sopenharmony_ci_PyTime_MAX = 2 ** 63 - 1
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci# Rounding modes supported by PyTime
467db96d56Sopenharmony_ciROUNDING_MODES = (
477db96d56Sopenharmony_ci    # (PyTime rounding method, decimal rounding method)
487db96d56Sopenharmony_ci    (_PyTime.ROUND_FLOOR, decimal.ROUND_FLOOR),
497db96d56Sopenharmony_ci    (_PyTime.ROUND_CEILING, decimal.ROUND_CEILING),
507db96d56Sopenharmony_ci    (_PyTime.ROUND_HALF_EVEN, decimal.ROUND_HALF_EVEN),
517db96d56Sopenharmony_ci    (_PyTime.ROUND_UP, decimal.ROUND_UP),
527db96d56Sopenharmony_ci)
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ciclass TimeTestCase(unittest.TestCase):
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci    def setUp(self):
587db96d56Sopenharmony_ci        self.t = time.time()
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci    def test_data_attributes(self):
617db96d56Sopenharmony_ci        time.altzone
627db96d56Sopenharmony_ci        time.daylight
637db96d56Sopenharmony_ci        time.timezone
647db96d56Sopenharmony_ci        time.tzname
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci    def test_time(self):
677db96d56Sopenharmony_ci        time.time()
687db96d56Sopenharmony_ci        info = time.get_clock_info('time')
697db96d56Sopenharmony_ci        self.assertFalse(info.monotonic)
707db96d56Sopenharmony_ci        self.assertTrue(info.adjustable)
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci    def test_time_ns_type(self):
737db96d56Sopenharmony_ci        def check_ns(sec, ns):
747db96d56Sopenharmony_ci            self.assertIsInstance(ns, int)
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci            sec_ns = int(sec * 1e9)
777db96d56Sopenharmony_ci            # tolerate a difference of 50 ms
787db96d56Sopenharmony_ci            self.assertLess((sec_ns - ns), 50 ** 6, (sec, ns))
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci        check_ns(time.time(),
817db96d56Sopenharmony_ci                 time.time_ns())
827db96d56Sopenharmony_ci        check_ns(time.monotonic(),
837db96d56Sopenharmony_ci                 time.monotonic_ns())
847db96d56Sopenharmony_ci        check_ns(time.perf_counter(),
857db96d56Sopenharmony_ci                 time.perf_counter_ns())
867db96d56Sopenharmony_ci        check_ns(time.process_time(),
877db96d56Sopenharmony_ci                 time.process_time_ns())
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci        if hasattr(time, 'thread_time'):
907db96d56Sopenharmony_ci            check_ns(time.thread_time(),
917db96d56Sopenharmony_ci                     time.thread_time_ns())
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci        if hasattr(time, 'clock_gettime'):
947db96d56Sopenharmony_ci            check_ns(time.clock_gettime(time.CLOCK_REALTIME),
957db96d56Sopenharmony_ci                     time.clock_gettime_ns(time.CLOCK_REALTIME))
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci    @unittest.skipUnless(hasattr(time, 'clock_gettime'),
987db96d56Sopenharmony_ci                         'need time.clock_gettime()')
997db96d56Sopenharmony_ci    def test_clock_realtime(self):
1007db96d56Sopenharmony_ci        t = time.clock_gettime(time.CLOCK_REALTIME)
1017db96d56Sopenharmony_ci        self.assertIsInstance(t, float)
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci    @unittest.skipUnless(hasattr(time, 'clock_gettime'),
1047db96d56Sopenharmony_ci                         'need time.clock_gettime()')
1057db96d56Sopenharmony_ci    @unittest.skipUnless(hasattr(time, 'CLOCK_MONOTONIC'),
1067db96d56Sopenharmony_ci                         'need time.CLOCK_MONOTONIC')
1077db96d56Sopenharmony_ci    def test_clock_monotonic(self):
1087db96d56Sopenharmony_ci        a = time.clock_gettime(time.CLOCK_MONOTONIC)
1097db96d56Sopenharmony_ci        b = time.clock_gettime(time.CLOCK_MONOTONIC)
1107db96d56Sopenharmony_ci        self.assertLessEqual(a, b)
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci    @unittest.skipUnless(hasattr(time, 'pthread_getcpuclockid'),
1137db96d56Sopenharmony_ci                         'need time.pthread_getcpuclockid()')
1147db96d56Sopenharmony_ci    @unittest.skipUnless(hasattr(time, 'clock_gettime'),
1157db96d56Sopenharmony_ci                         'need time.clock_gettime()')
1167db96d56Sopenharmony_ci    def test_pthread_getcpuclockid(self):
1177db96d56Sopenharmony_ci        clk_id = time.pthread_getcpuclockid(threading.get_ident())
1187db96d56Sopenharmony_ci        self.assertTrue(type(clk_id) is int)
1197db96d56Sopenharmony_ci        # when in 32-bit mode AIX only returns the predefined constant
1207db96d56Sopenharmony_ci        if platform.system() == "AIX" and (sys.maxsize.bit_length() <= 32):
1217db96d56Sopenharmony_ci            self.assertEqual(clk_id, time.CLOCK_THREAD_CPUTIME_ID)
1227db96d56Sopenharmony_ci        # Solaris returns CLOCK_THREAD_CPUTIME_ID when current thread is given
1237db96d56Sopenharmony_ci        elif sys.platform.startswith("sunos"):
1247db96d56Sopenharmony_ci            self.assertEqual(clk_id, time.CLOCK_THREAD_CPUTIME_ID)
1257db96d56Sopenharmony_ci        else:
1267db96d56Sopenharmony_ci            self.assertNotEqual(clk_id, time.CLOCK_THREAD_CPUTIME_ID)
1277db96d56Sopenharmony_ci        t1 = time.clock_gettime(clk_id)
1287db96d56Sopenharmony_ci        t2 = time.clock_gettime(clk_id)
1297db96d56Sopenharmony_ci        self.assertLessEqual(t1, t2)
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci    @unittest.skipUnless(hasattr(time, 'clock_getres'),
1327db96d56Sopenharmony_ci                         'need time.clock_getres()')
1337db96d56Sopenharmony_ci    def test_clock_getres(self):
1347db96d56Sopenharmony_ci        res = time.clock_getres(time.CLOCK_REALTIME)
1357db96d56Sopenharmony_ci        self.assertGreater(res, 0.0)
1367db96d56Sopenharmony_ci        self.assertLessEqual(res, 1.0)
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci    @unittest.skipUnless(hasattr(time, 'clock_settime'),
1397db96d56Sopenharmony_ci                         'need time.clock_settime()')
1407db96d56Sopenharmony_ci    def test_clock_settime(self):
1417db96d56Sopenharmony_ci        t = time.clock_gettime(time.CLOCK_REALTIME)
1427db96d56Sopenharmony_ci        try:
1437db96d56Sopenharmony_ci            time.clock_settime(time.CLOCK_REALTIME, t)
1447db96d56Sopenharmony_ci        except PermissionError:
1457db96d56Sopenharmony_ci            pass
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci        if hasattr(time, 'CLOCK_MONOTONIC'):
1487db96d56Sopenharmony_ci            self.assertRaises(OSError,
1497db96d56Sopenharmony_ci                              time.clock_settime, time.CLOCK_MONOTONIC, 0)
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci    def test_conversions(self):
1527db96d56Sopenharmony_ci        self.assertEqual(time.ctime(self.t),
1537db96d56Sopenharmony_ci                         time.asctime(time.localtime(self.t)))
1547db96d56Sopenharmony_ci        self.assertEqual(int(time.mktime(time.localtime(self.t))),
1557db96d56Sopenharmony_ci                         int(self.t))
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci    def test_sleep(self):
1587db96d56Sopenharmony_ci        self.assertRaises(ValueError, time.sleep, -2)
1597db96d56Sopenharmony_ci        self.assertRaises(ValueError, time.sleep, -1)
1607db96d56Sopenharmony_ci        time.sleep(1.2)
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci    def test_epoch(self):
1637db96d56Sopenharmony_ci        # bpo-43869: Make sure that Python use the same Epoch on all platforms:
1647db96d56Sopenharmony_ci        # January 1, 1970, 00:00:00 (UTC).
1657db96d56Sopenharmony_ci        epoch = time.gmtime(0)
1667db96d56Sopenharmony_ci        # Only test the date and time, ignore other gmtime() members
1677db96d56Sopenharmony_ci        self.assertEqual(tuple(epoch)[:6], (1970, 1, 1, 0, 0, 0), epoch)
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci    def test_strftime(self):
1707db96d56Sopenharmony_ci        tt = time.gmtime(self.t)
1717db96d56Sopenharmony_ci        for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I',
1727db96d56Sopenharmony_ci                          'j', 'm', 'M', 'p', 'S',
1737db96d56Sopenharmony_ci                          'U', 'w', 'W', 'x', 'X', 'y', 'Y', 'Z', '%'):
1747db96d56Sopenharmony_ci            format = ' %' + directive
1757db96d56Sopenharmony_ci            try:
1767db96d56Sopenharmony_ci                time.strftime(format, tt)
1777db96d56Sopenharmony_ci            except ValueError:
1787db96d56Sopenharmony_ci                self.fail('conversion specifier: %r failed.' % format)
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci        self.assertRaises(TypeError, time.strftime, b'%S', tt)
1817db96d56Sopenharmony_ci        # embedded null character
1827db96d56Sopenharmony_ci        self.assertRaises(ValueError, time.strftime, '%S\0', tt)
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci    def _bounds_checking(self, func):
1857db96d56Sopenharmony_ci        # Make sure that strftime() checks the bounds of the various parts
1867db96d56Sopenharmony_ci        # of the time tuple (0 is valid for *all* values).
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci        # The year field is tested by other test cases above
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci        # Check month [1, 12] + zero support
1917db96d56Sopenharmony_ci        func((1900, 0, 1, 0, 0, 0, 0, 1, -1))
1927db96d56Sopenharmony_ci        func((1900, 12, 1, 0, 0, 0, 0, 1, -1))
1937db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
1947db96d56Sopenharmony_ci                            (1900, -1, 1, 0, 0, 0, 0, 1, -1))
1957db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
1967db96d56Sopenharmony_ci                            (1900, 13, 1, 0, 0, 0, 0, 1, -1))
1977db96d56Sopenharmony_ci        # Check day of month [1, 31] + zero support
1987db96d56Sopenharmony_ci        func((1900, 1, 0, 0, 0, 0, 0, 1, -1))
1997db96d56Sopenharmony_ci        func((1900, 1, 31, 0, 0, 0, 0, 1, -1))
2007db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
2017db96d56Sopenharmony_ci                            (1900, 1, -1, 0, 0, 0, 0, 1, -1))
2027db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
2037db96d56Sopenharmony_ci                            (1900, 1, 32, 0, 0, 0, 0, 1, -1))
2047db96d56Sopenharmony_ci        # Check hour [0, 23]
2057db96d56Sopenharmony_ci        func((1900, 1, 1, 23, 0, 0, 0, 1, -1))
2067db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
2077db96d56Sopenharmony_ci                            (1900, 1, 1, -1, 0, 0, 0, 1, -1))
2087db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
2097db96d56Sopenharmony_ci                            (1900, 1, 1, 24, 0, 0, 0, 1, -1))
2107db96d56Sopenharmony_ci        # Check minute [0, 59]
2117db96d56Sopenharmony_ci        func((1900, 1, 1, 0, 59, 0, 0, 1, -1))
2127db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
2137db96d56Sopenharmony_ci                            (1900, 1, 1, 0, -1, 0, 0, 1, -1))
2147db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
2157db96d56Sopenharmony_ci                            (1900, 1, 1, 0, 60, 0, 0, 1, -1))
2167db96d56Sopenharmony_ci        # Check second [0, 61]
2177db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
2187db96d56Sopenharmony_ci                            (1900, 1, 1, 0, 0, -1, 0, 1, -1))
2197db96d56Sopenharmony_ci        # C99 only requires allowing for one leap second, but Python's docs say
2207db96d56Sopenharmony_ci        # allow two leap seconds (0..61)
2217db96d56Sopenharmony_ci        func((1900, 1, 1, 0, 0, 60, 0, 1, -1))
2227db96d56Sopenharmony_ci        func((1900, 1, 1, 0, 0, 61, 0, 1, -1))
2237db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
2247db96d56Sopenharmony_ci                            (1900, 1, 1, 0, 0, 62, 0, 1, -1))
2257db96d56Sopenharmony_ci        # No check for upper-bound day of week;
2267db96d56Sopenharmony_ci        #  value forced into range by a ``% 7`` calculation.
2277db96d56Sopenharmony_ci        # Start check at -2 since gettmarg() increments value before taking
2287db96d56Sopenharmony_ci        #  modulo.
2297db96d56Sopenharmony_ci        self.assertEqual(func((1900, 1, 1, 0, 0, 0, -1, 1, -1)),
2307db96d56Sopenharmony_ci                         func((1900, 1, 1, 0, 0, 0, +6, 1, -1)))
2317db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
2327db96d56Sopenharmony_ci                            (1900, 1, 1, 0, 0, 0, -2, 1, -1))
2337db96d56Sopenharmony_ci        # Check day of the year [1, 366] + zero support
2347db96d56Sopenharmony_ci        func((1900, 1, 1, 0, 0, 0, 0, 0, -1))
2357db96d56Sopenharmony_ci        func((1900, 1, 1, 0, 0, 0, 0, 366, -1))
2367db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
2377db96d56Sopenharmony_ci                            (1900, 1, 1, 0, 0, 0, 0, -1, -1))
2387db96d56Sopenharmony_ci        self.assertRaises(ValueError, func,
2397db96d56Sopenharmony_ci                            (1900, 1, 1, 0, 0, 0, 0, 367, -1))
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_ci    def test_strftime_bounding_check(self):
2427db96d56Sopenharmony_ci        self._bounds_checking(lambda tup: time.strftime('', tup))
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci    def test_strftime_format_check(self):
2457db96d56Sopenharmony_ci        # Test that strftime does not crash on invalid format strings
2467db96d56Sopenharmony_ci        # that may trigger a buffer overread. When not triggered,
2477db96d56Sopenharmony_ci        # strftime may succeed or raise ValueError depending on
2487db96d56Sopenharmony_ci        # the platform.
2497db96d56Sopenharmony_ci        for x in [ '', 'A', '%A', '%AA' ]:
2507db96d56Sopenharmony_ci            for y in range(0x0, 0x10):
2517db96d56Sopenharmony_ci                for z in [ '%', 'A%', 'AA%', '%A%', 'A%A%', '%#' ]:
2527db96d56Sopenharmony_ci                    try:
2537db96d56Sopenharmony_ci                        time.strftime(x * y + z)
2547db96d56Sopenharmony_ci                    except ValueError:
2557db96d56Sopenharmony_ci                        pass
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci    def test_default_values_for_zero(self):
2587db96d56Sopenharmony_ci        # Make sure that using all zeros uses the proper default
2597db96d56Sopenharmony_ci        # values.  No test for daylight savings since strftime() does
2607db96d56Sopenharmony_ci        # not change output based on its value and no test for year
2617db96d56Sopenharmony_ci        # because systems vary in their support for year 0.
2627db96d56Sopenharmony_ci        expected = "2000 01 01 00 00 00 1 001"
2637db96d56Sopenharmony_ci        with warnings_helper.check_warnings():
2647db96d56Sopenharmony_ci            result = time.strftime("%Y %m %d %H %M %S %w %j", (2000,)+(0,)*8)
2657db96d56Sopenharmony_ci        self.assertEqual(expected, result)
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ci    @skip_if_buggy_ucrt_strfptime
2687db96d56Sopenharmony_ci    def test_strptime(self):
2697db96d56Sopenharmony_ci        # Should be able to go round-trip from strftime to strptime without
2707db96d56Sopenharmony_ci        # raising an exception.
2717db96d56Sopenharmony_ci        tt = time.gmtime(self.t)
2727db96d56Sopenharmony_ci        for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I',
2737db96d56Sopenharmony_ci                          'j', 'm', 'M', 'p', 'S',
2747db96d56Sopenharmony_ci                          'U', 'w', 'W', 'x', 'X', 'y', 'Y', 'Z', '%'):
2757db96d56Sopenharmony_ci            format = '%' + directive
2767db96d56Sopenharmony_ci            strf_output = time.strftime(format, tt)
2777db96d56Sopenharmony_ci            try:
2787db96d56Sopenharmony_ci                time.strptime(strf_output, format)
2797db96d56Sopenharmony_ci            except ValueError:
2807db96d56Sopenharmony_ci                self.fail("conversion specifier %r failed with '%s' input." %
2817db96d56Sopenharmony_ci                          (format, strf_output))
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci    def test_strptime_bytes(self):
2847db96d56Sopenharmony_ci        # Make sure only strings are accepted as arguments to strptime.
2857db96d56Sopenharmony_ci        self.assertRaises(TypeError, time.strptime, b'2009', "%Y")
2867db96d56Sopenharmony_ci        self.assertRaises(TypeError, time.strptime, '2009', b'%Y')
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci    def test_strptime_exception_context(self):
2897db96d56Sopenharmony_ci        # check that this doesn't chain exceptions needlessly (see #17572)
2907db96d56Sopenharmony_ci        with self.assertRaises(ValueError) as e:
2917db96d56Sopenharmony_ci            time.strptime('', '%D')
2927db96d56Sopenharmony_ci        self.assertIs(e.exception.__suppress_context__, True)
2937db96d56Sopenharmony_ci        # additional check for IndexError branch (issue #19545)
2947db96d56Sopenharmony_ci        with self.assertRaises(ValueError) as e:
2957db96d56Sopenharmony_ci            time.strptime('19', '%Y %')
2967db96d56Sopenharmony_ci        self.assertIs(e.exception.__suppress_context__, True)
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci    def test_asctime(self):
2997db96d56Sopenharmony_ci        time.asctime(time.gmtime(self.t))
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci        # Max year is only limited by the size of C int.
3027db96d56Sopenharmony_ci        for bigyear in TIME_MAXYEAR, TIME_MINYEAR:
3037db96d56Sopenharmony_ci            asc = time.asctime((bigyear, 6, 1) + (0,) * 6)
3047db96d56Sopenharmony_ci            self.assertEqual(asc[-len(str(bigyear)):], str(bigyear))
3057db96d56Sopenharmony_ci        self.assertRaises(OverflowError, time.asctime,
3067db96d56Sopenharmony_ci                          (TIME_MAXYEAR + 1,) + (0,) * 8)
3077db96d56Sopenharmony_ci        self.assertRaises(OverflowError, time.asctime,
3087db96d56Sopenharmony_ci                          (TIME_MINYEAR - 1,) + (0,) * 8)
3097db96d56Sopenharmony_ci        self.assertRaises(TypeError, time.asctime, 0)
3107db96d56Sopenharmony_ci        self.assertRaises(TypeError, time.asctime, ())
3117db96d56Sopenharmony_ci        self.assertRaises(TypeError, time.asctime, (0,) * 10)
3127db96d56Sopenharmony_ci
3137db96d56Sopenharmony_ci    def test_asctime_bounding_check(self):
3147db96d56Sopenharmony_ci        self._bounds_checking(time.asctime)
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci    @unittest.skipIf(
3177db96d56Sopenharmony_ci        support.is_emscripten, "musl libc issue on Emscripten, bpo-46390"
3187db96d56Sopenharmony_ci    )
3197db96d56Sopenharmony_ci    def test_ctime(self):
3207db96d56Sopenharmony_ci        t = time.mktime((1973, 9, 16, 1, 3, 52, 0, 0, -1))
3217db96d56Sopenharmony_ci        self.assertEqual(time.ctime(t), 'Sun Sep 16 01:03:52 1973')
3227db96d56Sopenharmony_ci        t = time.mktime((2000, 1, 1, 0, 0, 0, 0, 0, -1))
3237db96d56Sopenharmony_ci        self.assertEqual(time.ctime(t), 'Sat Jan  1 00:00:00 2000')
3247db96d56Sopenharmony_ci        for year in [-100, 100, 1000, 2000, 2050, 10000]:
3257db96d56Sopenharmony_ci            try:
3267db96d56Sopenharmony_ci                testval = time.mktime((year, 1, 10) + (0,)*6)
3277db96d56Sopenharmony_ci            except (ValueError, OverflowError):
3287db96d56Sopenharmony_ci                # If mktime fails, ctime will fail too.  This may happen
3297db96d56Sopenharmony_ci                # on some platforms.
3307db96d56Sopenharmony_ci                pass
3317db96d56Sopenharmony_ci            else:
3327db96d56Sopenharmony_ci                self.assertEqual(time.ctime(testval)[20:], str(year))
3337db96d56Sopenharmony_ci
3347db96d56Sopenharmony_ci    @unittest.skipUnless(hasattr(time, "tzset"),
3357db96d56Sopenharmony_ci                         "time module has no attribute tzset")
3367db96d56Sopenharmony_ci    def test_tzset(self):
3377db96d56Sopenharmony_ci
3387db96d56Sopenharmony_ci        from os import environ
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci        # Epoch time of midnight Dec 25th 2002. Never DST in northern
3417db96d56Sopenharmony_ci        # hemisphere.
3427db96d56Sopenharmony_ci        xmas2002 = 1040774400.0
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_ci        # These formats are correct for 2002, and possibly future years
3457db96d56Sopenharmony_ci        # This format is the 'standard' as documented at:
3467db96d56Sopenharmony_ci        # http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap08.html
3477db96d56Sopenharmony_ci        # They are also documented in the tzset(3) man page on most Unix
3487db96d56Sopenharmony_ci        # systems.
3497db96d56Sopenharmony_ci        eastern = 'EST+05EDT,M4.1.0,M10.5.0'
3507db96d56Sopenharmony_ci        victoria = 'AEST-10AEDT-11,M10.5.0,M3.5.0'
3517db96d56Sopenharmony_ci        utc='UTC+0'
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ci        org_TZ = environ.get('TZ',None)
3547db96d56Sopenharmony_ci        try:
3557db96d56Sopenharmony_ci            # Make sure we can switch to UTC time and results are correct
3567db96d56Sopenharmony_ci            # Note that unknown timezones default to UTC.
3577db96d56Sopenharmony_ci            # Note that altzone is undefined in UTC, as there is no DST
3587db96d56Sopenharmony_ci            environ['TZ'] = eastern
3597db96d56Sopenharmony_ci            time.tzset()
3607db96d56Sopenharmony_ci            environ['TZ'] = utc
3617db96d56Sopenharmony_ci            time.tzset()
3627db96d56Sopenharmony_ci            self.assertEqual(
3637db96d56Sopenharmony_ci                time.gmtime(xmas2002), time.localtime(xmas2002)
3647db96d56Sopenharmony_ci                )
3657db96d56Sopenharmony_ci            self.assertEqual(time.daylight, 0)
3667db96d56Sopenharmony_ci            self.assertEqual(time.timezone, 0)
3677db96d56Sopenharmony_ci            self.assertEqual(time.localtime(xmas2002).tm_isdst, 0)
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci            # Make sure we can switch to US/Eastern
3707db96d56Sopenharmony_ci            environ['TZ'] = eastern
3717db96d56Sopenharmony_ci            time.tzset()
3727db96d56Sopenharmony_ci            self.assertNotEqual(time.gmtime(xmas2002), time.localtime(xmas2002))
3737db96d56Sopenharmony_ci            self.assertEqual(time.tzname, ('EST', 'EDT'))
3747db96d56Sopenharmony_ci            self.assertEqual(len(time.tzname), 2)
3757db96d56Sopenharmony_ci            self.assertEqual(time.daylight, 1)
3767db96d56Sopenharmony_ci            self.assertEqual(time.timezone, 18000)
3777db96d56Sopenharmony_ci            self.assertEqual(time.altzone, 14400)
3787db96d56Sopenharmony_ci            self.assertEqual(time.localtime(xmas2002).tm_isdst, 0)
3797db96d56Sopenharmony_ci            self.assertEqual(len(time.tzname), 2)
3807db96d56Sopenharmony_ci
3817db96d56Sopenharmony_ci            # Now go to the southern hemisphere.
3827db96d56Sopenharmony_ci            environ['TZ'] = victoria
3837db96d56Sopenharmony_ci            time.tzset()
3847db96d56Sopenharmony_ci            self.assertNotEqual(time.gmtime(xmas2002), time.localtime(xmas2002))
3857db96d56Sopenharmony_ci
3867db96d56Sopenharmony_ci            # Issue #11886: Australian Eastern Standard Time (UTC+10) is called
3877db96d56Sopenharmony_ci            # "EST" (as Eastern Standard Time, UTC-5) instead of "AEST"
3887db96d56Sopenharmony_ci            # (non-DST timezone), and "EDT" instead of "AEDT" (DST timezone),
3897db96d56Sopenharmony_ci            # on some operating systems (e.g. FreeBSD), which is wrong. See for
3907db96d56Sopenharmony_ci            # example this bug:
3917db96d56Sopenharmony_ci            # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=93810
3927db96d56Sopenharmony_ci            self.assertIn(time.tzname[0], ('AEST' 'EST'), time.tzname[0])
3937db96d56Sopenharmony_ci            self.assertTrue(time.tzname[1] in ('AEDT', 'EDT'), str(time.tzname[1]))
3947db96d56Sopenharmony_ci            self.assertEqual(len(time.tzname), 2)
3957db96d56Sopenharmony_ci            self.assertEqual(time.daylight, 1)
3967db96d56Sopenharmony_ci            self.assertEqual(time.timezone, -36000)
3977db96d56Sopenharmony_ci            self.assertEqual(time.altzone, -39600)
3987db96d56Sopenharmony_ci            self.assertEqual(time.localtime(xmas2002).tm_isdst, 1)
3997db96d56Sopenharmony_ci
4007db96d56Sopenharmony_ci        finally:
4017db96d56Sopenharmony_ci            # Repair TZ environment variable in case any other tests
4027db96d56Sopenharmony_ci            # rely on it.
4037db96d56Sopenharmony_ci            if org_TZ is not None:
4047db96d56Sopenharmony_ci                environ['TZ'] = org_TZ
4057db96d56Sopenharmony_ci            elif 'TZ' in environ:
4067db96d56Sopenharmony_ci                del environ['TZ']
4077db96d56Sopenharmony_ci            time.tzset()
4087db96d56Sopenharmony_ci
4097db96d56Sopenharmony_ci    def test_insane_timestamps(self):
4107db96d56Sopenharmony_ci        # It's possible that some platform maps time_t to double,
4117db96d56Sopenharmony_ci        # and that this test will fail there.  This test should
4127db96d56Sopenharmony_ci        # exempt such platforms (provided they return reasonable
4137db96d56Sopenharmony_ci        # results!).
4147db96d56Sopenharmony_ci        for func in time.ctime, time.gmtime, time.localtime:
4157db96d56Sopenharmony_ci            for unreasonable in -1e200, 1e200:
4167db96d56Sopenharmony_ci                self.assertRaises(OverflowError, func, unreasonable)
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci    def test_ctime_without_arg(self):
4197db96d56Sopenharmony_ci        # Not sure how to check the values, since the clock could tick
4207db96d56Sopenharmony_ci        # at any time.  Make sure these are at least accepted and
4217db96d56Sopenharmony_ci        # don't raise errors.
4227db96d56Sopenharmony_ci        time.ctime()
4237db96d56Sopenharmony_ci        time.ctime(None)
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci    def test_gmtime_without_arg(self):
4267db96d56Sopenharmony_ci        gt0 = time.gmtime()
4277db96d56Sopenharmony_ci        gt1 = time.gmtime(None)
4287db96d56Sopenharmony_ci        t0 = time.mktime(gt0)
4297db96d56Sopenharmony_ci        t1 = time.mktime(gt1)
4307db96d56Sopenharmony_ci        self.assertAlmostEqual(t1, t0, delta=0.2)
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci    def test_localtime_without_arg(self):
4337db96d56Sopenharmony_ci        lt0 = time.localtime()
4347db96d56Sopenharmony_ci        lt1 = time.localtime(None)
4357db96d56Sopenharmony_ci        t0 = time.mktime(lt0)
4367db96d56Sopenharmony_ci        t1 = time.mktime(lt1)
4377db96d56Sopenharmony_ci        self.assertAlmostEqual(t1, t0, delta=0.2)
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci    def test_mktime(self):
4407db96d56Sopenharmony_ci        # Issue #1726687
4417db96d56Sopenharmony_ci        for t in (-2, -1, 0, 1):
4427db96d56Sopenharmony_ci            try:
4437db96d56Sopenharmony_ci                tt = time.localtime(t)
4447db96d56Sopenharmony_ci            except (OverflowError, OSError):
4457db96d56Sopenharmony_ci                pass
4467db96d56Sopenharmony_ci            else:
4477db96d56Sopenharmony_ci                self.assertEqual(time.mktime(tt), t)
4487db96d56Sopenharmony_ci
4497db96d56Sopenharmony_ci    # Issue #13309: passing extreme values to mktime() or localtime()
4507db96d56Sopenharmony_ci    # borks the glibc's internal timezone data.
4517db96d56Sopenharmony_ci    @unittest.skipUnless(platform.libc_ver()[0] != 'glibc',
4527db96d56Sopenharmony_ci                         "disabled because of a bug in glibc. Issue #13309")
4537db96d56Sopenharmony_ci    def test_mktime_error(self):
4547db96d56Sopenharmony_ci        # It may not be possible to reliably make mktime return an error
4557db96d56Sopenharmony_ci        # on all platforms.  This will make sure that no other exception
4567db96d56Sopenharmony_ci        # than OverflowError is raised for an extreme value.
4577db96d56Sopenharmony_ci        tt = time.gmtime(self.t)
4587db96d56Sopenharmony_ci        tzname = time.strftime('%Z', tt)
4597db96d56Sopenharmony_ci        self.assertNotEqual(tzname, 'LMT')
4607db96d56Sopenharmony_ci        try:
4617db96d56Sopenharmony_ci            time.mktime((-1, 1, 1, 0, 0, 0, -1, -1, -1))
4627db96d56Sopenharmony_ci        except OverflowError:
4637db96d56Sopenharmony_ci            pass
4647db96d56Sopenharmony_ci        self.assertEqual(time.strftime('%Z', tt), tzname)
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci    def test_monotonic(self):
4677db96d56Sopenharmony_ci        # monotonic() should not go backward
4687db96d56Sopenharmony_ci        times = [time.monotonic() for n in range(100)]
4697db96d56Sopenharmony_ci        t1 = times[0]
4707db96d56Sopenharmony_ci        for t2 in times[1:]:
4717db96d56Sopenharmony_ci            self.assertGreaterEqual(t2, t1, "times=%s" % times)
4727db96d56Sopenharmony_ci            t1 = t2
4737db96d56Sopenharmony_ci
4747db96d56Sopenharmony_ci        # monotonic() includes time elapsed during a sleep
4757db96d56Sopenharmony_ci        t1 = time.monotonic()
4767db96d56Sopenharmony_ci        time.sleep(0.5)
4777db96d56Sopenharmony_ci        t2 = time.monotonic()
4787db96d56Sopenharmony_ci        dt = t2 - t1
4797db96d56Sopenharmony_ci        self.assertGreater(t2, t1)
4807db96d56Sopenharmony_ci        # bpo-20101: tolerate a difference of 50 ms because of bad timer
4817db96d56Sopenharmony_ci        # resolution on Windows
4827db96d56Sopenharmony_ci        self.assertTrue(0.450 <= dt)
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci        # monotonic() is a monotonic but non adjustable clock
4857db96d56Sopenharmony_ci        info = time.get_clock_info('monotonic')
4867db96d56Sopenharmony_ci        self.assertTrue(info.monotonic)
4877db96d56Sopenharmony_ci        self.assertFalse(info.adjustable)
4887db96d56Sopenharmony_ci
4897db96d56Sopenharmony_ci    def test_perf_counter(self):
4907db96d56Sopenharmony_ci        time.perf_counter()
4917db96d56Sopenharmony_ci
4927db96d56Sopenharmony_ci    @unittest.skipIf(
4937db96d56Sopenharmony_ci        support.is_wasi, "process_time not available on WASI"
4947db96d56Sopenharmony_ci    )
4957db96d56Sopenharmony_ci    def test_process_time(self):
4967db96d56Sopenharmony_ci        # process_time() should not include time spend during a sleep
4977db96d56Sopenharmony_ci        start = time.process_time()
4987db96d56Sopenharmony_ci        time.sleep(0.100)
4997db96d56Sopenharmony_ci        stop = time.process_time()
5007db96d56Sopenharmony_ci        # use 20 ms because process_time() has usually a resolution of 15 ms
5017db96d56Sopenharmony_ci        # on Windows
5027db96d56Sopenharmony_ci        self.assertLess(stop - start, 0.020)
5037db96d56Sopenharmony_ci
5047db96d56Sopenharmony_ci        info = time.get_clock_info('process_time')
5057db96d56Sopenharmony_ci        self.assertTrue(info.monotonic)
5067db96d56Sopenharmony_ci        self.assertFalse(info.adjustable)
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_ci    def test_thread_time(self):
5097db96d56Sopenharmony_ci        if not hasattr(time, 'thread_time'):
5107db96d56Sopenharmony_ci            if sys.platform.startswith(('linux', 'win')):
5117db96d56Sopenharmony_ci                self.fail("time.thread_time() should be available on %r"
5127db96d56Sopenharmony_ci                          % (sys.platform,))
5137db96d56Sopenharmony_ci            else:
5147db96d56Sopenharmony_ci                self.skipTest("need time.thread_time")
5157db96d56Sopenharmony_ci
5167db96d56Sopenharmony_ci        # thread_time() should not include time spend during a sleep
5177db96d56Sopenharmony_ci        start = time.thread_time()
5187db96d56Sopenharmony_ci        time.sleep(0.100)
5197db96d56Sopenharmony_ci        stop = time.thread_time()
5207db96d56Sopenharmony_ci        # use 20 ms because thread_time() has usually a resolution of 15 ms
5217db96d56Sopenharmony_ci        # on Windows
5227db96d56Sopenharmony_ci        self.assertLess(stop - start, 0.020)
5237db96d56Sopenharmony_ci
5247db96d56Sopenharmony_ci        info = time.get_clock_info('thread_time')
5257db96d56Sopenharmony_ci        self.assertTrue(info.monotonic)
5267db96d56Sopenharmony_ci        self.assertFalse(info.adjustable)
5277db96d56Sopenharmony_ci
5287db96d56Sopenharmony_ci    @unittest.skipUnless(hasattr(time, 'clock_settime'),
5297db96d56Sopenharmony_ci                         'need time.clock_settime')
5307db96d56Sopenharmony_ci    def test_monotonic_settime(self):
5317db96d56Sopenharmony_ci        t1 = time.monotonic()
5327db96d56Sopenharmony_ci        realtime = time.clock_gettime(time.CLOCK_REALTIME)
5337db96d56Sopenharmony_ci        # jump backward with an offset of 1 hour
5347db96d56Sopenharmony_ci        try:
5357db96d56Sopenharmony_ci            time.clock_settime(time.CLOCK_REALTIME, realtime - 3600)
5367db96d56Sopenharmony_ci        except PermissionError as err:
5377db96d56Sopenharmony_ci            self.skipTest(err)
5387db96d56Sopenharmony_ci        t2 = time.monotonic()
5397db96d56Sopenharmony_ci        time.clock_settime(time.CLOCK_REALTIME, realtime)
5407db96d56Sopenharmony_ci        # monotonic must not be affected by system clock updates
5417db96d56Sopenharmony_ci        self.assertGreaterEqual(t2, t1)
5427db96d56Sopenharmony_ci
5437db96d56Sopenharmony_ci    def test_localtime_failure(self):
5447db96d56Sopenharmony_ci        # Issue #13847: check for localtime() failure
5457db96d56Sopenharmony_ci        invalid_time_t = None
5467db96d56Sopenharmony_ci        for time_t in (-1, 2**30, 2**33, 2**60):
5477db96d56Sopenharmony_ci            try:
5487db96d56Sopenharmony_ci                time.localtime(time_t)
5497db96d56Sopenharmony_ci            except OverflowError:
5507db96d56Sopenharmony_ci                self.skipTest("need 64-bit time_t")
5517db96d56Sopenharmony_ci            except OSError:
5527db96d56Sopenharmony_ci                invalid_time_t = time_t
5537db96d56Sopenharmony_ci                break
5547db96d56Sopenharmony_ci        if invalid_time_t is None:
5557db96d56Sopenharmony_ci            self.skipTest("unable to find an invalid time_t value")
5567db96d56Sopenharmony_ci
5577db96d56Sopenharmony_ci        self.assertRaises(OSError, time.localtime, invalid_time_t)
5587db96d56Sopenharmony_ci        self.assertRaises(OSError, time.ctime, invalid_time_t)
5597db96d56Sopenharmony_ci
5607db96d56Sopenharmony_ci        # Issue #26669: check for localtime() failure
5617db96d56Sopenharmony_ci        self.assertRaises(ValueError, time.localtime, float("nan"))
5627db96d56Sopenharmony_ci        self.assertRaises(ValueError, time.ctime, float("nan"))
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci    def test_get_clock_info(self):
5657db96d56Sopenharmony_ci        clocks = [
5667db96d56Sopenharmony_ci            'monotonic',
5677db96d56Sopenharmony_ci            'perf_counter',
5687db96d56Sopenharmony_ci            'process_time',
5697db96d56Sopenharmony_ci            'time',
5707db96d56Sopenharmony_ci        ]
5717db96d56Sopenharmony_ci        if hasattr(time, 'thread_time'):
5727db96d56Sopenharmony_ci            clocks.append('thread_time')
5737db96d56Sopenharmony_ci
5747db96d56Sopenharmony_ci        for name in clocks:
5757db96d56Sopenharmony_ci            with self.subTest(name=name):
5767db96d56Sopenharmony_ci                info = time.get_clock_info(name)
5777db96d56Sopenharmony_ci
5787db96d56Sopenharmony_ci                self.assertIsInstance(info.implementation, str)
5797db96d56Sopenharmony_ci                self.assertNotEqual(info.implementation, '')
5807db96d56Sopenharmony_ci                self.assertIsInstance(info.monotonic, bool)
5817db96d56Sopenharmony_ci                self.assertIsInstance(info.resolution, float)
5827db96d56Sopenharmony_ci                # 0.0 < resolution <= 1.0
5837db96d56Sopenharmony_ci                self.assertGreater(info.resolution, 0.0)
5847db96d56Sopenharmony_ci                self.assertLessEqual(info.resolution, 1.0)
5857db96d56Sopenharmony_ci                self.assertIsInstance(info.adjustable, bool)
5867db96d56Sopenharmony_ci
5877db96d56Sopenharmony_ci        self.assertRaises(ValueError, time.get_clock_info, 'xxx')
5887db96d56Sopenharmony_ci
5897db96d56Sopenharmony_ci
5907db96d56Sopenharmony_ciclass TestLocale(unittest.TestCase):
5917db96d56Sopenharmony_ci    def setUp(self):
5927db96d56Sopenharmony_ci        self.oldloc = locale.setlocale(locale.LC_ALL)
5937db96d56Sopenharmony_ci
5947db96d56Sopenharmony_ci    def tearDown(self):
5957db96d56Sopenharmony_ci        locale.setlocale(locale.LC_ALL, self.oldloc)
5967db96d56Sopenharmony_ci
5977db96d56Sopenharmony_ci    def test_bug_3061(self):
5987db96d56Sopenharmony_ci        try:
5997db96d56Sopenharmony_ci            tmp = locale.setlocale(locale.LC_ALL, "fr_FR")
6007db96d56Sopenharmony_ci        except locale.Error:
6017db96d56Sopenharmony_ci            self.skipTest('could not set locale.LC_ALL to fr_FR')
6027db96d56Sopenharmony_ci        # This should not cause an exception
6037db96d56Sopenharmony_ci        time.strftime("%B", (2009,2,1,0,0,0,0,0,0))
6047db96d56Sopenharmony_ci
6057db96d56Sopenharmony_ci
6067db96d56Sopenharmony_ciclass _TestAsctimeYear:
6077db96d56Sopenharmony_ci    _format = '%d'
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci    def yearstr(self, y):
6107db96d56Sopenharmony_ci        return time.asctime((y,) + (0,) * 8).split()[-1]
6117db96d56Sopenharmony_ci
6127db96d56Sopenharmony_ci    def test_large_year(self):
6137db96d56Sopenharmony_ci        # Check that it doesn't crash for year > 9999
6147db96d56Sopenharmony_ci        self.assertEqual(self.yearstr(12345), '12345')
6157db96d56Sopenharmony_ci        self.assertEqual(self.yearstr(123456789), '123456789')
6167db96d56Sopenharmony_ci
6177db96d56Sopenharmony_ciclass _TestStrftimeYear:
6187db96d56Sopenharmony_ci
6197db96d56Sopenharmony_ci    # Issue 13305:  For years < 1000, the value is not always
6207db96d56Sopenharmony_ci    # padded to 4 digits across platforms.  The C standard
6217db96d56Sopenharmony_ci    # assumes year >= 1900, so it does not specify the number
6227db96d56Sopenharmony_ci    # of digits.
6237db96d56Sopenharmony_ci
6247db96d56Sopenharmony_ci    if time.strftime('%Y', (1,) + (0,) * 8) == '0001':
6257db96d56Sopenharmony_ci        _format = '%04d'
6267db96d56Sopenharmony_ci    else:
6277db96d56Sopenharmony_ci        _format = '%d'
6287db96d56Sopenharmony_ci
6297db96d56Sopenharmony_ci    def yearstr(self, y):
6307db96d56Sopenharmony_ci        return time.strftime('%Y', (y,) + (0,) * 8)
6317db96d56Sopenharmony_ci
6327db96d56Sopenharmony_ci    @unittest.skipUnless(
6337db96d56Sopenharmony_ci        support.has_strftime_extensions, "requires strftime extension"
6347db96d56Sopenharmony_ci    )
6357db96d56Sopenharmony_ci    def test_4dyear(self):
6367db96d56Sopenharmony_ci        # Check that we can return the zero padded value.
6377db96d56Sopenharmony_ci        if self._format == '%04d':
6387db96d56Sopenharmony_ci            self.test_year('%04d')
6397db96d56Sopenharmony_ci        else:
6407db96d56Sopenharmony_ci            def year4d(y):
6417db96d56Sopenharmony_ci                return time.strftime('%4Y', (y,) + (0,) * 8)
6427db96d56Sopenharmony_ci            self.test_year('%04d', func=year4d)
6437db96d56Sopenharmony_ci
6447db96d56Sopenharmony_ci    def skip_if_not_supported(y):
6457db96d56Sopenharmony_ci        msg = "strftime() is limited to [1; 9999] with Visual Studio"
6467db96d56Sopenharmony_ci        # Check that it doesn't crash for year > 9999
6477db96d56Sopenharmony_ci        try:
6487db96d56Sopenharmony_ci            time.strftime('%Y', (y,) + (0,) * 8)
6497db96d56Sopenharmony_ci        except ValueError:
6507db96d56Sopenharmony_ci            cond = False
6517db96d56Sopenharmony_ci        else:
6527db96d56Sopenharmony_ci            cond = True
6537db96d56Sopenharmony_ci        return unittest.skipUnless(cond, msg)
6547db96d56Sopenharmony_ci
6557db96d56Sopenharmony_ci    @skip_if_not_supported(10000)
6567db96d56Sopenharmony_ci    def test_large_year(self):
6577db96d56Sopenharmony_ci        return super().test_large_year()
6587db96d56Sopenharmony_ci
6597db96d56Sopenharmony_ci    @skip_if_not_supported(0)
6607db96d56Sopenharmony_ci    def test_negative(self):
6617db96d56Sopenharmony_ci        return super().test_negative()
6627db96d56Sopenharmony_ci
6637db96d56Sopenharmony_ci    del skip_if_not_supported
6647db96d56Sopenharmony_ci
6657db96d56Sopenharmony_ci
6667db96d56Sopenharmony_ciclass _Test4dYear:
6677db96d56Sopenharmony_ci    _format = '%d'
6687db96d56Sopenharmony_ci
6697db96d56Sopenharmony_ci    def test_year(self, fmt=None, func=None):
6707db96d56Sopenharmony_ci        fmt = fmt or self._format
6717db96d56Sopenharmony_ci        func = func or self.yearstr
6727db96d56Sopenharmony_ci        self.assertEqual(func(1),    fmt % 1)
6737db96d56Sopenharmony_ci        self.assertEqual(func(68),   fmt % 68)
6747db96d56Sopenharmony_ci        self.assertEqual(func(69),   fmt % 69)
6757db96d56Sopenharmony_ci        self.assertEqual(func(99),   fmt % 99)
6767db96d56Sopenharmony_ci        self.assertEqual(func(999),  fmt % 999)
6777db96d56Sopenharmony_ci        self.assertEqual(func(9999), fmt % 9999)
6787db96d56Sopenharmony_ci
6797db96d56Sopenharmony_ci    def test_large_year(self):
6807db96d56Sopenharmony_ci        self.assertEqual(self.yearstr(12345).lstrip('+'), '12345')
6817db96d56Sopenharmony_ci        self.assertEqual(self.yearstr(123456789).lstrip('+'), '123456789')
6827db96d56Sopenharmony_ci        self.assertEqual(self.yearstr(TIME_MAXYEAR).lstrip('+'), str(TIME_MAXYEAR))
6837db96d56Sopenharmony_ci        self.assertRaises(OverflowError, self.yearstr, TIME_MAXYEAR + 1)
6847db96d56Sopenharmony_ci
6857db96d56Sopenharmony_ci    def test_negative(self):
6867db96d56Sopenharmony_ci        self.assertEqual(self.yearstr(-1), self._format % -1)
6877db96d56Sopenharmony_ci        self.assertEqual(self.yearstr(-1234), '-1234')
6887db96d56Sopenharmony_ci        self.assertEqual(self.yearstr(-123456), '-123456')
6897db96d56Sopenharmony_ci        self.assertEqual(self.yearstr(-123456789), str(-123456789))
6907db96d56Sopenharmony_ci        self.assertEqual(self.yearstr(-1234567890), str(-1234567890))
6917db96d56Sopenharmony_ci        self.assertEqual(self.yearstr(TIME_MINYEAR), str(TIME_MINYEAR))
6927db96d56Sopenharmony_ci        # Modules/timemodule.c checks for underflow
6937db96d56Sopenharmony_ci        self.assertRaises(OverflowError, self.yearstr, TIME_MINYEAR - 1)
6947db96d56Sopenharmony_ci        with self.assertRaises(OverflowError):
6957db96d56Sopenharmony_ci            self.yearstr(-TIME_MAXYEAR - 1)
6967db96d56Sopenharmony_ci
6977db96d56Sopenharmony_ci
6987db96d56Sopenharmony_ciclass TestAsctime4dyear(_TestAsctimeYear, _Test4dYear, unittest.TestCase):
6997db96d56Sopenharmony_ci    pass
7007db96d56Sopenharmony_ci
7017db96d56Sopenharmony_ciclass TestStrftime4dyear(_TestStrftimeYear, _Test4dYear, unittest.TestCase):
7027db96d56Sopenharmony_ci    pass
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_ci
7057db96d56Sopenharmony_ciclass TestPytime(unittest.TestCase):
7067db96d56Sopenharmony_ci    @skip_if_buggy_ucrt_strfptime
7077db96d56Sopenharmony_ci    @unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support")
7087db96d56Sopenharmony_ci    @unittest.skipIf(
7097db96d56Sopenharmony_ci        support.is_emscripten, "musl libc issue on Emscripten, bpo-46390"
7107db96d56Sopenharmony_ci    )
7117db96d56Sopenharmony_ci    def test_localtime_timezone(self):
7127db96d56Sopenharmony_ci
7137db96d56Sopenharmony_ci        # Get the localtime and examine it for the offset and zone.
7147db96d56Sopenharmony_ci        lt = time.localtime()
7157db96d56Sopenharmony_ci        self.assertTrue(hasattr(lt, "tm_gmtoff"))
7167db96d56Sopenharmony_ci        self.assertTrue(hasattr(lt, "tm_zone"))
7177db96d56Sopenharmony_ci
7187db96d56Sopenharmony_ci        # See if the offset and zone are similar to the module
7197db96d56Sopenharmony_ci        # attributes.
7207db96d56Sopenharmony_ci        if lt.tm_gmtoff is None:
7217db96d56Sopenharmony_ci            self.assertTrue(not hasattr(time, "timezone"))
7227db96d56Sopenharmony_ci        else:
7237db96d56Sopenharmony_ci            self.assertEqual(lt.tm_gmtoff, -[time.timezone, time.altzone][lt.tm_isdst])
7247db96d56Sopenharmony_ci        if lt.tm_zone is None:
7257db96d56Sopenharmony_ci            self.assertTrue(not hasattr(time, "tzname"))
7267db96d56Sopenharmony_ci        else:
7277db96d56Sopenharmony_ci            self.assertEqual(lt.tm_zone, time.tzname[lt.tm_isdst])
7287db96d56Sopenharmony_ci
7297db96d56Sopenharmony_ci        # Try and make UNIX times from the localtime and a 9-tuple
7307db96d56Sopenharmony_ci        # created from the localtime. Test to see that the times are
7317db96d56Sopenharmony_ci        # the same.
7327db96d56Sopenharmony_ci        t = time.mktime(lt); t9 = time.mktime(lt[:9])
7337db96d56Sopenharmony_ci        self.assertEqual(t, t9)
7347db96d56Sopenharmony_ci
7357db96d56Sopenharmony_ci        # Make localtimes from the UNIX times and compare them to
7367db96d56Sopenharmony_ci        # the original localtime, thus making a round trip.
7377db96d56Sopenharmony_ci        new_lt = time.localtime(t); new_lt9 = time.localtime(t9)
7387db96d56Sopenharmony_ci        self.assertEqual(new_lt, lt)
7397db96d56Sopenharmony_ci        self.assertEqual(new_lt.tm_gmtoff, lt.tm_gmtoff)
7407db96d56Sopenharmony_ci        self.assertEqual(new_lt.tm_zone, lt.tm_zone)
7417db96d56Sopenharmony_ci        self.assertEqual(new_lt9, lt)
7427db96d56Sopenharmony_ci        self.assertEqual(new_lt.tm_gmtoff, lt.tm_gmtoff)
7437db96d56Sopenharmony_ci        self.assertEqual(new_lt9.tm_zone, lt.tm_zone)
7447db96d56Sopenharmony_ci
7457db96d56Sopenharmony_ci    @unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support")
7467db96d56Sopenharmony_ci    def test_strptime_timezone(self):
7477db96d56Sopenharmony_ci        t = time.strptime("UTC", "%Z")
7487db96d56Sopenharmony_ci        self.assertEqual(t.tm_zone, 'UTC')
7497db96d56Sopenharmony_ci        t = time.strptime("+0500", "%z")
7507db96d56Sopenharmony_ci        self.assertEqual(t.tm_gmtoff, 5 * 3600)
7517db96d56Sopenharmony_ci
7527db96d56Sopenharmony_ci    @unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support")
7537db96d56Sopenharmony_ci    def test_short_times(self):
7547db96d56Sopenharmony_ci
7557db96d56Sopenharmony_ci        import pickle
7567db96d56Sopenharmony_ci
7577db96d56Sopenharmony_ci        # Load a short time structure using pickle.
7587db96d56Sopenharmony_ci        st = b"ctime\nstruct_time\np0\n((I2007\nI8\nI11\nI1\nI24\nI49\nI5\nI223\nI1\ntp1\n(dp2\ntp3\nRp4\n."
7597db96d56Sopenharmony_ci        lt = pickle.loads(st)
7607db96d56Sopenharmony_ci        self.assertIs(lt.tm_gmtoff, None)
7617db96d56Sopenharmony_ci        self.assertIs(lt.tm_zone, None)
7627db96d56Sopenharmony_ci
7637db96d56Sopenharmony_ci
7647db96d56Sopenharmony_ci@unittest.skipIf(_testcapi is None, 'need the _testcapi module')
7657db96d56Sopenharmony_ciclass CPyTimeTestCase:
7667db96d56Sopenharmony_ci    """
7677db96d56Sopenharmony_ci    Base class to test the C _PyTime_t API.
7687db96d56Sopenharmony_ci    """
7697db96d56Sopenharmony_ci    OVERFLOW_SECONDS = None
7707db96d56Sopenharmony_ci
7717db96d56Sopenharmony_ci    def setUp(self):
7727db96d56Sopenharmony_ci        from _testcapi import SIZEOF_TIME_T
7737db96d56Sopenharmony_ci        bits = SIZEOF_TIME_T * 8 - 1
7747db96d56Sopenharmony_ci        self.time_t_min = -2 ** bits
7757db96d56Sopenharmony_ci        self.time_t_max = 2 ** bits - 1
7767db96d56Sopenharmony_ci
7777db96d56Sopenharmony_ci    def time_t_filter(self, seconds):
7787db96d56Sopenharmony_ci        return (self.time_t_min <= seconds <= self.time_t_max)
7797db96d56Sopenharmony_ci
7807db96d56Sopenharmony_ci    def _rounding_values(self, use_float):
7817db96d56Sopenharmony_ci        "Build timestamps used to test rounding."
7827db96d56Sopenharmony_ci
7837db96d56Sopenharmony_ci        units = [1, US_TO_NS, MS_TO_NS, SEC_TO_NS]
7847db96d56Sopenharmony_ci        if use_float:
7857db96d56Sopenharmony_ci            # picoseconds are only tested to pytime_converter accepting floats
7867db96d56Sopenharmony_ci            units.append(1e-3)
7877db96d56Sopenharmony_ci
7887db96d56Sopenharmony_ci        values = (
7897db96d56Sopenharmony_ci            # small values
7907db96d56Sopenharmony_ci            1, 2, 5, 7, 123, 456, 1234,
7917db96d56Sopenharmony_ci            # 10^k - 1
7927db96d56Sopenharmony_ci            9,
7937db96d56Sopenharmony_ci            99,
7947db96d56Sopenharmony_ci            999,
7957db96d56Sopenharmony_ci            9999,
7967db96d56Sopenharmony_ci            99999,
7977db96d56Sopenharmony_ci            999999,
7987db96d56Sopenharmony_ci            # test half even rounding near 0.5, 1.5, 2.5, 3.5, 4.5
7997db96d56Sopenharmony_ci            499, 500, 501,
8007db96d56Sopenharmony_ci            1499, 1500, 1501,
8017db96d56Sopenharmony_ci            2500,
8027db96d56Sopenharmony_ci            3500,
8037db96d56Sopenharmony_ci            4500,
8047db96d56Sopenharmony_ci        )
8057db96d56Sopenharmony_ci
8067db96d56Sopenharmony_ci        ns_timestamps = [0]
8077db96d56Sopenharmony_ci        for unit in units:
8087db96d56Sopenharmony_ci            for value in values:
8097db96d56Sopenharmony_ci                ns = value * unit
8107db96d56Sopenharmony_ci                ns_timestamps.extend((-ns, ns))
8117db96d56Sopenharmony_ci        for pow2 in (0, 5, 10, 15, 22, 23, 24, 30, 33):
8127db96d56Sopenharmony_ci            ns = (2 ** pow2) * SEC_TO_NS
8137db96d56Sopenharmony_ci            ns_timestamps.extend((
8147db96d56Sopenharmony_ci                -ns-1, -ns, -ns+1,
8157db96d56Sopenharmony_ci                ns-1, ns, ns+1
8167db96d56Sopenharmony_ci            ))
8177db96d56Sopenharmony_ci        for seconds in (_testcapi.INT_MIN, _testcapi.INT_MAX):
8187db96d56Sopenharmony_ci            ns_timestamps.append(seconds * SEC_TO_NS)
8197db96d56Sopenharmony_ci        if use_float:
8207db96d56Sopenharmony_ci            # numbers with an exact representation in IEEE 754 (base 2)
8217db96d56Sopenharmony_ci            for pow2 in (3, 7, 10, 15):
8227db96d56Sopenharmony_ci                ns = 2.0 ** (-pow2)
8237db96d56Sopenharmony_ci                ns_timestamps.extend((-ns, ns))
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_ci        # seconds close to _PyTime_t type limit
8267db96d56Sopenharmony_ci        ns = (2 ** 63 // SEC_TO_NS) * SEC_TO_NS
8277db96d56Sopenharmony_ci        ns_timestamps.extend((-ns, ns))
8287db96d56Sopenharmony_ci
8297db96d56Sopenharmony_ci        return ns_timestamps
8307db96d56Sopenharmony_ci
8317db96d56Sopenharmony_ci    def _check_rounding(self, pytime_converter, expected_func,
8327db96d56Sopenharmony_ci                        use_float, unit_to_sec, value_filter=None):
8337db96d56Sopenharmony_ci
8347db96d56Sopenharmony_ci        def convert_values(ns_timestamps):
8357db96d56Sopenharmony_ci            if use_float:
8367db96d56Sopenharmony_ci                unit_to_ns = SEC_TO_NS / float(unit_to_sec)
8377db96d56Sopenharmony_ci                values = [ns / unit_to_ns for ns in ns_timestamps]
8387db96d56Sopenharmony_ci            else:
8397db96d56Sopenharmony_ci                unit_to_ns = SEC_TO_NS // unit_to_sec
8407db96d56Sopenharmony_ci                values = [ns // unit_to_ns for ns in ns_timestamps]
8417db96d56Sopenharmony_ci
8427db96d56Sopenharmony_ci            if value_filter:
8437db96d56Sopenharmony_ci                values = filter(value_filter, values)
8447db96d56Sopenharmony_ci
8457db96d56Sopenharmony_ci            # remove duplicates and sort
8467db96d56Sopenharmony_ci            return sorted(set(values))
8477db96d56Sopenharmony_ci
8487db96d56Sopenharmony_ci        # test rounding
8497db96d56Sopenharmony_ci        ns_timestamps = self._rounding_values(use_float)
8507db96d56Sopenharmony_ci        valid_values = convert_values(ns_timestamps)
8517db96d56Sopenharmony_ci        for time_rnd, decimal_rnd in ROUNDING_MODES :
8527db96d56Sopenharmony_ci            with decimal.localcontext() as context:
8537db96d56Sopenharmony_ci                context.rounding = decimal_rnd
8547db96d56Sopenharmony_ci
8557db96d56Sopenharmony_ci                for value in valid_values:
8567db96d56Sopenharmony_ci                    debug_info = {'value': value, 'rounding': decimal_rnd}
8577db96d56Sopenharmony_ci                    try:
8587db96d56Sopenharmony_ci                        result = pytime_converter(value, time_rnd)
8597db96d56Sopenharmony_ci                        expected = expected_func(value)
8607db96d56Sopenharmony_ci                    except Exception:
8617db96d56Sopenharmony_ci                        self.fail("Error on timestamp conversion: %s" % debug_info)
8627db96d56Sopenharmony_ci                    self.assertEqual(result,
8637db96d56Sopenharmony_ci                                     expected,
8647db96d56Sopenharmony_ci                                     debug_info)
8657db96d56Sopenharmony_ci
8667db96d56Sopenharmony_ci        # test overflow
8677db96d56Sopenharmony_ci        ns = self.OVERFLOW_SECONDS * SEC_TO_NS
8687db96d56Sopenharmony_ci        ns_timestamps = (-ns, ns)
8697db96d56Sopenharmony_ci        overflow_values = convert_values(ns_timestamps)
8707db96d56Sopenharmony_ci        for time_rnd, _ in ROUNDING_MODES :
8717db96d56Sopenharmony_ci            for value in overflow_values:
8727db96d56Sopenharmony_ci                debug_info = {'value': value, 'rounding': time_rnd}
8737db96d56Sopenharmony_ci                with self.assertRaises(OverflowError, msg=debug_info):
8747db96d56Sopenharmony_ci                    pytime_converter(value, time_rnd)
8757db96d56Sopenharmony_ci
8767db96d56Sopenharmony_ci    def check_int_rounding(self, pytime_converter, expected_func,
8777db96d56Sopenharmony_ci                           unit_to_sec=1, value_filter=None):
8787db96d56Sopenharmony_ci        self._check_rounding(pytime_converter, expected_func,
8797db96d56Sopenharmony_ci                             False, unit_to_sec, value_filter)
8807db96d56Sopenharmony_ci
8817db96d56Sopenharmony_ci    def check_float_rounding(self, pytime_converter, expected_func,
8827db96d56Sopenharmony_ci                             unit_to_sec=1, value_filter=None):
8837db96d56Sopenharmony_ci        self._check_rounding(pytime_converter, expected_func,
8847db96d56Sopenharmony_ci                             True, unit_to_sec, value_filter)
8857db96d56Sopenharmony_ci
8867db96d56Sopenharmony_ci    def decimal_round(self, x):
8877db96d56Sopenharmony_ci        d = decimal.Decimal(x)
8887db96d56Sopenharmony_ci        d = d.quantize(1)
8897db96d56Sopenharmony_ci        return int(d)
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ciclass TestCPyTime(CPyTimeTestCase, unittest.TestCase):
8937db96d56Sopenharmony_ci    """
8947db96d56Sopenharmony_ci    Test the C _PyTime_t API.
8957db96d56Sopenharmony_ci    """
8967db96d56Sopenharmony_ci    # _PyTime_t is a 64-bit signed integer
8977db96d56Sopenharmony_ci    OVERFLOW_SECONDS = math.ceil((2**63 + 1) / SEC_TO_NS)
8987db96d56Sopenharmony_ci
8997db96d56Sopenharmony_ci    def test_FromSeconds(self):
9007db96d56Sopenharmony_ci        from _testcapi import PyTime_FromSeconds
9017db96d56Sopenharmony_ci
9027db96d56Sopenharmony_ci        # PyTime_FromSeconds() expects a C int, reject values out of range
9037db96d56Sopenharmony_ci        def c_int_filter(secs):
9047db96d56Sopenharmony_ci            return (_testcapi.INT_MIN <= secs <= _testcapi.INT_MAX)
9057db96d56Sopenharmony_ci
9067db96d56Sopenharmony_ci        self.check_int_rounding(lambda secs, rnd: PyTime_FromSeconds(secs),
9077db96d56Sopenharmony_ci                                lambda secs: secs * SEC_TO_NS,
9087db96d56Sopenharmony_ci                                value_filter=c_int_filter)
9097db96d56Sopenharmony_ci
9107db96d56Sopenharmony_ci        # test nan
9117db96d56Sopenharmony_ci        for time_rnd, _ in ROUNDING_MODES:
9127db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
9137db96d56Sopenharmony_ci                PyTime_FromSeconds(float('nan'))
9147db96d56Sopenharmony_ci
9157db96d56Sopenharmony_ci    def test_FromSecondsObject(self):
9167db96d56Sopenharmony_ci        from _testcapi import PyTime_FromSecondsObject
9177db96d56Sopenharmony_ci
9187db96d56Sopenharmony_ci        self.check_int_rounding(
9197db96d56Sopenharmony_ci            PyTime_FromSecondsObject,
9207db96d56Sopenharmony_ci            lambda secs: secs * SEC_TO_NS)
9217db96d56Sopenharmony_ci
9227db96d56Sopenharmony_ci        self.check_float_rounding(
9237db96d56Sopenharmony_ci            PyTime_FromSecondsObject,
9247db96d56Sopenharmony_ci            lambda ns: self.decimal_round(ns * SEC_TO_NS))
9257db96d56Sopenharmony_ci
9267db96d56Sopenharmony_ci        # test nan
9277db96d56Sopenharmony_ci        for time_rnd, _ in ROUNDING_MODES:
9287db96d56Sopenharmony_ci            with self.assertRaises(ValueError):
9297db96d56Sopenharmony_ci                PyTime_FromSecondsObject(float('nan'), time_rnd)
9307db96d56Sopenharmony_ci
9317db96d56Sopenharmony_ci    def test_AsSecondsDouble(self):
9327db96d56Sopenharmony_ci        from _testcapi import PyTime_AsSecondsDouble
9337db96d56Sopenharmony_ci
9347db96d56Sopenharmony_ci        def float_converter(ns):
9357db96d56Sopenharmony_ci            if abs(ns) % SEC_TO_NS == 0:
9367db96d56Sopenharmony_ci                return float(ns // SEC_TO_NS)
9377db96d56Sopenharmony_ci            else:
9387db96d56Sopenharmony_ci                return float(ns) / SEC_TO_NS
9397db96d56Sopenharmony_ci
9407db96d56Sopenharmony_ci        self.check_int_rounding(lambda ns, rnd: PyTime_AsSecondsDouble(ns),
9417db96d56Sopenharmony_ci                                float_converter,
9427db96d56Sopenharmony_ci                                NS_TO_SEC)
9437db96d56Sopenharmony_ci
9447db96d56Sopenharmony_ci        # test nan
9457db96d56Sopenharmony_ci        for time_rnd, _ in ROUNDING_MODES:
9467db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
9477db96d56Sopenharmony_ci                PyTime_AsSecondsDouble(float('nan'))
9487db96d56Sopenharmony_ci
9497db96d56Sopenharmony_ci    def create_decimal_converter(self, denominator):
9507db96d56Sopenharmony_ci        denom = decimal.Decimal(denominator)
9517db96d56Sopenharmony_ci
9527db96d56Sopenharmony_ci        def converter(value):
9537db96d56Sopenharmony_ci            d = decimal.Decimal(value) / denom
9547db96d56Sopenharmony_ci            return self.decimal_round(d)
9557db96d56Sopenharmony_ci
9567db96d56Sopenharmony_ci        return converter
9577db96d56Sopenharmony_ci
9587db96d56Sopenharmony_ci    def test_AsTimeval(self):
9597db96d56Sopenharmony_ci        from _testcapi import PyTime_AsTimeval
9607db96d56Sopenharmony_ci
9617db96d56Sopenharmony_ci        us_converter = self.create_decimal_converter(US_TO_NS)
9627db96d56Sopenharmony_ci
9637db96d56Sopenharmony_ci        def timeval_converter(ns):
9647db96d56Sopenharmony_ci            us = us_converter(ns)
9657db96d56Sopenharmony_ci            return divmod(us, SEC_TO_US)
9667db96d56Sopenharmony_ci
9677db96d56Sopenharmony_ci        if sys.platform == 'win32':
9687db96d56Sopenharmony_ci            from _testcapi import LONG_MIN, LONG_MAX
9697db96d56Sopenharmony_ci
9707db96d56Sopenharmony_ci            # On Windows, timeval.tv_sec type is a C long
9717db96d56Sopenharmony_ci            def seconds_filter(secs):
9727db96d56Sopenharmony_ci                return LONG_MIN <= secs <= LONG_MAX
9737db96d56Sopenharmony_ci        else:
9747db96d56Sopenharmony_ci            seconds_filter = self.time_t_filter
9757db96d56Sopenharmony_ci
9767db96d56Sopenharmony_ci        self.check_int_rounding(PyTime_AsTimeval,
9777db96d56Sopenharmony_ci                                timeval_converter,
9787db96d56Sopenharmony_ci                                NS_TO_SEC,
9797db96d56Sopenharmony_ci                                value_filter=seconds_filter)
9807db96d56Sopenharmony_ci
9817db96d56Sopenharmony_ci    @unittest.skipUnless(hasattr(_testcapi, 'PyTime_AsTimespec'),
9827db96d56Sopenharmony_ci                         'need _testcapi.PyTime_AsTimespec')
9837db96d56Sopenharmony_ci    def test_AsTimespec(self):
9847db96d56Sopenharmony_ci        from _testcapi import PyTime_AsTimespec
9857db96d56Sopenharmony_ci
9867db96d56Sopenharmony_ci        def timespec_converter(ns):
9877db96d56Sopenharmony_ci            return divmod(ns, SEC_TO_NS)
9887db96d56Sopenharmony_ci
9897db96d56Sopenharmony_ci        self.check_int_rounding(lambda ns, rnd: PyTime_AsTimespec(ns),
9907db96d56Sopenharmony_ci                                timespec_converter,
9917db96d56Sopenharmony_ci                                NS_TO_SEC,
9927db96d56Sopenharmony_ci                                value_filter=self.time_t_filter)
9937db96d56Sopenharmony_ci
9947db96d56Sopenharmony_ci    @unittest.skipUnless(hasattr(_testcapi, 'PyTime_AsTimeval_clamp'),
9957db96d56Sopenharmony_ci                         'need _testcapi.PyTime_AsTimeval_clamp')
9967db96d56Sopenharmony_ci    def test_AsTimeval_clamp(self):
9977db96d56Sopenharmony_ci        from _testcapi import PyTime_AsTimeval_clamp
9987db96d56Sopenharmony_ci
9997db96d56Sopenharmony_ci        if sys.platform == 'win32':
10007db96d56Sopenharmony_ci            from _testcapi import LONG_MIN, LONG_MAX
10017db96d56Sopenharmony_ci            tv_sec_max = LONG_MAX
10027db96d56Sopenharmony_ci            tv_sec_min = LONG_MIN
10037db96d56Sopenharmony_ci        else:
10047db96d56Sopenharmony_ci            tv_sec_max = self.time_t_max
10057db96d56Sopenharmony_ci            tv_sec_min = self.time_t_min
10067db96d56Sopenharmony_ci
10077db96d56Sopenharmony_ci        for t in (_PyTime_MIN, _PyTime_MAX):
10087db96d56Sopenharmony_ci            ts = PyTime_AsTimeval_clamp(t, _PyTime.ROUND_CEILING)
10097db96d56Sopenharmony_ci            with decimal.localcontext() as context:
10107db96d56Sopenharmony_ci                context.rounding = decimal.ROUND_CEILING
10117db96d56Sopenharmony_ci                us = self.decimal_round(decimal.Decimal(t) / US_TO_NS)
10127db96d56Sopenharmony_ci            tv_sec, tv_usec = divmod(us, SEC_TO_US)
10137db96d56Sopenharmony_ci            if tv_sec_max < tv_sec:
10147db96d56Sopenharmony_ci                tv_sec = tv_sec_max
10157db96d56Sopenharmony_ci                tv_usec = 0
10167db96d56Sopenharmony_ci            elif tv_sec < tv_sec_min:
10177db96d56Sopenharmony_ci                tv_sec = tv_sec_min
10187db96d56Sopenharmony_ci                tv_usec = 0
10197db96d56Sopenharmony_ci            self.assertEqual(ts, (tv_sec, tv_usec))
10207db96d56Sopenharmony_ci
10217db96d56Sopenharmony_ci    @unittest.skipUnless(hasattr(_testcapi, 'PyTime_AsTimespec_clamp'),
10227db96d56Sopenharmony_ci                         'need _testcapi.PyTime_AsTimespec_clamp')
10237db96d56Sopenharmony_ci    def test_AsTimespec_clamp(self):
10247db96d56Sopenharmony_ci        from _testcapi import PyTime_AsTimespec_clamp
10257db96d56Sopenharmony_ci
10267db96d56Sopenharmony_ci        for t in (_PyTime_MIN, _PyTime_MAX):
10277db96d56Sopenharmony_ci            ts = PyTime_AsTimespec_clamp(t)
10287db96d56Sopenharmony_ci            tv_sec, tv_nsec = divmod(t, NS_TO_SEC)
10297db96d56Sopenharmony_ci            if self.time_t_max < tv_sec:
10307db96d56Sopenharmony_ci                tv_sec = self.time_t_max
10317db96d56Sopenharmony_ci                tv_nsec = 0
10327db96d56Sopenharmony_ci            elif tv_sec < self.time_t_min:
10337db96d56Sopenharmony_ci                tv_sec = self.time_t_min
10347db96d56Sopenharmony_ci                tv_nsec = 0
10357db96d56Sopenharmony_ci            self.assertEqual(ts, (tv_sec, tv_nsec))
10367db96d56Sopenharmony_ci
10377db96d56Sopenharmony_ci    def test_AsMilliseconds(self):
10387db96d56Sopenharmony_ci        from _testcapi import PyTime_AsMilliseconds
10397db96d56Sopenharmony_ci
10407db96d56Sopenharmony_ci        self.check_int_rounding(PyTime_AsMilliseconds,
10417db96d56Sopenharmony_ci                                self.create_decimal_converter(MS_TO_NS),
10427db96d56Sopenharmony_ci                                NS_TO_SEC)
10437db96d56Sopenharmony_ci
10447db96d56Sopenharmony_ci    def test_AsMicroseconds(self):
10457db96d56Sopenharmony_ci        from _testcapi import PyTime_AsMicroseconds
10467db96d56Sopenharmony_ci
10477db96d56Sopenharmony_ci        self.check_int_rounding(PyTime_AsMicroseconds,
10487db96d56Sopenharmony_ci                                self.create_decimal_converter(US_TO_NS),
10497db96d56Sopenharmony_ci                                NS_TO_SEC)
10507db96d56Sopenharmony_ci
10517db96d56Sopenharmony_ci
10527db96d56Sopenharmony_ciclass TestOldPyTime(CPyTimeTestCase, unittest.TestCase):
10537db96d56Sopenharmony_ci    """
10547db96d56Sopenharmony_ci    Test the old C _PyTime_t API: _PyTime_ObjectToXXX() functions.
10557db96d56Sopenharmony_ci    """
10567db96d56Sopenharmony_ci
10577db96d56Sopenharmony_ci    # time_t is a 32-bit or 64-bit signed integer
10587db96d56Sopenharmony_ci    OVERFLOW_SECONDS = 2 ** 64
10597db96d56Sopenharmony_ci
10607db96d56Sopenharmony_ci    def test_object_to_time_t(self):
10617db96d56Sopenharmony_ci        from _testcapi import pytime_object_to_time_t
10627db96d56Sopenharmony_ci
10637db96d56Sopenharmony_ci        self.check_int_rounding(pytime_object_to_time_t,
10647db96d56Sopenharmony_ci                                lambda secs: secs,
10657db96d56Sopenharmony_ci                                value_filter=self.time_t_filter)
10667db96d56Sopenharmony_ci
10677db96d56Sopenharmony_ci        self.check_float_rounding(pytime_object_to_time_t,
10687db96d56Sopenharmony_ci                                  self.decimal_round,
10697db96d56Sopenharmony_ci                                  value_filter=self.time_t_filter)
10707db96d56Sopenharmony_ci
10717db96d56Sopenharmony_ci    def create_converter(self, sec_to_unit):
10727db96d56Sopenharmony_ci        def converter(secs):
10737db96d56Sopenharmony_ci            floatpart, intpart = math.modf(secs)
10747db96d56Sopenharmony_ci            intpart = int(intpart)
10757db96d56Sopenharmony_ci            floatpart *= sec_to_unit
10767db96d56Sopenharmony_ci            floatpart = self.decimal_round(floatpart)
10777db96d56Sopenharmony_ci            if floatpart < 0:
10787db96d56Sopenharmony_ci                floatpart += sec_to_unit
10797db96d56Sopenharmony_ci                intpart -= 1
10807db96d56Sopenharmony_ci            elif floatpart >= sec_to_unit:
10817db96d56Sopenharmony_ci                floatpart -= sec_to_unit
10827db96d56Sopenharmony_ci                intpart += 1
10837db96d56Sopenharmony_ci            return (intpart, floatpart)
10847db96d56Sopenharmony_ci        return converter
10857db96d56Sopenharmony_ci
10867db96d56Sopenharmony_ci    def test_object_to_timeval(self):
10877db96d56Sopenharmony_ci        from _testcapi import pytime_object_to_timeval
10887db96d56Sopenharmony_ci
10897db96d56Sopenharmony_ci        self.check_int_rounding(pytime_object_to_timeval,
10907db96d56Sopenharmony_ci                                lambda secs: (secs, 0),
10917db96d56Sopenharmony_ci                                value_filter=self.time_t_filter)
10927db96d56Sopenharmony_ci
10937db96d56Sopenharmony_ci        self.check_float_rounding(pytime_object_to_timeval,
10947db96d56Sopenharmony_ci                                  self.create_converter(SEC_TO_US),
10957db96d56Sopenharmony_ci                                  value_filter=self.time_t_filter)
10967db96d56Sopenharmony_ci
10977db96d56Sopenharmony_ci         # test nan
10987db96d56Sopenharmony_ci        for time_rnd, _ in ROUNDING_MODES:
10997db96d56Sopenharmony_ci            with self.assertRaises(ValueError):
11007db96d56Sopenharmony_ci                pytime_object_to_timeval(float('nan'), time_rnd)
11017db96d56Sopenharmony_ci
11027db96d56Sopenharmony_ci    def test_object_to_timespec(self):
11037db96d56Sopenharmony_ci        from _testcapi import pytime_object_to_timespec
11047db96d56Sopenharmony_ci
11057db96d56Sopenharmony_ci        self.check_int_rounding(pytime_object_to_timespec,
11067db96d56Sopenharmony_ci                                lambda secs: (secs, 0),
11077db96d56Sopenharmony_ci                                value_filter=self.time_t_filter)
11087db96d56Sopenharmony_ci
11097db96d56Sopenharmony_ci        self.check_float_rounding(pytime_object_to_timespec,
11107db96d56Sopenharmony_ci                                  self.create_converter(SEC_TO_NS),
11117db96d56Sopenharmony_ci                                  value_filter=self.time_t_filter)
11127db96d56Sopenharmony_ci
11137db96d56Sopenharmony_ci        # test nan
11147db96d56Sopenharmony_ci        for time_rnd, _ in ROUNDING_MODES:
11157db96d56Sopenharmony_ci            with self.assertRaises(ValueError):
11167db96d56Sopenharmony_ci                pytime_object_to_timespec(float('nan'), time_rnd)
11177db96d56Sopenharmony_ci
11187db96d56Sopenharmony_ci@unittest.skipUnless(sys.platform == "darwin", "test weak linking on macOS")
11197db96d56Sopenharmony_ciclass TestTimeWeaklinking(unittest.TestCase):
11207db96d56Sopenharmony_ci    # These test cases verify that weak linking support on macOS works
11217db96d56Sopenharmony_ci    # as expected. These cases only test new behaviour introduced by weak linking,
11227db96d56Sopenharmony_ci    # regular behaviour is tested by the normal test cases.
11237db96d56Sopenharmony_ci    #
11247db96d56Sopenharmony_ci    # See the section on Weak Linking in Mac/README.txt for more information.
11257db96d56Sopenharmony_ci    def test_clock_functions(self):
11267db96d56Sopenharmony_ci        import sysconfig
11277db96d56Sopenharmony_ci        import platform
11287db96d56Sopenharmony_ci
11297db96d56Sopenharmony_ci        config_vars = sysconfig.get_config_vars()
11307db96d56Sopenharmony_ci        var_name = "HAVE_CLOCK_GETTIME"
11317db96d56Sopenharmony_ci        if var_name not in config_vars or not config_vars[var_name]:
11327db96d56Sopenharmony_ci            raise unittest.SkipTest(f"{var_name} is not available")
11337db96d56Sopenharmony_ci
11347db96d56Sopenharmony_ci        mac_ver = tuple(int(x) for x in platform.mac_ver()[0].split("."))
11357db96d56Sopenharmony_ci
11367db96d56Sopenharmony_ci        clock_names = [
11377db96d56Sopenharmony_ci            "CLOCK_MONOTONIC", "clock_gettime", "clock_gettime_ns", "clock_settime",
11387db96d56Sopenharmony_ci            "clock_settime_ns", "clock_getres"]
11397db96d56Sopenharmony_ci
11407db96d56Sopenharmony_ci        if mac_ver >= (10, 12):
11417db96d56Sopenharmony_ci            for name in clock_names:
11427db96d56Sopenharmony_ci                self.assertTrue(hasattr(time, name), f"time.{name} is not available")
11437db96d56Sopenharmony_ci
11447db96d56Sopenharmony_ci        else:
11457db96d56Sopenharmony_ci            for name in clock_names:
11467db96d56Sopenharmony_ci                self.assertFalse(hasattr(time, name), f"time.{name} is available")
11477db96d56Sopenharmony_ci
11487db96d56Sopenharmony_ci
11497db96d56Sopenharmony_ciif __name__ == "__main__":
11507db96d56Sopenharmony_ci    unittest.main()
1151