summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_warnings.py
blob: 8206202846a295c865349d34f82be84ba163b90d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import warnings
import linecache
import os
from io import StringIO
import sys
import unittest
from test import test_support

from test import warning_tests

class TestModule(unittest.TestCase):
    def setUp(self):
        self.ignored = [w[2].__name__ for w in warnings.filters
            if w[0]=='ignore' and w[1] is None and w[3] is None]

    def test_warn_default_category(self):
        with test_support.catch_warning() as w:
            for i in range(4):
                text = 'multi %d' %i    # Different text on each call
                warnings.warn(text)
                self.assertEqual(str(w.message), text)
                self.assert_(w.category is UserWarning)

    def test_warn_specific_category(self):
        with test_support.catch_warning() as w:
            text = 'None'
            for category in [DeprecationWarning, FutureWarning,
                        PendingDeprecationWarning, RuntimeWarning,
                        SyntaxWarning, UserWarning, Warning]:
                if category.__name__ in self.ignored:
                    text = 'filtered out' + category.__name__
                    warnings.warn(text, category)
                    self.assertNotEqual(w.message, text)
                else:
                    text = 'unfiltered %s' % category.__name__
                    warnings.warn(text, category)
                    self.assertEqual(str(w.message), text)
                    self.assert_(w.category is category)

    def test_filtering(self):
        # Test filterwarnings().
        # Implicitly also tests resetwarnings().
        with test_support.catch_warning() as w:
            warnings.filterwarnings("error", "", Warning, "", 0)
            self.assertRaises(UserWarning, warnings.warn, 'convert to error')

            warnings.resetwarnings()
            text = 'handle normally'
            warnings.warn(text)
            self.assertEqual(str(w.message), text)
            self.assert_(w.category is UserWarning)

            warnings.filterwarnings("ignore", "", Warning, "", 0)
            text = 'filtered out'
            warnings.warn(text)
            self.assertNotEqual(str(w.message), text)

            warnings.resetwarnings()
            warnings.filterwarnings("error", "hex*", Warning, "", 0)
            self.assertRaises(UserWarning, warnings.warn, 'hex/oct')
            text = 'nonmatching text'
            warnings.warn(text)
            self.assertEqual(str(w.message), text)
            self.assert_(w.category is UserWarning)

    def test_options(self):
        # Uses the private _setoption() function to test the parsing
        # of command-line warning arguments
        with test_support.catch_warning():
            self.assertRaises(warnings._OptionError,
                              warnings._setoption, '1:2:3:4:5:6')
            self.assertRaises(warnings._OptionError,
                              warnings._setoption, 'bogus::Warning')
            self.assertRaises(warnings._OptionError,
                              warnings._setoption, 'ignore:2::4:-5')
            warnings._setoption('error::Warning::0')
            self.assertRaises(UserWarning, warnings.warn, 'convert to error')

    def test_filename(self):
        with test_support.catch_warning() as w:
            warning_tests.inner("spam1")
            self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
            warning_tests.outer("spam2")
            self.assertEqual(os.path.basename(w.filename), "warning_tests.py")

    def test_stacklevel(self):
        # Test stacklevel argument
        # make sure all messages are different, so the warning won't be skipped
        with test_support.catch_warning() as w:
            warning_tests.inner("spam3", stacklevel=1)
            self.assertEqual(os.path.basename(w.filename), "warning_tests.py")
            warning_tests.outer("spam4", stacklevel=1)
            self.assertEqual(os.path.basename(w.filename), "warning_tests.py")

            warning_tests.inner("spam5", stacklevel=2)
            self.assertEqual(os.path.basename(w.filename), "test_warnings.py")
            warning_tests.outer("spam6", stacklevel=2)
            self.assertEqual(os.path.basename(w.filename), "warning_tests.py")

            warning_tests.inner("spam7", stacklevel=9999)
            self.assertEqual(os.path.basename(w.filename), "sys")


class WarningsDisplayTests(unittest.TestCase):

    def test_formatwarning(self):
        message = "msg"
        category = Warning
        file_name = os.path.splitext(warning_tests.__file__)[0] + '.py'
        line_num = 3
        file_line = linecache.getline(file_name, line_num).strip()
        expect = "%s:%s: %s: %s\n  %s\n" % (file_name, line_num, category.__name__,
                                         message, file_line)
        self.failUnlessEqual(warnings.formatwarning(message, category,
                                                    file_name, line_num),
                             expect)

    def test_showwarning(self):
        file_name = os.path.splitext(warning_tests.__file__)[0] + '.py'
        line_num = 3
        expected_file_line = linecache.getline(file_name, line_num).strip()
        message = 'msg'
        category = Warning
        file_object = StringIO()
        expect = warnings.formatwarning(message, category, file_name, line_num)
        warnings.showwarning(message, category, file_name, line_num,
                                file_object)
        self.failUnlessEqual(file_object.getvalue(), expect)


def test_main(verbose=None):
    # Obscure hack so that this test passes after reloads or repeated calls
    # to test_main (regrtest -R).
    if '__warningregistry__' in globals():
        del globals()['__warningregistry__']
    if hasattr(warning_tests, '__warningregistry__'):
        del warning_tests.__warningregistry__
    if hasattr(sys, '__warningregistry__'):
        del sys.__warningregistry__
    test_support.run_unittest(TestModule, WarningsDisplayTests)

if __name__ == "__main__":
    test_main(verbose=True)