test_time.py 23.3 KB
Newer Older
1
from test import support
2
import time
3
import unittest
4 5 6 7
import locale
import sysconfig
import sys
import platform
8 9 10 11
try:
    import threading
except ImportError:
    threading = None
12

13 14 15 16 17 18
# Max year is only limited by the size of C int.
SIZEOF_INT = sysconfig.get_config_var('SIZEOF_INT') or 4
TIME_MAXYEAR = (1 << 8 * SIZEOF_INT - 1) - 1
TIME_MINYEAR = -TIME_MAXYEAR - 1


19 20 21 22 23 24 25 26 27 28 29
class TimeTestCase(unittest.TestCase):

    def setUp(self):
        self.t = time.time()

    def test_data_attributes(self):
        time.altzone
        time.daylight
        time.timezone
        time.tzname

30 31 32
    def test_time(self):
        time.time()
        info = time.get_clock_info('time')
33
        self.assertFalse(info.monotonic)
34
        if sys.platform != 'win32':
35
            self.assertTrue(info.adjusted)
36

37 38 39
    def test_clock(self):
        time.clock()

40
        info = time.get_clock_info('clock')
41 42
        self.assertTrue(info.monotonic)
        self.assertFalse(info.adjusted)
43

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
    @unittest.skipUnless(hasattr(time, 'clock_gettime'),
                         'need time.clock_gettime()')
    def test_clock_realtime(self):
        time.clock_gettime(time.CLOCK_REALTIME)

    @unittest.skipUnless(hasattr(time, 'clock_gettime'),
                         'need time.clock_gettime()')
    @unittest.skipUnless(hasattr(time, 'CLOCK_MONOTONIC'),
                         'need time.CLOCK_MONOTONIC')
    def test_clock_monotonic(self):
        a = time.clock_gettime(time.CLOCK_MONOTONIC)
        b = time.clock_gettime(time.CLOCK_MONOTONIC)
        self.assertLessEqual(a, b)

    @unittest.skipUnless(hasattr(time, 'clock_getres'),
                         'need time.clock_getres()')
    def test_clock_getres(self):
        res = time.clock_getres(time.CLOCK_REALTIME)
        self.assertGreater(res, 0.0)
        self.assertLessEqual(res, 1.0)

65 66 67 68 69 70 71 72 73
    @unittest.skipUnless(hasattr(time, 'clock_settime'),
                         'need time.clock_settime()')
    def test_clock_settime(self):
        t = time.clock_gettime(time.CLOCK_REALTIME)
        try:
            time.clock_settime(time.CLOCK_REALTIME, t)
        except PermissionError:
            pass

74 75 76
        if hasattr(time, 'CLOCK_MONOTONIC'):
            self.assertRaises(OSError,
                              time.clock_settime, time.CLOCK_MONOTONIC, 0)
77

78
    def test_conversions(self):
79 80 81 82
        self.assertEqual(time.ctime(self.t),
                         time.asctime(time.localtime(self.t)))
        self.assertEqual(int(time.mktime(time.localtime(self.t))),
                         int(self.t))
83 84

    def test_sleep(self):
85 86
        self.assertRaises(ValueError, time.sleep, -2)
        self.assertRaises(ValueError, time.sleep, -1)
87 88 89 90 91 92 93 94 95 96 97 98 99
        time.sleep(1.2)

    def test_strftime(self):
        tt = time.gmtime(self.t)
        for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I',
                          'j', 'm', 'M', 'p', 'S',
                          'U', 'w', 'W', 'x', 'X', 'y', 'Y', 'Z', '%'):
            format = ' %' + directive
            try:
                time.strftime(format, tt)
            except ValueError:
                self.fail('conversion specifier: %r failed.' % format)

100 101 102 103 104 105 106
        # Issue #10762: Guard against invalid/non-supported format string
        # so that Python don't crash (Windows crashes when the format string
        # input to [w]strftime is not kosher.
        if sys.platform.startswith('win'):
            with self.assertRaises(ValueError):
                time.strftime('%f')

