from test
import test_support
# The warnings module isn't easily tested, because it relies on module
# globals to store configuration information. setUp() and tearDown()
# preserve the current settings to avoid bashing them while running tests.
# To capture the warning messages, a replacement for showwarning() is
# used to save warning information in a global variable.
"Holds results of latest showwarning() call"
def showwarning(message
, category
, filename
, lineno
, file=None):
msg
.message
= str(message
)
msg
.category
= category
.__name
__
msg
.filename
= os
.path
.basename(filename
)
class TestModule(unittest
.TestCase
):
self
._filters
= warnings
.filters
[:]
self
._showwarning
= warnings
.showwarning
warnings
.showwarning
= showwarning
self
.ignored
= [w
[2].__name
__ for w
in self
._filters
if w
[0]=='ignore' and w
[1] is None and w
[3] is None]
warnings
.filters
= self
._filters
[:]
warnings
.showwarning
= self
._showwarning
def test_warn_default_category(self
):
text
= 'multi %d' %i # Different text on each call
self
.assertEqual(msg
.message
, text
)
self
.assertEqual(msg
.category
, 'UserWarning')
def test_warn_specific_category(self
):
# XXX OverflowWarning should go away for Python 2.5.
for category
in [DeprecationWarning, FutureWarning
, OverflowWarning,
PendingDeprecationWarning
, RuntimeWarning,
SyntaxWarning, UserWarning, Warning]:
if category
.__name
__ in self
.ignored
:
text
= 'filtered out' + category
.__name
__
warnings
.warn(text
, category
)
self
.assertNotEqual(msg
.message
, text
)
text
= 'unfiltered %s' % category
.__name
__
warnings
.warn(text
, category
)
self
.assertEqual(msg
.message
, text
)
self
.assertEqual(msg
.category
, category
.__name
__)
def test_filtering(self
):
warnings
.filterwarnings("error", "", Warning, "", 0)
self
.assertRaises(UserWarning, warnings
.warn
, 'convert to error')
self
.assertEqual(msg
.message
, text
)
self
.assertEqual(msg
.category
, 'UserWarning')
warnings
.filterwarnings("ignore", "", Warning, "", 0)
self
.assertNotEqual(msg
.message
, text
)
warnings
.filterwarnings("error", "hex*", Warning, "", 0)
self
.assertRaises(UserWarning, warnings
.warn
, 'hex/oct')
text
= 'nonmatching text'
self
.assertEqual(msg
.message
, text
)
self
.assertEqual(msg
.category
, 'UserWarning')
def test_main(verbose
=None):
test_support
.run_unittest(TestModule
)
if __name__
== "__main__":