import threads_exception

t = threads_exception.Test()
try:
    t.unknown()
except RuntimeError as e:
    pass

try:
    t.simple()
except RuntimeError as e:
    if e.args[0] != 37:
        raise RuntimeError

try:
    t.message()
except RuntimeError as e:
    if e.args[0] != "I died.":
        raise RuntimeError

# This is expected fail with -builtin option
# Throwing builtin classes as exceptions not supported
if not threads_exception.is_python_builtin():
    try:
        t.hosed()
    except threads_exception.Exc as e:
        code = e.code
        if code != 42:
            raise RuntimeError("bad... code: %d" % code)
        msg = e.msg
        if msg != "Hosed":
            raise RuntimeError("bad... msg: '%s' len: %d" % (msg, len(msg)))

for i in range(1, 4):
    try:
        t.multi(i)
    except RuntimeError as e:
        pass
    except threads_exception.Exc as e:
        pass
