# Copyright David Abrahams 2004. Distributed under the Boost # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ''' >>> from virtual_functions_ext import * >>> class C1(concrete): ... def f(self, y): ... return concrete.f(self, Y(-y.value())) >>> class C2(concrete): ... pass >>> class A1(abstract): ... def f(self, y): ... return y.value() * 2 ... def g(self, y): ... return self >>> class A2(abstract): ... pass >>> y1 = Y(16) >>> y2 = Y(17) # # Test abstract with f,g overridden # >>> a1 = A1(42) >>> a1.value() 42 # Call f,g indirectly from C++ >>> a1.call_f(y1) 32 >>> assert type(a1.call_g(y1)) is abstract # Call f directly from Python >>> a1.f(y2) 34 # # Test abstract with f not overridden # >>> a2 = A2(42) >>> a2.value() 42 # Call f indirectly from C++ >>> try: a2.call_f(y1) ... except AttributeError: pass ... else: print('no exception') # Call f directly from Python >>> try: a2.call_f(y2) ... except AttributeError: pass ... else: print('no exception') ############# Concrete Tests ############ # # Test concrete with f overridden # >>> c1 = C1(42) >>> c1.value() 42 # Call f indirectly from C++ >>> c1.call_f(y1) -16 # Call f directly from Python >>> c1.f(y2) -17 # # Test concrete with f not overridden # >>> c2 = C2(42) >>> c2.value() 42 # Call f indirectly from C++ >>> c2.call_f(y1) 16 # Call f directly from Python >>> c2.f(y2) 17 ''' def run(args = None): import sys import doctest if args is not None: sys.argv = args return doctest.testmod(sys.modules.get(__name__)) if __name__ == '__main__': print("running...") import sys status = run()[0] if (status == 0): print("Done.") sys.exit(status)