Convert test_exceptions to unittest.

This commit is contained in:
Georg Brandl 2006-05-30 08:47:19 +00:00
parent b0432bc032
commit cdcede62c0
2 changed files with 252 additions and 314 deletions

View File

@ -1,52 +0,0 @@
test_exceptions
5. Built-in exceptions
spam
AttributeError
spam
EOFError
spam
IOError
spam
ImportError
spam
IndexError
'spam'
KeyError
spam
KeyboardInterrupt
(not testable in a script)
spam
MemoryError
(not safe to test)
spam
NameError
spam
OverflowError
spam
RuntimeError
(not used any more?)
spam
SyntaxError
'continue' not supported inside 'finally' clause
ok
'continue' not properly in loop
ok
'continue' not properly in loop
ok
spam
IndentationError
spam
TabError
spam
SystemError
(hard to reproduce)
spam
SystemExit
spam
TypeError
spam
ValueError
spam
ZeroDivisionError
spam
Exception

View File

@ -1,43 +1,40 @@
# Python test set -- part 5, built-in exceptions
from test.test_support import TestFailed, TESTFN, unlink
from types import ClassType
from test.test_support import TESTFN, unlink, run_unittest
import warnings
import sys, traceback, os
import unittest
print '5. Built-in exceptions'
# XXX This is not really enough, each *operation* should be tested!
class ExceptionTests(unittest.TestCase):
def testReload(self):
# Reloading the built-in exceptions module failed prior to Py2.2, while it
# should act the same as reloading built-in sys.
try:
import exceptions
reload(exceptions)
except ImportError, e:
raise TestFailed, e
self.fail("reloading exceptions: %s" % e)
def test_raise_catch(exc):
def raise_catch(self, exc, excname):
try:
raise exc, "spam"
except exc, err:
buf = str(err)
buf1 = str(err)
try:
raise exc("spam")
except exc, err:
buf = str(err)
print buf
buf2 = str(err)
self.assertEquals(buf1, buf2)
self.assertEquals(exc.__name__, excname)
def r(thing):
test_raise_catch(thing)
print getattr(thing, '__name__', thing)
def testRaising(self):
self.raise_catch(AttributeError, "AttributeError")
self.assertRaises(AttributeError, getattr, sys, "undefined_attribute")
r(AttributeError)
import sys
try: x = sys.undefined_attribute
except AttributeError: pass
r(EOFError)
import sys
self.raise_catch(EOFError, "EOFError")
fp = open(TESTFN, 'w')
fp.close()
fp = open(TESTFN, 'r')
@ -51,120 +48,106 @@ try:
finally:
sys.stdin = savestdin
fp.close()
unlink(TESTFN)
r(IOError)
try: open('this file does not exist', 'r')
except IOError: pass
self.raise_catch(IOError, "IOError")
self.assertRaises(IOError, open, 'this file does not exist', 'r')
r(ImportError)
try: import undefined_module
except ImportError: pass
self.raise_catch(ImportError, "ImportError")
self.assertRaises(ImportError, __import__, "undefined_module")
r(IndexError)
self.raise_catch(IndexError, "IndexError")
x = []
try: a = x[10]
except IndexError: pass
self.assertRaises(IndexError, x.__getitem__, 10)
r(KeyError)
self.raise_catch(KeyError, "KeyError")
x = {}
try: a = x['key']
except KeyError: pass
self.assertRaises(KeyError, x.__getitem__, 'key')
r(KeyboardInterrupt)
print '(not testable in a script)'
self.raise_catch(KeyboardInterrupt, "KeyboardInterrupt")
r(MemoryError)
print '(not safe to test)'
self.raise_catch(MemoryError, "MemoryError")
r(NameError)
self.raise_catch(NameError, "NameError")
try: x = undefined_variable
except NameError: pass
r(OverflowError)
self.raise_catch(OverflowError, "OverflowError")
x = 1
for dummy in range(128):
x += x # this simply shouldn't blow up
r(RuntimeError)
print '(not used any more?)'
self.raise_catch(RuntimeError, "RuntimeError")
r(SyntaxError)
self.raise_catch(SyntaxError, "SyntaxError")
try: exec '/\n'
except SyntaxError: pass
# make sure the right exception message is raised for each of these
# code fragments:
self.raise_catch(IndentationError, "IndentationError")
self.raise_catch(TabError, "TabError")
# can only be tested under -tt, and is the only test for -tt
#try: compile("try:\n\t1/0\n \t1/0\nfinally:\n pass\n", '<string>', 'exec')
#except TabError: pass
#else: self.fail("TabError not raised")
self.raise_catch(SystemError, "SystemError")
self.raise_catch(SystemExit, "SystemExit")
self.assertRaises(SystemExit, sys.exit, 0)
self.raise_catch(TypeError, "TypeError")
try: [] + ()
except TypeError: pass
self.raise_catch(ValueError, "ValueError")
self.assertRaises(ValueError, chr, 10000)
self.raise_catch(ZeroDivisionError, "ZeroDivisionError")
try: x = 1/0
except ZeroDivisionError: pass
self.raise_catch(Exception, "Exception")
try: x = 1/0
except Exception, e: pass
def testSyntaxErrorMessage(self):
"""make sure the right exception message is raised for each of
these code fragments"""
def ckmsg(src, msg):
try:
compile(src, '<fragment>', 'exec')
except SyntaxError, e:
print e.msg
if e.msg == msg:
print "ok"
if e.msg != msg:
self.fail("expected %s, got %s" % (msg, e.msg))
else:
print "expected:", msg
else:
print "failed to get expected SyntaxError"
self.fail("failed to get expected SyntaxError")
s = '''\
while 1:
s = '''while 1:
try:
pass
finally:
continue
'''
if sys.platform.startswith('java'):
print "'continue' not supported inside 'finally' clause"
print "ok"
else:
continue'''
if not sys.platform.startswith('java'):
ckmsg(s, "'continue' not supported inside 'finally' clause")
s = '''\
s = '''if 1:
try:
continue
except:
pass
'''
pass'''
ckmsg(s, "'continue' not properly in loop")
ckmsg("continue\n", "'continue' not properly in loop")
r(IndentationError)
r(TabError)
# can only be tested under -tt, and is the only test for -tt
#try: compile("try:\n\t1/0\n \t1/0\nfinally:\n pass\n", '<string>', 'exec')
#except TabError: pass
#else: raise TestFailed
r(SystemError)
print '(hard to reproduce)'
r(SystemExit)
import sys
try: sys.exit(0)
except SystemExit: pass
r(TypeError)
try: [] + ()
except TypeError: pass
r(ValueError)
try: x = chr(10000)
except ValueError: pass
r(ZeroDivisionError)
try: x = 1/0
except ZeroDivisionError: pass
r(Exception)
try: x = 1/0
except Exception, e: pass
# test that setting an exception at the C level works even if the
# exception object can't be constructed.
def testSettingException(self):
"""test that setting an exception at the C level works even if the
exception object can't be constructed."""
class BadException:
def __init__(self):
def __init__(self_):
raise RuntimeError, "can't instantiate BadException"
def test_capi1():
@ -174,10 +157,10 @@ def test_capi1():
except TypeError, err:
exc, err, tb = sys.exc_info()
co = tb.tb_frame.f_code
assert co.co_name == "test_capi1"
assert co.co_filename.endswith('test_exceptions'+os.extsep+'py')
self.assertEquals(co.co_name, "test_capi1")
self.assert_(co.co_filename.endswith('test_exceptions'+os.extsep+'py'))
else:
print "Expected exception"
self.fail("Expected exception")
def test_capi2():
import _testcapi
@ -186,24 +169,25 @@ def test_capi2():
except RuntimeError, err:
exc, err, tb = sys.exc_info()
co = tb.tb_frame.f_code
assert co.co_name == "__init__"
assert co.co_filename.endswith('test_exceptions'+os.extsep+'py')
self.assertEquals(co.co_name, "__init__")
self.assert_(co.co_filename.endswith('test_exceptions'+os.extsep+'py'))
co2 = tb.tb_frame.f_back.f_code
assert co2.co_name == "test_capi2"
self.assertEquals(co2.co_name, "test_capi2")
else:
print "Expected exception"
self.fail("Expected exception")
if not sys.platform.startswith('java'):
test_capi1()
test_capi2()
unlink(TESTFN)
# test that exception attributes are happy.
def testAttributes(self):
"""test that exception attributes are happy."""
try: str(u'Hello \u00E1')
except Exception, e: sampleUnicodeEncodeError = e
try: unicode('\xff')
except Exception, e: sampleUnicodeDecodeError = e
exceptionList = [
( BaseException, (), { 'message' : '', 'args' : () }),
( BaseException, (1, ), { 'message' : 1, 'args' : ( 1, ) }),
@ -279,27 +263,33 @@ for args in exceptionList:
else: raise apply(args[0], args[1])
except BaseException, e:
for checkArgName in expected.keys():
if repr(getattr(e, checkArgName)) != repr(expected[checkArgName]):
raise TestFailed('Checking exception arguments, exception '
'"%s", attribute "%s" expected %s got %s.' %
( repr(e), checkArgName,
self.assertEquals(repr(getattr(e, checkArgName)),
repr(expected[checkArgName]),
repr(getattr(e, checkArgName)) ))
'exception "%s", attribute "%s"' %
(repr(e), checkArgName))
# test for pickling support
new = pickle.loads(pickle.dumps(e, random.randint(0, 2)))
for checkArgName in expected.keys():
if repr(getattr(e, checkArgName)) != repr(expected[checkArgName]):
raise TestFailed('Checking unpickled exception arguments, '
'exception '
'"%s", attribute "%s" expected %s got %s.' %
( repr(e), checkArgName,
self.assertEquals(repr(getattr(e, checkArgName)),
repr(expected[checkArgName]),
repr(getattr(e, checkArgName)) ))
'pickled exception "%s", attribute "%s' %
(repr(e), checkArgName))
try:
BaseException(a=1)
except TypeError:
pass
else:
raise TestFailed("BaseException shouldn't take keyword args")
def testKeywordArgs(self):
"""test that builtin exception don't take keyword args,
but user-defined subclasses can if they want"""
self.assertRaises(TypeError, BaseException, a=1)
class DerivedException(BaseException):
def __init__(self, fancy_arg):
BaseException.__init__(self)
self.fancy_arg = fancy_arg
x = DerivedException(fancy_arg=42)
self.assertEquals(x.fancy_arg, 42)
def test_main():
run_unittest(ExceptionTests)
if __name__ == '__main__':
test_main()