summaryrefslogtreecommitdiff
path: root/Lib/test/test_warnings.py
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2003-07-13 08:37:40 +0000
committerRaymond Hettinger <python@rcn.com>2003-07-13 08:37:40 +0000
commitd6f6e50c9b91cd3b5ac401d6ee94ec28f2dff02e (patch)
treea2b069b063be9dd84587fd2a13673f477a8f2d11 /Lib/test/test_warnings.py
parentdc9dcf135e7bde09726d0af5cd55f49c31851c66 (diff)
downloadcpython-git-d6f6e50c9b91cd3b5ac401d6ee94ec28f2dff02e.tar.gz
Reworked test_warnings.py:
* It ran fine under "python regrtest.py test_warnings" but failed under "python regrtest.py" presumably because other tests would add to filtered warnings and not reset them at the end of the test. * Converted to a unittest format for better control. Renamed monkey() and unmonkey() to setUp() and tearDown(). * Increased coverage by testing all warnings in __builtin__. * Increased coverage by testing regex matching of specific messages.
Diffstat (limited to 'Lib/test/test_warnings.py')
-rw-r--r--Lib/test/test_warnings.py127
1 files changed, 81 insertions, 46 deletions
diff --git a/Lib/test/test_warnings.py b/Lib/test/test_warnings.py
index 5e8574b0b4..4bfae320bd 100644
--- a/Lib/test/test_warnings.py
+++ b/Lib/test/test_warnings.py
@@ -1,53 +1,88 @@
import warnings
import os
+import unittest
+from test import test_support
# The warnings module isn't easily tested, because it relies on module
-# globals to store configuration information. We need to extract the
-# current settings to avoid bashing them while running tests.
+# globals to store configuration information. setUp() and tearDown()
+# preserve the current settings to avoid bashing them while running tests.
-_filters = []
-_showwarning = None
+# To capture the warning messages, a replacement for showwarning() is
+# used to save warning information in a global variable.
+
+class WarningMessage:
+ "Holds results of latest showwarning() call"
+ pass
def showwarning(message, category, filename, lineno, file=None):
- filename = os.path.basename(filename)
- print "%s:%s: %s: %s" % (filename, lineno, category.__name__, message)
-
-def monkey():
- global _filters, _showwarning
- _filters = warnings.filters[:]
- _showwarning = warnings.showwarning
- warnings.showwarning = showwarning
-
-def unmonkey():
- warnings.filters = _filters[:]
- warnings.showwarning = _showwarning
-
-def test():
- for item in warnings.filters:
- print (item[0], item[1] is None, item[2].__name__, item[3] is None,
- item[4])
- hello = "hello world"
- for i in range(4):
- warnings.warn(hello)
- warnings.warn(hello, UserWarning)
- warnings.warn(hello, DeprecationWarning)
- for i in range(3):
- warnings.warn(hello)
- warnings.filterwarnings("error", "", Warning, "", 0)
- try:
- warnings.warn(hello)
- except Exception, msg:
- print "Caught", msg.__class__.__name__ + ":", msg
- else:
- print "No exception"
- warnings.resetwarnings()
- try:
- warnings.filterwarnings("booh", "", Warning, "", 0)
- except Exception, msg:
- print "Caught", msg.__class__.__name__ + ":", msg
- else:
- print "No exception"
-
-monkey()
-test()
-unmonkey()
+ msg.message = str(message)
+ msg.category = category.__name__
+ msg.filename = os.path.basename(filename)
+ msg.lineno = lineno
+
+class TestModule(unittest.TestCase):
+
+ def setUp(self):
+ global msg
+ msg = WarningMessage()
+ 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]
+
+ def tearDown(self):
+ warnings.filters = self._filters[:]
+ warnings.showwarning = self._showwarning
+
+ def test_warn_default_category(self):
+ for i in range(4):
+ text = 'multi %d' %i # Different text on each call
+ warnings.warn(text)
+ self.assertEqual(msg.message, text)
+ self.assertEqual(msg.category, 'UserWarning')
+
+ def test_warn_specific_category(self):
+ text = 'None'
+ 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)
+ else:
+ 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')
+
+ warnings.resetwarnings()
+ text = 'handle normally'
+ warnings.warn(text)
+ self.assertEqual(msg.message, text)
+ self.assertEqual(msg.category, 'UserWarning')
+
+ warnings.filterwarnings("ignore", "", Warning, "", 0)
+ text = 'filtered out'
+ warnings.warn(text)
+ self.assertNotEqual(msg.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(msg.message, text)
+ self.assertEqual(msg.category, 'UserWarning')
+
+def test_main(verbose=None):
+ test_support.run_unittest(TestModule)
+
+if __name__ == "__main__":
+ test_main(verbose=True)