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,305 +1,295 @@
# Python test set -- part 5, built-in exceptions # Python test set -- part 5, built-in exceptions
from test.test_support import TestFailed, TESTFN, unlink from test.test_support import TESTFN, unlink, run_unittest
from types import ClassType
import warnings import warnings
import sys, traceback, os import sys, traceback, os
import unittest
print '5. Built-in exceptions'
# XXX This is not really enough, each *operation* should be tested! # XXX This is not really enough, each *operation* should be tested!
# Reloading the built-in exceptions module failed prior to Py2.2, while it class ExceptionTests(unittest.TestCase):
# should act the same as reloading built-in sys.
try:
import exceptions
reload(exceptions)
except ImportError, e:
raise TestFailed, e
def test_raise_catch(exc): def testReload(self):
try: # Reloading the built-in exceptions module failed prior to Py2.2, while it
raise exc, "spam" # should act the same as reloading built-in sys.
except exc, err: try:
buf = str(err) import exceptions
try: reload(exceptions)
raise exc("spam") except ImportError, e:
except exc, err: self.fail("reloading exceptions: %s" % e)
buf = str(err)
print buf
def r(thing): def raise_catch(self, exc, excname):
test_raise_catch(thing) try:
print getattr(thing, '__name__', thing) raise exc, "spam"
except exc, err:
buf1 = str(err)
try:
raise exc("spam")
except exc, err:
buf2 = str(err)
self.assertEquals(buf1, buf2)
self.assertEquals(exc.__name__, excname)
r(AttributeError) def testRaising(self):
import sys self.raise_catch(AttributeError, "AttributeError")
try: x = sys.undefined_attribute self.assertRaises(AttributeError, getattr, sys, "undefined_attribute")
except AttributeError: pass
r(EOFError) self.raise_catch(EOFError, "EOFError")
import sys fp = open(TESTFN, 'w')
fp = open(TESTFN, 'w') fp.close()
fp.close() fp = open(TESTFN, 'r')
fp = open(TESTFN, 'r') savestdin = sys.stdin
savestdin = sys.stdin try:
try: try:
try: sys.stdin = fp
sys.stdin = fp x = raw_input()
x = raw_input() except EOFError:
except EOFError: pass
pass finally:
finally: sys.stdin = savestdin
sys.stdin = savestdin fp.close()
fp.close() unlink(TESTFN)
r(IOError) self.raise_catch(IOError, "IOError")
try: open('this file does not exist', 'r') self.assertRaises(IOError, open, 'this file does not exist', 'r')
except IOError: pass
r(ImportError) self.raise_catch(ImportError, "ImportError")
try: import undefined_module self.assertRaises(ImportError, __import__, "undefined_module")
except ImportError: pass
r(IndexError) self.raise_catch(IndexError, "IndexError")
x = [] x = []
try: a = x[10] self.assertRaises(IndexError, x.__getitem__, 10)
except IndexError: pass
r(KeyError) self.raise_catch(KeyError, "KeyError")
x = {} x = {}
try: a = x['key'] self.assertRaises(KeyError, x.__getitem__, 'key')
except KeyError: pass
r(KeyboardInterrupt) self.raise_catch(KeyboardInterrupt, "KeyboardInterrupt")
print '(not testable in a script)'
r(MemoryError) self.raise_catch(MemoryError, "MemoryError")
print '(not safe to test)'
r(NameError) self.raise_catch(NameError, "NameError")
try: x = undefined_variable try: x = undefined_variable
except NameError: pass except NameError: pass
r(OverflowError) self.raise_catch(OverflowError, "OverflowError")
x = 1 x = 1
for dummy in range(128): for dummy in range(128):
x += x # this simply shouldn't blow up x += x # this simply shouldn't blow up
r(RuntimeError) self.raise_catch(RuntimeError, "RuntimeError")
print '(not used any more?)'
r(SyntaxError) self.raise_catch(SyntaxError, "SyntaxError")
try: exec '/\n' try: exec '/\n'
except SyntaxError: pass except SyntaxError: pass
# make sure the right exception message is raised for each of these self.raise_catch(IndentationError, "IndentationError")
# code fragments:
def ckmsg(src, msg): self.raise_catch(TabError, "TabError")
try: # can only be tested under -tt, and is the only test for -tt
compile(src, '<fragment>', 'exec') #try: compile("try:\n\t1/0\n \t1/0\nfinally:\n pass\n", '<string>', 'exec')
except SyntaxError, e: #except TabError: pass
print e.msg #else: self.fail("TabError not raised")
if e.msg == msg:
print "ok"
else:
print "expected:", msg
else:
print "failed to get expected SyntaxError"
s = '''\ self.raise_catch(SystemError, "SystemError")
while 1:
try:
pass
finally:
continue
'''
if sys.platform.startswith('java'):
print "'continue' not supported inside 'finally' clause"
print "ok"
else:
ckmsg(s, "'continue' not supported inside 'finally' clause")
s = '''\
try:
continue
except:
pass
'''
ckmsg(s, "'continue' not properly in loop")
ckmsg("continue\n", "'continue' not properly in loop")
r(IndentationError) self.raise_catch(SystemExit, "SystemExit")
self.assertRaises(SystemExit, sys.exit, 0)
r(TabError) self.raise_catch(TypeError, "TypeError")
# can only be tested under -tt, and is the only test for -tt try: [] + ()
#try: compile("try:\n\t1/0\n \t1/0\nfinally:\n pass\n", '<string>', 'exec') except TypeError: pass
#except TabError: pass
#else: raise TestFailed
r(SystemError) self.raise_catch(ValueError, "ValueError")
print '(hard to reproduce)' self.assertRaises(ValueError, chr, 10000)
r(SystemExit) self.raise_catch(ZeroDivisionError, "ZeroDivisionError")
import sys try: x = 1/0
try: sys.exit(0) except ZeroDivisionError: pass
except SystemExit: pass
r(TypeError) self.raise_catch(Exception, "Exception")
try: [] + () try: x = 1/0
except TypeError: pass except Exception, e: pass
r(ValueError) def testSyntaxErrorMessage(self):
try: x = chr(10000) """make sure the right exception message is raised for each of
except ValueError: pass these code fragments"""
r(ZeroDivisionError) def ckmsg(src, msg):
try: x = 1/0 try:
except ZeroDivisionError: pass compile(src, '<fragment>', 'exec')
except SyntaxError, e:
if e.msg != msg:
self.fail("expected %s, got %s" % (msg, e.msg))
else:
self.fail("failed to get expected SyntaxError")
r(Exception) s = '''while 1:
try: x = 1/0 try:
except Exception, e: pass pass
finally:
continue'''
# test that setting an exception at the C level works even if the if not sys.platform.startswith('java'):
# exception object can't be constructed. ckmsg(s, "'continue' not supported inside 'finally' clause")
class BadException: s = '''if 1:
def __init__(self): try:
raise RuntimeError, "can't instantiate BadException" continue
except:
pass'''
def test_capi1(): ckmsg(s, "'continue' not properly in loop")
import _testcapi ckmsg("continue\n", "'continue' not properly in loop")
try:
_testcapi.raise_exception(BadException, 1)
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')
else:
print "Expected exception"
def test_capi2(): def testSettingException(self):
import _testcapi """test that setting an exception at the C level works even if the
try: exception object can't be constructed."""
_testcapi.raise_exception(BadException, 0)
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')
co2 = tb.tb_frame.f_back.f_code
assert co2.co_name == "test_capi2"
else:
print "Expected exception"
if not sys.platform.startswith('java'): class BadException:
test_capi1() def __init__(self_):
test_capi2() raise RuntimeError, "can't instantiate BadException"
unlink(TESTFN) def test_capi1():
import _testcapi
try:
_testcapi.raise_exception(BadException, 1)
except TypeError, err:
exc, err, tb = sys.exc_info()
co = tb.tb_frame.f_code
self.assertEquals(co.co_name, "test_capi1")
self.assert_(co.co_filename.endswith('test_exceptions'+os.extsep+'py'))
else:
self.fail("Expected exception")
# test that exception attributes are happy. def test_capi2():
try: str(u'Hello \u00E1') import _testcapi
except Exception, e: sampleUnicodeEncodeError = e try:
try: unicode('\xff') _testcapi.raise_exception(BadException, 0)
except Exception, e: sampleUnicodeDecodeError = e except RuntimeError, err:
exceptionList = [ exc, err, tb = sys.exc_info()
( BaseException, (), { 'message' : '', 'args' : () }), co = tb.tb_frame.f_code
( BaseException, (1, ), { 'message' : 1, 'args' : ( 1, ) }), self.assertEquals(co.co_name, "__init__")
( BaseException, ('foo', ), { 'message' : 'foo', 'args' : ( 'foo', ) }), self.assert_(co.co_filename.endswith('test_exceptions'+os.extsep+'py'))
( BaseException, ('foo', 1), { 'message' : '', 'args' : ( 'foo', 1 ) }), co2 = tb.tb_frame.f_back.f_code
( SystemExit, ('foo',), { 'message' : 'foo', 'args' : ( 'foo', ), self.assertEquals(co2.co_name, "test_capi2")
'code' : 'foo' }), else:
( IOError, ('foo',), { 'message' : 'foo', 'args' : ( 'foo', ), }), self.fail("Expected exception")
( IOError, ('foo', 'bar'), { 'message' : '',
'args' : ('foo', 'bar'), }),
( IOError, ('foo', 'bar', 'baz'),
{ 'message' : '', 'args' : ('foo', 'bar'), }),
( EnvironmentError, ('errnoStr', 'strErrorStr', 'filenameStr'),
{ 'message' : '', 'args' : ('errnoStr', 'strErrorStr'),
'strerror' : 'strErrorStr',
'errno' : 'errnoStr', 'filename' : 'filenameStr' }),
( EnvironmentError, (1, 'strErrorStr', 'filenameStr'),
{ 'message' : '', 'args' : (1, 'strErrorStr'),
'strerror' : 'strErrorStr', 'errno' : 1,
'filename' : 'filenameStr' }),
( SyntaxError, ('msgStr',),
{ 'message' : 'msgStr', 'args' : ('msgStr', ),
'print_file_and_line' : None, 'msg' : 'msgStr',
'filename' : None, 'lineno' : None, 'offset' : None,
'text' : None }),
( SyntaxError, ('msgStr', ('filenameStr', 'linenoStr', 'offsetStr',
'textStr')),
{ 'message' : '', 'args' : ('msgStr', ('filenameStr',
'linenoStr', 'offsetStr', 'textStr' )),
'print_file_and_line' : None, 'msg' : 'msgStr',
'filename' : 'filenameStr', 'lineno' : 'linenoStr',
'offset' : 'offsetStr', 'text' : 'textStr' }),
( SyntaxError, ('msgStr', 'filenameStr', 'linenoStr', 'offsetStr',
'textStr', 'print_file_and_lineStr'),
{ 'message' : '', 'args' : ('msgStr', 'filenameStr',
'linenoStr', 'offsetStr', 'textStr',
'print_file_and_lineStr'),
'print_file_and_line' : None, 'msg' : 'msgStr',
'filename' : None, 'lineno' : None, 'offset' : None,
'text' : None }),
( UnicodeError, (),
{ 'message' : '', 'args' : (), }),
( sampleUnicodeEncodeError,
{ 'message' : '', 'args' : ('ascii', u'Hello \xe1', 6, 7,
'ordinal not in range(128)'),
'encoding' : 'ascii', 'object' : u'Hello \xe1',
'start' : 6, 'reason' : 'ordinal not in range(128)' }),
( sampleUnicodeDecodeError,
{ 'message' : '', 'args' : ('ascii', '\xff', 0, 1,
'ordinal not in range(128)'),
'encoding' : 'ascii', 'object' : '\xff',
'start' : 0, 'reason' : 'ordinal not in range(128)' }),
( UnicodeTranslateError, (u"\u3042", 0, 1, "ouch"),
{ 'message' : '', 'args' : (u'\u3042', 0, 1, 'ouch'),
'object' : u'\u3042', 'reason' : 'ouch',
'start' : 0, 'end' : 1 }),
]
try:
exceptionList.append(
( WindowsError, (1, 'strErrorStr', 'filenameStr'),
{ 'message' : '', 'args' : (1, 'strErrorStr'),
'strerror' : 'strErrorStr',
'errno' : 22, 'filename' : 'filenameStr',
'winerror' : 1 }))
except NameError: pass
import pickle, random if not sys.platform.startswith('java'):
test_capi1()
test_capi2()
for args in exceptionList: def testAttributes(self):
expected = args[-1] """test that exception attributes are happy."""
try: try: str(u'Hello \u00E1')
if len(args) == 2: raise args[0] except Exception, e: sampleUnicodeEncodeError = e
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,
repr(expected[checkArgName]),
repr(getattr(e, checkArgName)) ))
# test for pickling support try: unicode('\xff')
new = pickle.loads(pickle.dumps(e, random.randint(0, 2))) except Exception, e: sampleUnicodeDecodeError = e
for checkArgName in expected.keys():
if repr(getattr(e, checkArgName)) != repr(expected[checkArgName]): exceptionList = [
raise TestFailed('Checking unpickled exception arguments, ' ( BaseException, (), { 'message' : '', 'args' : () }),
'exception ' ( BaseException, (1, ), { 'message' : 1, 'args' : ( 1, ) }),
'"%s", attribute "%s" expected %s got %s.' % ( BaseException, ('foo', ), { 'message' : 'foo', 'args' : ( 'foo', ) }),
( repr(e), checkArgName, ( BaseException, ('foo', 1), { 'message' : '', 'args' : ( 'foo', 1 ) }),
repr(expected[checkArgName]), ( SystemExit, ('foo',), { 'message' : 'foo', 'args' : ( 'foo', ),
repr(getattr(e, checkArgName)) )) 'code' : 'foo' }),
( IOError, ('foo',), { 'message' : 'foo', 'args' : ( 'foo', ), }),
( IOError, ('foo', 'bar'), { 'message' : '',
'args' : ('foo', 'bar'), }),
( IOError, ('foo', 'bar', 'baz'),
{ 'message' : '', 'args' : ('foo', 'bar'), }),
( EnvironmentError, ('errnoStr', 'strErrorStr', 'filenameStr'),
{ 'message' : '', 'args' : ('errnoStr', 'strErrorStr'),
'strerror' : 'strErrorStr',
'errno' : 'errnoStr', 'filename' : 'filenameStr' }),
( EnvironmentError, (1, 'strErrorStr', 'filenameStr'),
{ 'message' : '', 'args' : (1, 'strErrorStr'),
'strerror' : 'strErrorStr', 'errno' : 1,
'filename' : 'filenameStr' }),
( SyntaxError, ('msgStr',),
{ 'message' : 'msgStr', 'args' : ('msgStr', ),
'print_file_and_line' : None, 'msg' : 'msgStr',
'filename' : None, 'lineno' : None, 'offset' : None,
'text' : None }),
( SyntaxError, ('msgStr', ('filenameStr', 'linenoStr', 'offsetStr',
'textStr')),
{ 'message' : '', 'args' : ('msgStr', ('filenameStr',
'linenoStr', 'offsetStr', 'textStr' )),
'print_file_and_line' : None, 'msg' : 'msgStr',
'filename' : 'filenameStr', 'lineno' : 'linenoStr',
'offset' : 'offsetStr', 'text' : 'textStr' }),
( SyntaxError, ('msgStr', 'filenameStr', 'linenoStr', 'offsetStr',
'textStr', 'print_file_and_lineStr'),
{ 'message' : '', 'args' : ('msgStr', 'filenameStr',
'linenoStr', 'offsetStr', 'textStr',
'print_file_and_lineStr'),
'print_file_and_line' : None, 'msg' : 'msgStr',
'filename' : None, 'lineno' : None, 'offset' : None,
'text' : None }),
( UnicodeError, (),
{ 'message' : '', 'args' : (), }),
( sampleUnicodeEncodeError,
{ 'message' : '', 'args' : ('ascii', u'Hello \xe1', 6, 7,
'ordinal not in range(128)'),
'encoding' : 'ascii', 'object' : u'Hello \xe1',
'start' : 6, 'reason' : 'ordinal not in range(128)' }),
( sampleUnicodeDecodeError,
{ 'message' : '', 'args' : ('ascii', '\xff', 0, 1,
'ordinal not in range(128)'),
'encoding' : 'ascii', 'object' : '\xff',
'start' : 0, 'reason' : 'ordinal not in range(128)' }),
( UnicodeTranslateError, (u"\u3042", 0, 1, "ouch"),
{ 'message' : '', 'args' : (u'\u3042', 0, 1, 'ouch'),
'object' : u'\u3042', 'reason' : 'ouch',
'start' : 0, 'end' : 1 }),
]
try:
exceptionList.append(
( WindowsError, (1, 'strErrorStr', 'filenameStr'),
{ 'message' : '', 'args' : (1, 'strErrorStr'),
'strerror' : 'strErrorStr',
'errno' : 22, 'filename' : 'filenameStr',
'winerror' : 1 }))
except NameError: pass
try: import pickle, random
BaseException(a=1)
except TypeError: for args in exceptionList:
pass expected = args[-1]
else: try:
raise TestFailed("BaseException shouldn't take keyword args") if len(args) == 2: raise args[0]
else: raise apply(args[0], args[1])
except BaseException, e:
for checkArgName in expected.keys():
self.assertEquals(repr(getattr(e, checkArgName)),
repr(expected[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():
self.assertEquals(repr(getattr(e, checkArgName)),
repr(expected[checkArgName]),
'pickled exception "%s", attribute "%s' %
(repr(e), checkArgName))
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()