|
6 | 6 | import re
|
7 | 7 | import sys
|
8 | 8 | import textwrap
|
| 9 | +import types |
9 | 10 | import unittest
|
10 | 11 | from test import support
|
11 | 12 | from test.support import import_helper
|
@@ -611,6 +612,97 @@ class NonWarningSubclass:
|
611 | 612 | self.module.warn('good warning category', MyWarningClass)
|
612 | 613 | self.assertIsInstance(cm.warning, Warning)
|
613 | 614 |
|
| 615 | + def check_module_globals(self, module_globals): |
| 616 | + with original_warnings.catch_warnings(module=self.module, record=True) as w: |
| 617 | + self.module.filterwarnings('default') |
| 618 | + self.module.warn_explicit( |
| 619 | + 'eggs', UserWarning, 'bar', 1, |
| 620 | + module_globals=module_globals) |
| 621 | + self.assertEqual(len(w), 1) |
| 622 | + self.assertEqual(w[0].category, UserWarning) |
| 623 | + self.assertEqual(str(w[0].message), 'eggs') |
| 624 | + |
| 625 | + def check_module_globals_error(self, module_globals, errmsg, errtype=ValueError): |
| 626 | + if self.module is py_warnings: |
| 627 | + self.check_module_globals(module_globals) |
| 628 | + return |
| 629 | + with original_warnings.catch_warnings(module=self.module, record=True) as w: |
| 630 | + self.module.filterwarnings('always') |
| 631 | + with self.assertRaisesRegex(errtype, re.escape(errmsg)): |
| 632 | + self.module.warn_explicit( |
| 633 | + 'eggs', UserWarning, 'bar', 1, |
| 634 | + module_globals=module_globals) |
| 635 | + self.assertEqual(len(w), 0) |
| 636 | + |
| 637 | + def check_module_globals_deprecated(self, module_globals, msg): |
| 638 | + if self.module is py_warnings: |
| 639 | + self.check_module_globals(module_globals) |
| 640 | + return |
| 641 | + with original_warnings.catch_warnings(module=self.module, record=True) as w: |
| 642 | + self.module.filterwarnings('always') |
| 643 | + self.module.warn_explicit( |
| 644 | + 'eggs', UserWarning, 'bar', 1, |
| 645 | + module_globals=module_globals) |
| 646 | + self.assertEqual(len(w), 2) |
| 647 | + self.assertEqual(w[0].category, DeprecationWarning) |
| 648 | + self.assertEqual(str(w[0].message), msg) |
| 649 | + self.assertEqual(w[1].category, UserWarning) |
| 650 | + self.assertEqual(str(w[1].message), 'eggs') |
| 651 | + |
| 652 | + def test_gh86298_no_loader_and_no_spec(self): |
| 653 | + self.check_module_globals({'__name__': 'bar'}) |
| 654 | + |
| 655 | + def test_gh86298_loader_is_none_and_no_spec(self): |
| 656 | + self.check_module_globals({'__name__': 'bar', '__loader__': None}) |
| 657 | + |
| 658 | + def test_gh86298_no_loader_and_spec_is_none(self): |
| 659 | + self.check_module_globals_error( |
| 660 | + {'__name__': 'bar', '__spec__': None}, |
| 661 | + 'Module globals is missing a __spec__.loader') |
| 662 | + |
| 663 | + def test_gh86298_loader_is_none_and_spec_is_none(self): |
| 664 | + self.check_module_globals_error( |
| 665 | + {'__name__': 'bar', '__loader__': None, '__spec__': None}, |
| 666 | + 'Module globals is missing a __spec__.loader') |
| 667 | + |
| 668 | + def test_gh86298_loader_is_none_and_spec_loader_is_none(self): |
| 669 | + self.check_module_globals_error( |
| 670 | + {'__name__': 'bar', '__loader__': None, |
| 671 | + '__spec__': types.SimpleNamespace(loader=None)}, |
| 672 | + 'Module globals is missing a __spec__.loader') |
| 673 | + |
| 674 | + def test_gh86298_no_spec(self): |
| 675 | + self.check_module_globals_deprecated( |
| 676 | + {'__name__': 'bar', '__loader__': object()}, |
| 677 | + 'Module globals is missing a __spec__.loader') |
| 678 | + |
| 679 | + def test_gh86298_spec_is_none(self): |
| 680 | + self.check_module_globals_deprecated( |
| 681 | + {'__name__': 'bar', '__loader__': object(), '__spec__': None}, |
| 682 | + 'Module globals is missing a __spec__.loader') |
| 683 | + |
| 684 | + def test_gh86298_no_spec_loader(self): |
| 685 | + self.check_module_globals_deprecated( |
| 686 | + {'__name__': 'bar', '__loader__': object(), |
| 687 | + '__spec__': types.SimpleNamespace()}, |
| 688 | + 'Module globals is missing a __spec__.loader') |
| 689 | + |
| 690 | + def test_gh86298_loader_and_spec_loader_disagree(self): |
| 691 | + self.check_module_globals_deprecated( |
| 692 | + {'__name__': 'bar', '__loader__': object(), |
| 693 | + '__spec__': types.SimpleNamespace(loader=object())}, |
| 694 | + 'Module globals; __loader__ != __spec__.loader') |
| 695 | + |
| 696 | + def test_gh86298_no_loader_and_no_spec_loader(self): |
| 697 | + self.check_module_globals_error( |
| 698 | + {'__name__': 'bar', '__spec__': types.SimpleNamespace()}, |
| 699 | + 'Module globals is missing a __spec__.loader', AttributeError) |
| 700 | + |
| 701 | + def test_gh86298_no_loader_with_spec_loader_okay(self): |
| 702 | + self.check_module_globals( |
| 703 | + {'__name__': 'bar', |
| 704 | + '__spec__': types.SimpleNamespace(loader=object())}) |
| 705 | + |
614 | 706 | class CWarnTests(WarnTests, unittest.TestCase):
|
615 | 707 | module = c_warnings
|
616 | 708 |
|
|
0 commit comments