1. Fix negative octals. Currently not handled correctly by `-py3`
(unusual case, but incorrect).
2. Fix arguments of type "octal + something" (e.g. `0640 | 04`).
Currently drops everything after the first octal. Nasty!
3. Fix bool arguments "0 + something" (e.g. `0 | 1`) are always
"False" (unusual case, but incorrect).
4. Remove special handling of "TRUE" and "FALSE" from
`convertValue` since there's no reason these have to match
"true" and "false".
5. Remove the Python 2 vs. Python 3 distinction based on the
`-py3` flag. Now the same python code is produced for default
arguments for Python 2 and Python 3. For this, octal default
arguments, e.g. 0644, are now wrapped as `int('644', 8)`. This
is required, as Python 2 and Python 3 have incompatible syntax
for octal literals.
Fixes #707
184 lines
4.5 KiB
Python
184 lines
4.5 KiB
Python
# Note that this test is also used by python_default_args_runme.py hence
|
|
# the use of __main__ and the run function
|
|
|
|
|
|
def is_new_style_class(cls):
|
|
return hasattr(cls, "__class__")
|
|
|
|
|
|
def run(module_name):
|
|
default_args = __import__(module_name)
|
|
ec = default_args.EnumClass()
|
|
if not ec.blah():
|
|
raise RuntimeError("EnumClass::blah() default arguments don't work")
|
|
|
|
de = default_args.DerivedEnumClass()
|
|
de.accelerate()
|
|
de.accelerate(default_args.EnumClass.SLOW)
|
|
|
|
if default_args.Statics_staticMethod() != 60:
|
|
raise RuntimeError
|
|
|
|
if default_args.cfunc1(1) != 2:
|
|
raise RuntimeError
|
|
|
|
if default_args.cfunc2(1) != 3:
|
|
raise RuntimeError
|
|
|
|
if default_args.cfunc3(1) != 4:
|
|
raise RuntimeError
|
|
|
|
f = default_args.Foo()
|
|
|
|
f.newname()
|
|
f.newname(1)
|
|
f.defaulted1()
|
|
f.defaulted2()
|
|
|
|
if f.double_if_void_ptr_is_null(2, None) != 4:
|
|
raise RuntimeError
|
|
|
|
if f.double_if_void_ptr_is_null(3) != 6:
|
|
raise RuntimeError
|
|
|
|
if f.double_if_handle_is_null(4, None) != 8:
|
|
raise RuntimeError
|
|
|
|
if f.double_if_handle_is_null(5) != 10:
|
|
raise RuntimeError
|
|
|
|
if f.double_if_dbl_ptr_is_null(6, None) != 12:
|
|
raise RuntimeError
|
|
|
|
if f.double_if_dbl_ptr_is_null(7) != 14:
|
|
raise RuntimeError
|
|
|
|
try:
|
|
f = default_args.Foo(1)
|
|
error = 1
|
|
except:
|
|
error = 0
|
|
if error:
|
|
raise RuntimeError("Foo::Foo ignore is not working")
|
|
|
|
try:
|
|
f = default_args.Foo(1, 2)
|
|
error = 1
|
|
except:
|
|
error = 0
|
|
if error:
|
|
raise RuntimeError("Foo::Foo ignore is not working")
|
|
|
|
try:
|
|
f = default_args.Foo(1, 2, 3)
|
|
error = 1
|
|
except:
|
|
error = 0
|
|
if error:
|
|
raise RuntimeError("Foo::Foo ignore is not working")
|
|
|
|
try:
|
|
m = f.meth(1)
|
|
error = 1
|
|
except:
|
|
error = 0
|
|
if error:
|
|
raise RuntimeError("Foo::meth ignore is not working")
|
|
|
|
try:
|
|
m = f.meth(1, 2)
|
|
error = 1
|
|
except:
|
|
error = 0
|
|
if error:
|
|
raise RuntimeError("Foo::meth ignore is not working")
|
|
|
|
try:
|
|
m = f.meth(1, 2, 3)
|
|
error = 1
|
|
except:
|
|
error = 0
|
|
if error:
|
|
raise RuntimeError("Foo::meth ignore is not working")
|
|
|
|
if is_new_style_class(default_args.Klass):
|
|
Klass_inc = default_args.Klass.inc
|
|
else:
|
|
Klass_inc = default_args.Klass_inc
|
|
|
|
if Klass_inc(100, default_args.Klass(22)).val != 122:
|
|
raise RuntimeError("Klass::inc failed")
|
|
|
|
if Klass_inc(100).val != 99:
|
|
raise RuntimeError("Klass::inc failed")
|
|
|
|
if Klass_inc().val != 0:
|
|
raise RuntimeError("Klass::inc failed")
|
|
|
|
tricky_failure = False
|
|
tricky = default_args.TrickyInPython()
|
|
if tricky.value_m1(10) != -1:
|
|
print "trickyvalue_m1 failed"
|
|
tricky_failure = True
|
|
if tricky.value_m1(10, 10) != 10:
|
|
print "trickyvalue_m1 failed"
|
|
tricky_failure = True
|
|
if tricky.value_0xabcdef(10) != 0xabcdef:
|
|
print "trickyvalue_0xabcdef failed"
|
|
tricky_failure = True
|
|
if tricky.value_0644(10) != 420:
|
|
print "trickyvalue_0644 failed"
|
|
tricky_failure = True
|
|
if tricky.value_perm(10) != 420:
|
|
print "trickyvalue_perm failed"
|
|
tricky_failure = True
|
|
if tricky.value_m01(10) != -1:
|
|
print "trickyvalue_m01 failed"
|
|
tricky_failure = True
|
|
if not tricky.booltest2():
|
|
print "booltest2 failed"
|
|
tricky_failure = True
|
|
|
|
if tricky_failure:
|
|
raise RuntimeError
|
|
|
|
default_args.seek()
|
|
default_args.seek(10)
|
|
|
|
if not default_args.booltest():
|
|
raise RuntimeError("booltest failed")
|
|
|
|
if default_args.slightly_off_square(10) != 102:
|
|
raise RuntimeError
|
|
|
|
if default_args.slightly_off_square() != 291:
|
|
raise RuntimeError
|
|
|
|
# It is difficult to test the python:cdefaultargs feature properly as -builtin
|
|
# and -fastproxy do not use the Python layer for default args
|
|
if default_args.CDA().cdefaultargs_test1() != 1:
|
|
raise RuntimeError
|
|
|
|
if default_args.CDA().cdefaultargs_test2() != 1:
|
|
raise RuntimeError
|
|
|
|
if default_args.chartest1() != 'x':
|
|
raise RuntimeError
|
|
|
|
if default_args.chartest2() != '\0':
|
|
raise RuntimeError
|
|
|
|
if default_args.chartest3() != '\1':
|
|
raise RuntimeError
|
|
|
|
if default_args.chartest4() != '\n':
|
|
raise RuntimeError
|
|
|
|
if default_args.chartest5() != 'B':
|
|
raise RuntimeError
|
|
|
|
if default_args.chartest6() != 'C':
|
|
raise RuntimeError
|
|
|
|
if __name__ == "__main__":
|
|
run('default_args')
|