Merge branch 'ejulien-python_operator_overload_test_suite'
* ejulien-python_operator_overload_test_suite: Add __str__ to operator_overload testcase for python builtin Python operator_overload runtime testcase cleanup Work around a limitation of the Python binding generator related to the += family of operators. Fix Python 3 division member operator when -builtin is not used. Fix class member division operator. Remove the PY3BUILTIN switch as its behavior can be achieved with the existing SWIG_FEATURES=-builtin switch. Implement the operator overload test suite for Python. Conflicts: Examples/test-suite/operator_overload.i
This commit is contained in:
commit
5e6ab1d61d
4 changed files with 98 additions and 10 deletions
|
|
@ -73,6 +73,10 @@ see bottom for a set of possible tests
|
|||
%rename(OrOperator) operator ||;
|
||||
#endif
|
||||
|
||||
#if defined(SWIGPYTHON)
|
||||
%feature("python:slot", "tp_str", functype="reprfunc") Op::__str__;
|
||||
#endif
|
||||
|
||||
#ifdef SWIGD
|
||||
// Due to the way operator overloading is implemented in D1 and D2, the prefix
|
||||
// increment/decrement operators (D1) resp. the postfix ones (D2) are ignored.
|
||||
|
|
@ -109,11 +113,11 @@ public:
|
|||
return *this;
|
||||
}
|
||||
// +=,-=... are member fns
|
||||
void operator+=(const Op& o){ i+=o.i;}
|
||||
void operator-=(const Op& o){ i-=o.i;}
|
||||
void operator*=(const Op& o){ i*=o.i;}
|
||||
void operator/=(const Op& o){ i/=o.i;}
|
||||
void operator%=(const Op& o){ i%=o.i;}
|
||||
Op &operator+=(const Op& o){ i+=o.i; return *this; }
|
||||
Op &operator-=(const Op& o){ i-=o.i; return *this; }
|
||||
Op &operator*=(const Op& o){ i*=o.i; return *this; }
|
||||
Op &operator/=(const Op& o){ i/=o.i; return *this; }
|
||||
Op &operator%=(const Op& o){ i%=o.i; return *this; }
|
||||
// the +,-,*,... are friends
|
||||
// (just to make life harder)
|
||||
friend Op operator+(const Op& a,const Op& b){return Op(a.i+b.i);}
|
||||
|
|
|
|||
77
Examples/test-suite/python/operator_overload_runme.py
Normal file
77
Examples/test-suite/python/operator_overload_runme.py
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
from operator_overload import *
|
||||
|
||||
# first check all the operators are implemented correctly from pure C++ code
|
||||
Op_sanity_check()
|
||||
|
||||
pop = Op(6)/Op(3)
|
||||
|
||||
# test routine:
|
||||
a=Op()
|
||||
b=Op(5)
|
||||
c=Op(b) # copy construct
|
||||
d=Op(2)
|
||||
dd=d # assignment operator
|
||||
|
||||
# test equality
|
||||
if not a!=b:
|
||||
raise RuntimeError("a!=b")
|
||||
if not b==c:
|
||||
raise RuntimeError("b==c")
|
||||
if not a!=d:
|
||||
raise RuntimeError("a!=d")
|
||||
if not d==dd:
|
||||
raise RuntimeError("d==dd")
|
||||
|
||||
# test <
|
||||
if not a<b:
|
||||
raise RuntimeError("a<b")
|
||||
if not a<=b:
|
||||
raise RuntimeError("a<=b")
|
||||
if not b<=c:
|
||||
raise RuntimeError("b<=c")
|
||||
if not b>=c:
|
||||
raise RuntimeError("b>=c")
|
||||
if not b>d:
|
||||
raise RuntimeError("b>d")
|
||||
if not b>=d:
|
||||
raise RuntimeError("b>=d")
|
||||
|
||||
# test +=
|
||||
e=Op(3)
|
||||
e+=d
|
||||
if not e==b:
|
||||
raise RuntimeError("e==b (%s==%s)" % (e.i, b.i))
|
||||
e-=c
|
||||
if not e==a:
|
||||
raise RuntimeError("e==a")
|
||||
e=Op(1)
|
||||
e*=b
|
||||
if not e==c:
|
||||
raise RuntimeError("e==c")
|
||||
e/=d
|
||||
if not e==d:
|
||||
raise RuntimeError("e==d")
|
||||
e%=c;
|
||||
if not e==d:
|
||||
raise RuntimeError("e==d")
|
||||
|
||||
# test +
|
||||
f=Op(1)
|
||||
g=Op(1)
|
||||
if not f+g==Op(2):
|
||||
raise RuntimeError("f+g==Op(2)")
|
||||
if not f-g==Op(0):
|
||||
raise RuntimeError("f-g==Op(0)")
|
||||
if not f*g==Op(1):
|
||||
raise RuntimeError("f*g==Op(1)")
|
||||
if not f/g==Op(1):
|
||||
raise RuntimeError("f/g==Op(1)")
|
||||
if not f%g==Op(0):
|
||||
raise RuntimeError("f%g==Op(0)")
|
||||
|
||||
# test unary operators
|
||||
if not -a==a:
|
||||
raise RuntimeError("-a==a")
|
||||
if not -b==Op(-5):
|
||||
raise RuntimeError("-b==Op(-5)")
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue