# Python test set -- part 5, built-in exceptions

from test.test_support import TestFailed, TESTFN, unlink
from types import ClassType
import warnings
import sys, traceback

print '5. Built-in exceptions'
# XXX This is not really enough, each *operation* should be tested!

# 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

def test_raise_catch(exc):
    try:
        raise exc, "spam"
    except exc, err:
        buf = str(err)
    try:
        raise exc("spam")
    except exc, err:
        buf = str(err)
    print buf

def r(thing):
    test_raise_catch(thing)
    if isinstance(thing, ClassType):
        print thing.__name__
    else:
        print thing

r(AttributeError)
import sys
try: x = sys.undefined_attribute
except AttributeError: pass

r(EOFError)
import sys
fp = open(TESTFN, 'w')
fp.close()
fp = open(TESTFN, 'r')
savestdin = sys.stdin
try:
    try:
        sys.stdin = fp
        x = raw_input()
    except EOFError:
        pass
finally:
    sys.stdin = savestdin
    fp.close()

r(IOError)
try: open('this file does not exist', 'r')
except IOError: pass

r(ImportError)
try: import undefined_module
except ImportError: pass

r(IndexError)
x = []
try: a = x[10]
except IndexError: pass

r(KeyError)
x = {}
try: a = x['key']
except KeyError: pass

r(KeyboardInterrupt)
print '(not testable in a script)'

r(MemoryError)
print '(not safe to test)'

r(NameError)
try: x = undefined_variable
except NameError: pass

r(OverflowError)
# XXX
# Obscure:  this test relies on int+int raising OverflowError if the
# ints are big enough.  But ints no longer do that by default.  This
# test will have to go away someday.  For now, we can convert the
# transitional OverflowWarning into an error.
warnings.filterwarnings("error", "", OverflowWarning, __name__)
x = 1
try:
    while 1: x = x+x
except OverflowError: pass

r(RuntimeError)
print '(not used any more?)'

r(SyntaxError)
try: exec '/\n'
except SyntaxError: pass

# 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"
        else:
            print "expected:", msg
    else:
        print "failed to get expected SyntaxError"

s = '''\
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)

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.

class BadException:
    def __init__(self):
        raise RuntimeError, "can't instantiate BadException"

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
        assert co.co_name == "test_capi1"
        assert co.co_filename.endswith('test_exceptions.py')
    else:
        print "Expected exception"

def test_capi2():
    import _testcapi
    try:
        _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.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'):
    test_capi1()
    test_capi2()

unlink(TESTFN)