107
    def _bounds_checking(self, func):
108
        # Make sure that strftime() checks the bounds of the various parts
109
        # of the time tuple (0 is valid for *all* values).
110

111 112
        # The year field is tested by other test cases above

113
        # Check month [1, 12] + zero support
114 115
        func((1900, 0, 1, 0, 0, 0, 0, 1, -1))
        func((1900, 12, 1, 0, 0, 0, 0, 1, -1))
116
        self.assertRaises(ValueError, func,
117
                            (1900, -1, 1, 0, 0, 0, 0, 1, -1))
118
        self.assertRaises(ValueError, func,
119
                            (1900, 13, 1, 0, 0, 0, 0, 1, -1))
120
        # Check day of month [1, 31] + zero support
121 122
        func((1900, 1, 0, 0, 0, 0, 0, 1, -1))
        func((1900, 1, 31, 0, 0, 0, 0, 1, -1))
123
        self.assertRaises(ValueError, func,
124
                            (1900, 1, -1, 0, 0, 0, 0, 1, -1))
125
        self.assertRaises(ValueError, func,
126
                            (1900, 1, 32, 0, 0, 0, 0, 1, -1))
127
        # Check hour [0, 23]
128
        func((1900, 1, 1, 23, 0, 0, 0, 1, -1))
129
        self.assertRaises(ValueError, func,
130
                            (1900, 1, 1, -1, 0, 0, 0, 1, -1))
131
        self.assertRaises(ValueError, func,
132
                            (1900, 1, 1, 24, 0, 0, 0, 1, -1))
133
        # Check minute [0, 59]
134
        func((1900, 1, 1, 0, 59, 0, 0, 1, -1))
135
        self.assertRaises(ValueError, func,
136
                            (1900, 1, 1, 0, -1, 0, 0, 1, -1))
137
        self.assertRaises(ValueError, func,
138
                            (1900, 1, 1, 0, 60, 0, 0, 1, -1))
139
        # Check second [0, 61]
140
        self.assertRaises(ValueError, func,
141 142 143
                            (1900, 1, 1, 0, 0, -1, 0, 1, -1))
        # C99 only requires allowing for one leap second, but Python's docs say
        # allow two leap seconds (0..61)
144 145
        func((1900, 1, 1, 0, 0, 60, 0, 1, -1))
        func((1900, 1, 1, 0, 0, 61, 0, 1, -1))
146
        self.assertRaises(ValueError, func,
147 148 149 150 151
                            (1900, 1, 1, 0, 0, 62, 0, 1, -1))
        # No check for upper-bound day of week;
        #  value forced into range by a ``% 7`` calculation.
        # Start check at -2 since gettmarg() increments value before taking
        #  modulo.
152 153
        self.assertEqual(func((1900, 1, 1, 0, 0, 0, -1, 1, -1)),
                         func((1900, 1, 1, 0, 0, 0, +6, 1, -1)))
154
        self.assertRaises(ValueError, func,
155
                            (1900, 1, 1, 0, 0, 0, -2, 1, -1))
156
        # Check day of the year [1, 366] + zero support
157 158
        func((1900, 1, 1, 0, 0, 0, 0, 0, -1))
        func((1900, 1, 1, 0, 0, 0, 0, 366, -1))
159
        self.assertRaises(ValueError, func,
160
                            (1900, 1, 1, 0, 0, 0, 0, -1, -1))
161
        self.assertRaises(ValueError, func,
162 163
                            (1900, 1, 1, 0, 0, 0, 0, 367, -1))

164 165 166
    def test_strftime_bounding_check(self):
        self._bounds_checking(lambda tup: time.strftime('', tup))

167
    def test_default_values_for_zero(self):
168 169 170 171
        # Make sure that using all zeros uses the proper default
        # values.  No test for daylight savings since strftime() does
        # not change output based on its value and no test for year
        # because systems vary in their support for year 0.
172
        expected = "2000 01 01 00 00 00 1 001"
