/SiRFLive/PythonStdLib/test/test_warnings.py

https://bitbucket.org/x893/sirflive · Python · 89 lines · 67 code · 16 blank · 6 comment · 9 complexity · f88653b6ca7af51779810f1c41ce5012 MD5 · raw file

  1. import warnings
  2. import os
  3. import unittest
  4. from test import test_support
  5. # The warnings module isn't easily tested, because it relies on module
  6. # globals to store configuration information. setUp() and tearDown()
  7. # preserve the current settings to avoid bashing them while running tests.
  8. # To capture the warning messages, a replacement for showwarning() is
  9. # used to save warning information in a global variable.
  10. class WarningMessage:
  11. "Holds results of latest showwarning() call"
  12. pass
  13. def showwarning(message, category, filename, lineno, file=None):
  14. msg.message = str(message)
  15. msg.category = category.__name__
  16. msg.filename = os.path.basename(filename)
  17. msg.lineno = lineno
  18. class TestModule(unittest.TestCase):
  19. def setUp(self):
  20. global msg
  21. msg = WarningMessage()
  22. self._filters = warnings.filters[:]
  23. self._showwarning = warnings.showwarning
  24. warnings.showwarning = showwarning
  25. self.ignored = [w[2].__name__ for w in self._filters
  26. if w[0]=='ignore' and w[1] is None and w[3] is None]
  27. def tearDown(self):
  28. warnings.filters = self._filters[:]
  29. warnings.showwarning = self._showwarning
  30. def test_warn_default_category(self):
  31. for i in range(4):
  32. text = 'multi %d' %i # Different text on each call
  33. warnings.warn(text)
  34. self.assertEqual(msg.message, text)
  35. self.assertEqual(msg.category, 'UserWarning')
  36. def test_warn_specific_category(self):
  37. text = 'None'
  38. # XXX OverflowWarning should go away for Python 2.5.
  39. for category in [DeprecationWarning, FutureWarning, OverflowWarning,
  40. PendingDeprecationWarning, RuntimeWarning,
  41. SyntaxWarning, UserWarning, Warning]:
  42. if category.__name__ in self.ignored:
  43. text = 'filtered out' + category.__name__
  44. warnings.warn(text, category)
  45. self.assertNotEqual(msg.message, text)
  46. else:
  47. text = 'unfiltered %s' % category.__name__
  48. warnings.warn(text, category)
  49. self.assertEqual(msg.message, text)
  50. self.assertEqual(msg.category, category.__name__)
  51. def test_filtering(self):
  52. warnings.filterwarnings("error", "", Warning, "", 0)
  53. self.assertRaises(UserWarning, warnings.warn, 'convert to error')
  54. warnings.resetwarnings()
  55. text = 'handle normally'
  56. warnings.warn(text)
  57. self.assertEqual(msg.message, text)
  58. self.assertEqual(msg.category, 'UserWarning')
  59. warnings.filterwarnings("ignore", "", Warning, "", 0)
  60. text = 'filtered out'
  61. warnings.warn(text)
  62. self.assertNotEqual(msg.message, text)
  63. warnings.resetwarnings()
  64. warnings.filterwarnings("error", "hex*", Warning, "", 0)
  65. self.assertRaises(UserWarning, warnings.warn, 'hex/oct')
  66. text = 'nonmatching text'
  67. warnings.warn(text)
  68. self.assertEqual(msg.message, text)
  69. self.assertEqual(msg.category, 'UserWarning')
  70. def test_main(verbose=None):
  71. test_support.run_unittest(TestModule)
  72. if __name__ == "__main__":
  73. test_main(verbose=True)