from director_exception import * class MyException(Exception): def __init__(self, a, b): self.msg = a + b class MyFoo(Foo): def ping(self): raise NotImplementedError("MyFoo::ping() EXCEPTION") class MyFoo2(Foo): def ping(self): return True pass # error: should return a string class MyFoo3(Foo): def ping(self): raise MyException("foo", "bar") class MyFoo4(Foo): def ping(self, *args): t = type("bad", "call") # throws TypeError message: type() takes 1 or 3 arguments return "Foo4.ping" # Check that the NotImplementedError raised by MyFoo.ping() is returned by # MyFoo.pong(). a = MyFoo() b = launder(a) try: b.pong() raise RuntimeError("Exception was not thrown") except NotImplementedError as e: if not str(e) == "MyFoo::ping() EXCEPTION": raise RuntimeError("Unexpected error message: %s" % str(e)) except TypeError: pass # Check that the director returns the appropriate TypeError if the return type # is wrong. a = MyFoo2() b = launder(a) try: b.pong() raise RuntimeError("Exception was not thrown") except TypeError as e: # fastdispatch mode adds on Additional Information to the exception message - just check the main exception message exists if not str(e).startswith("SWIG director type mismatch in output value of type 'std::string'"): raise RuntimeError("Unexpected error message: %s" % str(e)) # Check that the director can return an exception which requires two arguments # to the constructor, without mangling it. a = MyFoo3() b = launder(a) try: b.pong() raise RuntimeError("Exception was not thrown") except MyException as e: if e.msg != "foobar": raise RuntimeError("Unexpected error message: %s" % str(e)) # Check that the director returns the appropriate TypeError thrown in a director method a = MyFoo4() b = launder(a) try: b.pong() raise RuntimeError("Exception was not thrown") except TypeError as e: if not str(e).startswith("type() takes 1 or 3 arguments"): raise RuntimeError("Unexpected error message: %s" % str(e)) # This is expected to fail with -builtin option # Throwing builtin classes as exceptions not supported if not is_python_builtin(): try: raise Exception2() except Exception2: pass try: raise Exception1() except Exception1: pass