173
        with support.check_warnings():
174
            result = time.strftime("%Y %m %d %H %M %S %w %j", (2000,)+(0,)*8)
175
        self.assertEqual(expected, result)
176

177
    def test_strptime(self):
178 179
        # Should be able to go round-trip from strftime to strptime without
        # throwing an exception.
180 181 182 183
        tt = time.gmtime(self.t)
        for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I',
                          'j', 'm', 'M', 'p', 'S',
                          'U', 'w', 'W', 'x', 'X', 'y', 'Y', 'Z', '%'):
184 185
            format = '%' + directive
            strf_output = time.strftime(format, tt)
186
            try:
187
                time.strptime(strf_output, format)
188
            except ValueError:
189 190
                self.fail("conversion specifier %r failed with '%s' input." %
                          (format, strf_output))
191

192 193 194 195 196
    def test_strptime_bytes(self):
        # Make sure only strings are accepted as arguments to strptime.
        self.assertRaises(TypeError, time.strptime, b'2009', "%Y")
        self.assertRaises(TypeError, time.strptime, '2009', b'%Y')

197 198
    def test_asctime(self):
        time.asctime(time.gmtime(self.t))
199 200

        # Max year is only limited by the size of C int.
201 202 203 204 205 206 207
        for bigyear in TIME_MAXYEAR, TIME_MINYEAR:
            asc = time.asctime((bigyear, 6, 1) + (0,) * 6)
            self.assertEqual(asc[-len(str(bigyear)):], str(bigyear))
        self.assertRaises(OverflowError, time.asctime,
                          (TIME_MAXYEAR + 1,) + (0,) * 8)
        self.assertRaises(OverflowError, time.asctime,
                          (TIME_MINYEAR - 1,) + (0,) * 8)
208
        self.assertRaises(TypeError, time.asctime, 0)
209
        self.assertRaises(TypeError, time.asctime, ())
210
        self.assertRaises(TypeError, time.asctime, (0,) * 10)
211

212 213 214
    def test_asctime_bounding_check(self):
        self._bounds_checking(time.asctime)

Georg Brandl's avatar
Georg Brandl committed
215
    def test_ctime(self):
216 217 218 219
        t = time.mktime((1973, 9, 16, 1, 3, 52, 0, 0, -1))
        self.assertEqual(time.ctime(t), 'Sun Sep 16 01:03:52 1973')
        t = time.mktime((2000, 1, 1, 0, 0, 0, 0, 0, -1))
        self.assertEqual(time.ctime(t), 'Sat Jan  1 00:00:00 2000')
220 221 222 223 224 225 226 227 228
        for year in [-100, 100, 1000, 2000, 10000]:
            try:
                testval = time.mktime((year, 1, 10) + (0,)*6)
            except (ValueError, OverflowError):
                # If mktime fails, ctime will fail too.  This may happen
                # on some platforms.
                pass
            else:
                self.assertEqual(time.ctime(testval)[20:], str(year))
Georg Brandl's avatar
Georg Brandl committed
229

230 231
    @unittest.skipUnless(hasattr(time, "tzset"),
                         "time module has no attribute tzset")
232
    def test_tzset(self):
233

234 235
        from os import environ

Tim Peters's avatar
Tim Peters committed
236
        # Epoch time of midnight Dec 25th 2002. Never DST in northern
237
        # hemisphere.
Tim Peters's avatar
Tim Peters committed
238
        xmas2002 = 1040774400.0
239

240 241 242 243 244
        # These formats are correct for 2002, and possibly future years
        # This format is the 'standard' as documented at:
        # http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap08.html
        # They are also documented in the tzset(3) man page on most Unix
        # systems.
Tim Peters's avatar
Tim Peters committed
245
        eastern = 'EST+05EDT,M4.1.0,M10.5.0'
246 247 248
        victoria = 'AEST-10AEDT-11,M10.5.0,M3.5.0'
        utc='UTC+0'

