local v=require ("default_args")

local ec = v.EnumClass()
assert(ec:blah(), "EnumClass::blah() default arguments don't work")

local de = v.DerivedEnumClass()
de:accelerate()
de:accelerate(v.EnumClass.SLOW)

assert(v.Statics.staticmethod() == 60)
assert(v.cfunc1(1) == 2)
assert(v.cfunc2(1) == 3)
assert(v.cfunc3(1) == 4)

local f = v.Foo()
f:newname()
f:newname(1)
f:defaulted1()
f:defaulted2()
assert(f:double_if_void_ptr_is_null(2, nil) == 4)
assert(f:double_if_void_ptr_is_null(3) == 6)
assert(f:double_if_handle_is_null(4, nil) == 8)
assert(f:double_if_handle_is_null(5) == 10)
assert(f:double_if_dbl_ptr_is_null(6, nil) == 12)
assert(f:double_if_dbl_ptr_is_null(7) == 14)

assert(not pcall(function() v.Foo(1) end), "Foo::Foo ignore is not working")
assert(not pcall(function() v.Foo(1, 2) end), "Foo::Foo ignore is not working")
assert(not pcall(function() v.Foo(1, 2, 3) end), "Foo::Foo ignore is not working")
assert(not pcall(function() f.meth(1) end), "Foo::meth ignore is not working")
assert(not pcall(function() f.meth(1, 2) end), "Foo::meth ignore is not working")
assert(not pcall(function() f.meth(1, 2, 3) end), "Foo::meth ignore is not working")

local Klass_inc = v.Klass.inc
assert(Klass_inc(100, v.Klass(22)).val == 122, "Klass::inc failed")
assert(Klass_inc(100).val == 99, "Klass::inc failed")
assert(Klass_inc().val == 0, "Klass::inc failed")

local tricky = v.TrickyInPython()
assert(tricky:value_m1(10) == -1, "trickyvalue_m1 failed")
assert(tricky:value_m1(10, 10) == 10, "trickyvalue_m1 failed")
assert(tricky:value_0xabcdef(10) == 0xabcdef, "trickyvalue_0xabcdef failed")
assert(tricky:value_0644(10) == 420, "trickyvalue_0644 failed")
assert(tricky:value_perm(10) == 420, "trickyvalue_perm failed")
assert(tricky:value_m01(10) == -1, "trickyvalue_m01 failed")
assert(tricky:booltest2(), "booltest2 failed")
assert(tricky:max_32bit_int1() == 0x7FFFFFFF, "max_32bit_int1 failed")
assert(tricky:min_32bit_int1() == -2147483648, "min_32bit_int1 failed")
assert(tricky:max_32bit_int2() == 0x7FFFFFFF, "max_32bit_int2 failed")
tricky:too_big_32bit_int1()
tricky:too_small_32bit_int1()
tricky:too_big_32bit_int2()
tricky:too_small_32bit_int2()

v.seek()
v.seek(10)

assert(v.booltest(), "booltest failed")
assert(v.slightly_off_square(10) == 102)
assert(v.slightly_off_square() == 291)
assert(v.Q.slightly_off_square_static(10) == 102)
assert(v.Q.slightly_off_square_static() == 291)

local q = v.Q()
assert(q:slightly_off_square(10) == 102)
assert(q:slightly_off_square() == 291)

local cda = v.CDA()
assert(v.CDA():cdefaultargs_test1() == 1)
assert(v.CDA():cdefaultargs_test2() == 1)
assert(cda:cdefaultargs_test1() == 1)
assert(cda:cdefaultargs_test2() == 1)

assert(v.chartest1() == "x")
assert(v.chartest2() == "\0")
assert(v.chartest3() == "\1")
assert(v.chartest4() == "\n")
assert(v.chartest5() == "B")
assert(v.chartest6() == "C")
