|
14 | 14 | SIZEOF_INT = sysconfig.get_config_var('SIZEOF_INT') or 4 |
15 | 15 | TIME_MAXYEAR = (1 << 8 * SIZEOF_INT - 1) - 1 |
16 | 16 | TIME_MINYEAR = -TIME_MAXYEAR - 1 |
| 17 | +_PyTime_ROUND_DOWN = 0 |
| 18 | +_PyTime_ROUND_UP = 1 |
17 | 19 |
|
18 | 20 |
|
19 | 21 | class TimeTestCase(unittest.TestCase): |
@@ -585,58 +587,116 @@ def setUp(self): |
585 | 587 | @support.cpython_only |
586 | 588 | def test_time_t(self): |
587 | 589 | from _testcapi import pytime_object_to_time_t |
588 | | - for obj, time_t in ( |
589 | | - (0, 0), |
590 | | - (-1, -1), |
591 | | - (-1.0, -1), |
592 | | - (-1.9, -1), |
593 | | - (1.0, 1), |
594 | | - (1.9, 1), |
| 590 | + for obj, time_t, rnd in ( |
| 591 | + # Round towards zero |
| 592 | + (0, 0, _PyTime_ROUND_DOWN), |
| 593 | + (-1, -1, _PyTime_ROUND_DOWN), |
| 594 | + (-1.0, -1, _PyTime_ROUND_DOWN), |
| 595 | + (-1.9, -1, _PyTime_ROUND_DOWN), |
| 596 | + (1.0, 1, _PyTime_ROUND_DOWN), |
| 597 | + (1.9, 1, _PyTime_ROUND_DOWN), |
| 598 | + # Round away from zero |
| 599 | + (0, 0, _PyTime_ROUND_UP), |
| 600 | + (-1, -1, _PyTime_ROUND_UP), |
| 601 | + (-1.0, -1, _PyTime_ROUND_UP), |
| 602 | + (-1.9, -2, _PyTime_ROUND_UP), |
| 603 | + (1.0, 1, _PyTime_ROUND_UP), |
| 604 | + (1.9, 2, _PyTime_ROUND_UP), |
595 | 605 | ): |
596 | | - self.assertEqual(pytime_object_to_time_t(obj), time_t) |
| 606 | + self.assertEqual(pytime_object_to_time_t(obj, rnd), time_t) |
597 | 607 |
|
| 608 | + rnd = _PyTime_ROUND_DOWN |
598 | 609 | for invalid in self.invalid_values: |
599 | | - self.assertRaises(OverflowError, pytime_object_to_time_t, invalid) |
| 610 | + self.assertRaises(OverflowError, |
| 611 | + pytime_object_to_time_t, invalid, rnd) |
600 | 612 |
|
601 | 613 | @support.cpython_only |
602 | 614 | def test_timeval(self): |
603 | 615 | from _testcapi import pytime_object_to_timeval |
604 | | - for obj, timeval in ( |
605 | | - (0, (0, 0)), |
606 | | - (-1, (-1, 0)), |
607 | | - (-1.0, (-1, 0)), |
608 | | - (1e-6, (0, 1)), |
609 | | - (-1e-6, (-1, 999999)), |
610 | | - (-1.2, (-2, 800000)), |
611 | | - (1.1234560, (1, 123456)), |
612 | | - (1.1234569, (1, 123456)), |
613 | | - (-1.1234560, (-2, 876544)), |
614 | | - (-1.1234561, (-2, 876543)), |
| 616 | + for obj, timeval, rnd in ( |
| 617 | + # Round towards zero |
| 618 | + (0, (0, 0), _PyTime_ROUND_DOWN), |
| 619 | + (-1, (-1, 0), _PyTime_ROUND_DOWN), |
| 620 | + (-1.0, (-1, 0), _PyTime_ROUND_DOWN), |
| 621 | + (1e-6, (0, 1), _PyTime_ROUND_DOWN), |
| 622 | + (1e-7, (0, 0), _PyTime_ROUND_DOWN), |
| 623 | + (-1e-6, (-1, 999999), _PyTime_ROUND_DOWN), |
| 624 | + (-1e-7, (-1, 999999), _PyTime_ROUND_DOWN), |
| 625 | + (-1.2, (-2, 800000), _PyTime_ROUND_DOWN), |
| 626 | + (0.9999999, (0, 999999), _PyTime_ROUND_DOWN), |
| 627 | + (0.0000041, (0, 4), _PyTime_ROUND_DOWN), |
| 628 | + (1.1234560, (1, 123456), _PyTime_ROUND_DOWN), |
| 629 | + (1.1234569, (1, 123456), _PyTime_ROUND_DOWN), |
| 630 | + (-0.0000040, (-1, 999996), _PyTime_ROUND_DOWN), |
| 631 | + (-0.0000041, (-1, 999995), _PyTime_ROUND_DOWN), |
| 632 | + (-1.1234560, (-2, 876544), _PyTime_ROUND_DOWN), |
| 633 | + (-1.1234561, (-2, 876543), _PyTime_ROUND_DOWN), |
| 634 | + # Round away from zero |
| 635 | + (0, (0, 0), _PyTime_ROUND_UP), |
| 636 | + (-1, (-1, 0), _PyTime_ROUND_UP), |
| 637 | + (-1.0, (-1, 0), _PyTime_ROUND_UP), |
| 638 | + (1e-6, (0, 1), _PyTime_ROUND_UP), |
| 639 | + (1e-7, (0, 1), _PyTime_ROUND_UP), |
| 640 | + (-1e-6, (-1, 999999), _PyTime_ROUND_UP), |
| 641 | + (-1e-7, (-1, 999999), _PyTime_ROUND_UP), |
| 642 | + (-1.2, (-2, 800000), _PyTime_ROUND_UP), |
| 643 | + (0.9999999, (1, 0), _PyTime_ROUND_UP), |
| 644 | + (0.0000041, (0, 5), _PyTime_ROUND_UP), |
| 645 | + (1.1234560, (1, 123457), _PyTime_ROUND_UP), |
| 646 | + (1.1234569, (1, 123457), _PyTime_ROUND_UP), |
| 647 | + (-0.0000040, (-1, 999996), _PyTime_ROUND_UP), |
| 648 | + (-0.0000041, (-1, 999995), _PyTime_ROUND_UP), |
| 649 | + (-1.1234560, (-2, 876544), _PyTime_ROUND_UP), |
| 650 | + (-1.1234561, (-2, 876543), _PyTime_ROUND_UP), |
615 | 651 | ): |
616 | | - self.assertEqual(pytime_object_to_timeval(obj), timeval) |
| 652 | + with self.subTest(obj=obj, round=rnd, timeval=timeval): |
| 653 | + self.assertEqual(pytime_object_to_timeval(obj, rnd), timeval) |
617 | 654 |
|
| 655 | + rnd = _PyTime_ROUND_DOWN |
618 | 656 | for invalid in self.invalid_values: |
619 | | - self.assertRaises(OverflowError, pytime_object_to_timeval, invalid) |
| 657 | + self.assertRaises(OverflowError, |
| 658 | + pytime_object_to_timeval, invalid, rnd) |
620 | 659 |
|
621 | 660 | @support.cpython_only |
622 | 661 | def test_timespec(self): |
623 | 662 | from _testcapi import pytime_object_to_timespec |
624 | | - for obj, timespec in ( |
625 | | - (0, (0, 0)), |
626 | | - (-1, (-1, 0)), |
627 | | - (-1.0, (-1, 0)), |
628 | | - (1e-9, (0, 1)), |
629 | | - (-1e-9, (-1, 999999999)), |
630 | | - (-1.2, (-2, 800000000)), |
631 | | - (1.1234567890, (1, 123456789)), |
632 | | - (1.1234567899, (1, 123456789)), |
633 | | - (-1.1234567890, (-2, 876543211)), |
634 | | - (-1.1234567891, (-2, 876543210)), |
| 663 | + for obj, timespec, rnd in ( |
| 664 | + # Round towards zero |
| 665 | + (0, (0, 0), _PyTime_ROUND_DOWN), |
| 666 | + (-1, (-1, 0), _PyTime_ROUND_DOWN), |
| 667 | + (-1.0, (-1, 0), _PyTime_ROUND_DOWN), |
| 668 | + (1e-9, (0, 1), _PyTime_ROUND_DOWN), |
| 669 | + (1e-10, (0, 0), _PyTime_ROUND_DOWN), |
| 670 | + (-1e-9, (-1, 999999999), _PyTime_ROUND_DOWN), |
| 671 | + (-1e-10, (-1, 999999999), _PyTime_ROUND_DOWN), |
| 672 | + (-1.2, (-2, 800000000), _PyTime_ROUND_DOWN), |
| 673 | + (0.9999999999, (0, 999999999), _PyTime_ROUND_DOWN), |
| 674 | + (1.1234567890, (1, 123456789), _PyTime_ROUND_DOWN), |
| 675 | + (1.1234567899, (1, 123456789), _PyTime_ROUND_DOWN), |
| 676 | + (-1.1234567890, (-2, 876543211), _PyTime_ROUND_DOWN), |
| 677 | + (-1.1234567891, (-2, 876543210), _PyTime_ROUND_DOWN), |
| 678 | + # Round away from zero |
| 679 | + (0, (0, 0), _PyTime_ROUND_UP), |
| 680 | + (-1, (-1, 0), _PyTime_ROUND_UP), |
| 681 | + (-1.0, (-1, 0), _PyTime_ROUND_UP), |
| 682 | + (1e-9, (0, 1), _PyTime_ROUND_UP), |
| 683 | + (1e-10, (0, 1), _PyTime_ROUND_UP), |
| 684 | + (-1e-9, (-1, 999999999), _PyTime_ROUND_UP), |
| 685 | + (-1e-10, (-1, 999999999), _PyTime_ROUND_UP), |
| 686 | + (-1.2, (-2, 800000000), _PyTime_ROUND_UP), |
| 687 | + (0.9999999999, (1, 0), _PyTime_ROUND_UP), |
| 688 | + (1.1234567890, (1, 123456790), _PyTime_ROUND_UP), |
| 689 | + (1.1234567899, (1, 123456790), _PyTime_ROUND_UP), |
| 690 | + (-1.1234567890, (-2, 876543211), _PyTime_ROUND_UP), |
| 691 | + (-1.1234567891, (-2, 876543210), _PyTime_ROUND_UP), |
635 | 692 | ): |
636 | | - self.assertEqual(pytime_object_to_timespec(obj), timespec) |
| 693 | + with self.subTest(obj=obj, round=rnd, timespec=timespec): |
| 694 | + self.assertEqual(pytime_object_to_timespec(obj, rnd), timespec) |
637 | 695 |
|
| 696 | + rnd = _PyTime_ROUND_DOWN |
638 | 697 | for invalid in self.invalid_values: |
639 | | - self.assertRaises(OverflowError, pytime_object_to_timespec, invalid) |
| 698 | + self.assertRaises(OverflowError, |
| 699 | + pytime_object_to_timespec, invalid, rnd) |
640 | 700 |
|
641 | 701 | @unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support") |
642 | 702 | def test_localtime_timezone(self): |
|
0 commit comments