249 250 251 252
        org_TZ = environ.get('TZ',None)
        try:
            # Make sure we can switch to UTC time and results are correct
            # Note that unknown timezones default to UTC.
253 254
            # Note that altzone is undefined in UTC, as there is no DST
            environ['TZ'] = eastern
255
            time.tzset()
256
            environ['TZ'] = utc
257
            time.tzset()
258
            self.assertEqual(
259 260
                time.gmtime(xmas2002), time.localtime(xmas2002)
                )
261 262 263
            self.assertEqual(time.daylight, 0)
            self.assertEqual(time.timezone, 0)
            self.assertEqual(time.localtime(xmas2002).tm_isdst, 0)
264

265 266
            # Make sure we can switch to US/Eastern
            environ['TZ'] = eastern
267
            time.tzset()
268 269 270 271 272 273 274 275
            self.assertNotEqual(time.gmtime(xmas2002), time.localtime(xmas2002))
            self.assertEqual(time.tzname, ('EST', 'EDT'))
            self.assertEqual(len(time.tzname), 2)
            self.assertEqual(time.daylight, 1)
            self.assertEqual(time.timezone, 18000)
            self.assertEqual(time.altzone, 14400)
            self.assertEqual(time.localtime(xmas2002).tm_isdst, 0)
            self.assertEqual(len(time.tzname), 2)
276 277 278 279

            # Now go to the southern hemisphere.
            environ['TZ'] = victoria
            time.tzset()
280
            self.assertNotEqual(time.gmtime(xmas2002), time.localtime(xmas2002))
281 282

            # Issue #11886: Australian Eastern Standard Time (UTC+10) is called
283 284 285 286 287
            # "EST" (as Eastern Standard Time, UTC-5) instead of "AEST"
            # (non-DST timezone), and "EDT" instead of "AEDT" (DST timezone),
            # on some operating systems (e.g. FreeBSD), which is wrong. See for
            # example this bug:
            # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=93810
288
            self.assertIn(time.tzname[0], ('AEST' 'EST'), time.tzname[0])
289
            self.assertTrue(time.tzname[1] in ('AEDT', 'EDT'), str(time.tzname[1]))
290 291 292 293 294
            self.assertEqual(len(time.tzname), 2)
            self.assertEqual(time.daylight, 1)
            self.assertEqual(time.timezone, -36000)
            self.assertEqual(time.altzone, -39600)
            self.assertEqual(time.localtime(xmas2002).tm_isdst, 1)
295 296 297 298 299 300

        finally:
            # Repair TZ environment variable in case any other tests
            # rely on it.
            if org_TZ is not None:
                environ['TZ'] = org_TZ
301
            elif 'TZ' in environ:
302
                del environ['TZ']
303
            time.tzset()
Tim Peters's avatar
Tim Peters committed
304

305 306 307 308 309 310 311
    def test_insane_timestamps(self):
        # It's possible that some platform maps time_t to double,
        # and that this test will fail there.  This test should
        # exempt such platforms (provided they return reasonable
        # results!).
        for func in time.ctime, time.gmtime, time.localtime:
            for unreasonable in -1e200, 1e200:
312
                self.assertRaises(OverflowError, func, unreasonable)
313

314 315 316 317 318 319 320 321
    def test_ctime_without_arg(self):
        # Not sure how to check the values, since the clock could tick
        # at any time.  Make sure these are at least accepted and
        # don't raise errors.
        time.ctime()
        time.ctime(None)

    def test_gmtime_without_arg(self):
322 323 324 325
        gt0 = time.gmtime()
        gt1 = time.gmtime(None)
        t0 = time.mktime(gt0)
        t1 = time.mktime(gt1)
326
        self.assertAlmostEqual(t1, t0, delta=0.2)
327 328

    def test_localtime_without_arg(self):
329 330 331 332
        lt0 = time.localtime()
        lt1 = time.localtime(None)
        t0 = time.mktime(lt0)
        t1 = time.mktime(lt1)
