diff --git a/test/Jamfile b/test/Jamfile index f5421f9b..80c7a916 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -52,6 +52,7 @@ rule bpl-test ( name ? : files * ) } bpl-test minimal ; +bpl-test pearu1 : test_cltree.py cltree.cpp ; bpl-test try : newtest.py m1.cpp m2.cpp ; bpl-test builtin_converters : test_builtin_converters.py test_builtin_converters.cpp ; bpl-test test_pointer_adoption ; diff --git a/test/cltree.cpp b/test/cltree.cpp new file mode 100755 index 00000000..a17fd659 --- /dev/null +++ b/test/cltree.cpp @@ -0,0 +1,85 @@ +#include +#include +#include + +/* Non-modifiable definitions */ + +class basic { +public: + basic() { name = "cltree.basic"; } + std::string repr() { return name+"()"; } +protected: + std::string name; +}; + +class constant: public basic { +public: + constant() { name = "cltree.constant"; } +}; + +class symbol: public basic { +public: + symbol() { name = "cltree.symbol"; } +}; + +class variable: public basic { +public: + variable() { name = "cltree.variable"; } +}; + +/* EOF: Non-modifiable definitions */ + +class symbol_wrapper: public symbol { +public: + symbol_wrapper(PyObject* self): symbol() { + name = "cltree.wrapped_symbol"; + } +}; + +class variable_wrapper: public variable { +public: + variable_wrapper(PyObject* self): variable() { + name = "cltree.wrapped_variable"; + } + + // This constructor is introduced only because cannot use + // boost::noncopyable, see below. + variable_wrapper(PyObject* self,variable v): variable(v) {} + +}; + +BOOST_PYTHON_MODULE_INIT(cltree) { + + boost::python::module m("cltree"); + m + .add( + boost::python::class_("basic") + .def_init(boost::python::args<>()) + .def("__repr__",&basic::repr) + ) + ; + + m + .add(boost::python::class_ + ,boost::noncopyable + >("constant") + .def_init(boost::python::args<>()) + ) + + .add(boost::python::class_("symbol") + .def_init(boost::python::args<>()) + ) + + .add(boost::python::class_ + ,variable_wrapper + //,boost::noncopyable // leads to compiler failure?! + >("variable") + .def_init(boost::python::args<>()) + ) + ; +} diff --git a/test/test_cltree.py b/test/test_cltree.py new file mode 100644 index 00000000..8408f7f2 --- /dev/null +++ b/test/test_cltree.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +from cltree import basic,symbol,constant,variable + +b = basic() +c = constant() +s = symbol() +v = variable() + +assert isinstance(b,basic) +assert not isinstance(b,symbol) +assert not isinstance(b,constant) +assert not isinstance(b,variable) + +assert isinstance(c,basic) +assert isinstance(c,constant) +assert not isinstance(c,symbol) +assert not isinstance(c,variable) + +assert not isinstance(s,basic) +assert isinstance(s,symbol) +assert not isinstance(s,constant) +assert not isinstance(s,variable) + +assert isinstance(v,basic) +assert not isinstance(v,symbol) +assert not isinstance(v,constant) +assert isinstance(v,variable) + +print 'b=',b +assert repr(b)=='cltree.basic()' +print 's=',s +assert repr(s)!='cltree.wrapped_symbol()' # because not isinstance(s,basic) +print 'c=',c +assert repr(c)=='cltree.constant()' +print 'v=',v +assert repr(v)=='cltree.wrapped_variable()' + + +print 'ok'