# Note that this test is also used by python_default_args_runme.py hence
# the use of __main__ and the run function

from swig_test_utils import swig_check


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")

    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 = default_args.TrickyInPython()
    if tricky.value_m1(10) != -1:
        raise RuntimeError("trickyvalue_m1 failed")
    if tricky.value_m1(10, 10) != 10:
        raise RuntimeError("trickyvalue_m1 failed")
    if tricky.value_0xabcdef(10) != 0xabcdef:
        raise RuntimeError("trickyvalue_0xabcdef failed")
    if tricky.value_0644(10) != 420:
        raise RuntimeError("trickyvalue_0644 failed")
    if tricky.value_perm(10) != 420:
        raise RuntimeError("trickyvalue_perm failed")
    if tricky.value_m01(10) != -1:
        raise RuntimeError("trickyvalue_m01 failed")
    if not tricky.booltest2():
        raise RuntimeError("booltest2 failed")

    if tricky.max_32bit_int1() != 0x7FFFFFFF:
        raise RuntimeError("max_32bit_int1 failed")
    if tricky.min_32bit_int1() != -2147483648:
        raise RuntimeError("min_32bit_int1 failed")
    if tricky.max_32bit_int2() != 0x7FFFFFFF:
        raise RuntimeError("max_32bit_int2 failed")

    tricky.too_big_32bit_int1()
    tricky.too_small_32bit_int1()
    tricky.too_big_32bit_int2()
    tricky.too_small_32bit_int2()

    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

    if default_args.Q.slightly_off_square_static(10) != 102:
        raise RuntimeError

    # Regression test for https://github.com/swig/swig/issues/2786
    if default_args.Q.slightly_off_square_static() != 291:
        raise RuntimeError

    q = default_args.Q()
    if q.slightly_off_square(10) != 102:
        raise RuntimeError

    # Regression test for https://github.com/swig/swig/issues/2786
    if q.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

    default_args.wrapptr_0(1)
    default_args.wrapptr_0l(1)
    default_args.wrapptr_null(1)
    default_args.wrapptr_nullptr(1)

    swig_check(default_args.sizeof_subscript_default_arg(), 5)
    swig_check(default_args.sizeof_subscript_count, 5)
    swig_check(default_args.number_subscript_default_arg(), 3)
    swig_check(default_args.new_subscript_default_arg(), 2)

    size = default_args.sizeof_member_size()
    swig_check(default_args.sizeof_member_constant, 2 * size)
    swig_check(default_args.sizeof_member_default(), 2 * size)
    swig_check(default_args.sizeof_member_default(1), 1 + size)
    swig_check(default_args.sizeof_member_chain(), True)
    swig_check(default_args.sizeof_member_chain(0), False)

if __name__ == "__main__":
    run("default_args")