333
        self.assertAlmostEqual(t1, t0, delta=0.2)
334

335
    def test_mktime(self):
336 337 338 339
        # Issue #1726687
        for t in (-2, -1, 0, 1):
            try:
                tt = time.localtime(t)
340
            except (OverflowError, OSError):
341 342 343
                pass
            else:
                self.assertEqual(time.mktime(tt), t)
344 345 346 347 348 349

    # Issue #13309: passing extreme values to mktime() or localtime()
    # borks the glibc's internal timezone data.
    @unittest.skipUnless(platform.libc_ver()[0] != 'glibc',
                         "disabled because of a bug in glibc. Issue #13309")
    def test_mktime_error(self):
350 351 352
        # It may not be possible to reliably make mktime return error
        # on all platfom.  This will make sure that no other exception
        # than OverflowError is raised for an extreme value.
353 354 355
        tt = time.gmtime(self.t)
        tzname = time.strftime('%Z', tt)
        self.assertNotEqual(tzname, 'LMT')
356 357 358 359
        try:
            time.mktime((-1, 1, 1, 0, 0, 0, -1, -1, -1))
        except OverflowError:
            pass
360
        self.assertEqual(time.strftime('%Z', tt), tzname)
361

362 363 364 365
    @unittest.skipUnless(hasattr(time, 'monotonic'),
                         'need time.monotonic')
    def test_monotonic(self):
        t1 = time.monotonic()
366
        time.sleep(0.1)
367
        t2 = time.monotonic()
368
        dt = t2 - t1
369
        self.assertGreater(t2, t1)
370
        self.assertAlmostEqual(dt, 0.1, delta=0.2)
371

372
        info = time.get_clock_info('monotonic')
373
        self.assertTrue(info.monotonic)
374
        if sys.platform == 'linux':
375
            self.assertTrue(info.adjusted)
376
        else:
377
            self.assertFalse(info.adjusted)
378 379 380 381 382 383 384 385 386 387 388

    def test_perf_counter(self):
        time.perf_counter()

    def test_process_time(self):
        start = time.process_time()
        time.sleep(0.1)
        stop = time.process_time()
        self.assertLess(stop - start, 0.01)

        info = time.get_clock_info('process_time')
389 390
        self.assertTrue(info.monotonic)
        self.assertFalse(info.adjusted)
391 392 393 394 395 396 397 398 399

    @unittest.skipUnless(hasattr(time, 'monotonic'),
                         'need time.monotonic')
    @unittest.skipUnless(hasattr(time, 'clock_settime'),
                         'need time.clock_settime')
    def test_monotonic_settime(self):
        t1 = time.monotonic()
        realtime = time.clock_gettime(time.CLOCK_REALTIME)
        # jump backward with an offset of 1 hour
400
        try:
401 402 403 404 405 406
            time.clock_settime(time.CLOCK_REALTIME, realtime - 3600)
        except PermissionError as err:
            self.skipTest(err)
        t2 = time.monotonic()
        time.clock_settime(time.CLOCK_REALTIME, realtime)
        # monotonic must not be affected by system clock updates
407 408
        self.assertGreaterEqual(t2, t1)

409 410
    def test_localtime_failure(self):
        # Issue #13847: check for localtime() failure
411 412 413 414
        invalid_time_t = None
        for time_t in (-1, 2**30, 2**33, 2**60):
            try:
                time.localtime(time_t)
415 416
            except OverflowError:
                self.skipTest("need 64-bit time_t")
417 418 419 420 421 422
            except OSError:
                invalid_time_t = time_t
                break
        if invalid_time_t is None:
            self.skipTest("unable to find an invalid time_t value")

423 424
        self.assertRaises(OSError, time.localtime, invalid_time_t)
        self.assertRaises(OSError, time.ctime, invalid_time_t)
425

426 427 428 429 430 431 432 433 434 435
    def test_get_clock_info(self):
        clocks = ['clock', 'perf_counter', 'process_time', 'time']
        if hasattr(time, 'monotonic'):
            clocks.append('monotonic')

        for name in clocks:
            info = time.get_clock_info(name)
            #self.assertIsInstance(info, dict)
            self.assertIsInstance(info.implementation, str)
            self.assertNotEqual(info.implementation, '')
436
            self.assertIsInstance(info.monotonic, bool)
437 438 439 440
            self.assertIsInstance(info.resolution, float)
            # 0.0 < resolution <= 1.0
            self.assertGreater(info.resolution, 0.0)
            self.assertLessEqual(info.resolution, 1.0)
441
            self.assertIsInstance(info.adjusted, bool)
442 443 444 445

        self.assertRaises(ValueError, time.get_clock_info, 'xxx')


446 447 448 449 450 451
class TestLocale(unittest.TestCase):
    def setUp(self):
        self.oldloc = locale.setlocale(locale.LC_ALL)

    def tearDown(self):
        locale.setlocale(locale.LC_ALL, self.oldloc)
452

Martin v. Löwis's avatar
Martin v. Löwis committed
453
    def test_bug_3061(self):
454 455 456 457 458 459 460 461
        try:
            tmp = locale.setlocale(locale.LC_ALL, "fr_FR")
        except locale.Error:
            # skip this test
            return
        # This should not cause an exception
        time.strftime("%B", (2009,2,1,0,0,0,0,0,0))

462 463

class _BaseYearTest(unittest.TestCase):
464
    def yearstr(self, y):
465 466 467
        raise NotImplementedError()

class _TestAsctimeYear:
468 469
    _format = '%d'

470
    def yearstr(self, y):
471
        return time.asctime((y,) + (0,) * 8).split()[-1]
472

473
    def test_large_year(self):
474
        # Check that it doesn't crash for year > 9999
475 476 477 478
        self.assertEqual(self.yearstr(12345), '12345')
        self.assertEqual(self.yearstr(123456789), '123456789')

class _TestStrftimeYear:
479 480 481 482 483 484 485 486 487 488 489

    # Issue 13305:  For years < 1000, the value is not always
    # padded to 4 digits across platforms.  The C standard
    # assumes year >= 1900, so it does not specify the number
    # of digits.

    if time.strftime('%Y', (1,) + (0,) * 8) == '0001':
        _format = '%04d'
    else:
        _format = '%d'

490
    def yearstr(self, y):
491 492 493 494 495 496 497 498 499 500 501
        return time.strftime('%Y', (y,) + (0,) * 8)

    def test_4dyear(self):
        # Check that we can return the zero padded value.
        if self._format == '%04d':
            self.test_year('%04d')
        else:
            def year4d(y):
                return time.strftime('%4Y', (y,) + (0,) * 8)
            self.test_year('%04d', func=year4d)

502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523
    def skip_if_not_supported(y):
        msg = "strftime() is limited to [1; 9999] with Visual Studio"
        # Check that it doesn't crash for year > 9999
        try:
            time.strftime('%Y', (y,) + (0,) * 8)
        except ValueError:
            cond = False
        else:
            cond = True
        return unittest.skipUnless(cond, msg)

    @skip_if_not_supported(10000)
    def test_large_year(self):
        return super().test_large_year()

    @skip_if_not_supported(0)
    def test_negative(self):
        return super().test_negative()

    del skip_if_not_supported


524 525 526 527 528 529 530 531 532 533 534 535
class _Test4dYear(_BaseYearTest):
    _format = '%d'

    def test_year(self, fmt=None, func=None):
        fmt = fmt or self._format
        func = func or self.yearstr
        self.assertEqual(func(1),    fmt % 1)
        self.assertEqual(func(68),   fmt % 68)
        self.assertEqual(func(69),   fmt % 69)
        self.assertEqual(func(99),   fmt % 99)
        self.assertEqual(func(999),  fmt % 999)
        self.assertEqual(func(9999), fmt % 9999)
536 537

    def test_large_year(self):
538
        self.assertEqual(self.yearstr(12345), '12345')
539
        self.assertEqual(self.yearstr(123456789), '123456789')
540 541
        self.assertEqual(self.yearstr(TIME_MAXYEAR), str(TIME_MAXYEAR))
        self.assertRaises(OverflowError, self.yearstr, TIME_MAXYEAR + 1)
542

543
    def test_negative(self):
544
        self.assertEqual(self.yearstr(-1), self._format % -1)
545 546
        self.assertEqual(self.yearstr(-1234), '-1234')
        self.assertEqual(self.yearstr(-123456), '-123456')
547 548
        self.assertEqual(self.yearstr(-123456789), str(-123456789))
        self.assertEqual(self.yearstr(-1234567890), str(-1234567890))
549 550 551 552
        self.assertEqual(self.yearstr(TIME_MINYEAR + 1900), str(TIME_MINYEAR + 1900))
        # Issue #13312: it may return wrong value for year < TIME_MINYEAR + 1900
        # Skip the value test, but check that no error is raised
        self.yearstr(TIME_MINYEAR)
553
        # self.assertEqual(self.yearstr(TIME_MINYEAR), str(TIME_MINYEAR))
554
        self.assertRaises(OverflowError, self.yearstr, TIME_MINYEAR - 1)
555

556

557 558 559 560
class TestAsctime4dyear(_TestAsctimeYear, _Test4dYear):
    pass

class TestStrftime4dyear(_TestStrftimeYear, _Test4dYear):
561
    pass
562

563

564
class TestPytime(unittest.TestCase):
565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604
    def setUp(self):
        self.invalid_values = (
            -(2 ** 100), 2 ** 100,
            -(2.0 ** 100.0), 2.0 ** 100.0,
        )

    def test_time_t(self):
        from _testcapi import pytime_object_to_time_t
        for obj, time_t in (
            (0, 0),
            (-1, -1),
            (-1.0, -1),
            (-1.9, -1),
            (1.0, 1),
            (1.9, 1),
        ):
            self.assertEqual(pytime_object_to_time_t(obj), time_t)

        for invalid in self.invalid_values:
            self.assertRaises(OverflowError, pytime_object_to_time_t, invalid)

    def test_timeval(self):
        from _testcapi import pytime_object_to_timeval
        for obj, timeval in (
            (0, (0, 0)),
            (-1, (-1, 0)),
            (-1.0, (-1, 0)),
            (1e-6, (0, 1)),
            (-1e-6, (-1, 999999)),
            (-1.2, (-2, 800000)),
            (1.1234560, (1, 123456)),
            (1.1234569, (1, 123456)),
            (-1.1234560, (-2, 876544)),
            (-1.1234561, (-2, 876543)),
        ):
            self.assertEqual(pytime_object_to_timeval(obj), timeval)

        for invalid in self.invalid_values:
            self.assertRaises(OverflowError, pytime_object_to_timeval, invalid)

605 606 607 608 609 610
    def test_timespec(self):
        from _testcapi import pytime_object_to_timespec
        for obj, timespec in (
            (0, (0, 0)),
            (-1, (-1, 0)),
            (-1.0, (-1, 0)),
611
            (1e-9, (0, 1)),
612 613
            (-1e-9, (-1, 999999999)),
            (-1.2, (-2, 800000000)),
614 615 616 617
            (1.1234567890, (1, 123456789)),
            (1.1234567899, (1, 123456789)),
            (-1.1234567890, (-2, 876543211)),
            (-1.1234567891, (-2, 876543210)),
618 619 620
        ):
            self.assertEqual(pytime_object_to_timespec(obj), timespec)

621
        for invalid in self.invalid_values:
622 623 624 625
            self.assertRaises(OverflowError, pytime_object_to_timespec, invalid)



626
def test_main():
627 628 629 630
    support.run_unittest(
        TimeTestCase,
        TestLocale,
        TestAsctime4dyear,
631 632
        TestStrftime4dyear,
        TestPytime)
633 634 635

if __name__ == "__main__":
    test_main()