diff options
Diffstat (limited to 'Examples/test-suite')
108 files changed, 4512 insertions, 196 deletions
diff --git a/Examples/test-suite/apply_strings.i b/Examples/test-suite/apply_strings.i index 62b578bf2..695dd068f 100644 --- a/Examples/test-suite/apply_strings.i +++ b/Examples/test-suite/apply_strings.i @@ -68,6 +68,10 @@ TAscii *DigitsGlobalC; // Director test %feature("director"); +#if defined(SWIGGO) +%typemap(godirectorout) CharPtr, CCharPtr "" +#endif + %inline %{ struct DirectorTest { virtual UCharPtr UCharFunction(UCharPtr str) { return str; } diff --git a/Examples/test-suite/char_constant.i b/Examples/test-suite/char_constant.i index 5235b0581..918456192 100644 --- a/Examples/test-suite/char_constant.i +++ b/Examples/test-suite/char_constant.i @@ -12,6 +12,36 @@ #define ESC_CONST '\1' #define NULL_CONST '\0' #define SPECIALCHAR 'á' +#define SPECIALCHAR2 '\n' +#define SPECIALCHARA 'A' +#define SPECIALCHARB '\102' // B +#define SPECIALCHARC '\x43' // C +#define SPECIALCHARD 0x44 // D +#define SPECIALCHARE 69 // E +#define SPECIALCHARAE1 'Æ' // AE (latin1 encoded) +#define SPECIALCHARAE2 '\306' // AE (latin1 encoded) +#define SPECIALCHARAE3 '\xC6' // AE (latin1 encoded) + +#if defined(SWIGJAVA) +%javaconst(1); +#elif SWIGCSHARP +%csconst(1); +#elif SWIGD +%dmanifestconst; +#endif + +#define X_ESC_CONST '\1' +#define X_NULL_CONST '\0' +#define X_SPECIALCHAR 'á' +#define X_SPECIALCHAR2 '\n' +#define X_SPECIALCHARA 'A' +#define X_SPECIALCHARB '\102' // B +#define X_SPECIALCHARC '\x43' // C +#define X_SPECIALCHARD 0x44 // D +#define X_SPECIALCHARE 69 // E +#define X_SPECIALCHARAE1 'Æ' // AE (latin1 encoded) +#define X_SPECIALCHARAE2 '\306' // AE (latin1 encoded) +#define X_SPECIALCHARAE3 '\xC6' // AE (latin1 encoded) %inline { diff --git a/Examples/test-suite/chartest.i b/Examples/test-suite/chartest.i index e81cf54a4..1046fa4d1 100644 --- a/Examples/test-suite/chartest.i +++ b/Examples/test-suite/chartest.i @@ -1,6 +1,11 @@ %module chartest %inline %{ +#if defined(__clang__) +#pragma clang diagnostic push +// Suppress: illegal character encoding in character literal +#pragma clang diagnostic ignored "-Winvalid-source-encoding" +#endif char printable_global_char = 'a'; char unprintable_global_char = 0x7F; @@ -12,4 +17,68 @@ char GetUnprintableChar() { return 0x7F; } +static const char globchar0 = '\0'; +static const char globchar1 = '\1'; +static const char globchar2 = '\n'; +static const char globcharA = 'A'; +static const char globcharB = '\102'; // B +static const char globcharC = '\x43'; // C +static const char globcharD = 0x44; // D +static const char globcharE = 69; // E +static const char globcharAE1 = 'Æ'; // AE (latin1 encoded) +static const char globcharAE2 = '\306'; // AE (latin1 encoded) +static const char globcharAE3 = '\xC6'; // AE (latin1 encoded) + +struct CharTestClass { + static const char memberchar0 = '\0'; + static const char memberchar1 = '\1'; + static const char memberchar2 = '\n'; + static const char membercharA = 'A'; + static const char membercharB = '\102'; // B + static const char membercharC = '\x43'; // C + static const char membercharD = 0x44; // D + static const char membercharE = 69; // E + static const char membercharAE1 = 'Æ'; // AE (latin1 encoded) + static const char membercharAE2 = '\306'; // AE (latin1 encoded) + static const char membercharAE3 = '\xC6'; // AE (latin1 encoded) +}; +%} + +#if defined(SWIGJAVA) +%javaconst(1); +#elif SWIGCSHARP +%csconst(1); +#elif SWIGD +%dmanifestconst; +#endif + +%inline %{ +static const char x_globchar0 = '\0'; +static const char x_globchar1 = '\1'; +static const char x_globchar2 = '\n'; +static const char x_globcharA = 'A'; +static const char x_globcharB = '\102'; // B +static const char x_globcharC = '\x43'; // C +static const char x_globcharD = 0x44; // D +static const char x_globcharE = 69; // E +static const char x_globcharAE1 = 'Æ'; // AE (latin1 encoded) +static const char x_globcharAE2 = '\306'; // AE (latin1 encoded) +static const char x_globcharAE3 = '\xC6'; // AE (latin1 encoded) + +struct X_CharTestClass { + static const char memberchar0 = '\0'; + static const char memberchar1 = '\1'; + static const char memberchar2 = '\n'; + static const char membercharA = 'A'; + static const char membercharB = '\102'; // B + static const char membercharC = '\x43'; // C + static const char membercharD = 0x44; // D + static const char membercharE = 69; // E + static const char membercharAE1 = 'Æ'; // AE (latin1 encoded) + static const char membercharAE2 = '\306'; // AE (latin1 encoded) + static const char membercharAE3 = '\xC6'; // AE (latin1 encoded) +}; +#if defined(__clang__) +#pragma clang diagnostic pop +#endif %} diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk index 9f948c2ca..1658e509b 100644 --- a/Examples/test-suite/common.mk +++ b/Examples/test-suite/common.mk @@ -174,7 +174,6 @@ CPP_TEST_CASES += \ director_abstract \ director_alternating \ director_basic \ - director_property \ director_binary_string \ director_classes \ director_classic \ @@ -189,12 +188,14 @@ CPP_TEST_CASES += \ director_ignore \ director_keywords \ director_namespace_clash \ + director_nested \ director_nspace \ director_nspace_director_name_collision \ - director_nested \ director_overload \ director_overload2 \ + director_pass_by_value \ director_primitives \ + director_property \ director_protected \ director_protected_overloaded \ director_redefined \ @@ -282,6 +283,10 @@ CPP_TEST_CASES += \ minherit2 \ mixed_types \ multiple_inheritance \ + multiple_inheritance_abstract \ + multiple_inheritance_interfaces \ + multiple_inheritance_nspace \ + multiple_inheritance_shared_ptr \ name_cxx \ name_warnings \ namespace_class \ @@ -303,6 +308,7 @@ CPP_TEST_CASES += \ nested_class \ nested_directors \ nested_comment \ + nested_ignore \ nested_scope \ nested_template_base \ nested_workaround \ @@ -341,6 +347,7 @@ CPP_TEST_CASES += \ rename2 \ rename3 \ rename4 \ + rename_rstrip_encoder \ rename_scope \ rename_simple \ rename_strip_encoder \ @@ -357,6 +364,7 @@ CPP_TEST_CASES += \ smart_pointer_const2 \ smart_pointer_const_overload \ smart_pointer_extend \ + smart_pointer_ignore \ smart_pointer_member \ smart_pointer_multi \ smart_pointer_multi_typedef \ @@ -379,6 +387,7 @@ CPP_TEST_CASES += \ static_array_member \ static_const_member \ static_const_member_2 \ + string_constants \ struct_initialization_cpp \ struct_value \ symbol_clash \ @@ -396,6 +405,7 @@ CPP_TEST_CASES += \ template_default2 \ template_default_arg \ template_default_arg_overloaded \ + template_default_arg_overloaded_extend \ template_default_arg_virtual_destructor \ template_default_class_parms \ template_default_class_parms_typedef \ @@ -664,6 +674,11 @@ MULTI_CPP_TEST_CASES += \ wallkw.cpptest: SWIGOPT += -Wallkw preproc_include.ctest: SWIGOPT += -includeall +# Allow modules to define temporarily failing tests. +C_TEST_CASES := $(filter-out $(FAILING_C_TESTS),$(C_TEST_CASES)) +CPP_TEST_CASES := $(filter-out $(FAILING_CPP_TESTS),$(CPP_TEST_CASES)) +MULTI_CPP_TEST_CASES := $(filter-out $(FAILING_MULTI_CPP_TESTS),$(MULTI_CPP_TEST_CASES)) + NOT_BROKEN_TEST_CASES = $(CPP_TEST_CASES:=.cpptest) \ $(C_TEST_CASES:=.ctest) \ @@ -694,6 +709,7 @@ all: $(NOT_BROKEN_TEST_CASES) $(BROKEN_TEST_CASES) broken: $(BROKEN_TEST_CASES) check: $(NOT_BROKEN_TEST_CASES) + @echo $(words $^) $(LANGUAGE) tests passed check-c: $(C_TEST_CASES:=.ctest) @@ -701,6 +717,13 @@ check-cpp: $(CPP_TEST_CASES:=.cpptest) check-cpp11: $(CPP11_TEST_CASES:=.cpptest) +check-failing-test = \ + $(MAKE) -s $1.$2 >/dev/null 2>/dev/null && echo "Failing test $1 passed." + +check-failing: + +-$(foreach t,$(FAILING_C_TESTS),$(call check-failing-test,$t,ctest);) + +-$(foreach t,$(FAILING_CPP_TESTS),$(call check-failing-test,$t,cpptest);) + +-$(foreach t,$(FAILING_MULTI_CPP_TESTS),$(call check-failing-test,$t,multicpptest);) endif # partialcheck target runs SWIG only, ie no compilation or running of tests (for a subset of languages) diff --git a/Examples/test-suite/compactdefaultargs.i b/Examples/test-suite/compactdefaultargs.i index b2b07c5f8..af96fbe23 100644 --- a/Examples/test-suite/compactdefaultargs.i +++ b/Examples/test-suite/compactdefaultargs.i @@ -30,6 +30,7 @@ public: static const double PUBLIC_DEFAULT; Defaults2(int a = PRIVATE_DEFAULT) {} double ret(double d = PUBLIC_DEFAULT) { return d; } + double nodefault(int x) { return x; } }; %} diff --git a/Examples/test-suite/constant_directive.i b/Examples/test-suite/constant_directive.i index 8204720d6..89f13cecc 100644 --- a/Examples/test-suite/constant_directive.i +++ b/Examples/test-suite/constant_directive.i @@ -1,28 +1,44 @@ %module constant_directive // %constant and struct -%{ - struct Type1 { - Type1(int val = 0) : val(val) {} - int val; - }; - static Type1 TYPE1_CONSTANT1(1); - static Type1 TYPE1_CONST2(2); - static Type1 TYPE1_CONST3(3); -%} +%inline %{ +#if defined(_MSC_VER) + #pragma warning(disable : 4190) // warning C4190: 'result' has C-linkage specified, but returns UDT 'Type1' which is incompatible with C +#endif struct Type1 { - Type1(int val = 0) : val(val) {} + Type1(int val = 0) : val(val) {} int val; }; +/* Typedefs for const Type and its pointer */ +typedef const Type1 Type1Const; +typedef const Type1* Type1Cptr; -%inline %{ +/* Typedefs for function pointers returning Type1 */ +typedef Type1 (*Type1Fptr)(); +typedef Type1 (* const Type1Cfptr)(); + +/* Function returning an instance of Type1 */ Type1 getType1Instance() { return Type1(111); } %} +%{ + static Type1 TYPE1_CONSTANT1(1); + static Type1 TYPE1_CONST2(2); + static Type1 TYPE1_CONST3(3); +%} + %constant Type1 TYPE1_CONSTANT1; %constant Type1 TYPE1_CONSTANT2 = TYPE1_CONST2; %constant Type1 *TYPE1_CONSTANT3 = &TYPE1_CONST3; - +/* Typedef'ed types */ +%constant Type1Const* TYPE1CONST_CONSTANT1 = &TYPE1_CONSTANT1; +%constant Type1Cptr TYPE1CPTR_CONSTANT1 = &TYPE1_CONSTANT1; +/* Function pointers */ +%constant Type1 (*TYPE1FPTR1_CONSTANT1)() = getType1Instance; +%constant Type1 (* const TYPE1CFPTR1_CONSTANT1)() = getType1Instance; +/* Typedef'ed function pointers */ +%constant Type1Fptr TYPE1FPTR1DEF_CONSTANT1 = getType1Instance; +%constant Type1Cfptr TYPE1CFPTR1DEF_CONSTANT1 = getType1Instance; +/* Regular constant */ %constant int TYPE_INT = 0; - diff --git a/Examples/test-suite/cpp11_li_std_array.i b/Examples/test-suite/cpp11_li_std_array.i index 74e34370c..19304d9e6 100644 --- a/Examples/test-suite/cpp11_li_std_array.i +++ b/Examples/test-suite/cpp11_li_std_array.i @@ -1,6 +1,6 @@ %module cpp11_li_std_array -#if defined(SWIGPYTHON) || defined(SWIGRUBY) +#if defined(SWIGPYTHON) || defined(SWIGRUBY) || defined(SWIGJAVA) %{ #include <array> diff --git a/Examples/test-suite/cpp11_strongly_typed_enumerations.i b/Examples/test-suite/cpp11_strongly_typed_enumerations.i index 3a4ee107a..64fdd2b6f 100644 --- a/Examples/test-suite/cpp11_strongly_typed_enumerations.i +++ b/Examples/test-suite/cpp11_strongly_typed_enumerations.i @@ -214,5 +214,12 @@ Enum1 globalTest1(Enum1 e) { return e; } Class1::Enum12 globalTest2(Class1::Enum12 e) { return e; } Class1::Struct1::Enum12 globalTest3(Class1::Struct1::Enum12 e) { return e; } +class PrivateEnumClass { +private: + enum class Enum { + PrivateEnum1, + PrivateEnum2 + }; +}; %} diff --git a/Examples/test-suite/cpp11_type_aliasing.i b/Examples/test-suite/cpp11_type_aliasing.i index 87443633a..2f6ea3aa7 100644 --- a/Examples/test-suite/cpp11_type_aliasing.i +++ b/Examples/test-suite/cpp11_type_aliasing.i @@ -2,15 +2,6 @@ // Type aliasing seg fault : Github issue #424 -%warnfilter(SWIGWARN_CPP11_ALIAS_DECLARATION) Target; -%warnfilter(SWIGWARN_CPP11_ALIAS_DECLARATION) Int; -%warnfilter(SWIGWARN_CPP11_ALIAS_DECLARATION) IntRef; -%warnfilter(SWIGWARN_CPP11_ALIAS_DECLARATION) IntPtrRef; -%warnfilter(SWIGWARN_CPP11_ALIAS_DECLARATION) IntRValueRef; -%warnfilter(SWIGWARN_CPP11_ALIAS_DECLARATION) IntArray; -%warnfilter(SWIGWARN_CPP11_ALIAS_DECLARATION) HalideTargetPtr1; -%warnfilter(SWIGWARN_CPP11_ALIAS_DECLARATION) HalideTargetPtr2; - %inline %{ namespace Halide { @@ -53,14 +44,69 @@ public: %inline %{ -using Int = int; -using IntRef = int&; -using IntPtrRef = int*&; -using IntRValueRef = int&&; -using IntArray = int[]; - using HalideTargetPtr1 = Halide::Target*; namespace Halide { using HalideTargetPtr2 = Target*; } %} + +// Define some types + +%inline %{ +using Int = int; +using IntPtr = Int*; +using IntRef = Int&; +using IntPtrRef = Int*&; +using IntRValueRef = Int&&; +using IntArray = Int[]; +%} + +// Test that SWIG understands these new types + +%callback("%s_cb"); +Int mult2(Int x); +%nocallback; + +%inline %{ +Int mult2(Int x) { return x * 2; } +IntPtr allocate_int() { return new Int(12); } +void free_int(int* ptr) { delete ptr; } +void inplace_mult2(IntRef x) { x *= 2; } +Int read_int(IntPtr ptr) { return *ptr; } + +template <typename T> class Pair { +public: + using data_t = T; + + data_t a, b; + + Pair() : a(), b() { } + Pair(data_t a, data_t b) : a(a), b(b) { } + data_t first() { return a; } + data_t second() { return b; } +}; +%} + +%template(int_pair) Pair<Int>; + +%inline %{ +using PairInt = Pair<Int>; + +class PairSubclass : public PairInt { +public: + PairSubclass(data_t a, data_t b) : PairInt(a, b) { } + + using const_ref_data_t = const data_t&; +}; + +PairSubclass::data_t plus1(PairSubclass::const_ref_data_t x) { return x + 1; } +%} + +// Test function pointers + +%inline %{ +using callback_t = int(*)(int); + +callback_t get_callback() { return mult2; } +int call(callback_t func, int param) { return func(param); } +%} diff --git a/Examples/test-suite/csharp/director_pass_by_value_runme.cs b/Examples/test-suite/csharp/director_pass_by_value_runme.cs new file mode 100644 index 000000000..ba6371590 --- /dev/null +++ b/Examples/test-suite/csharp/director_pass_by_value_runme.cs @@ -0,0 +1,43 @@ +using System; +using director_pass_by_valueNamespace; + +public class runme +{ + private static void WaitForGC() + { + System.GC.Collect(); + System.GC.WaitForPendingFinalizers(); + System.Threading.Thread.Sleep(10); + } + + static void Main() + { + runme r = new runme(); + r.run(); + } + + void run() + { + Caller caller = new Caller(); + caller.call_virtualMethod(new director_pass_by_value_Derived()); + { + int countdown = 5; + while (true) { + WaitForGC(); + if (--countdown == 0) + break; + }; + } + // bug was the passByVal 'global' object was destroyed after the call to virtualMethod had finished. + int ret = runme.passByVal.getVal(); + if (ret != 0x12345678) + throw new Exception("Bad return value, got " + ret.ToString("x")); + } + public static PassedByValue passByVal; +} + +class director_pass_by_value_Derived : DirectorPassByValueAbstractBase { + public override void virtualMethod(PassedByValue pbv) { + runme.passByVal = pbv; + } +} diff --git a/Examples/test-suite/csharp/multiple_inheritance_abstract_runme.cs b/Examples/test-suite/csharp/multiple_inheritance_abstract_runme.cs new file mode 100644 index 000000000..4584be399 --- /dev/null +++ b/Examples/test-suite/csharp/multiple_inheritance_abstract_runme.cs @@ -0,0 +1,245 @@ +using System; +using multiple_inheritance_abstractNamespace; + +public class multiple_inheritance_abstract_runme { + + //Test base class as a parameter in C# + int jcbase1b(CBase1 cb1){ + return cb1.cbase1y(); + } + int jabase1(ABase1 ab1){ + return ab1.abase1(); + } + int jcbase2(CBase2 cb2){ + return cb2.cbase2(); + } + + public static void check(bool fail, string msg) { + if (fail) + throw new Exception(msg); + } + + public static void Main() { + //Test Derived1 + Derived1 d1=new Derived1(); + check(d1.cbase1y()!=3, "Derived1::cbase1y() failed"); + check(d1.cbase2()!=4, "Derived1::cbase2() failed"); + + //Test Derived2 + Derived2 d2=new Derived2(); + check(d2.cbase1y()!=6, "Derived2::cbase1y() failed"); + check(d2.abase1()!=5, "Derived2::abase1() failed"); + + //Test Derived3 + Derived3 d3=new Derived3(); + check(d3.cbase1y()!=7, "Derived3::cbase1y() failed"); + check(d3.cbase2()!=8, "Derived3::cbase2() failed"); + check(d3.abase1()!=9, "Derived3::abase1() failed"); + + //Test Bottom1 + Bottom1 b1=new Bottom1(); + check(b1.cbase1y()!=103, "Bottom1::cbase1y() failed"); + check(b1.cbase2()!=104, "Bottom1::cbase2() failed"); + + //Test Bottom2 + Bottom2 b2=new Bottom2(); + check(b2.cbase1y()!=206, "Bottom2::cbase1y() failed"); + check(b2.abase1()!=205, "Bottom2::abase1() failed"); + + //Test Bottom3 + Bottom3 b3=new Bottom3(); + check(b3.cbase1y()!=307, "Bottom3::cbase1y() failed"); + check(b3.cbase2()!=308, "Bottom3::cbase2() failed"); + check(b3.abase1()!=309, "Bottom3::abase1() failed"); + + //Test interfaces from c++ classes + CBase1 cb1=new CBase1SwigImpl(); + CBase2 cb2=new CBase2SwigImpl(); + check(cb1.cbase1y()!=1, "CBase1::cbase1y() failed"); + check(cb2.cbase2()!=2, "CBase2::cbase2() failed"); + + //Test abstract class as return value + ABase1 ab1=d3.cloneit(); + check(ab1.abase1()!=9, "Derived3::abase1() through ABase1 failed"); + + //Test concrete base class as return value + CBase1 cb6=d2.cloneit(); + CBase2 cb7=d1.cloneit(); + check(cb6.cbase1y()!=6, "Derived2::cbase1y() through CBase1 failed"); + check(cb7.cbase2()!=4, "Derived1:cbase2() through ABase1 failed"); + + //Test multi inheritance + CBase1 cb3=new Derived1(); + CBase1 cb4=new Derived3(); + CBase2 cb5=new Derived3(); + ABase1 ab6=new Derived2(); + check(cb3.cbase1y()!=3, "Derived1::cbase1y() through CBase1 failed"); + check(cb4.cbase1y()!=7, "Derived3::cbase1y() through CBase1 failed"); + check(cb5.cbase2()!=8, "Derived3::cbase2() through CBase2 failed"); + check(ab6.abase1()!=5, "Derived2::abase1() through ABase1 failed"); + + //Test base classes as parameter in C# + multiple_inheritance_abstract_runme mhar=new multiple_inheritance_abstract_runme(); + check(mhar.jcbase1b(d1)!=3, "jcbase1b() through Derived1 as parameter failed"); + check(mhar.jcbase1b(d2)!=6, "jcbase1b() through Derived2 as parameter failed"); + check(mhar.jcbase1b(d3)!=7, "jcbase1b() through Derived3 as parameter failed"); + check(mhar.jcbase2(d1)!=4, "jcbase2() through Derived1 as parameter failed"); + check(mhar.jcbase2(d3)!=8, "jcbase2() through Derived3 as parameter failed"); + check(mhar.jabase1(d2)!=5, "jabase1() through Derived2 as parameter failed"); + check(mhar.jabase1(d3)!=9, "jabase1() through Derived3 as parameter failed"); + + //Value parameters + //Test CBase1 CBase2 as parameters (note slicing for Derived and Bottom classes) + check(multiple_inheritance_abstract.InputValCBase1(d1)!=1, "InputValCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase1(d2)!=1, "InputValCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase1(d3)!=1, "InputValCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase2(d3)!=2, "InputValCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase2(d1)!=2, "InputValCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase1(cb1)!=1, "InputValCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase2(cb2)!=2, "InputValCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase1(b1)!=1, "InputValCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase1(b2)!=1, "InputValCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase1(b3)!=1, "InputValCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase2(b3)!=2, "InputValCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase2(b1)!=2, "InputValCBase2(), Bottom1 as a parameter failed"); + + //Pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_abstract.InputPtrABase1(d2)!=5, "InputPtrABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrABase1(d3)!=9, "InputPtrABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrABase1(b2)!=205, "InputPtrABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrABase1(b3)!=309, "InputPtrABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_abstract.InputPtrCBase1(d1)!=3, "InputPtrCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase1(d2)!=6, "InputPtrCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase1(d3)!=7, "InputPtrCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase2(d3)!=8, "InputPtrCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase2(d1)!=4, "InputPtrCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase1(cb1)!=1, "InputPtrCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase2(cb2)!=2, "InputPtrCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase1(b1)!=103, "InputPtrCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase1(b2)!=206, "InputPtrCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase1(b3)!=307, "InputPtrCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase2(b3)!=308, "InputPtrCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase2(b1)!=104, "InputPtrCBase2(), Bottom1 as a parameter failed"); + + //Reference parameters + //Test ABase1 as a parameter + check(multiple_inheritance_abstract.InputRefABase1(d2)!=5, "InputRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefABase1(d3)!=9, "InputRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefABase1(b2)!=205, "InputRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefABase1(b3)!=309, "InputRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_abstract.InputRefCBase1(d1)!=3, "InputRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase1(d2)!=6, "InputRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase1(d3)!=7, "InputRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase2(d3)!=8, "InputRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase2(d1)!=4, "InputRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase1(cb1)!=1, "InputRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase2(cb2)!=2, "InputRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase1(b1)!=103, "InputRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase1(b2)!=206, "InputRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase1(b3)!=307, "InputRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase2(b3)!=308, "InputRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase2(b1)!=104, "InputRefCBase2(), Bottom1 as a parameter failed"); + + //Const reference pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_abstract.InputCPtrRefABase1(d2)!=5, "InputCPtrRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefABase1(d3)!=9, "InputCPtrRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefABase1(b2)!=205, "InputCPtrRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefABase1(b3)!=309, "InputCPtrRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_abstract.InputCPtrRefCBase1(d1)!=3, "InputCPtrRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(d2)!=6, "InputCPtrRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(d3)!=7, "InputCPtrRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(d3)!=8, "InputCPtrRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(d1)!=4, "InputCPtrRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(cb1)!=1, "InputCPtrRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(cb2)!=2, "InputCPtrRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(b1)!=103, "InputCPtrRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(b2)!=206, "InputCPtrRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(b3)!=307, "InputCPtrRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(b3)!=308, "InputCPtrRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(b1)!=104, "InputCPtrRefCBase2(), Bottom1 as a parameter failed"); + + //Derived classes as parameters + check(multiple_inheritance_abstract.InputValDerived1(d1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_abstract.InputValDerived2(d2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_abstract.InputValDerived3(d3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_abstract.InputRefDerived1(d1)!=3+4, "InputRefDerived1() failed"); + check(multiple_inheritance_abstract.InputRefDerived2(d2)!=6+5, "InputRefDerived2() failed"); + check(multiple_inheritance_abstract.InputRefDerived3(d3)!=7+8+9, "InputRefDerived3() failed"); + + check(multiple_inheritance_abstract.InputPtrDerived1(d1)!=3+4, "InputPtrDerived1() failed"); + check(multiple_inheritance_abstract.InputPtrDerived2(d2)!=6+5, "InputPtrDerived2() failed"); + check(multiple_inheritance_abstract.InputPtrDerived3(d3)!=7+8+9, "InputPtrDerived3() failed"); + + check(multiple_inheritance_abstract.InputCPtrRefDerived1(d1)!=3+4, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_abstract.InputCPtrRefDerived2(d2)!=6+5, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_abstract.InputCPtrRefDerived3(d3)!=7+8+9, "InputCPtrRefDerived3() failed"); + + //Bottom classes as Derived parameters + check(multiple_inheritance_abstract.InputValDerived1(b1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_abstract.InputValDerived2(b2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_abstract.InputValDerived3(b3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_abstract.InputRefDerived1(b1)!=103+104, "InputRefDerived1() failed"); + check(multiple_inheritance_abstract.InputRefDerived2(b2)!=206+205, "InputRefDerived2() failed"); + check(multiple_inheritance_abstract.InputRefDerived3(b3)!=307+308+309, "InputRefDerived3() failed"); + + check(multiple_inheritance_abstract.InputPtrDerived1(b1)!=103+104, "InputPtrDerived1() failed"); + check(multiple_inheritance_abstract.InputPtrDerived2(b2)!=206+205, "InputPtrDerived2() failed"); + check(multiple_inheritance_abstract.InputPtrDerived3(b3)!=307+308+309, "InputPtrDerived3() failed"); + + check(multiple_inheritance_abstract.InputCPtrRefDerived1(b1)!=103+104, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_abstract.InputCPtrRefDerived2(b2)!=206+205, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_abstract.InputCPtrRefDerived3(b3)!=307+308+309, "InputCPtrRefDerived3() failed"); + + //Bottom classes as Bottom parameters + check(multiple_inheritance_abstract.InputValBottom1(b1)!=103+104, "InputValBottom1() failed"); + check(multiple_inheritance_abstract.InputValBottom2(b2)!=206+205, "InputValBottom2() failed"); + check(multiple_inheritance_abstract.InputValBottom3(b3)!=307+308+309, "InputValBottom3() failed"); + + check(multiple_inheritance_abstract.InputRefBottom1(b1)!=103+104, "InputRefBottom1() failed"); + check(multiple_inheritance_abstract.InputRefBottom2(b2)!=206+205, "InputRefBottom2() failed"); + check(multiple_inheritance_abstract.InputRefBottom3(b3)!=307+308+309, "InputRefBottom3() failed"); + + check(multiple_inheritance_abstract.InputPtrBottom1(b1)!=103+104, "InputPtrBottom1() failed"); + check(multiple_inheritance_abstract.InputPtrBottom2(b2)!=206+205, "InputPtrBottom2() failed"); + check(multiple_inheritance_abstract.InputPtrBottom3(b3)!=307+308+309, "InputPtrBottom3() failed"); + + check(multiple_inheritance_abstract.InputCPtrRefBottom1(b1)!=103+104, "InputCPtrRefBottom1() failed"); + check(multiple_inheritance_abstract.InputCPtrRefBottom2(b2)!=206+205, "InputCPtrRefBottom2() failed"); + check(multiple_inheritance_abstract.InputCPtrRefBottom3(b3)!=307+308+309, "InputCPtrRefBottom3() failed"); + // Return pointers + check(multiple_inheritance_abstract.MakePtrDerived1_CBase1().cbase1y()!=3, "MakePtrDerived1_CBase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived1_CBase2().cbase2()!=4, "MakePtrDerived1_CBase2 failed"); + check(multiple_inheritance_abstract.MakePtrDerived2_CBase1().cbase1y()!=6, "MakePtrDerived2_CBase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived2_ABase1().abase1()!=5, "MakePtrDerived2_ABase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived3_ABase1().abase1()!=9, "MakePtrDerived3_ABase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived3_CBase1().cbase1y()!=7, "MakePtrDerived3_CBase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived3_CBase2().cbase2()!=8, "MakePtrDerived3_CBase2 failed"); + + // Return references + check(multiple_inheritance_abstract.MakeRefDerived1_CBase1().cbase1y()!=3, "MakeRefDerived1_CBase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived1_CBase2().cbase2()!=4, "MakeRefDerived1_CBase2 failed"); + check(multiple_inheritance_abstract.MakeRefDerived2_CBase1().cbase1y()!=6, "MakeRefDerived2_CBase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived2_ABase1().abase1()!=5, "MakeRefDerived2_ABase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived3_ABase1().abase1()!=9, "MakeRefDerived3_ABase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived3_CBase1().cbase1y()!=7, "MakeRefDerived3_CBase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived3_CBase2().cbase2()!=8, "MakeRefDerived3_CBase2 failed"); + + // Return by value (sliced objects) + check(multiple_inheritance_abstract.MakeValDerived1_CBase1().cbase1y()!=1, "MakeValDerived1_CBase1 failed"); + check(multiple_inheritance_abstract.MakeValDerived1_CBase2().cbase2()!=2, "MakeValDerived1_CBase2 failed"); + check(multiple_inheritance_abstract.MakeValDerived2_CBase1().cbase1y()!=1, "MakeValDerived2_CBase1 failed"); + check(multiple_inheritance_abstract.MakeValDerived3_CBase1().cbase1y()!=1, "MakeValDerived3_CBase1 failed"); + check(multiple_inheritance_abstract.MakeValDerived3_CBase2().cbase2()!=2, "MakeValDerived3_CBase2 failed"); + + } +} diff --git a/Examples/test-suite/csharp/multiple_inheritance_interfaces_runme.cs b/Examples/test-suite/csharp/multiple_inheritance_interfaces_runme.cs new file mode 100644 index 000000000..c786ff9b3 --- /dev/null +++ b/Examples/test-suite/csharp/multiple_inheritance_interfaces_runme.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using multiple_inheritance_interfacesNamespace; + +public class multiple_inheritance_interfaces_runme { + + static string SortArrayToString(string[] types) { + Array.Sort<string>(types); + return string.Join(" ", types); + } + + static string SortArrayToString(Type[] types) { + List<string> stypes = new List<string>(); + foreach (Type t in types) + stypes.Add(t.Name); + return SortArrayToString(stypes.ToArray()); + } + + + private static void checkBaseAndInterfaces(Type cls, bool interfaceExpected, string baseClass, string[] interfaces) { + string[] expectedInterfaces = new string[interfaces.Length + (interfaceExpected ? 0 : 1)]; + for (int i=0; i<interfaces.Length; ++i) + expectedInterfaces[i] = interfaces[i]; + if (!interfaceExpected) + expectedInterfaces[interfaces.Length] = "IDisposable"; + Type[] actualInterfaces = cls.GetInterfaces(); + string expectedInterfacesString = SortArrayToString(expectedInterfaces); + string actualInterfacesString = SortArrayToString(actualInterfaces); + if (expectedInterfacesString != actualInterfacesString) + throw new Exception("Expected interfaces for " + cls.Name + ": \n" + expectedInterfacesString + "\n" + "Actual interfaces: \n" + actualInterfacesString); + + string expectedBaseString = null; + if (interfaceExpected) { + // expecting an interface + if (!cls.IsInterface) + throw new Exception(cls.Name + " should be an interface but is not"); + expectedBaseString = string.IsNullOrEmpty(baseClass) ? "" : "multiple_inheritance_interfacesNamespace." + baseClass; + } else { + // expecting a class + if (cls.IsInterface) + throw new Exception(cls.Name + " is an interface but it should not be"); + expectedBaseString = string.IsNullOrEmpty(baseClass) ? "Object" : baseClass; + } + + string actualBaseString = cls.BaseType == null ? "" : cls.BaseType.Name; + if (expectedBaseString != actualBaseString) + throw new Exception("Expected base for " + cls.Name + ": [" + expectedBaseString + "]" + " Actual base: [" + actualBaseString + "]"); + } + + public static void Main() { + // Note that we can't get just the immediate interface + // Type.GetInterfaces() returns all interfaces up the inheritance hierarchy + checkBaseAndInterfaces(typeof(IA), true, "", new string[] {}); + checkBaseAndInterfaces(typeof(IB), true, "", new string[] {}); + checkBaseAndInterfaces(typeof(IC), true, "", new string[] {"IA", "IB"}); + checkBaseAndInterfaces(typeof(A), false, "", new string[] {"IA"}); + checkBaseAndInterfaces(typeof(B), false, "", new string[] {"IB"}); + checkBaseAndInterfaces(typeof(C), false, "", new string[] {"IA", "IB", "IC"}); + checkBaseAndInterfaces(typeof(D), false, "", new string[] {"IA", "IB", "IC"}); + checkBaseAndInterfaces(typeof(E), false, "D", new string[] {"IA", "IB", "IC"}); + + checkBaseAndInterfaces(typeof(IJ), true, "", new string[] {}); + checkBaseAndInterfaces(typeof(IK), true, "", new string[] {"IJ"}); + checkBaseAndInterfaces(typeof(IL), true, "", new string[] {"IJ", "IK"}); + checkBaseAndInterfaces(typeof(J), false, "", new string[] {"IJ"}); + checkBaseAndInterfaces(typeof(K), false, "", new string[] {"IJ", "IK"}); + checkBaseAndInterfaces(typeof(L), false, "", new string[] {"IJ", "IK", "IL"}); + checkBaseAndInterfaces(typeof(M), false, "", new string[] {"IJ", "IK", "IL"}); + + checkBaseAndInterfaces(typeof(P), false, "", new string[] {}); + checkBaseAndInterfaces(typeof(IQ), true, "", new string[] {}); + checkBaseAndInterfaces(typeof(Q), false, "", new string[] {"IQ"}); + checkBaseAndInterfaces(typeof(R), false, "P", new string[] {"IQ"}); + checkBaseAndInterfaces(typeof(S), false, "P", new string[] {"IQ"}); + checkBaseAndInterfaces(typeof(T), false, "", new string[] {"IQ"}); + checkBaseAndInterfaces(typeof(U), false, "R", new string[] {"IQ"}); + checkBaseAndInterfaces(typeof(V), false, "S", new string[] {"IQ"}); + checkBaseAndInterfaces(typeof(W), false, "T", new string[] {"IQ"}); + + // overloaded methods check + D d = new D(); + d.ia(); + d.ia(10); + d.ia("bye"); + d.ia("bye", false); + } +} diff --git a/Examples/test-suite/csharp/multiple_inheritance_nspace_runme.cs b/Examples/test-suite/csharp/multiple_inheritance_nspace_runme.cs new file mode 100644 index 000000000..6ed13a6ff --- /dev/null +++ b/Examples/test-suite/csharp/multiple_inheritance_nspace_runme.cs @@ -0,0 +1,246 @@ +using System; +using multiple_inheritance_nspaceNamespace; +using multiple_inheritance_nspaceNamespace.Space; + +public class multiple_inheritance_nspace_runme { + + //Test base class as a parameter in C# + int jcbase1b(CBase1SwigInterface cb1){ + return cb1.cbase1y(); + } + int jabase1(ABase1SwigInterface ab1){ + return ab1.abase1(); + } + int jcbase2(CBase2SwigInterface cb2){ + return cb2.cbase2(); + } + + public static void check(bool fail, string msg) { + if (fail) + throw new Exception(msg); + } + + public static void Main() { + //Test Derived1 + Derived1 d1=new Derived1(); + check(d1.cbase1y()!=3, "Derived1::cbase1y() failed"); + check(d1.cbase2()!=4, "Derived1::cbase2() failed"); + + //Test Derived2 + Derived2 d2=new Derived2(); + check(d2.cbase1y()!=6, "Derived2::cbase1y() failed"); + check(d2.abase1()!=5, "Derived2::abase1() failed"); + + //Test Derived3 + Derived3 d3=new Derived3(); + check(d3.cbase1y()!=7, "Derived3::cbase1y() failed"); + check(d3.cbase2()!=8, "Derived3::cbase2() failed"); + check(d3.abase1()!=9, "Derived3::abase1() failed"); + + //Test Bottom1 + Bottom1 b1=new Bottom1(); + check(b1.cbase1y()!=103, "Bottom1::cbase1y() failed"); + check(b1.cbase2()!=104, "Bottom1::cbase2() failed"); + + //Test Bottom2 + Bottom2 b2=new Bottom2(); + check(b2.cbase1y()!=206, "Bottom2::cbase1y() failed"); + check(b2.abase1()!=205, "Bottom2::abase1() failed"); + + //Test Bottom3 + Bottom3 b3=new Bottom3(); + check(b3.cbase1y()!=307, "Bottom3::cbase1y() failed"); + check(b3.cbase2()!=308, "Bottom3::cbase2() failed"); + check(b3.abase1()!=309, "Bottom3::abase1() failed"); + + //Test interfaces from c++ classes + CBase1SwigInterface cb1=new CBase1(); + CBase2SwigInterface cb2=new CBase2(); + check(cb1.cbase1y()!=1, "CBase1::cbase1y() failed"); + check(cb2.cbase2()!=2, "CBase2::cbase2() failed"); + + //Test nspace class as return value + ABase1SwigInterface ab1=d3.cloneit(); + check(ab1.abase1()!=9, "Derived3::abase1() through ABase1 failed"); + + //Test concrete base class as return value + CBase1SwigInterface cb6=d2.cloneit(); + CBase2SwigInterface cb7=d1.cloneit(); + check(cb6.cbase1y()!=6, "Derived2::cbase1y() through CBase1 failed"); + check(cb7.cbase2()!=4, "Derived1:cbase2() through ABase1 failed"); + + //Test multi inheritance + CBase1SwigInterface cb3=new Derived1(); + CBase1SwigInterface cb4=new Derived3(); + CBase2SwigInterface cb5=new Derived3(); + ABase1SwigInterface ab6=new Derived2(); + check(cb3.cbase1y()!=3, "Derived1::cbase1y() through CBase1 failed"); + check(cb4.cbase1y()!=7, "Derived3::cbase1y() through CBase1 failed"); + check(cb5.cbase2()!=8, "Derived3::cbase2() through CBase2 failed"); + check(ab6.abase1()!=5, "Derived2::abase1() through ABase1 failed"); + + //Test base classes as parameter in C# + multiple_inheritance_nspace_runme mhar=new multiple_inheritance_nspace_runme(); + check(mhar.jcbase1b(d1)!=3, "jcbase1b() through Derived1 as parameter failed"); + check(mhar.jcbase1b(d2)!=6, "jcbase1b() through Derived2 as parameter failed"); + check(mhar.jcbase1b(d3)!=7, "jcbase1b() through Derived3 as parameter failed"); + check(mhar.jcbase2(d1)!=4, "jcbase2() through Derived1 as parameter failed"); + check(mhar.jcbase2(d3)!=8, "jcbase2() through Derived3 as parameter failed"); + check(mhar.jabase1(d2)!=5, "jabase1() through Derived2 as parameter failed"); + check(mhar.jabase1(d3)!=9, "jabase1() through Derived3 as parameter failed"); + + //Value parameters + //Test CBase1 CBase2 as parameters (note slicing for Derived and Bottom classes) + check(multiple_inheritance_nspace.InputValCBase1(d1)!=1, "InputValCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase1(d2)!=1, "InputValCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase1(d3)!=1, "InputValCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase2(d3)!=2, "InputValCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase2(d1)!=2, "InputValCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase1(cb1)!=1, "InputValCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase2(cb2)!=2, "InputValCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase1(b1)!=1, "InputValCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase1(b2)!=1, "InputValCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase1(b3)!=1, "InputValCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase2(b3)!=2, "InputValCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase2(b1)!=2, "InputValCBase2(), Bottom1 as a parameter failed"); + + //Pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_nspace.InputPtrABase1(d2)!=5, "InputPtrABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrABase1(d3)!=9, "InputPtrABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrABase1(b2)!=205, "InputPtrABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrABase1(b3)!=309, "InputPtrABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_nspace.InputPtrCBase1(d1)!=3, "InputPtrCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase1(d2)!=6, "InputPtrCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase1(d3)!=7, "InputPtrCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase2(d3)!=8, "InputPtrCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase2(d1)!=4, "InputPtrCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase1(cb1)!=1, "InputPtrCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase2(cb2)!=2, "InputPtrCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase1(b1)!=103, "InputPtrCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase1(b2)!=206, "InputPtrCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase1(b3)!=307, "InputPtrCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase2(b3)!=308, "InputPtrCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase2(b1)!=104, "InputPtrCBase2(), Bottom1 as a parameter failed"); + + //Reference parameters + //Test ABase1 as a parameter + check(multiple_inheritance_nspace.InputRefABase1(d2)!=5, "InputRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefABase1(d3)!=9, "InputRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefABase1(b2)!=205, "InputRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefABase1(b3)!=309, "InputRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_nspace.InputRefCBase1(d1)!=3, "InputRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase1(d2)!=6, "InputRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase1(d3)!=7, "InputRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase2(d3)!=8, "InputRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase2(d1)!=4, "InputRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase1(cb1)!=1, "InputRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase2(cb2)!=2, "InputRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase1(b1)!=103, "InputRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase1(b2)!=206, "InputRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase1(b3)!=307, "InputRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase2(b3)!=308, "InputRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase2(b1)!=104, "InputRefCBase2(), Bottom1 as a parameter failed"); + + //Const reference pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_nspace.InputCPtrRefABase1(d2)!=5, "InputCPtrRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefABase1(d3)!=9, "InputCPtrRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefABase1(b2)!=205, "InputCPtrRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefABase1(b3)!=309, "InputCPtrRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_nspace.InputCPtrRefCBase1(d1)!=3, "InputCPtrRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase1(d2)!=6, "InputCPtrRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase1(d3)!=7, "InputCPtrRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase2(d3)!=8, "InputCPtrRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase2(d1)!=4, "InputCPtrRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase1(cb1)!=1, "InputCPtrRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase2(cb2)!=2, "InputCPtrRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase1(b1)!=103, "InputCPtrRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase1(b2)!=206, "InputCPtrRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase1(b3)!=307, "InputCPtrRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase2(b3)!=308, "InputCPtrRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase2(b1)!=104, "InputCPtrRefCBase2(), Bottom1 as a parameter failed"); + + //Derived classes as parameters + check(multiple_inheritance_nspace.InputValDerived1(d1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_nspace.InputValDerived2(d2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_nspace.InputValDerived3(d3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_nspace.InputRefDerived1(d1)!=3+4, "InputRefDerived1() failed"); + check(multiple_inheritance_nspace.InputRefDerived2(d2)!=6+5, "InputRefDerived2() failed"); + check(multiple_inheritance_nspace.InputRefDerived3(d3)!=7+8+9, "InputRefDerived3() failed"); + + check(multiple_inheritance_nspace.InputPtrDerived1(d1)!=3+4, "InputPtrDerived1() failed"); + check(multiple_inheritance_nspace.InputPtrDerived2(d2)!=6+5, "InputPtrDerived2() failed"); + check(multiple_inheritance_nspace.InputPtrDerived3(d3)!=7+8+9, "InputPtrDerived3() failed"); + + check(multiple_inheritance_nspace.InputCPtrRefDerived1(d1)!=3+4, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_nspace.InputCPtrRefDerived2(d2)!=6+5, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_nspace.InputCPtrRefDerived3(d3)!=7+8+9, "InputCPtrRefDerived3() failed"); + + //Bottom classes as Derived parameters + check(multiple_inheritance_nspace.InputValDerived1(b1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_nspace.InputValDerived2(b2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_nspace.InputValDerived3(b3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_nspace.InputRefDerived1(b1)!=103+104, "InputRefDerived1() failed"); + check(multiple_inheritance_nspace.InputRefDerived2(b2)!=206+205, "InputRefDerived2() failed"); + check(multiple_inheritance_nspace.InputRefDerived3(b3)!=307+308+309, "InputRefDerived3() failed"); + + check(multiple_inheritance_nspace.InputPtrDerived1(b1)!=103+104, "InputPtrDerived1() failed"); + check(multiple_inheritance_nspace.InputPtrDerived2(b2)!=206+205, "InputPtrDerived2() failed"); + check(multiple_inheritance_nspace.InputPtrDerived3(b3)!=307+308+309, "InputPtrDerived3() failed"); + + check(multiple_inheritance_nspace.InputCPtrRefDerived1(b1)!=103+104, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_nspace.InputCPtrRefDerived2(b2)!=206+205, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_nspace.InputCPtrRefDerived3(b3)!=307+308+309, "InputCPtrRefDerived3() failed"); + + //Bottom classes as Bottom parameters + check(multiple_inheritance_nspace.InputValBottom1(b1)!=103+104, "InputValBottom1() failed"); + check(multiple_inheritance_nspace.InputValBottom2(b2)!=206+205, "InputValBottom2() failed"); + check(multiple_inheritance_nspace.InputValBottom3(b3)!=307+308+309, "InputValBottom3() failed"); + + check(multiple_inheritance_nspace.InputRefBottom1(b1)!=103+104, "InputRefBottom1() failed"); + check(multiple_inheritance_nspace.InputRefBottom2(b2)!=206+205, "InputRefBottom2() failed"); + check(multiple_inheritance_nspace.InputRefBottom3(b3)!=307+308+309, "InputRefBottom3() failed"); + + check(multiple_inheritance_nspace.InputPtrBottom1(b1)!=103+104, "InputPtrBottom1() failed"); + check(multiple_inheritance_nspace.InputPtrBottom2(b2)!=206+205, "InputPtrBottom2() failed"); + check(multiple_inheritance_nspace.InputPtrBottom3(b3)!=307+308+309, "InputPtrBottom3() failed"); + + check(multiple_inheritance_nspace.InputCPtrRefBottom1(b1)!=103+104, "InputCPtrRefBottom1() failed"); + check(multiple_inheritance_nspace.InputCPtrRefBottom2(b2)!=206+205, "InputCPtrRefBottom2() failed"); + check(multiple_inheritance_nspace.InputCPtrRefBottom3(b3)!=307+308+309, "InputCPtrRefBottom3() failed"); + // Return pointers + check(multiple_inheritance_nspace.MakePtrDerived1_CBase1().cbase1y()!=3, "MakePtrDerived1_CBase1 failed"); + check(multiple_inheritance_nspace.MakePtrDerived1_CBase2().cbase2()!=4, "MakePtrDerived1_CBase2 failed"); + check(multiple_inheritance_nspace.MakePtrDerived2_CBase1().cbase1y()!=6, "MakePtrDerived2_CBase1 failed"); + check(multiple_inheritance_nspace.MakePtrDerived2_ABase1().abase1()!=5, "MakePtrDerived2_ABase1 failed"); + check(multiple_inheritance_nspace.MakePtrDerived3_ABase1().abase1()!=9, "MakePtrDerived3_ABase1 failed"); + check(multiple_inheritance_nspace.MakePtrDerived3_CBase1().cbase1y()!=7, "MakePtrDerived3_CBase1 failed"); + check(multiple_inheritance_nspace.MakePtrDerived3_CBase2().cbase2()!=8, "MakePtrDerived3_CBase2 failed"); + + // Return references + check(multiple_inheritance_nspace.MakeRefDerived1_CBase1().cbase1y()!=3, "MakeRefDerived1_CBase1 failed"); + check(multiple_inheritance_nspace.MakeRefDerived1_CBase2().cbase2()!=4, "MakeRefDerived1_CBase2 failed"); + check(multiple_inheritance_nspace.MakeRefDerived2_CBase1().cbase1y()!=6, "MakeRefDerived2_CBase1 failed"); + check(multiple_inheritance_nspace.MakeRefDerived2_ABase1().abase1()!=5, "MakeRefDerived2_ABase1 failed"); + check(multiple_inheritance_nspace.MakeRefDerived3_ABase1().abase1()!=9, "MakeRefDerived3_ABase1 failed"); + check(multiple_inheritance_nspace.MakeRefDerived3_CBase1().cbase1y()!=7, "MakeRefDerived3_CBase1 failed"); + check(multiple_inheritance_nspace.MakeRefDerived3_CBase2().cbase2()!=8, "MakeRefDerived3_CBase2 failed"); + + // Return by value (sliced objects) + check(multiple_inheritance_nspace.MakeValDerived1_CBase1().cbase1y()!=1, "MakeValDerived1_CBase1 failed"); + check(multiple_inheritance_nspace.MakeValDerived1_CBase2().cbase2()!=2, "MakeValDerived1_CBase2 failed"); + check(multiple_inheritance_nspace.MakeValDerived2_CBase1().cbase1y()!=1, "MakeValDerived2_CBase1 failed"); + check(multiple_inheritance_nspace.MakeValDerived3_CBase1().cbase1y()!=1, "MakeValDerived3_CBase1 failed"); + check(multiple_inheritance_nspace.MakeValDerived3_CBase2().cbase2()!=2, "MakeValDerived3_CBase2 failed"); + + } +} diff --git a/Examples/test-suite/csharp/multiple_inheritance_shared_ptr_runme.cs b/Examples/test-suite/csharp/multiple_inheritance_shared_ptr_runme.cs new file mode 100644 index 000000000..13ffc62a4 --- /dev/null +++ b/Examples/test-suite/csharp/multiple_inheritance_shared_ptr_runme.cs @@ -0,0 +1,329 @@ +using System; +using multiple_inheritance_shared_ptrNamespace; + +public class multiple_inheritance_shared_ptr_runme { + + //Test base class as a parameter in C# + int jcbase1b(CBase1 cb1){ + return cb1.cbase1y(); + } + int jabase1(ABase1 ab1){ + return ab1.abase1(); + } + int jcbase2(CBase2 cb2){ + return cb2.cbase2(); + } + + public static void check(bool fail, string msg) { + if (fail) + throw new Exception(msg); + } + + public static void Main() { + //Test Derived1 + Derived1 d1=new Derived1(); + check(d1.cbase1y()!=3, "Derived1::cbase1y() failed"); + check(d1.cbase2()!=4, "Derived1::cbase2() failed"); + + //Test Derived2 + Derived2 d2=new Derived2(); + check(d2.cbase1y()!=6, "Derived2::cbase1y() failed"); + check(d2.abase1()!=5, "Derived2::abase1() failed"); + + //Test Derived3 + Derived3 d3=new Derived3(); + check(d3.cbase1y()!=7, "Derived3::cbase1y() failed"); + check(d3.cbase2()!=8, "Derived3::cbase2() failed"); + check(d3.abase1()!=9, "Derived3::abase1() failed"); + + //Test Bottom1 + Bottom1 b1=new Bottom1(); + check(b1.cbase1y()!=103, "Bottom1::cbase1y() failed"); + check(b1.cbase2()!=104, "Bottom1::cbase2() failed"); + + //Test Bottom2 + Bottom2 b2=new Bottom2(); + check(b2.cbase1y()!=206, "Bottom2::cbase1y() failed"); + check(b2.abase1()!=205, "Bottom2::abase1() failed"); + + //Test Bottom3 + Bottom3 b3=new Bottom3(); + check(b3.cbase1y()!=307, "Bottom3::cbase1y() failed"); + check(b3.cbase2()!=308, "Bottom3::cbase2() failed"); + check(b3.abase1()!=309, "Bottom3::abase1() failed"); + + //Test interfaces from c++ classes + CBase1 cb1=new CBase1SwigImpl(); + CBase2 cb2=new CBase2SwigImpl(); + check(cb1.cbase1y()!=1, "CBase1::cbase1y() failed"); + check(cb2.cbase2()!=2, "CBase2::cbase2() failed"); + + //Test abstract class as return value + ABase1 ab1=d3.cloneit(); + check(ab1.abase1()!=9, "Derived3::abase1() through ABase1 failed"); + + //Test concrete base class as return value + CBase1 cb6=d2.cloneit(); + CBase2 cb7=d1.cloneit(); + check(cb6.cbase1y()!=6, "Derived2::cbase1y() through CBase1 failed"); + check(cb7.cbase2()!=4, "Derived1:cbase2() through ABase1 failed"); + + //Test multi inheritance + CBase1 cb3=new Derived1(); + CBase1 cb4=new Derived3(); + CBase2 cb5=new Derived3(); + ABase1 ab6=new Derived2(); + check(cb3.cbase1y()!=3, "Derived1::cbase1y() through CBase1 failed"); + check(cb4.cbase1y()!=7, "Derived3::cbase1y() through CBase1 failed"); + check(cb5.cbase2()!=8, "Derived3::cbase2() through CBase2 failed"); + check(ab6.abase1()!=5, "Derived2::abase1() through ABase1 failed"); + + //Test base classes as parameter in C# + multiple_inheritance_shared_ptr_runme mhar=new multiple_inheritance_shared_ptr_runme(); + check(mhar.jcbase1b(d1)!=3, "jcbase1b() through Derived1 as parameter failed"); + check(mhar.jcbase1b(d2)!=6, "jcbase1b() through Derived2 as parameter failed"); + check(mhar.jcbase1b(d3)!=7, "jcbase1b() through Derived3 as parameter failed"); + check(mhar.jcbase2(d1)!=4, "jcbase2() through Derived1 as parameter failed"); + check(mhar.jcbase2(d3)!=8, "jcbase2() through Derived3 as parameter failed"); + check(mhar.jabase1(d2)!=5, "jabase1() through Derived2 as parameter failed"); + check(mhar.jabase1(d3)!=9, "jabase1() through Derived3 as parameter failed"); + + //Value parameters + //Test CBase1 CBase2 as parameters (note slicing for Derived and Bottom classes) + check(multiple_inheritance_shared_ptr.InputValCBase1(d1)!=1, "InputValCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(d2)!=1, "InputValCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(d3)!=1, "InputValCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(d3)!=2, "InputValCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(d1)!=2, "InputValCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(cb1)!=1, "InputValCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(cb2)!=2, "InputValCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(b1)!=1, "InputValCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(b2)!=1, "InputValCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(b3)!=1, "InputValCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(b3)!=2, "InputValCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(b1)!=2, "InputValCBase2(), Bottom1 as a parameter failed"); + + //Pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputPtrABase1(d2)!=5, "InputPtrABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrABase1(d3)!=9, "InputPtrABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrABase1(b2)!=205, "InputPtrABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrABase1(b3)!=309, "InputPtrABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputPtrCBase1(d1)!=3, "InputPtrCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(d2)!=6, "InputPtrCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(d3)!=7, "InputPtrCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(d3)!=8, "InputPtrCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(d1)!=4, "InputPtrCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(cb1)!=1, "InputPtrCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(cb2)!=2, "InputPtrCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(b1)!=103, "InputPtrCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(b2)!=206, "InputPtrCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(b3)!=307, "InputPtrCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(b3)!=308, "InputPtrCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(b1)!=104, "InputPtrCBase2(), Bottom1 as a parameter failed"); + + //Reference parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputRefABase1(d2)!=5, "InputRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefABase1(d3)!=9, "InputRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefABase1(b2)!=205, "InputRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefABase1(b3)!=309, "InputRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputRefCBase1(d1)!=3, "InputRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(d2)!=6, "InputRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(d3)!=7, "InputRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(d3)!=8, "InputRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(d1)!=4, "InputRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(cb1)!=1, "InputRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(cb2)!=2, "InputRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(b1)!=103, "InputRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(b2)!=206, "InputRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(b3)!=307, "InputRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(b3)!=308, "InputRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(b1)!=104, "InputRefCBase2(), Bottom1 as a parameter failed"); + + //Const reference pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(d2)!=5, "InputCPtrRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(d3)!=9, "InputCPtrRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(b2)!=205, "InputCPtrRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(b3)!=309, "InputCPtrRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(d1)!=3, "InputCPtrRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(d2)!=6, "InputCPtrRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(d3)!=7, "InputCPtrRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(d3)!=8, "InputCPtrRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(d1)!=4, "InputCPtrRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(cb1)!=1, "InputCPtrRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(cb2)!=2, "InputCPtrRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(b1)!=103, "InputCPtrRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(b2)!=206, "InputCPtrRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(b3)!=307, "InputCPtrRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(b3)!=308, "InputCPtrRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(b1)!=104, "InputCPtrRefCBase2(), Bottom1 as a parameter failed"); + + //Shared pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(d2)!=5, "InputSharedPtrABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(d3)!=9, "InputSharedPtrABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(b2)!=205, "InputSharedPtrABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(b3)!=309, "InputSharedPtrABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(d1)!=3, "InputSharedPtrCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(d2)!=6, "InputSharedPtrCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(d3)!=7, "InputSharedPtrCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(d3)!=8, "InputSharedPtrCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(d1)!=4, "InputSharedPtrCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(cb1)!=1, "InputSharedPtrCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(cb2)!=2, "InputSharedPtrCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(b1)!=103, "InputSharedPtrCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(b2)!=206, "InputSharedPtrCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(b3)!=307, "InputSharedPtrCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(b3)!=308, "InputSharedPtrCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(b1)!=104, "InputSharedPtrCBase2(), Bottom1 as a parameter failed"); + + //Shared pointer reference parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(d2)!=5, "InputSharedPtrRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(d3)!=9, "InputSharedPtrRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(b2)!=205, "InputSharedPtrRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(b3)!=309, "InputSharedPtrRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(d1)!=3, "InputSharedPtrRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(d2)!=6, "InputSharedPtrRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(d3)!=7, "InputSharedPtrRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(d3)!=8, "InputSharedPtrRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(d1)!=4, "InputSharedPtrRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(cb1)!=1, "InputSharedPtrRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(cb2)!=2, "InputSharedPtrRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(b1)!=103, "InputSharedPtrRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(b2)!=206, "InputSharedPtrRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(b3)!=307, "InputSharedPtrRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(b3)!=308, "InputSharedPtrRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(b1)!=104, "InputSharedPtrRefCBase2(), Bottom1 as a parameter failed"); + + //Derived classes as parameters + check(multiple_inheritance_shared_ptr.InputValDerived1(d1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived2(d2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived3(d3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputRefDerived1(d1)!=3+4, "InputRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived2(d2)!=6+5, "InputRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived3(d3)!=7+8+9, "InputRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputPtrDerived1(d1)!=3+4, "InputPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived2(d2)!=6+5, "InputPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived3(d3)!=7+8+9, "InputPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived1(d1)!=3+4, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived2(d2)!=6+5, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived3(d3)!=7+8+9, "InputCPtrRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived1(d1)!=3+4, "InputSharedPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived2(d2)!=6+5, "InputSharedPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived3(d3)!=7+8+9, "InputSharedPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived1(d1)!=3+4, "InputSharedPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived2(d2)!=6+5, "InputSharedPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived3(d3)!=7+8+9, "InputSharedPtrRefDerived3() failed"); + + //Bottom classes as Derived parameters + check(multiple_inheritance_shared_ptr.InputValDerived1(b1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived2(b2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived3(b3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputRefDerived1(b1)!=103+104, "InputRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived2(b2)!=206+205, "InputRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived3(b3)!=307+308+309, "InputRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputPtrDerived1(b1)!=103+104, "InputPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived2(b2)!=206+205, "InputPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived3(b3)!=307+308+309, "InputPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived1(b1)!=103+104, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived2(b2)!=206+205, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived3(b3)!=307+308+309, "InputCPtrRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived1(b1)!=103+104, "InputSharedPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived2(b2)!=206+205, "InputSharedPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived3(b3)!=307+308+309, "InputSharedPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived1(b1)!=103+104, "InputSharedPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived2(b2)!=206+205, "InputSharedPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived3(b3)!=307+308+309, "InputSharedPtrRefDerived3() failed"); + + //Bottom classes as Bottom parameters + check(multiple_inheritance_shared_ptr.InputValBottom1(b1)!=103+104, "InputValBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputValBottom2(b2)!=206+205, "InputValBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputValBottom3(b3)!=307+308+309, "InputValBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputRefBottom1(b1)!=103+104, "InputRefBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputRefBottom2(b2)!=206+205, "InputRefBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputRefBottom3(b3)!=307+308+309, "InputRefBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputPtrBottom1(b1)!=103+104, "InputPtrBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputPtrBottom2(b2)!=206+205, "InputPtrBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputPtrBottom3(b3)!=307+308+309, "InputPtrBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputCPtrRefBottom1(b1)!=103+104, "InputCPtrRefBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefBottom2(b2)!=206+205, "InputCPtrRefBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefBottom3(b3)!=307+308+309, "InputCPtrRefBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrBottom1(b1)!=103+104, "InputSharedPtrBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrBottom2(b2)!=206+205, "InputSharedPtrBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrBottom3(b3)!=307+308+309, "InputSharedPtrBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrRefBottom1(b1)!=103+104, "InputSharedPtrRefBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefBottom2(b2)!=206+205, "InputSharedPtrRefBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefBottom3(b3)!=307+308+309, "InputSharedPtrRefBottom3() failed"); + + // Return pointers + check(multiple_inheritance_shared_ptr.MakePtrDerived1_CBase1().cbase1y()!=3, "MakePtrDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived1_CBase2().cbase2()!=4, "MakePtrDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived2_CBase1().cbase1y()!=6, "MakePtrDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived2_ABase1().abase1()!=5, "MakePtrDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived3_ABase1().abase1()!=9, "MakePtrDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived3_CBase1().cbase1y()!=7, "MakePtrDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived3_CBase2().cbase2()!=8, "MakePtrDerived3_CBase2 failed"); + + // Return references + check(multiple_inheritance_shared_ptr.MakeRefDerived1_CBase1().cbase1y()!=3, "MakeRefDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived1_CBase2().cbase2()!=4, "MakeRefDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived2_CBase1().cbase1y()!=6, "MakeRefDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived2_ABase1().abase1()!=5, "MakeRefDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived3_ABase1().abase1()!=9, "MakeRefDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived3_CBase1().cbase1y()!=7, "MakeRefDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived3_CBase2().cbase2()!=8, "MakeRefDerived3_CBase2 failed"); + + // Return by value (sliced objects) + check(multiple_inheritance_shared_ptr.MakeValDerived1_CBase1().cbase1y()!=1, "MakeValDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived1_CBase2().cbase2()!=2, "MakeValDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived2_CBase1().cbase1y()!=1, "MakeValDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived3_CBase1().cbase1y()!=1, "MakeValDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived3_CBase2().cbase2()!=2, "MakeValDerived3_CBase2 failed"); + + // Return smart pointers + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived1_CBase1().cbase1y()!=3, "MakeSharedPtrDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived1_CBase2().cbase2()!=4, "MakeSharedPtrDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived2_CBase1().cbase1y()!=6, "MakeSharedPtrDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived2_ABase1().abase1()!=5, "MakeSharedPtrDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived3_ABase1().abase1()!=9, "MakeSharedPtrDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived3_CBase1().cbase1y()!=7, "MakeSharedPtrDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived3_CBase2().cbase2()!=8, "MakeSharedPtrDerived3_CBase2 failed"); + + // Return smart pointers + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived1_CBase1().cbase1y()!=3, "MakeSharedPtrRefDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived1_CBase2().cbase2()!=4, "MakeSharedPtrRefDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived2_CBase1().cbase1y()!=6, "MakeSharedPtrRefDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived2_ABase1().abase1()!=5, "MakeSharedPtrRefDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived3_ABase1().abase1()!=9, "MakeSharedPtrRefDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived3_CBase1().cbase1y()!=7, "MakeSharedPtrRefDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived3_CBase2().cbase2()!=8, "MakeSharedPtrRefDerived3_CBase2 failed"); + } +} diff --git a/Examples/test-suite/default_args.i b/Examples/test-suite/default_args.i index d3014d386..02d860765 100644 --- a/Examples/test-suite/default_args.i +++ b/Examples/test-suite/default_args.i @@ -77,6 +77,10 @@ // char char chartest1(char c = 'x') { return c; } char chartest2(char c = '\0') { return c; } + char chartest3(char c = '\1') { return c; } + char chartest4(char c = '\n') { return c; } + char chartest5(char c = '\102') { return c; } // 'B' + char chartest6(char c = '\x43') { return c; } // 'C' // namespaces namespace AType { diff --git a/Examples/test-suite/default_args_c.i b/Examples/test-suite/default_args_c.i new file mode 100644 index 000000000..e0c0af056 --- /dev/null +++ b/Examples/test-suite/default_args_c.i @@ -0,0 +1,14 @@ +%module default_args_c + +/* Default arguments for C code */ +int foo1(int x = 42 || 3); +int foo43(int x = 42 | 3); + +%{ +int foo1(int x) { + return x; +} +int foo43(int x) { + return x; +} +%} diff --git a/Examples/test-suite/director_pass_by_value.i b/Examples/test-suite/director_pass_by_value.i new file mode 100644 index 000000000..31d8ce2d2 --- /dev/null +++ b/Examples/test-suite/director_pass_by_value.i @@ -0,0 +1,30 @@ +%module(directors="1") director_pass_by_value +%director DirectorPassByValueAbstractBase; + +%inline %{ +class PassedByValue { + int val; +public: + PassedByValue() { val = 0x12345678; } + int getVal() { return val; } +}; + +int doSomething(int x) { + int yy[256]; + yy[0] =0x9876; + return yy[0]; +} + +class DirectorPassByValueAbstractBase { +public: + virtual void virtualMethod(PassedByValue pbv) = 0; + virtual ~DirectorPassByValueAbstractBase () {} +}; + +class Caller { +public: + void call_virtualMethod(DirectorPassByValueAbstractBase &f) { + f.virtualMethod(PassedByValue()); + } +}; +%} diff --git a/Examples/test-suite/enum_thorough.i b/Examples/test-suite/enum_thorough.i index e4624c097..f17a7ee96 100644 --- a/Examples/test-suite/enum_thorough.i +++ b/Examples/test-suite/enum_thorough.i @@ -585,7 +585,62 @@ enum { }; int globalDifferentTypesTest(int n) { return n; } } +%} + +#if defined(SWIGCSHARP) +%csconstvalue("1") globalenumchar1; +%csconstvalue("'B'") globalenumcharB; +%csconstvalue("1") enumchar1; +%csconstvalue("'B'") enumcharB; +#endif +%inline %{ +#if defined(__clang__) +#pragma clang diagnostic push +// Suppress: illegal character encoding in character literal +#pragma clang diagnostic ignored "-Winvalid-source-encoding" +#endif +enum { + globalenumchar0 = '\0', + globalenumchar1 = '\1', + globalenumchar2 = '\n', + globalenumcharA = 'A', + globalenumcharB = '\102', // B + globalenumcharC = '\x43', // C + globalenumcharD = 0x44, // D + globalenumcharE = 69, // E + globalenumcharAE1 = 'Æ', // AE (latin1 encoded) + globalenumcharAE2 = '\306', // AE (latin1 encoded) + globalenumcharAE3 = '\xC6' // AE (latin1 encoded) +}; +enum EnumChar { + enumchar0 = '\0', + enumchar1 = '\1', + enumchar2 = '\n', + enumcharA = 'A', + enumcharB = '\102', // B + enumcharC = '\x43', // C + enumcharD = 0x44, // D + enumcharE = 69, // E + enumcharAE1 = 'Æ', // AE (latin1 encoded) + enumcharAE2 = '\306', // AE (latin1 encoded) + enumcharAE3 = '\xC6' // AE (latin1 encoded) +}; +struct EnumCharStruct { + enum EnumChar { + enumchar0 = '\0', + enumchar1 = '\1', + enumchar2 = '\n', + enumcharA = 'A', + enumcharB = '\102', // B + enumcharC = '\x43', // C + enumcharD = 0x44, // D + enumcharE = 69, // E + enumcharAE1 = 'Æ', // AE (latin1 encoded) + enumcharAE2 = '\306', // AE (latin1 encoded) + enumcharAE3 = '\xC6' // AE (latin1 encoded) + }; +}; %} #if defined(SWIGJAVA) @@ -595,6 +650,53 @@ int globalDifferentTypesTest(int n) { return n; } #endif %inline %{ +enum { + x_globalenumchar0 = '\0', + x_globalenumchar1 = '\1', + x_globalenumchar2 = '\n', + x_globalenumcharA = 'A', + x_globalenumcharB = '\102', // B + x_globalenumcharC = '\x43', // C + x_globalenumcharD = 0x44, // D + x_globalenumcharE = 69, // E + x_globalenumcharAE1 = 'Æ', // AE (latin1 encoded) + x_globalenumcharAE2 = '\306', // AE (latin1 encoded) + x_globalenumcharAE3 = '\xC6' // AE (latin1 encoded) +}; +enum X_EnumChar { + x_enumchar0 = '\0', + x_enumchar1 = '\1', + x_enumchar2 = '\n', + x_enumcharA = 'A', + x_enumcharB = '\102', // B + x_enumcharC = '\x43', // C + x_enumcharD = 0x44, // D + x_enumcharE = 69, // E + x_enumcharAE1 = 'Æ', // AE (latin1 encoded) + x_enumcharAE2 = '\306', // AE (latin1 encoded) + x_enumcharAE3 = '\xC6' // AE (latin1 encoded) +}; +struct X_EnumCharStruct { + enum X_EnumChar { + enumchar0 = '\0', + enumchar1 = '\1', + enumchar2 = '\n', + enumcharA = 'A', + enumcharB = '\102', // B + enumcharC = '\x43', // C + enumcharD = 0x44, // D + enumcharE = 69, // E + enumcharAE1 = 'Æ', // AE (latin1 encoded) + enumcharAE2 = '\306', // AE (latin1 encoded) + enumcharAE3 = '\xC6' // AE (latin1 encoded) + }; +}; +#if defined(__clang__) +#pragma clang diagnostic pop +#endif +%} + +%inline %{ namespace DifferentSpace { enum DifferentTypesNoConst { typeint_noconst = 10, @@ -614,5 +716,4 @@ enum { global_typedefaultint_noconst }; } - %} diff --git a/Examples/test-suite/errors/c_default_error.i b/Examples/test-suite/errors/c_default_error.i deleted file mode 100644 index f6220e11d..000000000 --- a/Examples/test-suite/errors/c_default_error.i +++ /dev/null @@ -1,4 +0,0 @@ -%module xxx - -int foo(int x = 42 || 3); - diff --git a/Examples/test-suite/errors/c_default_error.stderr b/Examples/test-suite/errors/c_default_error.stderr deleted file mode 100644 index e69de29bb..000000000 --- a/Examples/test-suite/errors/c_default_error.stderr +++ /dev/null diff --git a/Examples/test-suite/errors/c_varargs.i b/Examples/test-suite/errors/c_varargs.i deleted file mode 100644 index 88f9c2e7d..000000000 --- a/Examples/test-suite/errors/c_varargs.i +++ /dev/null @@ -1,3 +0,0 @@ -%module xxx - -int foo(int x, ...); diff --git a/Examples/test-suite/errors/c_varargs.stderr b/Examples/test-suite/errors/c_varargs.stderr deleted file mode 100644 index e69de29bb..000000000 --- a/Examples/test-suite/errors/c_varargs.stderr +++ /dev/null diff --git a/Examples/test-suite/errors/cpp_inherit_ignored.i b/Examples/test-suite/errors/cpp_inherit_ignored.i new file mode 100644 index 000000000..fdc1c83e3 --- /dev/null +++ b/Examples/test-suite/errors/cpp_inherit_ignored.i @@ -0,0 +1,19 @@ +%module xxx + +// Only non-ignored classes should warn about Ignored base classes +%ignore ActualClass; +%ignore ActualClassNoTemplates; + +%{ +struct BaseClassNoTemplates {}; +%} +%inline %{ +template<typename T> +class TemplateClass {}; + +class ActualClass : public TemplateClass<int> {}; +class AktuelKlass : public TemplateClass<int> {}; + +class ActualClassNoTemplates : public BaseClassNoTemplates {}; +class AktuelKlassNoTemplates : public BaseClassNoTemplates {}; +%} diff --git a/Examples/test-suite/errors/cpp_inherit_ignored.stderr b/Examples/test-suite/errors/cpp_inherit_ignored.stderr new file mode 100644 index 000000000..360c1f9fc --- /dev/null +++ b/Examples/test-suite/errors/cpp_inherit_ignored.stderr @@ -0,0 +1,3 @@ +cpp_inherit_ignored.i:15: Warning 401: Nothing known about base class 'TemplateClass< int >'. Ignored. +cpp_inherit_ignored.i:15: Warning 401: Maybe you forgot to instantiate 'TemplateClass< int >' using %template. +cpp_inherit_ignored.i:18: Warning 401: Nothing known about base class 'BaseClassNoTemplates'. Ignored. diff --git a/Examples/test-suite/errors/cpp_overload.i b/Examples/test-suite/errors/cpp_overload.i deleted file mode 100644 index 34fa3cc25..000000000 --- a/Examples/test-suite/errors/cpp_overload.i +++ /dev/null @@ -1,15 +0,0 @@ -%module xxx -int foo(int x); -int foo(double x); - -class Foo { -public: - int bar(int); - int bar(double); -}; - -class Spam { -public: - Spam(); - Spam(int); -}; diff --git a/Examples/test-suite/errors/cpp_overload.stderr b/Examples/test-suite/errors/cpp_overload.stderr deleted file mode 100644 index e69de29bb..000000000 --- a/Examples/test-suite/errors/cpp_overload.stderr +++ /dev/null diff --git a/Examples/test-suite/errors/cpp_private_defvalue.i b/Examples/test-suite/errors/cpp_private_defvalue.i deleted file mode 100644 index 15542c7bc..000000000 --- a/Examples/test-suite/errors/cpp_private_defvalue.i +++ /dev/null @@ -1,7 +0,0 @@ -%module xxx - -class foo { -static const int BAR = 42; -public: - int blah(int x = BAR); -}; diff --git a/Examples/test-suite/errors/cpp_private_defvalue.stderr b/Examples/test-suite/errors/cpp_private_defvalue.stderr deleted file mode 100644 index e69de29bb..000000000 --- a/Examples/test-suite/errors/cpp_private_defvalue.stderr +++ /dev/null diff --git a/Examples/test-suite/errors/cpp_template_argname.i b/Examples/test-suite/errors/cpp_template_argname.i deleted file mode 100644 index b87c115c1..000000000 --- a/Examples/test-suite/errors/cpp_template_argname.i +++ /dev/null @@ -1,8 +0,0 @@ -%module xxx - -template<T> T blah(T x); - - - - - diff --git a/Examples/test-suite/errors/cpp_template_argname.stderr b/Examples/test-suite/errors/cpp_template_argname.stderr deleted file mode 100644 index e69de29bb..000000000 --- a/Examples/test-suite/errors/cpp_template_argname.stderr +++ /dev/null diff --git a/Examples/test-suite/errors/cpp_template_repeat.i b/Examples/test-suite/errors/cpp_template_repeat.i index e63ffe8d9..f170080b7 100644 --- a/Examples/test-suite/errors/cpp_template_repeat.i +++ b/Examples/test-suite/errors/cpp_template_repeat.i @@ -4,4 +4,4 @@ template<class T> T blah(T x) { }; %template(iblah) blah<int>; %template(iiblah) blah<int>; - +// The second %template instantiation above should surely be ignored with a warning, but doesn't atm diff --git a/Examples/test-suite/errors/cpp_using_type_aliasing.stderr b/Examples/test-suite/errors/cpp_using_type_aliasing.stderr index 3f256652f..e69de29bb 100644 --- a/Examples/test-suite/errors/cpp_using_type_aliasing.stderr +++ b/Examples/test-suite/errors/cpp_using_type_aliasing.stderr @@ -1,3 +0,0 @@ -cpp_using_type_aliasing.i:8: Warning 341: The 'using' keyword in type aliasing is not fully supported yet. -cpp_using_type_aliasing.i:8: Warning 315: Nothing known about 'Okay< int >'. -cpp_using_type_aliasing.i:8: Warning 315: Nothing known about 'Okay< int >'. diff --git a/Examples/test-suite/errors/pp_macro_args.i b/Examples/test-suite/errors/pp_macro_args.i deleted file mode 100644 index 8bbbfb104..000000000 --- a/Examples/test-suite/errors/pp_macro_args.i +++ /dev/null @@ -1,7 +0,0 @@ -%module xxx - -#define foo(a,x) a x - -#if foo -#endif - diff --git a/Examples/test-suite/errors/pp_macro_args.stderr b/Examples/test-suite/errors/pp_macro_args.stderr deleted file mode 100644 index e69de29bb..000000000 --- a/Examples/test-suite/errors/pp_macro_args.stderr +++ /dev/null diff --git a/Examples/test-suite/exception_classname.i b/Examples/test-suite/exception_classname.i index a5a76e24d..6900581cf 100644 --- a/Examples/test-suite/exception_classname.i +++ b/Examples/test-suite/exception_classname.i @@ -1,6 +1,9 @@ %module exception_classname %warnfilter(SWIGWARN_RUBY_WRONG_NAME); +#ifdef SWIGPHP +%rename(ExceptionClass) Exception; +#endif %inline %{ class Exception { diff --git a/Examples/test-suite/funcptr_cpp.i b/Examples/test-suite/funcptr_cpp.i index 015164ed9..b63749dc1 100644 --- a/Examples/test-suite/funcptr_cpp.i +++ b/Examples/test-suite/funcptr_cpp.i @@ -20,7 +20,7 @@ int call3(int & (*d)(const int &, int), int a, int b) { return d(a, b); } %constant int (*ADD_BY_VALUE)(const int &, int) = addByValue; %constant int * (*ADD_BY_POINTER)(const int &, int) = addByPointer; %constant int & (*ADD_BY_REFERENCE)(const int &, int) = addByReference; - +%constant int (* const ADD_BY_VALUE_C)(const int &, int) = addByValue; %inline %{ typedef int AddByValueTypedef(const int &a, int b); diff --git a/Examples/test-suite/go/go_inout_runme.go b/Examples/test-suite/go/go_inout_runme.go index 13c429b87..9aa0cd0c5 100644 --- a/Examples/test-suite/go/go_inout_runme.go +++ b/Examples/test-suite/go/go_inout_runme.go @@ -40,4 +40,14 @@ func main() { fmt.Println("got", a, "want", dwant) panic(a) } + + c2 := go_inout.NewC2() + pm := c2.M() + want = map[string]interface{}{ + "ID": float64(1), + } + if !reflect.DeepEqual(*pm, want) { + fmt.Println("for c2.M got", pm, "want", want) + panic(pm) + } } diff --git a/Examples/test-suite/go_inout.i b/Examples/test-suite/go_inout.i index 57e7bf2fb..0bcb979ef 100644 --- a/Examples/test-suite/go_inout.i +++ b/Examples/test-suite/go_inout.i @@ -23,7 +23,7 @@ struct RetStruct { // Write a typemap that calls C++ by converting in and out of JSON. -%go_import("encoding/json", "bytes", "encoding/binary") +%go_import("encoding/json", "bytes", "encoding/binary", "reflect", "unsafe") %insert(go_header) %{ @@ -68,6 +68,26 @@ type In json.Marshaler } %} +%typemap(gotype) RetStruct* "*map[string]interface{}" + +%typemap(imtype) RetStruct* "*string" + +%typemap(out,fragment="AllocateString") RetStruct* +%{ + $result = (_gostring_*)malloc(sizeof(_gostring_)); + *$result = Swig_AllocateString($1->str.data(), $1->str.length()); +%} + +%typemap(goout,fragment="CopyString") RetStruct* +%{ + defer Swig_free(uintptr(unsafe.Pointer($1))) + var rm map[string]interface{} + if err := json.Unmarshal([]byte(swigCopyString(*$1)), &rm); err != nil { + panic(err) + } + $result = &rm +%} + %inline %{ @@ -87,6 +107,10 @@ struct MyArray { std::vector<std::string> strings; }; +void* Allocate(int n) { + return new char[n]; +} + static uint64_t getuint64(const char* s) { uint64_t ret = 0; for (int i = 0; i < 8; i++, s++) { @@ -121,7 +145,12 @@ static void putuint64(std::string *s, size_t off, uint64_t v) { buf.Write(b[:]) buf.WriteString(s) } - str := buf.String() + bb := buf.Bytes() + p := Allocate(len(bb)) + copy((*[1<<15]byte)(unsafe.Pointer(p))[:len(bb)], bb) + var str string + (*reflect.StringHeader)(unsafe.Pointer(&str)).Data = uintptr(unsafe.Pointer(p)) + (*reflect.StringHeader)(unsafe.Pointer(&str)).Len = len(bb) $result = &str } %} @@ -197,3 +226,18 @@ void DoubleArray(MyArray* v) { } } %} + +%inline +%{ +class C1 { + public: + RetStruct* M() { + RetStruct* r = new RetStruct; + r->str = "{\"ID\":1}"; + return r; + } +}; + +class C2 : public C1 { +}; +%} diff --git a/Examples/test-suite/insert_directive.i b/Examples/test-suite/insert_directive.i index 8ad966a99..36c3af6c6 100644 --- a/Examples/test-suite/insert_directive.i +++ b/Examples/test-suite/insert_directive.i @@ -34,5 +34,5 @@ int inserted_wrapper(int i) { return inserted_header3(i); } %init %{ // %inserted code %init -int inserted_init_value = inserted_wrapper(0); +int SWIGUNUSED inserted_init_value = inserted_wrapper(0); %} diff --git a/Examples/test-suite/java/Makefile.in b/Examples/test-suite/java/Makefile.in index 3dc6555ef..e69964352 100644 --- a/Examples/test-suite/java/Makefile.in +++ b/Examples/test-suite/java/Makefile.in @@ -5,7 +5,7 @@ LANGUAGE = java JAVA = @JAVA@ JAVAC = @JAVAC@ -JAVAFLAGS = -Xcheck:jni +JAVAFLAGS = @JAVAFLAGS@ SCRIPTSUFFIX = _runme.java srcdir = @srcdir@ @@ -38,7 +38,7 @@ CPP_TEST_CASES = \ java_prepost \ java_throws \ java_typemaps_proxy \ - java_typemaps_typewrapper + java_typemaps_typewrapper \ # li_boost_intrusive_ptr CPP11_TEST_CASES = \ @@ -53,12 +53,13 @@ JAVA_PACKAGEOPT = -package $(JAVA_PACKAGE) SWIGOPT += $(JAVA_PACKAGEOPT) # Custom tests - tests with additional commandline options -java_nspacewithoutpackage.%: JAVA_PACKAGEOPT = +director_nspace.%: JAVA_PACKAGE = $*Package +director_nspace_director_name_collision.%: JAVA_PACKAGE = $*Package java_director_exception_feature_nspace.%: JAVA_PACKAGE = $*Package +java_nspacewithoutpackage.%: JAVA_PACKAGEOPT = +multiple_inheritance_nspace.%: JAVA_PACKAGE = $*Package nspace.%: JAVA_PACKAGE = $*Package nspace_extend.%: JAVA_PACKAGE = $*Package -director_nspace.%: JAVA_PACKAGE = $*Package -director_nspace_director_name_collision.%: JAVA_PACKAGE = $*Package # Rules for the different types of tests %.cpptest: diff --git a/Examples/test-suite/java/constant_directive_runme.java b/Examples/test-suite/java/constant_directive_runme.java index b5135a499..4b5c3c3d0 100644 --- a/Examples/test-suite/java/constant_directive_runme.java +++ b/Examples/test-suite/java/constant_directive_runme.java @@ -18,5 +18,9 @@ public class constant_directive_runme { throw new RuntimeException("fail"); if (constant_directive.TYPE1_CONSTANT3.getVal() != 3) throw new RuntimeException("fail"); + if (constant_directive.TYPE1CONST_CONSTANT1.getVal() != 1) + throw new RuntimeException("fail"); + if (constant_directive.TYPE1CPTR_CONSTANT1.getVal() != 1) + throw new RuntimeException("fail"); } } diff --git a/Examples/test-suite/java/cpp11_li_std_array_runme.java b/Examples/test-suite/java/cpp11_li_std_array_runme.java new file mode 100644 index 000000000..2e2a20138 --- /dev/null +++ b/Examples/test-suite/java/cpp11_li_std_array_runme.java @@ -0,0 +1,82 @@ +import cpp11_li_std_array.*; + +public class cpp11_li_std_array_runme { + + static { + try { + System.loadLibrary("cpp11_li_std_array"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + private static ArrayInt6 ToArray6(int [] a) { + ArrayInt6 ai = new ArrayInt6(); + if (a.length != 6) + throw new RuntimeException("a is incorrect size"); + for (int i=0; i<6; ++i) + ai.set(i, a[i]); + return ai; + } + + private static void compareContainers(ArrayInt6 actual, int[] expected) { + if (actual.size() != expected.length) + throw new RuntimeException("Sizes are different: " + actual.size() + " " + expected.length); + for (int i=0; i<actual.size(); ++i) { + int actualValue = actual.get(i); + int expectedValue = expected[i]; + if (actualValue != expectedValue) + throw new RuntimeException("Value is wrong for element " + i + ". Expected " + expectedValue + " got: " + actualValue); + } + if (actual.isEmpty()) + throw new RuntimeException("ai should not be empty"); + } + + public static void main(String argv[]) { + ArrayInt6 ai = new ArrayInt6(); + compareContainers(ai, new int[] {0, 0, 0, 0, 0, 0}); + + int[] vals = {10, 20, 30, 40, 50, 60}; + for (int i=0; i<ai.size(); ++i) + ai.set(i, vals[i]); + compareContainers(ai, vals); + + // Check return + compareContainers(cpp11_li_std_array.arrayOutVal(), new int[] {-2, -1, 0, 0, 1, 2}); + compareContainers(cpp11_li_std_array.arrayOutConstRef(), new int[] {-2, -1, 0, 0, 1, 2}); + compareContainers(cpp11_li_std_array.arrayOutRef(), new int[] {-2, -1, 0, 0, 1, 2}); + compareContainers(cpp11_li_std_array.arrayOutPtr(), new int[] {-2, -1, 0, 0, 1, 2}); + + // Check passing arguments + ai = cpp11_li_std_array.arrayInVal(ToArray6(new int[] {9, 8, 7, 6, 5, 4})); + compareContainers(ai, new int[] {90, 80, 70, 60, 50, 40}); + + ai = cpp11_li_std_array.arrayInConstRef(ToArray6(new int[] {9, 8, 7, 6, 5, 4})); + compareContainers(ai, new int[] {90, 80, 70, 60, 50, 40}); + + ai = new ArrayInt6(ToArray6(new int[] {9, 8, 7, 6, 5, 4})); + cpp11_li_std_array.arrayInRef(ai); + compareContainers(ai, new int[] {90, 80, 70, 60, 50, 40}); + + ai = new ArrayInt6(ToArray6(new int[] {9, 8, 7, 6, 5, 4})); + cpp11_li_std_array.arrayInPtr(ai); + compareContainers(ai, new int[] {90, 80, 70, 60, 50, 40}); + + // fill + ai.fill(111); + compareContainers(ai, new int[] {111, 111, 111, 111, 111, 111}); + + // out of range errors + try { + ai.set((int)ai.size(), 0); + throw new RuntimeException("Out of range exception not caught"); + } catch(IndexOutOfBoundsException e) { + } + try { + ai.set(-1, 0); + throw new RuntimeException("Out of range exception not caught"); + } catch(IndexOutOfBoundsException e) { + } + } +} diff --git a/Examples/test-suite/java/director_classes_runme.java b/Examples/test-suite/java/director_classes_runme.java index 013bdc75b..5fbb9ea35 100644 --- a/Examples/test-suite/java/director_classes_runme.java +++ b/Examples/test-suite/java/director_classes_runme.java @@ -140,7 +140,7 @@ public class director_classes_runme { Package packag = klass.getPackage(); String simpleName = null; if (packag != null) - simpleName = fullName.replaceAll(packag.getName() + ".", ""); + simpleName = fullName.replaceAll(packag.getName() + "\\.", ""); else simpleName = fullName; return simpleName; diff --git a/Examples/test-suite/java/director_pass_by_value_runme.java b/Examples/test-suite/java/director_pass_by_value_runme.java new file mode 100644 index 000000000..24ded2ccf --- /dev/null +++ b/Examples/test-suite/java/director_pass_by_value_runme.java @@ -0,0 +1,48 @@ + +import director_pass_by_value.*; + +public class director_pass_by_value_runme { + + static { + try { + System.loadLibrary("director_pass_by_value"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + private static void WaitForGC() { + System.gc(); + System.runFinalization(); + try { + java.lang.Thread.sleep(10); + } catch (java.lang.InterruptedException e) { + } + } + + public static void main(String argv[]) { + Caller caller = new Caller(); + caller.call_virtualMethod(new director_pass_by_value_Derived()); + { + int countdown = 5; + while (true) { + WaitForGC(); + if (--countdown == 0) + break; + }; + } + // bug was the passByVal 'global' object was destroyed after the call to virtualMethod had finished. + int ret = director_pass_by_value_runme.passByVal.getVal(); + if (ret != 0x12345678) + throw new RuntimeException("Bad return value, got " + Integer.toHexString(ret)); + } + + static PassedByValue passByVal; +} + +class director_pass_by_value_Derived extends DirectorPassByValueAbstractBase { + public void virtualMethod(PassedByValue pbv) { + director_pass_by_value_runme.passByVal = pbv; + } +} diff --git a/Examples/test-suite/java/long_long_runme.java b/Examples/test-suite/java/long_long_runme.java index 3a967f7a7..76aa0705d 100644 --- a/Examples/test-suite/java/long_long_runme.java +++ b/Examples/test-suite/java/long_long_runme.java @@ -3,7 +3,8 @@ // unsigned long long types map correctly to long and BigInteger respectively. import long_long.*; -import java.math.*; +import java.math.BigInteger; +import java.util.ArrayList; public class long_long_runme { @@ -54,12 +55,57 @@ public class long_long_runme { check_ull(testNumber); testNumber = testNumber.add(BigInteger.ONE); } - + try { long_long.setUll(null); throw new RuntimeException("null check failed"); } catch (NullPointerException e) { } + + // UnsignedToSigned - checks that a cast from unsigned long long to long long in C + // gives expected value (including -ve numbers) + + long[] nums = { + 0x00, + 0xFF, 0x80, 0x7F, 0x01, + -0xFF, -0x80, -0x7F, -0x01, + 0x100, 0x10000, + -0x100, -0x10000, + 0xFFFF, 0xFF80, 0xFF7F, 0xFF01, 0xFF00, + -0xFFFF, -0xFF80, -0xFF7F, -0xFF01, -0xFF00, + 0x7FFF, 0x7F80, 0x7F7F, 0x7F01, 0x7F00, + -0x7FFF, -0x7F80, -0x7F7F, -0x7F01, -0x7F00, + 0x80FF, 0x8080, 0x807F, 0x8001, 0x8000, + -0x80FF, -0x8080, -0x807F, -0x8001, -0x8000, + Integer.MAX_VALUE, Integer.MIN_VALUE, + Integer.MAX_VALUE+1, Integer.MIN_VALUE-1, + Long.MAX_VALUE, Long.MIN_VALUE, + }; + + ArrayList<BigInteger> bigIntegers = new ArrayList<BigInteger>(); + for (int i=0; i<nums.length; ++i) { + BigInteger bi = new BigInteger(new Long(nums[i]).toString()); + bigIntegers.add(bi); + } + + { + BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString()); + bigIntegers.add(bi.add(BigInteger.ONE)); + bi = new BigInteger(new Long(Long.MIN_VALUE).toString()); + bigIntegers.add(bi.subtract(BigInteger.ONE)); + } + + boolean failed = false; + for (int i=0; i<bigIntegers.size(); ++i) { + BigInteger bi = (BigInteger)bigIntegers.get(i); + long longReturn = long_long.UnsignedToSigned(bi); + if (bi.longValue() != longReturn) { + System.err.println("Conversion to long failed, in:" + bi + " out:" + longReturn); + failed = true; + } + } + if (failed) + throw new RuntimeException("There were UnsignedToSigned failures"); } public static void check_ll(long ll) { diff --git a/Examples/test-suite/java/multiple_inheritance_abstract_runme.java b/Examples/test-suite/java/multiple_inheritance_abstract_runme.java new file mode 100644 index 000000000..1489d92a7 --- /dev/null +++ b/Examples/test-suite/java/multiple_inheritance_abstract_runme.java @@ -0,0 +1,253 @@ +import multiple_inheritance_abstract.*; + +public class multiple_inheritance_abstract_runme { + + static { + try { + System.loadLibrary("multiple_inheritance_abstract"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + //Test base class as a parameter in java + int jcbase1b(CBase1 cb1){ + return cb1.cbase1y(); + } + int jabase1(ABase1 ab1){ + return ab1.abase1(); + } + int jcbase2(CBase2 cb2){ + return cb2.cbase2(); + } + + public static void check(boolean fail, String msg) { + if (fail) + throw new RuntimeException(msg); + } + + public static void main(String argv[]) { + //Test Derived1 + Derived1 d1=new Derived1(); + check(d1.cbase1y()!=3, "Derived1::cbase1y() failed"); + check(d1.cbase2()!=4, "Derived1::cbase2() failed"); + + //Test Derived2 + Derived2 d2=new Derived2(); + check(d2.cbase1y()!=6, "Derived2::cbase1y() failed"); + check(d2.abase1()!=5, "Derived2::abase1() failed"); + + //Test Derived3 + Derived3 d3=new Derived3(); + check(d3.cbase1y()!=7, "Derived3::cbase1y() failed"); + check(d3.cbase2()!=8, "Derived3::cbase2() failed"); + check(d3.abase1()!=9, "Derived3::abase1() failed"); + + //Test Bottom1 + Bottom1 b1=new Bottom1(); + check(b1.cbase1y()!=103, "Bottom1::cbase1y() failed"); + check(b1.cbase2()!=104, "Bottom1::cbase2() failed"); + + //Test Bottom2 + Bottom2 b2=new Bottom2(); + check(b2.cbase1y()!=206, "Bottom2::cbase1y() failed"); + check(b2.abase1()!=205, "Bottom2::abase1() failed"); + + //Test Bottom3 + Bottom3 b3=new Bottom3(); + check(b3.cbase1y()!=307, "Bottom3::cbase1y() failed"); + check(b3.cbase2()!=308, "Bottom3::cbase2() failed"); + check(b3.abase1()!=309, "Bottom3::abase1() failed"); + + //Test interfaces from c++ classes + CBase1 cb1=new CBase1SwigImpl(); + CBase2 cb2=new CBase2SwigImpl(); + check(cb1.cbase1y()!=1, "CBase1::cbase1y() failed"); + check(cb2.cbase2()!=2, "CBase2::cbase2() failed"); + + //Test abstract class as return value + ABase1 ab1=d3.cloneit(); + check(ab1.abase1()!=9, "Derived3::abase1() through ABase1 failed"); + + //Test concrete base class as return value + CBase1 cb6=d2.cloneit(); + CBase2 cb7=d1.cloneit(); + check(cb6.cbase1y()!=6, "Derived2::cbase1y() through CBase1 failed"); + check(cb7.cbase2()!=4, "Derived1:cbase2() through ABase1 failed"); + + //Test multi inheritance + CBase1 cb3=new Derived1(); + CBase1 cb4=new Derived3(); + CBase2 cb5=new Derived3(); + ABase1 ab6=new Derived2(); + check(cb3.cbase1y()!=3, "Derived1::cbase1y() through CBase1 failed"); + check(cb4.cbase1y()!=7, "Derived3::cbase1y() through CBase1 failed"); + check(cb5.cbase2()!=8, "Derived3::cbase2() through CBase2 failed"); + check(ab6.abase1()!=5, "Derived2::abase1() through ABase1 failed"); + + //Test base classes as parameter in java + multiple_inheritance_abstract_runme mhar=new multiple_inheritance_abstract_runme(); + check(mhar.jcbase1b(d1)!=3, "jcbase1b() through Derived1 as parameter failed"); + check(mhar.jcbase1b(d2)!=6, "jcbase1b() through Derived2 as parameter failed"); + check(mhar.jcbase1b(d3)!=7, "jcbase1b() through Derived3 as parameter failed"); + check(mhar.jcbase2(d1)!=4, "jcbase2() through Derived1 as parameter failed"); + check(mhar.jcbase2(d3)!=8, "jcbase2() through Derived3 as parameter failed"); + check(mhar.jabase1(d2)!=5, "jabase1() through Derived2 as parameter failed"); + check(mhar.jabase1(d3)!=9, "jabase1() through Derived3 as parameter failed"); + + //Value parameters + //Test CBase1 CBase2 as parameters (note slicing for Derived and Bottom classes) + check(multiple_inheritance_abstract.InputValCBase1(d1)!=1, "InputValCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase1(d2)!=1, "InputValCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase1(d3)!=1, "InputValCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase2(d3)!=2, "InputValCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase2(d1)!=2, "InputValCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase1(cb1)!=1, "InputValCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase2(cb2)!=2, "InputValCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase1(b1)!=1, "InputValCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase1(b2)!=1, "InputValCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase1(b3)!=1, "InputValCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase2(b3)!=2, "InputValCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputValCBase2(b1)!=2, "InputValCBase2(), Bottom1 as a parameter failed"); + + //Pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_abstract.InputPtrABase1(d2)!=5, "InputPtrABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrABase1(d3)!=9, "InputPtrABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrABase1(b2)!=205, "InputPtrABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrABase1(b3)!=309, "InputPtrABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_abstract.InputPtrCBase1(d1)!=3, "InputPtrCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase1(d2)!=6, "InputPtrCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase1(d3)!=7, "InputPtrCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase2(d3)!=8, "InputPtrCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase2(d1)!=4, "InputPtrCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase1(cb1)!=1, "InputPtrCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase2(cb2)!=2, "InputPtrCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase1(b1)!=103, "InputPtrCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase1(b2)!=206, "InputPtrCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase1(b3)!=307, "InputPtrCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase2(b3)!=308, "InputPtrCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputPtrCBase2(b1)!=104, "InputPtrCBase2(), Bottom1 as a parameter failed"); + + //Reference parameters + //Test ABase1 as a parameter + check(multiple_inheritance_abstract.InputRefABase1(d2)!=5, "InputRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefABase1(d3)!=9, "InputRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefABase1(b2)!=205, "InputRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefABase1(b3)!=309, "InputRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_abstract.InputRefCBase1(d1)!=3, "InputRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase1(d2)!=6, "InputRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase1(d3)!=7, "InputRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase2(d3)!=8, "InputRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase2(d1)!=4, "InputRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase1(cb1)!=1, "InputRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase2(cb2)!=2, "InputRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase1(b1)!=103, "InputRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase1(b2)!=206, "InputRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase1(b3)!=307, "InputRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase2(b3)!=308, "InputRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputRefCBase2(b1)!=104, "InputRefCBase2(), Bottom1 as a parameter failed"); + + //Const reference pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_abstract.InputCPtrRefABase1(d2)!=5, "InputCPtrRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefABase1(d3)!=9, "InputCPtrRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefABase1(b2)!=205, "InputCPtrRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefABase1(b3)!=309, "InputCPtrRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_abstract.InputCPtrRefCBase1(d1)!=3, "InputCPtrRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(d2)!=6, "InputCPtrRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(d3)!=7, "InputCPtrRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(d3)!=8, "InputCPtrRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(d1)!=4, "InputCPtrRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(cb1)!=1, "InputCPtrRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(cb2)!=2, "InputCPtrRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(b1)!=103, "InputCPtrRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(b2)!=206, "InputCPtrRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase1(b3)!=307, "InputCPtrRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(b3)!=308, "InputCPtrRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_abstract.InputCPtrRefCBase2(b1)!=104, "InputCPtrRefCBase2(), Bottom1 as a parameter failed"); + + //Derived classes as parameters + check(multiple_inheritance_abstract.InputValDerived1(d1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_abstract.InputValDerived2(d2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_abstract.InputValDerived3(d3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_abstract.InputRefDerived1(d1)!=3+4, "InputRefDerived1() failed"); + check(multiple_inheritance_abstract.InputRefDerived2(d2)!=6+5, "InputRefDerived2() failed"); + check(multiple_inheritance_abstract.InputRefDerived3(d3)!=7+8+9, "InputRefDerived3() failed"); + + check(multiple_inheritance_abstract.InputPtrDerived1(d1)!=3+4, "InputPtrDerived1() failed"); + check(multiple_inheritance_abstract.InputPtrDerived2(d2)!=6+5, "InputPtrDerived2() failed"); + check(multiple_inheritance_abstract.InputPtrDerived3(d3)!=7+8+9, "InputPtrDerived3() failed"); + + check(multiple_inheritance_abstract.InputCPtrRefDerived1(d1)!=3+4, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_abstract.InputCPtrRefDerived2(d2)!=6+5, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_abstract.InputCPtrRefDerived3(d3)!=7+8+9, "InputCPtrRefDerived3() failed"); + + //Bottom classes as Derived parameters + check(multiple_inheritance_abstract.InputValDerived1(b1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_abstract.InputValDerived2(b2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_abstract.InputValDerived3(b3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_abstract.InputRefDerived1(b1)!=103+104, "InputRefDerived1() failed"); + check(multiple_inheritance_abstract.InputRefDerived2(b2)!=206+205, "InputRefDerived2() failed"); + check(multiple_inheritance_abstract.InputRefDerived3(b3)!=307+308+309, "InputRefDerived3() failed"); + + check(multiple_inheritance_abstract.InputPtrDerived1(b1)!=103+104, "InputPtrDerived1() failed"); + check(multiple_inheritance_abstract.InputPtrDerived2(b2)!=206+205, "InputPtrDerived2() failed"); + check(multiple_inheritance_abstract.InputPtrDerived3(b3)!=307+308+309, "InputPtrDerived3() failed"); + + check(multiple_inheritance_abstract.InputCPtrRefDerived1(b1)!=103+104, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_abstract.InputCPtrRefDerived2(b2)!=206+205, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_abstract.InputCPtrRefDerived3(b3)!=307+308+309, "InputCPtrRefDerived3() failed"); + + //Bottom classes as Bottom parameters + check(multiple_inheritance_abstract.InputValBottom1(b1)!=103+104, "InputValBottom1() failed"); + check(multiple_inheritance_abstract.InputValBottom2(b2)!=206+205, "InputValBottom2() failed"); + check(multiple_inheritance_abstract.InputValBottom3(b3)!=307+308+309, "InputValBottom3() failed"); + + check(multiple_inheritance_abstract.InputRefBottom1(b1)!=103+104, "InputRefBottom1() failed"); + check(multiple_inheritance_abstract.InputRefBottom2(b2)!=206+205, "InputRefBottom2() failed"); + check(multiple_inheritance_abstract.InputRefBottom3(b3)!=307+308+309, "InputRefBottom3() failed"); + + check(multiple_inheritance_abstract.InputPtrBottom1(b1)!=103+104, "InputPtrBottom1() failed"); + check(multiple_inheritance_abstract.InputPtrBottom2(b2)!=206+205, "InputPtrBottom2() failed"); + check(multiple_inheritance_abstract.InputPtrBottom3(b3)!=307+308+309, "InputPtrBottom3() failed"); + + check(multiple_inheritance_abstract.InputCPtrRefBottom1(b1)!=103+104, "InputCPtrRefBottom1() failed"); + check(multiple_inheritance_abstract.InputCPtrRefBottom2(b2)!=206+205, "InputCPtrRefBottom2() failed"); + check(multiple_inheritance_abstract.InputCPtrRefBottom3(b3)!=307+308+309, "InputCPtrRefBottom3() failed"); + // Return pointers + check(multiple_inheritance_abstract.MakePtrDerived1_CBase1().cbase1y()!=3, "MakePtrDerived1_CBase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived1_CBase2().cbase2()!=4, "MakePtrDerived1_CBase2 failed"); + check(multiple_inheritance_abstract.MakePtrDerived2_CBase1().cbase1y()!=6, "MakePtrDerived2_CBase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived2_ABase1().abase1()!=5, "MakePtrDerived2_ABase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived3_ABase1().abase1()!=9, "MakePtrDerived3_ABase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived3_CBase1().cbase1y()!=7, "MakePtrDerived3_CBase1 failed"); + check(multiple_inheritance_abstract.MakePtrDerived3_CBase2().cbase2()!=8, "MakePtrDerived3_CBase2 failed"); + + // Return references + check(multiple_inheritance_abstract.MakeRefDerived1_CBase1().cbase1y()!=3, "MakeRefDerived1_CBase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived1_CBase2().cbase2()!=4, "MakeRefDerived1_CBase2 failed"); + check(multiple_inheritance_abstract.MakeRefDerived2_CBase1().cbase1y()!=6, "MakeRefDerived2_CBase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived2_ABase1().abase1()!=5, "MakeRefDerived2_ABase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived3_ABase1().abase1()!=9, "MakeRefDerived3_ABase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived3_CBase1().cbase1y()!=7, "MakeRefDerived3_CBase1 failed"); + check(multiple_inheritance_abstract.MakeRefDerived3_CBase2().cbase2()!=8, "MakeRefDerived3_CBase2 failed"); + + // Return by value (sliced objects) + check(multiple_inheritance_abstract.MakeValDerived1_CBase1().cbase1y()!=1, "MakeValDerived1_CBase1 failed"); + check(multiple_inheritance_abstract.MakeValDerived1_CBase2().cbase2()!=2, "MakeValDerived1_CBase2 failed"); + check(multiple_inheritance_abstract.MakeValDerived2_CBase1().cbase1y()!=1, "MakeValDerived2_CBase1 failed"); + check(multiple_inheritance_abstract.MakeValDerived3_CBase1().cbase1y()!=1, "MakeValDerived3_CBase1 failed"); + check(multiple_inheritance_abstract.MakeValDerived3_CBase2().cbase2()!=2, "MakeValDerived3_CBase2 failed"); + + } +} diff --git a/Examples/test-suite/java/multiple_inheritance_interfaces_runme.java b/Examples/test-suite/java/multiple_inheritance_interfaces_runme.java new file mode 100644 index 000000000..3f2b00000 --- /dev/null +++ b/Examples/test-suite/java/multiple_inheritance_interfaces_runme.java @@ -0,0 +1,78 @@ +import multiple_inheritance_interfaces.*; +import java.util.Arrays; + +public class multiple_inheritance_interfaces_runme { + + static { + try { + System.loadLibrary("multiple_inheritance_interfaces"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + private static void checkBaseAndInterfaces(Class cls, boolean interfaceExpected, String base, String[] interfaces) { + String[] expectedInterfaces = new String[interfaces.length]; + for (int i=0; i<interfaces.length; ++i) + expectedInterfaces[i] = "interface multiple_inheritance_interfaces." + interfaces[i]; + Class[] actualInterfaces = cls.getInterfaces(); + String expectedInterfacesString = Arrays.toString(expectedInterfaces); + String actualInterfacesString = Arrays.toString(actualInterfaces); + if (!expectedInterfacesString.equals(actualInterfacesString)) + throw new RuntimeException("Expected interfaces for " + cls.getName() + ": \n" + expectedInterfacesString + "\n" + "Actual interfaces: \n" + actualInterfacesString); + + String expectedBaseString = null; + if (interfaceExpected) { + // expecting an interface + if (!cls.isInterface()) + throw new RuntimeException(cls.getName() + " should be an interface but is not"); + expectedBaseString = base.isEmpty() ? "" : "multiple_inheritance_interfaces." + base; + } else { + // expecting a class + if (cls.isInterface()) + throw new RuntimeException(cls.getName() + " is an interface but it should not be"); + expectedBaseString = base.isEmpty() ? "java.lang.Object" : "multiple_inheritance_interfaces." + base; + } + + String actualBaseString = cls.getSuperclass() == null ? "" : cls.getSuperclass().getName(); + if (!expectedBaseString.equals(actualBaseString)) + throw new RuntimeException("Expected base for " + cls.getName() + ": [" + expectedBaseString + "]" + " Actual base: [" + actualBaseString + "]"); + } + + public static void main(String argv[]) { + checkBaseAndInterfaces(IA.class, true, "", new String[] {}); + checkBaseAndInterfaces(IB.class, true, "", new String[] {}); + checkBaseAndInterfaces(IC.class, true, "", new String[] {"IA", "IB"}); + checkBaseAndInterfaces(A.class, false, "", new String[] {"IA"}); + checkBaseAndInterfaces(B.class, false, "", new String[] {"IB"}); + checkBaseAndInterfaces(C.class, false, "", new String[] {"IA", "IB", "IC"}); + checkBaseAndInterfaces(D.class, false, "", new String[] {"IA", "IB", "IC"}); + checkBaseAndInterfaces(E.class, false, "D", new String[] {}); + + checkBaseAndInterfaces(IJ.class, true, "", new String[] {}); + checkBaseAndInterfaces(IK.class, true, "", new String[] {"IJ"}); + checkBaseAndInterfaces(IL.class, true, "", new String[] {"IK"}); + checkBaseAndInterfaces(J.class, false, "", new String[] {"IJ"}); + checkBaseAndInterfaces(K.class, false, "", new String[] {"IJ", "IK"}); + checkBaseAndInterfaces(L.class, false, "", new String[] {"IJ", "IK", "IL"}); + checkBaseAndInterfaces(M.class, false, "", new String[] {"IJ", "IK", "IL"}); + + checkBaseAndInterfaces(P.class, false, "", new String[] {}); + checkBaseAndInterfaces(IQ.class, true, "", new String[] {}); + checkBaseAndInterfaces(Q.class, false, "", new String[] {"IQ"}); + checkBaseAndInterfaces(R.class, false, "P", new String[] {"IQ"}); + checkBaseAndInterfaces(S.class, false, "P", new String[] {"IQ"}); + checkBaseAndInterfaces(T.class, false, "", new String[] {"IQ"}); + checkBaseAndInterfaces(U.class, false, "R", new String[] {}); + checkBaseAndInterfaces(V.class, false, "S", new String[] {}); + checkBaseAndInterfaces(W.class, false, "T", new String[] {}); + + // overloaded methods check + D d = new D(); + d.ia(); + d.ia(10); + d.ia("bye"); + d.ia("bye", false); + } +} diff --git a/Examples/test-suite/java/multiple_inheritance_nspace_runme.java b/Examples/test-suite/java/multiple_inheritance_nspace_runme.java new file mode 100644 index 000000000..461c7a131 --- /dev/null +++ b/Examples/test-suite/java/multiple_inheritance_nspace_runme.java @@ -0,0 +1,255 @@ +import multiple_inheritance_nspacePackage.multiple_inheritance_nspace; +import multiple_inheritance_nspacePackage.multiple_inheritance_nspaceJNI; +import multiple_inheritance_nspacePackage.Space.*; + +public class multiple_inheritance_nspace_runme { + + static { + try { + System.loadLibrary("multiple_inheritance_nspace"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + //Test base class as a parameter in java + int jcbase1b(CBase1SwigInterface cb1){ + return cb1.cbase1y(); + } + int jabase1(ABase1SwigInterface ab1){ + return ab1.abase1(); + } + int jcbase2(CBase2SwigInterface cb2){ + return cb2.cbase2(); + } + + public static void check(boolean fail, String msg) { + if (fail) + throw new RuntimeException(msg); + } + + public static void main(String argv[]) { + //Test Derived1 + Derived1 d1=new Derived1(); + check(d1.cbase1y()!=3, "Derived1::cbase1y() failed"); + check(d1.cbase2()!=4, "Derived1::cbase2() failed"); + + //Test Derived2 + Derived2 d2=new Derived2(); + check(d2.cbase1y()!=6, "Derived2::cbase1y() failed"); + check(d2.abase1()!=5, "Derived2::abase1() failed"); + + //Test Derived3 + Derived3 d3=new Derived3(); + check(d3.cbase1y()!=7, "Derived3::cbase1y() failed"); + check(d3.cbase2()!=8, "Derived3::cbase2() failed"); + check(d3.abase1()!=9, "Derived3::abase1() failed"); + + //Test Bottom1 + Bottom1 b1=new Bottom1(); + check(b1.cbase1y()!=103, "Bottom1::cbase1y() failed"); + check(b1.cbase2()!=104, "Bottom1::cbase2() failed"); + + //Test Bottom2 + Bottom2 b2=new Bottom2(); + check(b2.cbase1y()!=206, "Bottom2::cbase1y() failed"); + check(b2.abase1()!=205, "Bottom2::abase1() failed"); + + //Test Bottom3 + Bottom3 b3=new Bottom3(); + check(b3.cbase1y()!=307, "Bottom3::cbase1y() failed"); + check(b3.cbase2()!=308, "Bottom3::cbase2() failed"); + check(b3.abase1()!=309, "Bottom3::abase1() failed"); + + //Test interfaces from c++ classes + CBase1SwigInterface cb1=new CBase1(); + CBase2SwigInterface cb2=new CBase2(); + check(cb1.cbase1y()!=1, "CBase1::cbase1y() failed"); + check(cb2.cbase2()!=2, "CBase2::cbase2() failed"); + + //Test nspace class as return value + ABase1SwigInterface ab1=d3.cloneit(); + check(ab1.abase1()!=9, "Derived3::abase1() through ABase1 failed"); + + //Test concrete base class as return value + CBase1SwigInterface cb6=d2.cloneit(); + CBase2SwigInterface cb7=d1.cloneit(); + check(cb6.cbase1y()!=6, "Derived2::cbase1y() through CBase1 failed"); + check(cb7.cbase2()!=4, "Derived1:cbase2() through ABase1 failed"); + + //Test multi inheritance + CBase1SwigInterface cb3=new Derived1(); + CBase1SwigInterface cb4=new Derived3(); + CBase2SwigInterface cb5=new Derived3(); + ABase1SwigInterface ab6=new Derived2(); + check(cb3.cbase1y()!=3, "Derived1::cbase1y() through CBase1 failed"); + check(cb4.cbase1y()!=7, "Derived3::cbase1y() through CBase1 failed"); + check(cb5.cbase2()!=8, "Derived3::cbase2() through CBase2 failed"); + check(ab6.abase1()!=5, "Derived2::abase1() through ABase1 failed"); + + //Test base classes as parameter in java + multiple_inheritance_nspace_runme mhar=new multiple_inheritance_nspace_runme(); + check(mhar.jcbase1b(d1)!=3, "jcbase1b() through Derived1 as parameter failed"); + check(mhar.jcbase1b(d2)!=6, "jcbase1b() through Derived2 as parameter failed"); + check(mhar.jcbase1b(d3)!=7, "jcbase1b() through Derived3 as parameter failed"); + check(mhar.jcbase2(d1)!=4, "jcbase2() through Derived1 as parameter failed"); + check(mhar.jcbase2(d3)!=8, "jcbase2() through Derived3 as parameter failed"); + check(mhar.jabase1(d2)!=5, "jabase1() through Derived2 as parameter failed"); + check(mhar.jabase1(d3)!=9, "jabase1() through Derived3 as parameter failed"); + + //Value parameters + //Test CBase1 CBase2 as parameters (note slicing for Derived and Bottom classes) + check(multiple_inheritance_nspace.InputValCBase1(d1)!=1, "InputValCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase1(d2)!=1, "InputValCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase1(d3)!=1, "InputValCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase2(d3)!=2, "InputValCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase2(d1)!=2, "InputValCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase1(cb1)!=1, "InputValCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase2(cb2)!=2, "InputValCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase1(b1)!=1, "InputValCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase1(b2)!=1, "InputValCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase1(b3)!=1, "InputValCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase2(b3)!=2, "InputValCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputValCBase2(b1)!=2, "InputValCBase2(), Bottom1 as a parameter failed"); + + //Pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_nspace.InputPtrABase1(d2)!=5, "InputPtrABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrABase1(d3)!=9, "InputPtrABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrABase1(b2)!=205, "InputPtrABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrABase1(b3)!=309, "InputPtrABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_nspace.InputPtrCBase1(d1)!=3, "InputPtrCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase1(d2)!=6, "InputPtrCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase1(d3)!=7, "InputPtrCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase2(d3)!=8, "InputPtrCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase2(d1)!=4, "InputPtrCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase1(cb1)!=1, "InputPtrCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase2(cb2)!=2, "InputPtrCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase1(b1)!=103, "InputPtrCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase1(b2)!=206, "InputPtrCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase1(b3)!=307, "InputPtrCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase2(b3)!=308, "InputPtrCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputPtrCBase2(b1)!=104, "InputPtrCBase2(), Bottom1 as a parameter failed"); + + //Reference parameters + //Test ABase1 as a parameter + check(multiple_inheritance_nspace.InputRefABase1(d2)!=5, "InputRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefABase1(d3)!=9, "InputRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefABase1(b2)!=205, "InputRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefABase1(b3)!=309, "InputRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_nspace.InputRefCBase1(d1)!=3, "InputRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase1(d2)!=6, "InputRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase1(d3)!=7, "InputRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase2(d3)!=8, "InputRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase2(d1)!=4, "InputRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase1(cb1)!=1, "InputRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase2(cb2)!=2, "InputRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase1(b1)!=103, "InputRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase1(b2)!=206, "InputRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase1(b3)!=307, "InputRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase2(b3)!=308, "InputRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputRefCBase2(b1)!=104, "InputRefCBase2(), Bottom1 as a parameter failed"); + + //Const reference pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_nspace.InputCPtrRefABase1(d2)!=5, "InputCPtrRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefABase1(d3)!=9, "InputCPtrRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefABase1(b2)!=205, "InputCPtrRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefABase1(b3)!=309, "InputCPtrRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_nspace.InputCPtrRefCBase1(d1)!=3, "InputCPtrRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase1(d2)!=6, "InputCPtrRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase1(d3)!=7, "InputCPtrRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase2(d3)!=8, "InputCPtrRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase2(d1)!=4, "InputCPtrRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase1(cb1)!=1, "InputCPtrRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase2(cb2)!=2, "InputCPtrRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase1(b1)!=103, "InputCPtrRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase1(b2)!=206, "InputCPtrRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase1(b3)!=307, "InputCPtrRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase2(b3)!=308, "InputCPtrRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_nspace.InputCPtrRefCBase2(b1)!=104, "InputCPtrRefCBase2(), Bottom1 as a parameter failed"); + + //Derived classes as parameters + check(multiple_inheritance_nspace.InputValDerived1(d1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_nspace.InputValDerived2(d2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_nspace.InputValDerived3(d3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_nspace.InputRefDerived1(d1)!=3+4, "InputRefDerived1() failed"); + check(multiple_inheritance_nspace.InputRefDerived2(d2)!=6+5, "InputRefDerived2() failed"); + check(multiple_inheritance_nspace.InputRefDerived3(d3)!=7+8+9, "InputRefDerived3() failed"); + + check(multiple_inheritance_nspace.InputPtrDerived1(d1)!=3+4, "InputPtrDerived1() failed"); + check(multiple_inheritance_nspace.InputPtrDerived2(d2)!=6+5, "InputPtrDerived2() failed"); + check(multiple_inheritance_nspace.InputPtrDerived3(d3)!=7+8+9, "InputPtrDerived3() failed"); + + check(multiple_inheritance_nspace.InputCPtrRefDerived1(d1)!=3+4, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_nspace.InputCPtrRefDerived2(d2)!=6+5, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_nspace.InputCPtrRefDerived3(d3)!=7+8+9, "InputCPtrRefDerived3() failed"); + + //Bottom classes as Derived parameters + check(multiple_inheritance_nspace.InputValDerived1(b1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_nspace.InputValDerived2(b2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_nspace.InputValDerived3(b3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_nspace.InputRefDerived1(b1)!=103+104, "InputRefDerived1() failed"); + check(multiple_inheritance_nspace.InputRefDerived2(b2)!=206+205, "InputRefDerived2() failed"); + check(multiple_inheritance_nspace.InputRefDerived3(b3)!=307+308+309, "InputRefDerived3() failed"); + + check(multiple_inheritance_nspace.InputPtrDerived1(b1)!=103+104, "InputPtrDerived1() failed"); + check(multiple_inheritance_nspace.InputPtrDerived2(b2)!=206+205, "InputPtrDerived2() failed"); + check(multiple_inheritance_nspace.InputPtrDerived3(b3)!=307+308+309, "InputPtrDerived3() failed"); + + check(multiple_inheritance_nspace.InputCPtrRefDerived1(b1)!=103+104, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_nspace.InputCPtrRefDerived2(b2)!=206+205, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_nspace.InputCPtrRefDerived3(b3)!=307+308+309, "InputCPtrRefDerived3() failed"); + + //Bottom classes as Bottom parameters + check(multiple_inheritance_nspace.InputValBottom1(b1)!=103+104, "InputValBottom1() failed"); + check(multiple_inheritance_nspace.InputValBottom2(b2)!=206+205, "InputValBottom2() failed"); + check(multiple_inheritance_nspace.InputValBottom3(b3)!=307+308+309, "InputValBottom3() failed"); + + check(multiple_inheritance_nspace.InputRefBottom1(b1)!=103+104, "InputRefBottom1() failed"); + check(multiple_inheritance_nspace.InputRefBottom2(b2)!=206+205, "InputRefBottom2() failed"); + check(multiple_inheritance_nspace.InputRefBottom3(b3)!=307+308+309, "InputRefBottom3() failed"); + + check(multiple_inheritance_nspace.InputPtrBottom1(b1)!=103+104, "InputPtrBottom1() failed"); + check(multiple_inheritance_nspace.InputPtrBottom2(b2)!=206+205, "InputPtrBottom2() failed"); + check(multiple_inheritance_nspace.InputPtrBottom3(b3)!=307+308+309, "InputPtrBottom3() failed"); + + check(multiple_inheritance_nspace.InputCPtrRefBottom1(b1)!=103+104, "InputCPtrRefBottom1() failed"); + check(multiple_inheritance_nspace.InputCPtrRefBottom2(b2)!=206+205, "InputCPtrRefBottom2() failed"); + check(multiple_inheritance_nspace.InputCPtrRefBottom3(b3)!=307+308+309, "InputCPtrRefBottom3() failed"); + // Return pointers + check(multiple_inheritance_nspace.MakePtrDerived1_CBase1().cbase1y()!=3, "MakePtrDerived1_CBase1 failed"); + check(multiple_inheritance_nspace.MakePtrDerived1_CBase2().cbase2()!=4, "MakePtrDerived1_CBase2 failed"); + check(multiple_inheritance_nspace.MakePtrDerived2_CBase1().cbase1y()!=6, "MakePtrDerived2_CBase1 failed"); + check(multiple_inheritance_nspace.MakePtrDerived2_ABase1().abase1()!=5, "MakePtrDerived2_ABase1 failed"); + check(multiple_inheritance_nspace.MakePtrDerived3_ABase1().abase1()!=9, "MakePtrDerived3_ABase1 failed"); + check(multiple_inheritance_nspace.MakePtrDerived3_CBase1().cbase1y()!=7, "MakePtrDerived3_CBase1 failed"); + check(multiple_inheritance_nspace.MakePtrDerived3_CBase2().cbase2()!=8, "MakePtrDerived3_CBase2 failed"); + + // Return references + check(multiple_inheritance_nspace.MakeRefDerived1_CBase1().cbase1y()!=3, "MakeRefDerived1_CBase1 failed"); + check(multiple_inheritance_nspace.MakeRefDerived1_CBase2().cbase2()!=4, "MakeRefDerived1_CBase2 failed"); + check(multiple_inheritance_nspace.MakeRefDerived2_CBase1().cbase1y()!=6, "MakeRefDerived2_CBase1 failed"); + check(multiple_inheritance_nspace.MakeRefDerived2_ABase1().abase1()!=5, "MakeRefDerived2_ABase1 failed"); + check(multiple_inheritance_nspace.MakeRefDerived3_ABase1().abase1()!=9, "MakeRefDerived3_ABase1 failed"); + check(multiple_inheritance_nspace.MakeRefDerived3_CBase1().cbase1y()!=7, "MakeRefDerived3_CBase1 failed"); + check(multiple_inheritance_nspace.MakeRefDerived3_CBase2().cbase2()!=8, "MakeRefDerived3_CBase2 failed"); + + // Return by value (sliced objects) + check(multiple_inheritance_nspace.MakeValDerived1_CBase1().cbase1y()!=1, "MakeValDerived1_CBase1 failed"); + check(multiple_inheritance_nspace.MakeValDerived1_CBase2().cbase2()!=2, "MakeValDerived1_CBase2 failed"); + check(multiple_inheritance_nspace.MakeValDerived2_CBase1().cbase1y()!=1, "MakeValDerived2_CBase1 failed"); + check(multiple_inheritance_nspace.MakeValDerived3_CBase1().cbase1y()!=1, "MakeValDerived3_CBase1 failed"); + check(multiple_inheritance_nspace.MakeValDerived3_CBase2().cbase2()!=2, "MakeValDerived3_CBase2 failed"); + + } +} diff --git a/Examples/test-suite/java/multiple_inheritance_shared_ptr_runme.java b/Examples/test-suite/java/multiple_inheritance_shared_ptr_runme.java new file mode 100644 index 000000000..6472a911e --- /dev/null +++ b/Examples/test-suite/java/multiple_inheritance_shared_ptr_runme.java @@ -0,0 +1,337 @@ +import multiple_inheritance_shared_ptr.*; + +public class multiple_inheritance_shared_ptr_runme { + + static { + try { + System.loadLibrary("multiple_inheritance_shared_ptr"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + //Test base class as a parameter in java + int jcbase1b(CBase1 cb1){ + return cb1.cbase1y(); + } + int jabase1(ABase1 ab1){ + return ab1.abase1(); + } + int jcbase2(CBase2 cb2){ + return cb2.cbase2(); + } + + public static void check(boolean fail, String msg) { + if (fail) + throw new RuntimeException(msg); + } + + public static void main(String argv[]) { + //Test Derived1 + Derived1 d1=new Derived1(); + check(d1.cbase1y()!=3, "Derived1::cbase1y() failed"); + check(d1.cbase2()!=4, "Derived1::cbase2() failed"); + + //Test Derived2 + Derived2 d2=new Derived2(); + check(d2.cbase1y()!=6, "Derived2::cbase1y() failed"); + check(d2.abase1()!=5, "Derived2::abase1() failed"); + + //Test Derived3 + Derived3 d3=new Derived3(); + check(d3.cbase1y()!=7, "Derived3::cbase1y() failed"); + check(d3.cbase2()!=8, "Derived3::cbase2() failed"); + check(d3.abase1()!=9, "Derived3::abase1() failed"); + + //Test Bottom1 + Bottom1 b1=new Bottom1(); + check(b1.cbase1y()!=103, "Bottom1::cbase1y() failed"); + check(b1.cbase2()!=104, "Bottom1::cbase2() failed"); + + //Test Bottom2 + Bottom2 b2=new Bottom2(); + check(b2.cbase1y()!=206, "Bottom2::cbase1y() failed"); + check(b2.abase1()!=205, "Bottom2::abase1() failed"); + + //Test Bottom3 + Bottom3 b3=new Bottom3(); + check(b3.cbase1y()!=307, "Bottom3::cbase1y() failed"); + check(b3.cbase2()!=308, "Bottom3::cbase2() failed"); + check(b3.abase1()!=309, "Bottom3::abase1() failed"); + + //Test interfaces from c++ classes + CBase1 cb1=new CBase1SwigImpl(); + CBase2 cb2=new CBase2SwigImpl(); + check(cb1.cbase1y()!=1, "CBase1::cbase1y() failed"); + check(cb2.cbase2()!=2, "CBase2::cbase2() failed"); + + //Test abstract class as return value + ABase1 ab1=d3.cloneit(); + check(ab1.abase1()!=9, "Derived3::abase1() through ABase1 failed"); + + //Test concrete base class as return value + CBase1 cb6=d2.cloneit(); + CBase2 cb7=d1.cloneit(); + check(cb6.cbase1y()!=6, "Derived2::cbase1y() through CBase1 failed"); + check(cb7.cbase2()!=4, "Derived1:cbase2() through ABase1 failed"); + + //Test multi inheritance + CBase1 cb3=new Derived1(); + CBase1 cb4=new Derived3(); + CBase2 cb5=new Derived3(); + ABase1 ab6=new Derived2(); + check(cb3.cbase1y()!=3, "Derived1::cbase1y() through CBase1 failed"); + check(cb4.cbase1y()!=7, "Derived3::cbase1y() through CBase1 failed"); + check(cb5.cbase2()!=8, "Derived3::cbase2() through CBase2 failed"); + check(ab6.abase1()!=5, "Derived2::abase1() through ABase1 failed"); + + //Test base classes as parameter in java + multiple_inheritance_shared_ptr_runme mhar=new multiple_inheritance_shared_ptr_runme(); + check(mhar.jcbase1b(d1)!=3, "jcbase1b() through Derived1 as parameter failed"); + check(mhar.jcbase1b(d2)!=6, "jcbase1b() through Derived2 as parameter failed"); + check(mhar.jcbase1b(d3)!=7, "jcbase1b() through Derived3 as parameter failed"); + check(mhar.jcbase2(d1)!=4, "jcbase2() through Derived1 as parameter failed"); + check(mhar.jcbase2(d3)!=8, "jcbase2() through Derived3 as parameter failed"); + check(mhar.jabase1(d2)!=5, "jabase1() through Derived2 as parameter failed"); + check(mhar.jabase1(d3)!=9, "jabase1() through Derived3 as parameter failed"); + + //Value parameters + //Test CBase1 CBase2 as parameters (note slicing for Derived and Bottom classes) + check(multiple_inheritance_shared_ptr.InputValCBase1(d1)!=1, "InputValCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(d2)!=1, "InputValCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(d3)!=1, "InputValCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(d3)!=2, "InputValCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(d1)!=2, "InputValCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(cb1)!=1, "InputValCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(cb2)!=2, "InputValCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(b1)!=1, "InputValCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(b2)!=1, "InputValCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase1(b3)!=1, "InputValCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(b3)!=2, "InputValCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputValCBase2(b1)!=2, "InputValCBase2(), Bottom1 as a parameter failed"); + + //Pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputPtrABase1(d2)!=5, "InputPtrABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrABase1(d3)!=9, "InputPtrABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrABase1(b2)!=205, "InputPtrABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrABase1(b3)!=309, "InputPtrABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputPtrCBase1(d1)!=3, "InputPtrCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(d2)!=6, "InputPtrCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(d3)!=7, "InputPtrCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(d3)!=8, "InputPtrCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(d1)!=4, "InputPtrCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(cb1)!=1, "InputPtrCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(cb2)!=2, "InputPtrCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(b1)!=103, "InputPtrCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(b2)!=206, "InputPtrCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase1(b3)!=307, "InputPtrCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(b3)!=308, "InputPtrCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputPtrCBase2(b1)!=104, "InputPtrCBase2(), Bottom1 as a parameter failed"); + + //Reference parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputRefABase1(d2)!=5, "InputRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefABase1(d3)!=9, "InputRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefABase1(b2)!=205, "InputRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefABase1(b3)!=309, "InputRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputRefCBase1(d1)!=3, "InputRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(d2)!=6, "InputRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(d3)!=7, "InputRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(d3)!=8, "InputRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(d1)!=4, "InputRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(cb1)!=1, "InputRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(cb2)!=2, "InputRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(b1)!=103, "InputRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(b2)!=206, "InputRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase1(b3)!=307, "InputRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(b3)!=308, "InputRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputRefCBase2(b1)!=104, "InputRefCBase2(), Bottom1 as a parameter failed"); + + //Const reference pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(d2)!=5, "InputCPtrRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(d3)!=9, "InputCPtrRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(b2)!=205, "InputCPtrRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefABase1(b3)!=309, "InputCPtrRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(d1)!=3, "InputCPtrRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(d2)!=6, "InputCPtrRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(d3)!=7, "InputCPtrRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(d3)!=8, "InputCPtrRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(d1)!=4, "InputCPtrRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(cb1)!=1, "InputCPtrRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(cb2)!=2, "InputCPtrRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(b1)!=103, "InputCPtrRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(b2)!=206, "InputCPtrRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase1(b3)!=307, "InputCPtrRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(b3)!=308, "InputCPtrRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefCBase2(b1)!=104, "InputCPtrRefCBase2(), Bottom1 as a parameter failed"); + + //Shared pointer parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(d2)!=5, "InputSharedPtrABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(d3)!=9, "InputSharedPtrABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(b2)!=205, "InputSharedPtrABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrABase1(b3)!=309, "InputSharedPtrABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(d1)!=3, "InputSharedPtrCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(d2)!=6, "InputSharedPtrCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(d3)!=7, "InputSharedPtrCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(d3)!=8, "InputSharedPtrCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(d1)!=4, "InputSharedPtrCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(cb1)!=1, "InputSharedPtrCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(cb2)!=2, "InputSharedPtrCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(b1)!=103, "InputSharedPtrCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(b2)!=206, "InputSharedPtrCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase1(b3)!=307, "InputSharedPtrCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(b3)!=308, "InputSharedPtrCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrCBase2(b1)!=104, "InputSharedPtrCBase2(), Bottom1 as a parameter failed"); + + //Shared pointer reference parameters + //Test ABase1 as a parameter + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(d2)!=5, "InputSharedPtrRefABase1() through Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(d3)!=9, "InputSharedPtrRefABase1() through Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(b2)!=205, "InputSharedPtrRefABase1() through Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefABase1(b3)!=309, "InputSharedPtrRefABase1() through Bottom3 as a parameter failed"); + + //Test CBase1 CBase2 as parameters + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(d1)!=3, "InputSharedPtrRefCBase1(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(d2)!=6, "InputSharedPtrRefCBase1(), Derived2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(d3)!=7, "InputSharedPtrRefCBase1(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(d3)!=8, "InputSharedPtrRefCBase2(), Derived3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(d1)!=4, "InputSharedPtrRefCBase2(), Derived1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(cb1)!=1, "InputSharedPtrRefCBase1(), CBase1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(cb2)!=2, "InputSharedPtrRefCBase2(), CBase2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(b1)!=103, "InputSharedPtrRefCBase1(), Bottom1 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(b2)!=206, "InputSharedPtrRefCBase1(), Bottom2 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase1(b3)!=307, "InputSharedPtrRefCBase1(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(b3)!=308, "InputSharedPtrRefCBase2(), Bottom3 as a parameter failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefCBase2(b1)!=104, "InputSharedPtrRefCBase2(), Bottom1 as a parameter failed"); + + //Derived classes as parameters + check(multiple_inheritance_shared_ptr.InputValDerived1(d1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived2(d2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived3(d3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputRefDerived1(d1)!=3+4, "InputRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived2(d2)!=6+5, "InputRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived3(d3)!=7+8+9, "InputRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputPtrDerived1(d1)!=3+4, "InputPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived2(d2)!=6+5, "InputPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived3(d3)!=7+8+9, "InputPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived1(d1)!=3+4, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived2(d2)!=6+5, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived3(d3)!=7+8+9, "InputCPtrRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived1(d1)!=3+4, "InputSharedPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived2(d2)!=6+5, "InputSharedPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived3(d3)!=7+8+9, "InputSharedPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived1(d1)!=3+4, "InputSharedPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived2(d2)!=6+5, "InputSharedPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived3(d3)!=7+8+9, "InputSharedPtrRefDerived3() failed"); + + //Bottom classes as Derived parameters + check(multiple_inheritance_shared_ptr.InputValDerived1(b1)!=3+4, "InputValDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived2(b2)!=6+5, "InputValDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputValDerived3(b3)!=7+8+9, "InputValDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputRefDerived1(b1)!=103+104, "InputRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived2(b2)!=206+205, "InputRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputRefDerived3(b3)!=307+308+309, "InputRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputPtrDerived1(b1)!=103+104, "InputPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived2(b2)!=206+205, "InputPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputPtrDerived3(b3)!=307+308+309, "InputPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived1(b1)!=103+104, "InputCPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived2(b2)!=206+205, "InputCPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefDerived3(b3)!=307+308+309, "InputCPtrRefDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived1(b1)!=103+104, "InputSharedPtrDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived2(b2)!=206+205, "InputSharedPtrDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrDerived3(b3)!=307+308+309, "InputSharedPtrDerived3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived1(b1)!=103+104, "InputSharedPtrRefDerived1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived2(b2)!=206+205, "InputSharedPtrRefDerived2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefDerived3(b3)!=307+308+309, "InputSharedPtrRefDerived3() failed"); + + //Bottom classes as Bottom parameters + check(multiple_inheritance_shared_ptr.InputValBottom1(b1)!=103+104, "InputValBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputValBottom2(b2)!=206+205, "InputValBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputValBottom3(b3)!=307+308+309, "InputValBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputRefBottom1(b1)!=103+104, "InputRefBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputRefBottom2(b2)!=206+205, "InputRefBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputRefBottom3(b3)!=307+308+309, "InputRefBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputPtrBottom1(b1)!=103+104, "InputPtrBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputPtrBottom2(b2)!=206+205, "InputPtrBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputPtrBottom3(b3)!=307+308+309, "InputPtrBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputCPtrRefBottom1(b1)!=103+104, "InputCPtrRefBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefBottom2(b2)!=206+205, "InputCPtrRefBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputCPtrRefBottom3(b3)!=307+308+309, "InputCPtrRefBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrBottom1(b1)!=103+104, "InputSharedPtrBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrBottom2(b2)!=206+205, "InputSharedPtrBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrBottom3(b3)!=307+308+309, "InputSharedPtrBottom3() failed"); + + check(multiple_inheritance_shared_ptr.InputSharedPtrRefBottom1(b1)!=103+104, "InputSharedPtrRefBottom1() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefBottom2(b2)!=206+205, "InputSharedPtrRefBottom2() failed"); + check(multiple_inheritance_shared_ptr.InputSharedPtrRefBottom3(b3)!=307+308+309, "InputSharedPtrRefBottom3() failed"); + + // Return pointers + check(multiple_inheritance_shared_ptr.MakePtrDerived1_CBase1().cbase1y()!=3, "MakePtrDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived1_CBase2().cbase2()!=4, "MakePtrDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived2_CBase1().cbase1y()!=6, "MakePtrDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived2_ABase1().abase1()!=5, "MakePtrDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived3_ABase1().abase1()!=9, "MakePtrDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived3_CBase1().cbase1y()!=7, "MakePtrDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakePtrDerived3_CBase2().cbase2()!=8, "MakePtrDerived3_CBase2 failed"); + + // Return references + check(multiple_inheritance_shared_ptr.MakeRefDerived1_CBase1().cbase1y()!=3, "MakeRefDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived1_CBase2().cbase2()!=4, "MakeRefDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived2_CBase1().cbase1y()!=6, "MakeRefDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived2_ABase1().abase1()!=5, "MakeRefDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived3_ABase1().abase1()!=9, "MakeRefDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived3_CBase1().cbase1y()!=7, "MakeRefDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeRefDerived3_CBase2().cbase2()!=8, "MakeRefDerived3_CBase2 failed"); + + // Return by value (sliced objects) + check(multiple_inheritance_shared_ptr.MakeValDerived1_CBase1().cbase1y()!=1, "MakeValDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived1_CBase2().cbase2()!=2, "MakeValDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived2_CBase1().cbase1y()!=1, "MakeValDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived3_CBase1().cbase1y()!=1, "MakeValDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeValDerived3_CBase2().cbase2()!=2, "MakeValDerived3_CBase2 failed"); + + // Return smart pointers + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived1_CBase1().cbase1y()!=3, "MakeSharedPtrDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived1_CBase2().cbase2()!=4, "MakeSharedPtrDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived2_CBase1().cbase1y()!=6, "MakeSharedPtrDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived2_ABase1().abase1()!=5, "MakeSharedPtrDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived3_ABase1().abase1()!=9, "MakeSharedPtrDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived3_CBase1().cbase1y()!=7, "MakeSharedPtrDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrDerived3_CBase2().cbase2()!=8, "MakeSharedPtrDerived3_CBase2 failed"); + + // Return smart pointers references + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived1_CBase1().cbase1y()!=3, "MakeSharedPtrRefDerived1_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived1_CBase2().cbase2()!=4, "MakeSharedPtrRefDerived1_CBase2 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived2_CBase1().cbase1y()!=6, "MakeSharedPtrRefDerived2_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived2_ABase1().abase1()!=5, "MakeSharedPtrRefDerived2_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived3_ABase1().abase1()!=9, "MakeSharedPtrRefDerived3_ABase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived3_CBase1().cbase1y()!=7, "MakeSharedPtrRefDerived3_CBase1 failed"); + check(multiple_inheritance_shared_ptr.MakeSharedPtrRefDerived3_CBase2().cbase2()!=8, "MakeSharedPtrRefDerived3_CBase2 failed"); + } +} diff --git a/Examples/test-suite/java/smart_pointer_ignore_runme.java b/Examples/test-suite/java/smart_pointer_ignore_runme.java new file mode 100644 index 000000000..f02bf536a --- /dev/null +++ b/Examples/test-suite/java/smart_pointer_ignore_runme.java @@ -0,0 +1,19 @@ +import smart_pointer_ignore.*; + +public class smart_pointer_ignore_runme { + + static { + try { + System.loadLibrary("smart_pointer_ignore"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) { + DerivedPtr d = smart_pointer_ignore.makeDerived(); + d.base(); + d.derived(); + } +} diff --git a/Examples/test-suite/javascript/Makefile.in b/Examples/test-suite/javascript/Makefile.in index c68dd22b2..b430f236f 100644 --- a/Examples/test-suite/javascript/Makefile.in +++ b/Examples/test-suite/javascript/Makefile.in @@ -66,18 +66,18 @@ ifeq (node,$(JSENGINE)) $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ SWIGOPT='-javascript $(SWIGOPT) -o $*_wrap.cxx $(srcdir)/../$*.i' swiginvoke && \ - $(NODEGYP) --loglevel=silent --directory $* configure build 1>>/dev/null + $(COMPILETOOL) $(NODEGYP) --loglevel=silent --directory $* configure build 1>>/dev/null swig_and_compile_cpp = \ $(setup_node) && \ $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ SWIGOPT='-c++ -javascript $(SWIGOPT) $(srcdir)/../$*.i' swiginvoke && \ - $(NODEGYP) --loglevel=silent --directory $* configure build 1>>/dev/null + $(COMPILETOOL) $(NODEGYP) --loglevel=silent --directory $* configure build 1>>/dev/null run_testcase = \ if [ -f $(srcdir)/$*$(SCRIPTSUFFIX) ]; then \ - env NODE_PATH=$$PWD:$(srcdir) $(NODEJS) $(srcdir)/$*$(SCRIPTSUFFIX); \ + env NODE_PATH=$$PWD:$(srcdir) $(RUNTOOL) $(NODEJS) $(srcdir)/$*$(SCRIPTSUFFIX); \ fi diff --git a/Examples/test-suite/li_boost_array.i b/Examples/test-suite/li_boost_array.i index be51d15e0..e18140a50 100644 --- a/Examples/test-suite/li_boost_array.i +++ b/Examples/test-suite/li_boost_array.i @@ -25,6 +25,8 @@ namespace boost { using std::array; } +%ignore std::array::fill; // Some older versions of boost don't have this function + %include <std_array.i> %template(ArrayInt6) std::array<int, 6>; diff --git a/Examples/test-suite/li_boost_shared_ptr_template.i b/Examples/test-suite/li_boost_shared_ptr_template.i index e3b735c24..3965a976e 100644 --- a/Examples/test-suite/li_boost_shared_ptr_template.i +++ b/Examples/test-suite/li_boost_shared_ptr_template.i @@ -67,7 +67,7 @@ INTEGER bar_getter(Base<INTEGER>& foo) { // 2nd test - templates with default template parameters #if defined(SHARED_PTR_WRAPPERS_IMPLEMENTED) -%shared_ptr(Space::BaseDefault<short>) +%shared_ptr(Space::BaseDefault<short, int>) %shared_ptr(Space::DerivedDefault<short>) %shared_ptr(Space::DerivedDefault2<short>) diff --git a/Examples/test-suite/li_std_vector.i b/Examples/test-suite/li_std_vector.i index 9c76659df..b728c55af 100644 --- a/Examples/test-suite/li_std_vector.i +++ b/Examples/test-suite/li_std_vector.i @@ -130,3 +130,13 @@ namespace aa { std::vector< ::aa::Holder > vec1(std::vector< ::aa::Holder > x) { return x; } %} #endif + +// exercising vectors of strings +%inline %{ +std::vector<std::string> RevStringVec (const std::vector<std::string> &In) + { + std::vector<std::string> result(In); + std::reverse(result.begin(), result.end()); + return(result); + } +%} diff --git a/Examples/test-suite/long_long.i b/Examples/test-suite/long_long.i index 74dd87a15..47acc15c6 100644 --- a/Examples/test-suite/long_long.i +++ b/Examples/test-suite/long_long.i @@ -38,3 +38,9 @@ unsigned long long ull; #define lconst5 987654321LL #define lconst6 987654321ULL + +%inline %{ +long long UnsignedToSigned(unsigned long long ull) { + return (long long)ull; +} +%} diff --git a/Examples/test-suite/lua/Makefile.in b/Examples/test-suite/lua/Makefile.in index 7be59214b..7a77bbb9e 100644 --- a/Examples/test-suite/lua/Makefile.in +++ b/Examples/test-suite/lua/Makefile.in @@ -14,6 +14,7 @@ top_builddir = @top_builddir@ CPP_TEST_CASES += \ lua_no_module_global \ + lua_inherit_getitem \ C_TEST_CASES += \ diff --git a/Examples/test-suite/lua/funcptr_cpp_runme.lua b/Examples/test-suite/lua/funcptr_cpp_runme.lua index 3b8469348..d814e059a 100644 --- a/Examples/test-suite/lua/funcptr_cpp_runme.lua +++ b/Examples/test-suite/lua/funcptr_cpp_runme.lua @@ -16,3 +16,4 @@ assert(fc.addByValue(5,10) == 15) assert(fc.call1(fc.ADD_BY_VALUE, 5, 10) == 15) assert(fc.call2(fc.ADD_BY_POINTER, 7, 9) == 16) assert(fc.call3(fc.ADD_BY_REFERENCE, 8, 9) == 17) +assert(fc.call1(fc.ADD_BY_VALUE_C, 2, 3) == 5) diff --git a/Examples/test-suite/lua/lua_inherit_getitem_runme.lua b/Examples/test-suite/lua/lua_inherit_getitem_runme.lua new file mode 100644 index 000000000..21c4796f8 --- /dev/null +++ b/Examples/test-suite/lua/lua_inherit_getitem_runme.lua @@ -0,0 +1,12 @@ +require("import") -- the import fn +import("lua_inherit_getitem") -- import lib + +local t = lua_inherit_getitem; +local base = t.CBase() +local derived = t.CDerived() + +assert(base.Foo ~= nil) +assert(base:Foo() == "CBase::Foo") +assert(derived.Foo == base.Foo) +assert(derived:Foo() == "CBase::Foo") + diff --git a/Examples/test-suite/lua_inherit_getitem.i b/Examples/test-suite/lua_inherit_getitem.i new file mode 100644 index 000000000..82c055dd1 --- /dev/null +++ b/Examples/test-suite/lua_inherit_getitem.i @@ -0,0 +1,19 @@ +%module lua_inherit_getitem + +%inline %{ + +class CBase { +public: + const char* Foo(void) { + return "CBase::Foo"; + } +}; + +class CDerived : public CBase { +public: + void *__getitem(const char *name) const { + return NULL; + } +}; + +%} diff --git a/Examples/test-suite/multiple_inheritance_abstract.i b/Examples/test-suite/multiple_inheritance_abstract.i new file mode 100644 index 000000000..b54a37dea --- /dev/null +++ b/Examples/test-suite/multiple_inheritance_abstract.i @@ -0,0 +1,328 @@ +// This is a copy of the multiple_inheritance_abstract test +%module multiple_inheritance_abstract + +%warnfilter(SWIGWARN_RUBY_MULTIPLE_INHERITANCE, + SWIGWARN_D_MULTIPLE_INHERITANCE, + SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance or %interface */ + +#if defined(SWIGJAVA) || defined(SWIGCSHARP) +%include "swiginterface.i" +%interface_impl(Space::ABase1) +%interface_impl(Space::CBase1) +%interface_impl(Space::CBase2) +#endif + +#if defined(SWIGD) +// Missing multiple inheritance support results in incorrect use of override +%ignore CBase1; +%ignore CBase2; +#endif + +%inline %{ +namespace Space { + struct CBase1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 1; + } + int cbase1z() { + return 10; + } + virtual ~CBase1() { + } + }; + + struct CBase2 { + virtual int cbase2() { + return 2; + } + virtual ~CBase2() { + } + }; + + struct ABase1 { + virtual int abase1() = 0; + virtual ~ABase1() { + } + }; + + struct Derived1 : CBase2, CBase1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 3; + } + virtual int cbase2() { + return 4; + } + virtual CBase2 *cloneit() { + return new Derived1(*this); + } + void derived1() { + } + }; + + struct Derived2 : CBase1, ABase1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 6; + } + virtual int abase1() { + return 5; + } + virtual CBase1 *cloneit() { + return new Derived2(*this); + } + void derived2() { + } + }; + + struct Derived3 : ABase1, CBase1, CBase2 { + virtual int cbase1y() { + return 7; + } + virtual int cbase2() { + return 8; + } + virtual int abase1() { + return 9; + } + virtual void cbase1x() { + } + virtual ABase1 *cloneit() { + return new Derived3(*this); + } + void derived3() { + } + }; + + struct Bottom1 : Derived1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 103; + } + virtual int cbase2() { + return 104; + } + }; + + struct Bottom2 : Derived2 { + virtual int cbase1y() { + return 206; + } + virtual int abase1() { + return 205; + } + }; + + struct Bottom3 : Derived3 { + virtual int cbase1y() { + return 307; + } + virtual int cbase2() { + return 308; + } + virtual int abase1() { + return 309; + } + }; + + // Base classes as input + int InputValCBase1(CBase1 cb1) { + return cb1.cbase1y(); + } + int InputValCBase2(CBase2 cb2) { + return cb2.cbase2(); + } + + int InputPtrABase1(ABase1 *pab1) { + return pab1->abase1(); + } + int InputPtrCBase1(CBase1 *pcb1) { + return pcb1->cbase1y(); + } + int InputPtrCBase2(CBase2 *pcb2) { + return pcb2->cbase2(); + } + + int InputRefABase1(ABase1 &rab1) { + return rab1.abase1(); + } + int InputRefCBase1(CBase1 &rcb1) { + return rcb1.cbase1y(); + } + int InputRefCBase2(CBase2 &rcb2) { + return rcb2.cbase2(); + } + + int InputCPtrRefABase1(ABase1 *const& pab1) { + return pab1->abase1(); + } + int InputCPtrRefCBase1(CBase1 *const& pcb1) { + return pcb1->cbase1y(); + } + int InputCPtrRefCBase2(CBase2 *const& pcb2) { + return pcb2->cbase2(); + } + + // Derived classes as input + int InputValDerived1(Derived1 d) { + return d.cbase1y() + d.cbase2(); + } + int InputValDerived2(Derived2 d) { + return d.cbase1y() + d.abase1(); + } + int InputValDerived3(Derived3 d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputRefDerived1(Derived1 &d) { + return d.cbase1y() + d.cbase2(); + } + int InputRefDerived2(Derived2 &d) { + return d.cbase1y() + d.abase1(); + } + int InputRefDerived3(Derived3 &d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputPtrDerived1(Derived1 *d) { + return d->cbase1y() + d->cbase2(); + } + int InputPtrDerived2(Derived2 *d) { + return d->cbase1y() + d->abase1(); + } + int InputPtrDerived3(Derived3 *d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputCPtrRefDerived1(Derived1 *const& d) { + return d->cbase1y() + d->cbase2(); + } + int InputCPtrRefDerived2(Derived2 *const& d) { + return d->cbase1y() + d->abase1(); + } + int InputCPtrRefDerived3(Derived3 *const& d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + // Bottom classes as input + int InputValBottom1(Bottom1 d) { + return d.cbase1y() + d.cbase2(); + } + int InputValBottom2(Bottom2 d) { + return d.cbase1y() + d.abase1(); + } + int InputValBottom3(Bottom3 d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputRefBottom1(Bottom1 &d) { + return d.cbase1y() + d.cbase2(); + } + int InputRefBottom2(Bottom2 &d) { + return d.cbase1y() + d.abase1(); + } + int InputRefBottom3(Bottom3 &d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputPtrBottom1(Bottom1 *d) { + return d->cbase1y() + d->cbase2(); + } + int InputPtrBottom2(Bottom2 *d) { + return d->cbase1y() + d->abase1(); + } + int InputPtrBottom3(Bottom3 *d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputCPtrRefBottom1(Bottom1 *const& d) { + return d->cbase1y() + d->cbase2(); + } + int InputCPtrRefBottom2(Bottom2 *const& d) { + return d->cbase1y() + d->abase1(); + } + int InputCPtrRefBottom3(Bottom3 *const& d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + // Return pointers + CBase1 *MakePtrDerived1_CBase1() { + return new Derived1(); + } + CBase2 *MakePtrDerived1_CBase2() { + return new Derived1(); + } + CBase1 *MakePtrDerived2_CBase1() { + return new Derived2(); + } + ABase1 *MakePtrDerived2_ABase1() { + return new Derived2(); + } + ABase1 *MakePtrDerived3_ABase1() { + return new Derived3(); + } + CBase1 *MakePtrDerived3_CBase1() { + return new Derived3(); + } + CBase2 *MakePtrDerived3_CBase2() { + return new Derived3(); + } + + // Return references + CBase1 &MakeRefDerived1_CBase1() { + static Derived1 d; + return d; + } + CBase2 &MakeRefDerived1_CBase2() { + static Derived1 d; + return d; + } + CBase1 &MakeRefDerived2_CBase1() { + static Derived2 d; + return d; + } + ABase1 &MakeRefDerived2_ABase1() { + static Derived2 d; + return d; + } + ABase1 &MakeRefDerived3_ABase1() { + static Derived3 d; + return d; + } + CBase1 &MakeRefDerived3_CBase1() { + static Derived3 d; + return d; + } + CBase2 &MakeRefDerived3_CBase2() { + static Derived3 d; + return d; + } + + // Return by value (sliced objects) + CBase1 MakeValDerived1_CBase1() { + return Derived1(); + } + CBase2 MakeValDerived1_CBase2() { + return Derived1(); + } + CBase1 MakeValDerived2_CBase1() { + return Derived2(); + } + CBase1 MakeValDerived3_CBase1() { + return Derived3(); + } + CBase2 MakeValDerived3_CBase2() { + return Derived3(); + } +} + +%} diff --git a/Examples/test-suite/multiple_inheritance_interfaces.i b/Examples/test-suite/multiple_inheritance_interfaces.i new file mode 100644 index 000000000..2972922fb --- /dev/null +++ b/Examples/test-suite/multiple_inheritance_interfaces.i @@ -0,0 +1,66 @@ +%module multiple_inheritance_interfaces + +%warnfilter(SWIGWARN_RUBY_MULTIPLE_INHERITANCE, + SWIGWARN_D_MULTIPLE_INHERITANCE, + SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance or %interface */ + +#if defined(SWIGJAVA) || defined(SWIGCSHARP) +%include "swiginterface.i" +%interface_custom("A", "IA", IA) +%interface_custom("B", "IB", IB) +%interface_custom("%(strip:[I])s", "I%s", IC) // same as %interface_custom("C", "IC", IC) +#endif + +%inline %{ +struct IA { + virtual void ia() {}; + virtual void ia(const char *s, bool b = true) {} + virtual void ia(int i) {} + virtual ~IA() {} +}; +struct IB { virtual ~IB() {} virtual void ib() {} }; +struct IC : IA, IB {}; +struct D : IC {}; +struct E : D {}; +%} + +#if defined(SWIGJAVA) || defined(SWIGCSHARP) +%interface_custom("J", "IJ", IJ) +%interface_custom("K", "IK", IK) +%interface_custom("L", "IL", IL) +#endif +%inline %{ +struct IJ { virtual ~IJ() {}; virtual void ij() {} }; +struct IK : IJ {}; +struct IL : IK {}; +struct M : IL {}; +%} + +#if defined(SWIGJAVA) || defined(SWIGCSHARP) +%interface_custom("Q", "IQ", IQ) +#endif +%inline %{ +struct P { virtual ~P() {} virtual void p() {} }; +struct IQ { virtual ~IQ() {} virtual void iq() {} }; +struct R : IQ, P {}; +struct S : P, IQ {}; +struct T : IQ {}; +struct U : R {}; +struct V : S {}; +struct W : T {}; +%} + +#if defined(SWIGJAVA) || defined(SWIGCSHARP) +%interface_impl(BaseOverloaded); +#endif +%inline %{ +struct BaseOverloaded { + typedef P PTypedef; + virtual ~BaseOverloaded() {} + virtual void identical_overload(int i, const PTypedef &pp = PTypedef()) {} +}; + +struct DerivedOverloaded : public BaseOverloaded { + virtual void identical_overload(int i, const PTypedef &p = PTypedef()) {} +}; +%} diff --git a/Examples/test-suite/multiple_inheritance_nspace.i b/Examples/test-suite/multiple_inheritance_nspace.i new file mode 100644 index 000000000..4faef5749 --- /dev/null +++ b/Examples/test-suite/multiple_inheritance_nspace.i @@ -0,0 +1,338 @@ +// This is a copy of the multiple_inheritance_abstract test +%module multiple_inheritance_nspace + +%warnfilter(SWIGWARN_RUBY_MULTIPLE_INHERITANCE, + SWIGWARN_D_MULTIPLE_INHERITANCE, + SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance or %interface */ + +// nspace feature only supported by these languages +#if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGD) || defined(SWIGLUA) || defined(SWIGJAVASCRIPT) +%nspace; +#endif + +#if defined(SWIGJAVA) || defined(SWIGCSHARP) +%include "swiginterface.i" +%interface(Space::ABase1) +%interface(Space::CBase1) +%interface(Space::CBase2) +#endif + +#if defined(SWIGD) +// Missing multiple inheritance support results in incorrect use of override +%ignore CBase1; +%ignore CBase2; +#endif + +#if defined(SWIGJAVA) +SWIG_JAVABODY_PROXY(public, public, SWIGTYPE) +#endif + +%inline %{ +namespace Space { + struct CBase1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 1; + } + int cbase1z() { + return 10; + } + virtual ~CBase1() { + } + }; + + struct CBase2 { + virtual int cbase2() { + return 2; + } + virtual ~CBase2() { + } + }; + + struct ABase1 { + virtual int abase1() = 0; + virtual ~ABase1() { + } + }; + + struct Derived1 : CBase2, CBase1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 3; + } + virtual int cbase2() { + return 4; + } + virtual CBase2 *cloneit() { + return new Derived1(*this); + } + void derived1() { + } + }; + + struct Derived2 : CBase1, ABase1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 6; + } + virtual int abase1() { + return 5; + } + virtual CBase1 *cloneit() { + return new Derived2(*this); + } + void derived2() { + } + }; + + struct Derived3 : ABase1, CBase1, CBase2 { + virtual int cbase1y() { + return 7; + } + virtual int cbase2() { + return 8; + } + virtual int abase1() { + return 9; + } + virtual void cbase1x() { + } + virtual ABase1 *cloneit() { + return new Derived3(*this); + } + void derived3() { + } + }; + + struct Bottom1 : Derived1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 103; + } + virtual int cbase2() { + return 104; + } + }; + + struct Bottom2 : Derived2 { + virtual int cbase1y() { + return 206; + } + virtual int abase1() { + return 205; + } + }; + + struct Bottom3 : Derived3 { + virtual int cbase1y() { + return 307; + } + virtual int cbase2() { + return 308; + } + virtual int abase1() { + return 309; + } + }; + + // Base classes as input + int InputValCBase1(CBase1 cb1) { + return cb1.cbase1y(); + } + int InputValCBase2(CBase2 cb2) { + return cb2.cbase2(); + } + + int InputPtrABase1(ABase1 *pab1) { + return pab1->abase1(); + } + int InputPtrCBase1(CBase1 *pcb1) { + return pcb1->cbase1y(); + } + int InputPtrCBase2(CBase2 *pcb2) { + return pcb2->cbase2(); + } + + int InputRefABase1(ABase1 &rab1) { + return rab1.abase1(); + } + int InputRefCBase1(CBase1 &rcb1) { + return rcb1.cbase1y(); + } + int InputRefCBase2(CBase2 &rcb2) { + return rcb2.cbase2(); + } + + int InputCPtrRefABase1(ABase1 *const& pab1) { + return pab1->abase1(); + } + int InputCPtrRefCBase1(CBase1 *const& pcb1) { + return pcb1->cbase1y(); + } + int InputCPtrRefCBase2(CBase2 *const& pcb2) { + return pcb2->cbase2(); + } + + // Derived classes as input + int InputValDerived1(Derived1 d) { + return d.cbase1y() + d.cbase2(); + } + int InputValDerived2(Derived2 d) { + return d.cbase1y() + d.abase1(); + } + int InputValDerived3(Derived3 d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputRefDerived1(Derived1 &d) { + return d.cbase1y() + d.cbase2(); + } + int InputRefDerived2(Derived2 &d) { + return d.cbase1y() + d.abase1(); + } + int InputRefDerived3(Derived3 &d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputPtrDerived1(Derived1 *d) { + return d->cbase1y() + d->cbase2(); + } + int InputPtrDerived2(Derived2 *d) { + return d->cbase1y() + d->abase1(); + } + int InputPtrDerived3(Derived3 *d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputCPtrRefDerived1(Derived1 *const& d) { + return d->cbase1y() + d->cbase2(); + } + int InputCPtrRefDerived2(Derived2 *const& d) { + return d->cbase1y() + d->abase1(); + } + int InputCPtrRefDerived3(Derived3 *const& d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + // Bottom classes as input + int InputValBottom1(Bottom1 d) { + return d.cbase1y() + d.cbase2(); + } + int InputValBottom2(Bottom2 d) { + return d.cbase1y() + d.abase1(); + } + int InputValBottom3(Bottom3 d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputRefBottom1(Bottom1 &d) { + return d.cbase1y() + d.cbase2(); + } + int InputRefBottom2(Bottom2 &d) { + return d.cbase1y() + d.abase1(); + } + int InputRefBottom3(Bottom3 &d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputPtrBottom1(Bottom1 *d) { + return d->cbase1y() + d->cbase2(); + } + int InputPtrBottom2(Bottom2 *d) { + return d->cbase1y() + d->abase1(); + } + int InputPtrBottom3(Bottom3 *d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputCPtrRefBottom1(Bottom1 *const& d) { + return d->cbase1y() + d->cbase2(); + } + int InputCPtrRefBottom2(Bottom2 *const& d) { + return d->cbase1y() + d->abase1(); + } + int InputCPtrRefBottom3(Bottom3 *const& d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + // Return pointers + CBase1 *MakePtrDerived1_CBase1() { + return new Derived1(); + } + CBase2 *MakePtrDerived1_CBase2() { + return new Derived1(); + } + CBase1 *MakePtrDerived2_CBase1() { + return new Derived2(); + } + ABase1 *MakePtrDerived2_ABase1() { + return new Derived2(); + } + ABase1 *MakePtrDerived3_ABase1() { + return new Derived3(); + } + CBase1 *MakePtrDerived3_CBase1() { + return new Derived3(); + } + CBase2 *MakePtrDerived3_CBase2() { + return new Derived3(); + } + + // Return references + CBase1 &MakeRefDerived1_CBase1() { + static Derived1 d; + return d; + } + CBase2 &MakeRefDerived1_CBase2() { + static Derived1 d; + return d; + } + CBase1 &MakeRefDerived2_CBase1() { + static Derived2 d; + return d; + } + ABase1 &MakeRefDerived2_ABase1() { + static Derived2 d; + return d; + } + ABase1 &MakeRefDerived3_ABase1() { + static Derived3 d; + return d; + } + CBase1 &MakeRefDerived3_CBase1() { + static Derived3 d; + return d; + } + CBase2 &MakeRefDerived3_CBase2() { + static Derived3 d; + return d; + } + + // Return by value (sliced objects) + CBase1 MakeValDerived1_CBase1() { + return Derived1(); + } + CBase2 MakeValDerived1_CBase2() { + return Derived1(); + } + CBase1 MakeValDerived2_CBase1() { + return Derived2(); + } + CBase1 MakeValDerived3_CBase1() { + return Derived3(); + } + CBase2 MakeValDerived3_CBase2() { + return Derived3(); + } +} + +%} + diff --git a/Examples/test-suite/multiple_inheritance_shared_ptr.i b/Examples/test-suite/multiple_inheritance_shared_ptr.i new file mode 100644 index 000000000..5a08e5e6e --- /dev/null +++ b/Examples/test-suite/multiple_inheritance_shared_ptr.i @@ -0,0 +1,499 @@ +// This is a copy of the multiple_inheritance_abstract test and extended for testing %shared_ptr and %interface_impl +%module multiple_inheritance_shared_ptr + +%warnfilter(SWIGWARN_RUBY_MULTIPLE_INHERITANCE, + SWIGWARN_D_MULTIPLE_INHERITANCE, + SWIGWARN_PHP_MULTIPLE_INHERITANCE); /* languages not supporting multiple inheritance or %interface */ + +// Typemap changes required to mix %shared_ptr and %interface_impl +// Note we don't have a way to use $javainterfacename/$csinterfacename (yet), +// so we improvise somewhat by adding the SwigImpl suffix +%define SWIG_SHARED_PTR_INTERFACE_TYPEMAPS(CONST, TYPE...) +#if defined(SWIGJAVA) +%typemap(javain) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "($javainput == null) ? 0 : $javainput.$typemap(jstype, TYPE)_GetInterfaceCPtr()" +%typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { + long cPtr = $jnicall; + return (cPtr == 0) ? null : ($typemap(jstype, TYPE))new $typemap(jstype, TYPE)SwigImpl(cPtr, true); + } +#elif defined(SWIGCSHARP) +%typemap(csin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$csinput == null ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : $csinput.GetInterfaceCPtr()" +%typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, + SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { + global::System.IntPtr cPtr = $imcall; + $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)SwigImpl(cPtr, true);$excode + return ret; + } +#endif +%enddef + +#if defined(SWIGJAVA) || defined(SWIGCSHARP) +%include <boost_shared_ptr.i> +%shared_ptr(Space::ABase1) +%shared_ptr(Space::CBase1) +%shared_ptr(Space::CBase2) +%shared_ptr(Space::Derived1) +%shared_ptr(Space::Derived2) +%shared_ptr(Space::Derived3) +%shared_ptr(Space::Bottom1) +%shared_ptr(Space::Bottom2) +%shared_ptr(Space::Bottom3) + +%include "swiginterface.i" +SWIG_SHARED_PTR_INTERFACE_TYPEMAPS(SWIGEMPTYHACK, Space::ABase1) +SWIG_SHARED_PTR_INTERFACE_TYPEMAPS(SWIGEMPTYHACK, Space::CBase1) +SWIG_SHARED_PTR_INTERFACE_TYPEMAPS(SWIGEMPTYHACK, Space::CBase2) +%interface_impl(Space::ABase1) +%interface_impl(Space::CBase1) +%interface_impl(Space::CBase2) +#endif + +#if defined(SWIGD) +// Missing multiple inheritance support results in incorrect use of override +%ignore CBase1; +%ignore CBase2; +#endif + +%inline %{ +#include <boost/shared_ptr.hpp> + +namespace Space { + struct CBase1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 1; + } + int cbase1z() { + return 10; + } + virtual ~CBase1() { + } + }; + + struct CBase2 { + virtual int cbase2() { + return 2; + } + virtual ~CBase2() { + } + }; + + struct ABase1 { + virtual int abase1() = 0; + virtual ~ABase1() { + } + }; + + struct Derived1 : CBase2, CBase1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 3; + } + virtual int cbase2() { + return 4; + } + virtual CBase2 *cloneit() { + return new Derived1(*this); + } + void derived1() { + } + }; + + struct Derived2 : CBase1, ABase1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 6; + } + virtual int abase1() { + return 5; + } + virtual CBase1 *cloneit() { + return new Derived2(*this); + } + void derived2() { + } + }; + + struct Derived3 : ABase1, CBase1, CBase2 { + virtual int cbase1y() { + return 7; + } + virtual int cbase2() { + return 8; + } + virtual int abase1() { + return 9; + } + virtual void cbase1x() { + } + virtual ABase1 *cloneit() { + return new Derived3(*this); + } + void derived3() { + } + }; + + struct Bottom1 : Derived1 { + virtual void cbase1x() { + return; + } + virtual int cbase1y() { + return 103; + } + virtual int cbase2() { + return 104; + } + }; + + struct Bottom2 : Derived2 { + virtual int cbase1y() { + return 206; + } + virtual int abase1() { + return 205; + } + }; + + struct Bottom3 : Derived3 { + virtual int cbase1y() { + return 307; + } + virtual int cbase2() { + return 308; + } + virtual int abase1() { + return 309; + } + }; + + typedef boost::shared_ptr<ABase1> ABase1_SharedPtr; + typedef boost::shared_ptr<CBase1> CBase1_SharedPtr; + typedef boost::shared_ptr<CBase2> CBase2_SharedPtr; + typedef boost::shared_ptr<Derived1> Derived1_SharedPtr; + typedef boost::shared_ptr<Derived2> Derived2_SharedPtr; + typedef boost::shared_ptr<Derived3> Derived3_SharedPtr; + typedef boost::shared_ptr<Bottom1> Bottom1_SharedPtr; + typedef boost::shared_ptr<Bottom2> Bottom2_SharedPtr; + typedef boost::shared_ptr<Bottom3> Bottom3_SharedPtr; + + // Base classes as input + int InputValCBase1(CBase1 cb1) { + return cb1.cbase1y(); + } + int InputValCBase2(CBase2 cb2) { + return cb2.cbase2(); + } + + int InputPtrABase1(ABase1 *pab1) { + return pab1->abase1(); + } + int InputPtrCBase1(CBase1 *pcb1) { + return pcb1->cbase1y(); + } + int InputPtrCBase2(CBase2 *pcb2) { + return pcb2->cbase2(); + } + + int InputRefABase1(ABase1 &rab1) { + return rab1.abase1(); + } + int InputRefCBase1(CBase1 &rcb1) { + return rcb1.cbase1y(); + } + int InputRefCBase2(CBase2 &rcb2) { + return rcb2.cbase2(); + } + + int InputCPtrRefABase1(ABase1 *const& pab1) { + return pab1->abase1(); + } + int InputCPtrRefCBase1(CBase1 *const& pcb1) { + return pcb1->cbase1y(); + } + int InputCPtrRefCBase2(CBase2 *const& pcb2) { + return pcb2->cbase2(); + } + + int InputSharedPtrABase1(ABase1_SharedPtr pab1) { + return pab1->abase1(); + } + int InputSharedPtrCBase1(CBase1_SharedPtr pcb1) { + return pcb1->cbase1y(); + } + int InputSharedPtrCBase2(CBase2_SharedPtr pcb2) { + return pcb2->cbase2(); + } + + int InputSharedPtrRefABase1(ABase1_SharedPtr &pab1) { + return pab1->abase1(); + } + int InputSharedPtrRefCBase1(CBase1_SharedPtr &pcb1) { + return pcb1->cbase1y(); + } + int InputSharedPtrRefCBase2(CBase2_SharedPtr &pcb2) { + return pcb2->cbase2(); + } + + // Derived classes as input + int InputValDerived1(Derived1 d) { + return d.cbase1y() + d.cbase2(); + } + int InputValDerived2(Derived2 d) { + return d.cbase1y() + d.abase1(); + } + int InputValDerived3(Derived3 d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputRefDerived1(Derived1 &d) { + return d.cbase1y() + d.cbase2(); + } + int InputRefDerived2(Derived2 &d) { + return d.cbase1y() + d.abase1(); + } + int InputRefDerived3(Derived3 &d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputPtrDerived1(Derived1 *d) { + return d->cbase1y() + d->cbase2(); + } + int InputPtrDerived2(Derived2 *d) { + return d->cbase1y() + d->abase1(); + } + int InputPtrDerived3(Derived3 *d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputCPtrRefDerived1(Derived1 *const& d) { + return d->cbase1y() + d->cbase2(); + } + int InputCPtrRefDerived2(Derived2 *const& d) { + return d->cbase1y() + d->abase1(); + } + int InputCPtrRefDerived3(Derived3 *const& d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputSharedPtrDerived1(Derived1_SharedPtr d) { + return d->cbase1y() + d->cbase2(); + } + int InputSharedPtrDerived2(Derived2_SharedPtr d) { + return d->cbase1y() + d->abase1(); + } + int InputSharedPtrDerived3(Derived3_SharedPtr d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputSharedPtrRefDerived1(Derived1_SharedPtr &d) { + return d->cbase1y() + d->cbase2(); + } + int InputSharedPtrRefDerived2(Derived2_SharedPtr &d) { + return d->cbase1y() + d->abase1(); + } + int InputSharedPtrRefDerived3(Derived3_SharedPtr &d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + // Bottom classes as input + int InputValBottom1(Bottom1 d) { + return d.cbase1y() + d.cbase2(); + } + int InputValBottom2(Bottom2 d) { + return d.cbase1y() + d.abase1(); + } + int InputValBottom3(Bottom3 d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputRefBottom1(Bottom1 &d) { + return d.cbase1y() + d.cbase2(); + } + int InputRefBottom2(Bottom2 &d) { + return d.cbase1y() + d.abase1(); + } + int InputRefBottom3(Bottom3 &d) { + return d.cbase1y() + d.cbase2() + d.abase1(); + } + + int InputPtrBottom1(Bottom1 *d) { + return d->cbase1y() + d->cbase2(); + } + int InputPtrBottom2(Bottom2 *d) { + return d->cbase1y() + d->abase1(); + } + int InputPtrBottom3(Bottom3 *d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputCPtrRefBottom1(Bottom1 *const& d) { + return d->cbase1y() + d->cbase2(); + } + int InputCPtrRefBottom2(Bottom2 *const& d) { + return d->cbase1y() + d->abase1(); + } + int InputCPtrRefBottom3(Bottom3 *const& d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputSharedPtrBottom1(Bottom1_SharedPtr d) { + return d->cbase1y() + d->cbase2(); + } + int InputSharedPtrBottom2(Bottom2_SharedPtr d) { + return d->cbase1y() + d->abase1(); + } + int InputSharedPtrBottom3(Bottom3_SharedPtr d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + int InputSharedPtrRefBottom1(Bottom1_SharedPtr &d) { + return d->cbase1y() + d->cbase2(); + } + int InputSharedPtrRefBottom2(Bottom2_SharedPtr &d) { + return d->cbase1y() + d->abase1(); + } + int InputSharedPtrRefBottom3(Bottom3_SharedPtr &d) { + return d->cbase1y() + d->cbase2() + d->abase1(); + } + + // Return pointers + CBase1 *MakePtrDerived1_CBase1() { + return new Derived1(); + } + CBase2 *MakePtrDerived1_CBase2() { + return new Derived1(); + } + CBase1 *MakePtrDerived2_CBase1() { + return new Derived2(); + } + ABase1 *MakePtrDerived2_ABase1() { + return new Derived2(); + } + ABase1 *MakePtrDerived3_ABase1() { + return new Derived3(); + } + CBase1 *MakePtrDerived3_CBase1() { + return new Derived3(); + } + CBase2 *MakePtrDerived3_CBase2() { + return new Derived3(); + } + + // Return references + CBase1 &MakeRefDerived1_CBase1() { + static Derived1 d; + return d; + } + CBase2 &MakeRefDerived1_CBase2() { + static Derived1 d; + return d; + } + CBase1 &MakeRefDerived2_CBase1() { + static Derived2 d; + return d; + } + ABase1 &MakeRefDerived2_ABase1() { + static Derived2 d; + return d; + } + ABase1 &MakeRefDerived3_ABase1() { + static Derived3 d; + return d; + } + CBase1 &MakeRefDerived3_CBase1() { + static Derived3 d; + return d; + } + CBase2 &MakeRefDerived3_CBase2() { + static Derived3 d; + return d; + } + + // Return by value (sliced objects) + CBase1 MakeValDerived1_CBase1() { + return Derived1(); + } + CBase2 MakeValDerived1_CBase2() { + return Derived1(); + } + CBase1 MakeValDerived2_CBase1() { + return Derived2(); + } + CBase1 MakeValDerived3_CBase1() { + return Derived3(); + } + CBase2 MakeValDerived3_CBase2() { + return Derived3(); + } + + // Return smart pointers + CBase1_SharedPtr MakeSharedPtrDerived1_CBase1() { + return CBase1_SharedPtr(new Derived1()); + } + CBase2_SharedPtr MakeSharedPtrDerived1_CBase2() { + return CBase2_SharedPtr(new Derived1()); + } + CBase1_SharedPtr MakeSharedPtrDerived2_CBase1() { + return CBase1_SharedPtr(new Derived2()); + } + ABase1_SharedPtr MakeSharedPtrDerived2_ABase1() { + return ABase1_SharedPtr(new Derived2()); + } + ABase1_SharedPtr MakeSharedPtrDerived3_ABase1() { + return ABase1_SharedPtr(new Derived3()); + } + CBase1_SharedPtr MakeSharedPtrDerived3_CBase1() { + return CBase1_SharedPtr(new Derived3()); + } + CBase2_SharedPtr MakeSharedPtrDerived3_CBase2() { + return CBase2_SharedPtr(new Derived3()); + } + + // Return smart pointer references + CBase1_SharedPtr MakeSharedPtrRefDerived1_CBase1() { + static CBase1_SharedPtr s(new Derived1()); + return s; + } + CBase2_SharedPtr MakeSharedPtrRefDerived1_CBase2() { + static CBase2_SharedPtr s(new Derived1()); + return s; + } + CBase1_SharedPtr MakeSharedPtrRefDerived2_CBase1() { + static CBase1_SharedPtr s(new Derived2()); + return s; + } + ABase1_SharedPtr MakeSharedPtrRefDerived2_ABase1() { + static ABase1_SharedPtr s(new Derived2()); + return s; + } + ABase1_SharedPtr MakeSharedPtrRefDerived3_ABase1() { + static ABase1_SharedPtr s(new Derived3()); + return s; + } + CBase1_SharedPtr MakeSharedPtrRefDerived3_CBase1() { + static CBase1_SharedPtr s(new Derived3()); + return s; + } + CBase2_SharedPtr MakeSharedPtrRefDerived3_CBase2() { + static CBase2_SharedPtr s(new Derived3()); + return s; + } +} + +%} diff --git a/Examples/test-suite/namespace_typemap.i b/Examples/test-suite/namespace_typemap.i index 8ead78c6c..7f474bd9c 100644 --- a/Examples/test-suite/namespace_typemap.i +++ b/Examples/test-suite/namespace_typemap.i @@ -109,7 +109,11 @@ namespace test { #ifdef SWIGGO %typemap(gotype) string_class * "string" %typemap(in) string_class * { - $1 = new string_class($input.p); + char* buf = new char[$input.n + 1]; + memcpy(buf, $input.p, $input.n); + buf[$input.n] = '\0'; + $1 = new string_class(buf); + delete[] buf; } %typemap(freearg) string_class * { delete $1; diff --git a/Examples/test-suite/nested_extend_c.i b/Examples/test-suite/nested_extend_c.i index 8fde075a4..032619f8e 100644 --- a/Examples/test-suite/nested_extend_c.i +++ b/Examples/test-suite/nested_extend_c.i @@ -98,5 +98,9 @@ typedef struct { static struct { int i; } THING; + +int useThing() { + return THING.i; +} %} diff --git a/Examples/test-suite/nested_ignore.i b/Examples/test-suite/nested_ignore.i new file mode 100644 index 000000000..e271eca7d --- /dev/null +++ b/Examples/test-suite/nested_ignore.i @@ -0,0 +1,24 @@ +%module nested_ignore +%warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) B::C::D; + +%rename($ignore) B::C; + +%inline %{ +namespace B { + class C { + public: + struct D { + }; + }; + + class E { + public: + typedef C::D D; + }; + + struct F + { + const E::D foo(){ return E::D(); } + }; +} +%} diff --git a/Examples/test-suite/operator_overload.i b/Examples/test-suite/operator_overload.i index 90f767a84..af884e5b4 100644 --- a/Examples/test-suite/operator_overload.i +++ b/Examples/test-suite/operator_overload.i @@ -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. @@ -89,8 +93,6 @@ see bottom for a set of possible tests #include <iso646.h> /* for named logical operator, eg 'operator or' */ #endif -#include <assert.h> - class Op { public: int i; @@ -109,11 +111,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);} @@ -245,8 +247,8 @@ public: %{ - -#include <assert.h> +#include <stdexcept> +#define ASSERT(X) { if (!(X)) { throw std::runtime_error(#X); } } void Op::sanity_check() { @@ -258,66 +260,66 @@ void Op::sanity_check() Op dd=d; // assignment operator // test equality - assert(a!=b); - assert(b==c); - assert(a!=d); - assert(d==dd); + ASSERT(a!=b); + ASSERT(b==c); + ASSERT(a!=d); + ASSERT(d==dd); // test < - assert(a<b); - assert(a<=b); - assert(b<=c); - assert(b>=c); - assert(b>d); - assert(b>=d); + ASSERT(a<b); + ASSERT(a<=b); + ASSERT(b<=c); + ASSERT(b>=c); + ASSERT(b>d); + ASSERT(b>=d); // test += Op e=3; e+=d; - assert(e==b); + ASSERT(e==b); e-=c; - assert(e==a); + ASSERT(e==a); e=Op(1); e*=b; - assert(e==c); + ASSERT(e==c); e/=d; - assert(e==d); + ASSERT(e==d); e%=c; - assert(e==d); + ASSERT(e==d); // test + Op f(1),g(1); - assert(f+g==Op(2)); - assert(f-g==Op(0)); - assert(f*g==Op(1)); - assert(f/g==Op(1)); - assert(f%g==Op(0)); + ASSERT(f+g==Op(2)); + ASSERT(f-g==Op(0)); + ASSERT(f*g==Op(1)); + ASSERT(f/g==Op(1)); + ASSERT(f%g==Op(0)); // test unary operators - assert(!a==true); - assert(!b==false); - assert(-a==a); - assert(-b==Op(-5)); + ASSERT(!a==true); + ASSERT(!b==false); + ASSERT(-a==a); + ASSERT(-b==Op(-5)); // test [] Op h=3; - assert(h[0]==3); - assert(h[1]==0); + ASSERT(h[0]==3); + ASSERT(h[1]==0); h[0]=2; // set - assert(h[0]==2); + ASSERT(h[0]==2); h[1]=2; // ignored - assert(h[0]==2); - assert(h[1]==0); + ASSERT(h[0]==2); + ASSERT(h[1]==0); // test () Op i=3; - assert(i()==3); - assert(i(1)==4); - assert(i(1,2)==6); + ASSERT(i()==3); + ASSERT(i(1)==4); + ASSERT(i(1,2)==6); // plus add some code to check the __str__ fn - //assert(str(Op(1))=="Op(1)"); - //assert(str(Op(-3))=="Op(-3)"); + //ASSERT(str(Op(1))=="Op(1)"); + //ASSERT(str(Op(-3))=="Op(-3)"); // test ++ and -- Op j(100); @@ -325,36 +327,36 @@ void Op::sanity_check() { Op newOp = j++; int newInt = original++; - assert(j.i == original); - assert(newOp.i == newInt); + ASSERT(j.i == original); + ASSERT(newOp.i == newInt); } { Op newOp = j--; int newInt = original--; - assert(j.i == original); - assert(newOp.i == newInt); + ASSERT(j.i == original); + ASSERT(newOp.i == newInt); } { Op newOp = ++j; int newInt = ++original; - assert(j.i == original); - assert(newOp.i == newInt); + ASSERT(j.i == original); + ASSERT(newOp.i == newInt); } { Op newOp = --j; int newInt = --original; - assert(j.i == original); - assert(newOp.i == newInt); + ASSERT(j.i == original); + ASSERT(newOp.i == newInt); } // cast operators Op k=3; int check_k = k; - assert (check_k == 3); + ASSERT (check_k == 3); Op l=4; double check_l = l; - assert (check_l == 4); + ASSERT (check_l == 4); } %} diff --git a/Examples/test-suite/php/director_pass_by_value_runme.php b/Examples/test-suite/php/director_pass_by_value_runme.php new file mode 100644 index 000000000..8a8b84d67 --- /dev/null +++ b/Examples/test-suite/php/director_pass_by_value_runme.php @@ -0,0 +1,24 @@ +<?php + +require "tests.php"; +require "director_pass_by_value.php"; + +$passByVal = null; + +class director_pass_by_value_Derived extends DirectorPassByValueAbstractBase { + function virtualMethod($b) { + global $passByVal; + $passByVal = $b; + } +} + +# bug was the passByVal global object was destroyed after the call to virtualMethod had finished. +$caller = new Caller(); +$caller->call_virtualMethod(new director_pass_by_value_Derived()); +$ret = $passByVal->getVal(); +if ($ret != 0x12345678) { + check::fail("Bad return value, got " . dechex($ret)); +} + +check::done(); +?> diff --git a/Examples/test-suite/preproc_defined.i b/Examples/test-suite/preproc_defined.i index 0a91bd98a..e1958515d 100644 --- a/Examples/test-suite/preproc_defined.i +++ b/Examples/test-suite/preproc_defined.i @@ -102,6 +102,7 @@ ANOTHER_MACRO(int) void another_macro_checking(void) { struct Defined d; d.defined = 10; + (void)d; thing(10); stuff(10); bumpf(10); diff --git a/Examples/test-suite/primitive_types.i b/Examples/test-suite/primitive_types.i index 8eb2a13f2..b9b973a2b 100644 --- a/Examples/test-suite/primitive_types.i +++ b/Examples/test-suite/primitive_types.i @@ -2,6 +2,7 @@ %module(directors="1") primitive_types #if defined(SWIGSCILAB) +%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) ovr_str; %warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) ovr_val; %rename(TestDir) TestDirector; #endif diff --git a/Examples/test-suite/python/Makefile.in b/Examples/test-suite/python/Makefile.in index 0c47d19ce..a7993b0b8 100644 --- a/Examples/test-suite/python/Makefile.in +++ b/Examples/test-suite/python/Makefile.in @@ -130,11 +130,11 @@ py2_runme = $(SCRIPTPREFIX)$*$(PY2SCRIPTSUFFIX) py3_runme = $(SCRIPTPREFIX)$*$(PY3SCRIPTSUFFIX) ifneq (,$(PEP8)) -check_pep8 = $(PEP8) $(PEP8_FLAGS) $(SCRIPTPREFIX)$*.py +check_pep8 = $(COMPILETOOL) $(PEP8) $(PEP8_FLAGS) $(SCRIPTPREFIX)$*.py check_pep8_multi_cpp = \ for f in `cat $(top_srcdir)/$(EXAMPLES)/$(TEST_SUITE)/$*.list` ; do \ - $(PEP8) $(PEP8_FLAGS) $$f.py; \ + $(COMPILETOOL) $(PEP8) $(PEP8_FLAGS) $$f.py; \ done endif diff --git a/Examples/test-suite/python/autodoc_runme.py b/Examples/test-suite/python/autodoc_runme.py index ce0aae0eb..af04c8c0e 100644 --- a/Examples/test-suite/python/autodoc_runme.py +++ b/Examples/test-suite/python/autodoc_runme.py @@ -15,11 +15,19 @@ def check(got, expected, expected_builtin=None, skip=False): def is_new_style_class(cls): return hasattr(cls, "__class__") +def is_fastproxy(module): + return "new_instancemethod" in module + if not is_new_style_class(A): # Missing static methods make this hard to test... skip if -classic is # used! sys.exit(0) +if is_fastproxy(dir()): + # Detect when -fastproxy is specified and skip test as it changes the function names making it + # hard to test... skip until the number of options are reduced in SWIG-3.1 and autodoc is improved + sys.exit(0) + # skip builtin check - the autodoc is missing, but it probably should not be skip = True diff --git a/Examples/test-suite/python/compactdefaultargs_runme.py b/Examples/test-suite/python/compactdefaultargs_runme.py index e81c8d173..1096619f4 100644 --- a/Examples/test-suite/python/compactdefaultargs_runme.py +++ b/Examples/test-suite/python/compactdefaultargs_runme.py @@ -17,3 +17,6 @@ if defaults2.ret(10.0) != 10.0: if defaults2.ret() != -1.0: raise RuntimeError + +if defaults2.nodefault(-2) != -2: + raise RuntimeError diff --git a/Examples/test-suite/python/constant_directive_runme.py b/Examples/test-suite/python/constant_directive_runme.py index a7ed82b8b..e223cd261 100644 --- a/Examples/test-suite/python/constant_directive_runme.py +++ b/Examples/test-suite/python/constant_directive_runme.py @@ -18,3 +18,11 @@ if constant_directive.TYPE1_CONSTANT2.val != 2: if constant_directive.TYPE1_CONSTANT3.val != 3: raise RuntimeError("constant_directive.TYPE1_CONSTANT3.val is %r (should be 3)" % constant_directive.TYPE1_CONSTANT3.val) + +if constant_directive.TYPE1CONST_CONSTANT1.val != 1: + raise RuntimeError("constant_directive.TYPE1CONST_CONSTANT1.val is %r (should be 1)" % + constant_directive.TYPE1CONST_CONSTANT1.val) + +if constant_directive.TYPE1CPTR_CONSTANT1.val != 1: + raise RuntimeError("constant_directive.TYPE1CPTR_CONSTANT1.val is %r (should be 1)" % + constant_directive.TYPE1CPTR_CONSTANT1.val) diff --git a/Examples/test-suite/python/cpp11_type_aliasing_runme.py b/Examples/test-suite/python/cpp11_type_aliasing_runme.py new file mode 100644 index 000000000..52cc81d1c --- /dev/null +++ b/Examples/test-suite/python/cpp11_type_aliasing_runme.py @@ -0,0 +1,32 @@ +from cpp11_type_aliasing import * + +if get_host_target().bits != 32: + raise RuntimeError("get_host_target().bits should return 32") + +if mult2(10) != 20: + raise RuntimeError("mult2(10) should return 20") + +int_ptr = allocate_int() +inplace_mult2(int_ptr) +if read_int(int_ptr) != 24: + raise RuntimeError("read_int should return 24") +free_int(int_ptr) + +pair = PairSubclass(3, 4) +if pair.first() != 3: + raise RuntimeError("pair.first() should return 3") + +if pair.second() != 4: + raise RuntimeError("pair.second() should return 4") + +if pair.a != 3: + raise RuntimeError("pair.a should be 3") + +if plus1(5) != 6: + raise RuntimeError("plus1(5) should return 6") + +if call(mult2_cb, 7) != 14: + raise RuntimeError("call(mult2_cb, 7) should return 14") + +if call(get_callback(), 7) != 14: + raise RuntimeError("call(get_callback(), 7) should return 14") diff --git a/Examples/test-suite/python/cpp_static_runme.py b/Examples/test-suite/python/cpp_static_runme.py index b742de285..1c7705f3e 100644 --- a/Examples/test-suite/python/cpp_static_runme.py +++ b/Examples/test-suite/python/cpp_static_runme.py @@ -14,4 +14,5 @@ else: StaticFunctionTest().static_func_2(1) StaticFunctionTest().static_func_3(1, 2) StaticMemberTest.static_int = 10 -assert StaticMemberTest.static_int == 10 +if not StaticMemberTest.static_int == 10: + raise RuntimeError("static_int not 10") diff --git a/Examples/test-suite/python/default_args_c_runme.py b/Examples/test-suite/python/default_args_c_runme.py new file mode 100644 index 000000000..5985fd75c --- /dev/null +++ b/Examples/test-suite/python/default_args_c_runme.py @@ -0,0 +1,6 @@ +import default_args_c + +if default_args_c.foo1() != 1: + raise RuntimeError("failed") +if default_args_c.foo43() != 43: + raise RuntimeError("failed") diff --git a/Examples/test-suite/python/default_args_runme.py b/Examples/test-suite/python/default_args_runme.py index 6610a4ec4..9d275e4a1 100644 --- a/Examples/test-suite/python/default_args_runme.py +++ b/Examples/test-suite/python/default_args_runme.py @@ -136,5 +136,23 @@ def run(module_name): 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') diff --git a/Examples/test-suite/python/director_pass_by_value_runme.py b/Examples/test-suite/python/director_pass_by_value_runme.py new file mode 100644 index 000000000..7744db962 --- /dev/null +++ b/Examples/test-suite/python/director_pass_by_value_runme.py @@ -0,0 +1,13 @@ +import director_pass_by_value + +passByVal = None +class director_pass_by_value_Derived(director_pass_by_value.DirectorPassByValueAbstractBase): + def virtualMethod(self, b): + global passByVal + passByVal = b + +# bug was the passByVal global object was destroyed after the call to virtualMethod had finished. +director_pass_by_value.Caller().call_virtualMethod(director_pass_by_value_Derived()) +ret = passByVal.getVal(); +if ret != 0x12345678: + raise RuntimeError("Bad return value, got " + hex(ret)) diff --git a/Examples/test-suite/python/exception_classname_runme.py b/Examples/test-suite/python/exception_classname_runme.py index c78f4e68b..9a82c9105 100644 --- a/Examples/test-suite/python/exception_classname_runme.py +++ b/Examples/test-suite/python/exception_classname_runme.py @@ -1,4 +1,5 @@ import exception_classname a = exception_classname.Exception() -assert a.testfunc() == 42 +if a.testfunc() != 42: + raise RuntimeError("Not 42!") diff --git a/Examples/test-suite/python/funcptr_cpp_runme.py b/Examples/test-suite/python/funcptr_cpp_runme.py index 08e85ad7b..eb113d226 100644 --- a/Examples/test-suite/python/funcptr_cpp_runme.py +++ b/Examples/test-suite/python/funcptr_cpp_runme.py @@ -6,3 +6,5 @@ if call2(ADD_BY_POINTER, 12, 13) != 25: raise RuntimeError if call3(ADD_BY_REFERENCE, 14, 15) != 29: raise RuntimeError +if call1(ADD_BY_VALUE_C, 2, 3) != 5: + raise RuntimeError diff --git a/Examples/test-suite/python/li_attribute_runme.py b/Examples/test-suite/python/li_attribute_runme.py index 13a01c97d..80e793618 100644 --- a/Examples/test-suite/python/li_attribute_runme.py +++ b/Examples/test-suite/python/li_attribute_runme.py @@ -71,3 +71,13 @@ if myStringyClass.ReadWriteString != "changed string": raise RuntimeError if myStringyClass.ReadOnlyString != "changed string": raise RuntimeError + +# Check a proper AttributeError is raised for non-existent attributes, old versions used to raise unhelpful error: +# AttributeError: type object 'object' has no attribute '__getattr__' +try: + x = myFoo.does_not_exist + raise RuntimeError +except AttributeError, e: + if str(e).find("does_not_exist") == -1: + raise RuntimeError + diff --git a/Examples/test-suite/python/li_boost_shared_ptr_template_runme.py b/Examples/test-suite/python/li_boost_shared_ptr_template_runme.py index 6b56ec479..eab7e282a 100644 --- a/Examples/test-suite/python/li_boost_shared_ptr_template_runme.py +++ b/Examples/test-suite/python/li_boost_shared_ptr_template_runme.py @@ -8,9 +8,8 @@ if d.bar() != 2: raise RuntimeError if bar_getter(b) != 1: raise RuntimeError -# Fix reverted in rev 12953 -# if bar_getter(d) != 2: -# raise RuntimeError +if bar_getter(d) != 2: + raise RuntimeError b = BaseDefaultInt() d = DerivedDefaultInt() @@ -23,8 +22,11 @@ if d2.bar2() != 4: raise RuntimeError if bar2_getter(b) != 3: raise RuntimeError -# Fix reverted in rev 12953 -# if bar2_getter(d) != 4: -# raise RuntimeError -# if bar2_getter(d2) != 4: -# raise RuntimeError +# SWIG fix reverted in Subversion rev 12953 +# Testcase has now been modified to mask the problem by providing the default parameter 'int' in: +# %shared_ptr(Space::BaseDefault<short, int>) +# If this is not done then d fails to convert to BaseDefault<short>& +if bar2_getter(d) != 4: + raise RuntimeError +if bar2_getter(d2) != 4: + raise RuntimeError diff --git a/Examples/test-suite/python/operator_overload_runme.py b/Examples/test-suite/python/operator_overload_runme.py new file mode 100644 index 000000000..cf4277f35 --- /dev/null +++ b/Examples/test-suite/python/operator_overload_runme.py @@ -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)") + diff --git a/Examples/test-suite/python/operbool_runme.py b/Examples/test-suite/python/operbool_runme.py index 708dea786..cdef85abc 100644 --- a/Examples/test-suite/python/operbool_runme.py +++ b/Examples/test-suite/python/operbool_runme.py @@ -1,3 +1,4 @@ #!/usr/bin/env python import operbool -assert not operbool.Test() +if operbool.Test(): + raise RuntimeError("operbool failed") diff --git a/Examples/test-suite/python/python_abstractbase_runme3.py b/Examples/test-suite/python/python_abstractbase_runme3.py index b4a20f085..4fdc79935 100644 --- a/Examples/test-suite/python/python_abstractbase_runme3.py +++ b/Examples/test-suite/python/python_abstractbase_runme3.py @@ -6,6 +6,10 @@ from collections import * if is_python_builtin(): exit(0) +# Python abc is only turned on when -py3 option is passed to SWIG +if not is_swig_py3: + exit(0) + assert issubclass(Mapii, MutableMapping) assert issubclass(Multimapii, MutableMapping) assert issubclass(IntSet, MutableSet) diff --git a/Examples/test-suite/python/python_destructor_exception_runme.py b/Examples/test-suite/python/python_destructor_exception_runme.py index 671eff3cc..ee71ab33b 100644 --- a/Examples/test-suite/python/python_destructor_exception_runme.py +++ b/Examples/test-suite/python/python_destructor_exception_runme.py @@ -26,8 +26,10 @@ def test1(): sys.stderr.flush() sys.stderr = stderr_saved - assert attributeErrorOccurred - assert buffer.getvalue().count("I am the ClassWithThrowingDestructor dtor doing bad things") >= 1 + if not attributeErrorOccurred: + raise RuntimeError("attributeErrorOccurred failed") + if not buffer.getvalue().count("I am the ClassWithThrowingDestructor dtor doing bad things") >= 1: + raise RuntimeError("ClassWithThrowingDestructor dtor doing bad things failed") class VectorHolder(object): def __init__(self, v): diff --git a/Examples/test-suite/python/rename_rstrip_encoder_runme.py b/Examples/test-suite/python/rename_rstrip_encoder_runme.py new file mode 100644 index 000000000..84072f7f2 --- /dev/null +++ b/Examples/test-suite/python/rename_rstrip_encoder_runme.py @@ -0,0 +1,5 @@ +from rename_rstrip_encoder import * + +s = SomeThing() +a = AnotherThing() +a.DoClsX() diff --git a/Examples/test-suite/python/template_default_arg_overloaded_extend_runme.py b/Examples/test-suite/python/template_default_arg_overloaded_extend_runme.py new file mode 100644 index 000000000..1f71066cb --- /dev/null +++ b/Examples/test-suite/python/template_default_arg_overloaded_extend_runme.py @@ -0,0 +1,20 @@ +from template_default_arg_overloaded_extend import * + +def check(flag): + if not flag: + raise RuntimeError("failed") + +rs = ResultSet() + +check(rs.go_get_method(0, SearchPoint()) == -1) +check(rs.go_get_method(0, SearchPoint(), 100) == 100) + +check(rs.go_get_template(0, SearchPoint()) == -2) +check(rs.go_get_template(0, SearchPoint(), 100) == 100) + +check(rs.over() == "over(int)") +check(rs.over(10) == "over(int)") +check(rs.over(SearchPoint()) == "over(giai2::SearchPoint, int)") +check(rs.over(SearchPoint(), 10) == "over(giai2::SearchPoint, int)") +check(rs.over(True, SearchPoint()) == "over(bool, gaia2::SearchPoint, int)") +check(rs.over(True, SearchPoint(), 10) == "over(bool, gaia2::SearchPoint, int)") diff --git a/Examples/test-suite/python/unicode_strings_runme.py b/Examples/test-suite/python/unicode_strings_runme.py index 3ce98bcdb..fa9c51437 100644 --- a/Examples/test-suite/python/unicode_strings_runme.py +++ b/Examples/test-suite/python/unicode_strings_runme.py @@ -13,11 +13,15 @@ if sys.version_info[0:2] >= (3, 1): if unicode_strings.non_utf8_std_string() != test_string: raise ValueError('Test comparison mismatch') +def check(s1, s2): + if s1 != s2: + raise RuntimeError("{} != {}".format(s1, s2)) + # Testing SWIG_PYTHON_2_UNICODE flag which allows unicode strings to be passed to C if sys.version_info[0:2] < (3, 0): - assert unicode_strings.charstring("hello1") == "hello1" - assert unicode_strings.charstring(str(u"hello2")) == "hello2" - assert unicode_strings.charstring(u"hello3") == "hello3" - assert unicode_strings.charstring(unicode("hello4")) == "hello4" + check(unicode_strings.charstring("hello1"), "hello1") + check(unicode_strings.charstring(str(u"hello2")), "hello2") + check(unicode_strings.charstring(u"hello3"), "hello3") + check(unicode_strings.charstring(unicode("hello4")), "hello4") unicode_strings.charstring(u"hell\xb05") unicode_strings.charstring(u"hell\u00f66") diff --git a/Examples/test-suite/python_abstractbase.i b/Examples/test-suite/python_abstractbase.i index 65f3d9931..2146e758e 100644 --- a/Examples/test-suite/python_abstractbase.i +++ b/Examples/test-suite/python_abstractbase.i @@ -24,3 +24,9 @@ bool is_python_builtin() { return true; } bool is_python_builtin() { return false; } #endif %} + +#ifdef SWIGPYTHON_PY3 // set when using -py3 +#define is_swig_py3 1 +#else +#define is_swig_py3 0 +#endif diff --git a/Examples/test-suite/r/Makefile.in b/Examples/test-suite/r/Makefile.in index 312834a51..bc12ba671 100644 --- a/Examples/test-suite/r/Makefile.in +++ b/Examples/test-suite/r/Makefile.in @@ -5,7 +5,8 @@ LANGUAGE = r SCRIPTSUFFIX = _runme.R WRAPSUFFIX = .R -RUNR = R CMD BATCH --no-save --no-restore '--args $(SCRIPTDIR)' +R_OPT = --quiet --no-save --no-restore +RUNR = R CMD BATCH $(R_OPT) '--args $(SCRIPTDIR)' srcdir = @srcdir@ top_srcdir = @top_srcdir@ @@ -51,18 +52,17 @@ include $(srcdir)/../common.mk # check for syntactic correctness run_testcase = \ if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \ - env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PATH=.:"$$PATH" $(RUNTOOL) $(RUNR) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \ + env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PATH=.:"$$PATH" $(RUNTOOL) $(RUNR) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) || (cat $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX)out ; false); \ else \ - $(RUNTOOL) $(RUNR) ./$(SCRIPTPREFIX)$*$(WRAPSUFFIX); \ + $(RUNTOOL) $(RUNR) ./$(SCRIPTPREFIX)$*$(WRAPSUFFIX) || (cat ./$(SCRIPTPREFIX)$*$(WRAPSUFFIX)out ; false); \ fi run_multitestcase = \ for f in `cat $(top_srcdir)/$(EXAMPLES)/$(TEST_SUITE)/$*.list` ; do \ if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$${f}$(SCRIPTSUFFIX) ]; then \ - env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PATH=.:"$$PATH" \ - $(RUNTOOL) $(RUNR) $(SCRIPTDIR)/$(SCRIPTPREFIX)$${f}$(SCRIPTSUFFIX); \ + env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PATH=.:"$$PATH" $(RUNTOOL) $(RUNR) $(SCRIPTDIR)/$(SCRIPTPREFIX)$${f}$(SCRIPTSUFFIX) || (cat $(SCRIPTDIR)/$(SCRIPTPREFIX)$${f}$(SCRIPTSUFFIX)out ; false); \ else \ - $(RUNTOOL) $(RUNR) ./$(SCRIPTPREFIX)$${f}$(WRAPSUFFIX); \ + $(RUNTOOL) $(RUNR) ./$(SCRIPTPREFIX)$${f}$(WRAPSUFFIX) || (cat ./$(SCRIPTPREFIX)$${f}$(WRAPSUFFIX)out ; false); \ fi; \ done # Clean diff --git a/Examples/test-suite/r/li_std_vector_runme.R b/Examples/test-suite/r/li_std_vector_runme.R new file mode 100644 index 000000000..bd02d840a --- /dev/null +++ b/Examples/test-suite/r/li_std_vector_runme.R @@ -0,0 +1,19 @@ +clargs <- commandArgs(trailing=TRUE) +source(file.path(clargs[1], "unittest.R")) + +dyn.load(paste("li_std_vector", .Platform$dynlib.ext, sep="")) +source("li_std_vector.R") +cacheMetaData(1) + +testvec <- c(1, 2, 3) + +unittest(half(testvec), testvec/2) +unittest(average(testvec), mean(testvec)) +## string vector test +vlen <- 13 +stringvec <- paste(letters[1:vlen], as.character(rnorm(vlen))) +unittest(rev(stringvec), RevStringVec(stringvec)) +q(save="no") + + + diff --git a/Examples/test-suite/r/unittest.R b/Examples/test-suite/r/unittest.R index 0633c7715..b55b4a3f3 100644 --- a/Examples/test-suite/r/unittest.R +++ b/Examples/test-suite/r/unittest.R @@ -1,5 +1,5 @@ unittest <- function (x,y) { - if (x==y) { + if (all(x==y)) { print("PASS") } else { print("FAIL") @@ -8,7 +8,7 @@ unittest <- function (x,y) { } unittesttol <- function(x,y,z) { - if (abs(x-y) < z) { + if (all(abs(x-y) < z)) { print("PASS") } else { print("FAIL") diff --git a/Examples/test-suite/rename_rstrip_encoder.i b/Examples/test-suite/rename_rstrip_encoder.i new file mode 100644 index 000000000..4ecbe129f --- /dev/null +++ b/Examples/test-suite/rename_rstrip_encoder.i @@ -0,0 +1,15 @@ +%module rename_rstrip_encoder + +// strip the Cls suffix from all identifiers +%rename("%(rstrip:[Cls])s") ""; + +%inline %{ + +class SomeThingCls { +}; + +struct AnotherThingCls { + void DoClsXCls() {} +}; + +%} diff --git a/Examples/test-suite/ruby/Makefile.in b/Examples/test-suite/ruby/Makefile.in index 847c95919..d94ac7061 100644 --- a/Examples/test-suite/ruby/Makefile.in +++ b/Examples/test-suite/ruby/Makefile.in @@ -30,7 +30,8 @@ CPP_TEST_CASES = \ # stl_new C_TEST_CASES += \ - li_cstring + li_cstring \ + ruby_manual_proxy \ include $(srcdir)/../common.mk diff --git a/Examples/test-suite/ruby/ruby_manual_proxy_runme.rb b/Examples/test-suite/ruby/ruby_manual_proxy_runme.rb new file mode 100644 index 000000000..c1cee2d13 --- /dev/null +++ b/Examples/test-suite/ruby/ruby_manual_proxy_runme.rb @@ -0,0 +1,49 @@ +#!/usr/bin/env ruby +# +# The Subversion bindings use this manually written proxy class approach +# to the Ruby bindings. Note that in C the struct svn_fs_t is an +# opaque pointer and the Ruby FileSystem proxy class is hand written around it. +# This testcase tests this and the C close function and subsequent error +# handling. + +require 'swig_assert' +require 'ruby_manual_proxy' + +module Svn + module Fs + module_function + def create(path) + f = Ruby_manual_proxy::svn_fs_create(path) + return f + end + + FileSystem = SWIG::TYPE_p_svn_fs_t + class FileSystem + class << self + def create(*args) + Fs.create(*args) + end + end + def path + Ruby_manual_proxy::svn_fs_path(self) + end + end + end +end + +f = Svn::Fs::FileSystem.create("/tmp/myfile") +path = f.path +f.close +begin + # regression in swig-3.0.8 meant ObjectPreviouslyDeleted error was thrown instead + path = f.path + raise RuntimeError.new("IOError (1) not thrown") +rescue IOError +end + +file = nil +begin + path = Ruby_manual_proxy::svn_fs_path(file) + raise RuntimeError.new("IOError (2) not thrown") +rescue IOError +end diff --git a/Examples/test-suite/ruby_manual_proxy.i b/Examples/test-suite/ruby_manual_proxy.i new file mode 100644 index 000000000..2cb154e6a --- /dev/null +++ b/Examples/test-suite/ruby_manual_proxy.i @@ -0,0 +1,66 @@ +%module ruby_manual_proxy + + +%typemap(in, numinputs=0) SWIGTYPE ** ($*1_ltype temp) "$1 = &temp;"; + +%typemap(argout) SWIGTYPE **OUTPARAM { + $result = SWIG_Ruby_AppendOutput($result, SWIG_NewPointerObj(*$1, $*1_descriptor, 0)); +} + +%apply SWIGTYPE **OUTPARAM { + svn_fs_t ** +}; + +%typemap(check) svn_fs_t * { + if (!$1) { + svn_swig_rb_raise_svn_fs_already_close(); + } +} + +%{ +typedef struct svn_fs_t { + char path[256]; +} svn_fs_t; + +void svn_fs_create(svn_fs_t **fs_p, const char *path) { + svn_fs_t *fs = (svn_fs_t *)malloc(sizeof(svn_fs_t)); + strncpy(fs->path, path, 256); + *fs_p = fs; +} +const char *svn_fs_path(svn_fs_t *fs) { + return fs->path; +} +%} + +typedef struct svn_fs_t svn_fs_t; +void svn_fs_create(svn_fs_t **fs_p, const char *path); +const char *svn_fs_path(svn_fs_t *fs); + +%{ +static void svn_swig_rb_raise_svn_fs_already_close(void) { + rb_raise(rb_eIOError, "already closed"); +} + +static VALUE svn_fs_swig_rb_close(VALUE self) { + if (!DATA_PTR(self)) { + svn_swig_rb_raise_svn_fs_already_close(); + } + + DATA_PTR(self) = NULL; + + return Qnil; +} + +static VALUE svn_fs_swig_rb_closed(VALUE self) { + return DATA_PTR(self) ? Qfalse : Qtrue; +} +%} + +%insert("init") %{ + { + VALUE cSvnfs; + cSvnfs = rb_const_get(_mSWIG, rb_intern("TYPE_p_svn_fs_t")); + rb_define_method(cSvnfs, "close", + VALUEFUNC(svn_fs_swig_rb_close), 0); + } +%} diff --git a/Examples/test-suite/scilab/funcptr_cpp_runme.sci b/Examples/test-suite/scilab/funcptr_cpp_runme.sci index cb4c3cd0d..2065fb1df 100644 --- a/Examples/test-suite/scilab/funcptr_cpp_runme.sci +++ b/Examples/test-suite/scilab/funcptr_cpp_runme.sci @@ -3,5 +3,6 @@ exec("swigtest.start", -1); checkequal(call1(ADD_BY_VALUE_get(), 10, 11), 21, "ADD_BY_VALUE"); checkequal(call2(ADD_BY_POINTER_get(), 12, 13), 25, "ADD_BY_POINTER"); checkequal(call3(ADD_BY_REFERENCE_get(), 14, 15), 29, "ADD_BY_REFERENCE"); +checkequal(call1(ADD_BY_VALUE_C_get(), 2, 3), 5, "ADD_BY_VALUE_C"); exec("swigtest.quit", -1); diff --git a/Examples/test-suite/scilab/overload_polymorphic_runme.sci b/Examples/test-suite/scilab/overload_polymorphic_runme.sci new file mode 100644 index 000000000..cae65405c --- /dev/null +++ b/Examples/test-suite/scilab/overload_polymorphic_runme.sci @@ -0,0 +1,11 @@ +exec("swigtest.start", -1); + +derived = new_Derived(); + +checkequal(test(derived), 0, "test(derived)"); +checkequal(test2(derived), 1, "test2(derived)"); + +delete_Derived(derived); + +exec("swigtest.quit", -1); + diff --git a/Examples/test-suite/scilab/overload_simple_runme.sci b/Examples/test-suite/scilab/overload_simple_runme.sci index 23be43db9..ad353e847 100644 --- a/Examples/test-suite/scilab/overload_simple_runme.sci +++ b/Examples/test-suite/scilab/overload_simple_runme.sci @@ -1,16 +1,17 @@ exec("swigtest.start", -1); +f = new_Foo(); +b = new_Bar(); +v = malloc_void(32); + // Functions checkequal(foo(int32(3)), "foo:int", "foo(int)"); checkequal(foo(3), "foo:double", "foo(double)"); checkequal(foo("hello"), "foo:char *", "foo(char* )"); -f = new_Foo(); checkequal(foo(f), "foo:Foo *", "foo(Foo *)"); -//b = new_Bar(); -//checkequal(foo(b), "foo:Bar *", "foo(Bar *)"); -//v = malloc_void(32); -//checkequal(foo(v), "foo:void *", "foo(void *)"); +checkequal(foo(b), "foo:Bar *", "foo(Bar *)"); +checkequal(foo(v), "foo:void *", "foo(void *)"); // Class methods @@ -19,8 +20,8 @@ checkequal(Spam_foo(s, int32(3)), "foo:int", "Spam::foo(int)"); checkequal(Spam_foo(s, 3), "foo:double", "Spam::foo(double)"); checkequal(Spam_foo(s, "hello"), "foo:char *", "Spam::foo(char *)"); checkequal(Spam_foo(s, f), "foo:Foo *", "Spam::foo(Foo *)"); -//checkequal(Spam_foo(s, b), "foo:Bar *", "Spam::foo(Bar *)"); -//checkequal(Spam_foo(s, v), "foo:void *", "Spam::foo(void *)"); +checkequal(Spam_foo(s, b), "foo:Bar *", "Spam::foo(Bar *)"); +checkequal(Spam_foo(s, v), "foo:void *", "Spam::foo(void *)"); delete_Spam(s); // Static class methods @@ -29,8 +30,8 @@ checkequal(Spam_bar(int32(3)), "bar:int", "Spam::bar(int)"); checkequal(Spam_bar(3.1), "bar:double", "Spam::bar(double)"); checkequal(Spam_bar("hello"), "bar:char *", "Spam::bar(char *)"); checkequal(Spam_bar(f), "bar:Foo *", "Spam::bar(Foo *)"); -//checkequal(Spam_bar(b), "bar:Bar *", "Spam::bar(Bar *)"); -//checkequal(Spam_bar(b), "bar:void *", "Spam::bar(void *)"); +checkequal(Spam_bar(b), "bar:Bar *", "Spam::bar(Bar *)"); +checkequal(Spam_bar(v), "bar:void *", "Spam::bar(void *)"); // Constructors @@ -54,20 +55,21 @@ s = new_Spam(f); checkequal(Spam_type_get(s), "Foo *", "Spam::Spam(Foo *)"); delete_Spam(s); -//s = new_Spam(b); -//checkequal(Spam_type_get(s), "Bar *", "Spam::Spam(Bar *)"); -//delete_Spam(s); +s = new_Spam(b); +checkequal(Spam_type_get(s), "Bar *", "Spam::Spam(Bar *)"); +delete_Spam(s); -//s = new_Spam(v); -//checkequal(Spam_type_get(s), "void *", "Spam::Spam(void *)"); -//delete_Spam(s); +s = new_Spam(v); +checkequal(Spam_type_get(s), "void *", "Spam::Spam(void *)"); +delete_Spam(s); delete_Foo(f); -//delete_Bar(b); -//free_void(v); +delete_Bar(b); +free_void(v); a = new_ClassA(); b = ClassA_method1(a, 1); +delete_ClassA(a); exec("swigtest.quit", -1); diff --git a/Examples/test-suite/scilab/overload_subtype_runme.sci b/Examples/test-suite/scilab/overload_subtype_runme.sci new file mode 100644 index 000000000..e644f56b9 --- /dev/null +++ b/Examples/test-suite/scilab/overload_subtype_runme.sci @@ -0,0 +1,13 @@ +exec("swigtest.start", -1); + +f = new_Foo(); +b = new_Bar(); + +checkequal(spam(f), 1, "spam(f)"); +checkequal(spam(b), 2, "spam(b)"); + +delete_Foo(f); +delete_Bar(b); + +exec("swigtest.quit", -1); + diff --git a/Examples/test-suite/scilab/template_rename_runme.sci b/Examples/test-suite/scilab/template_rename_runme.sci index 9c9512930..7b6b0de84 100644 --- a/Examples/test-suite/scilab/template_rename_runme.sci +++ b/Examples/test-suite/scilab/template_rename_runme.sci @@ -6,7 +6,7 @@ checkequal(iFoo_spam_test(i, 5), 5, "iFoo_spam_test(i, 5) test fails"); checkequal(iFoo_groki_test(i, 6), 6, "iFoo_groki_test(i, 6) test fails"); delete_iFoo(i); -d = new_iFoo(); +d = new_dFoo(); checkequal(dFoo_blah_test(d, 4), 4, "dFoo_blah_test(d, 4) test fails"); checkequal(dFoo_spam(d, 5), 5, "dFoo_spam_test(d, 5) test fails"); checkequal(dFoo_grok_test(d, 6), 6, "dFoo_groki_test(d, 6) test fails"); diff --git a/Examples/test-suite/smart_pointer_ignore.i b/Examples/test-suite/smart_pointer_ignore.i new file mode 100644 index 000000000..f369de782 --- /dev/null +++ b/Examples/test-suite/smart_pointer_ignore.i @@ -0,0 +1,33 @@ +%module smart_pointer_ignore + + +%ignore Derived; + +%inline %{ +class Base { + public: + void base() {} +}; + +class Derived : public Base { + public: + void derived() {} +}; + +template <class T> +class Ptr { +public: + Ptr(T *t) : ptr(t) {} + T * operator->() const { return ptr; } +private: + T *ptr; +}; +%} + +%template(DerivedPtr) Ptr<Derived>; + +%inline %{ +Ptr<Derived> makeDerived() { + return Ptr<Derived>(new Derived()); +} +%} diff --git a/Examples/test-suite/string_constants.i b/Examples/test-suite/string_constants.i new file mode 100644 index 000000000..60f8c1859 --- /dev/null +++ b/Examples/test-suite/string_constants.i @@ -0,0 +1,44 @@ +%module string_constants +// Test unusual string constants + +%warnfilter(SWIGWARN_TYPEMAP_CHARLEAK); + +#if defined(SWIGCSHARP) +%csconst(1); +%csconstvalue("\"AEIOU\\n\"") SS1; +%csconstvalue("\"AEIOU\\n\"") SS2; +#endif +#if defined(SWIGJAVA) +%javaconst(1); +#endif +%inline %{ +#define SS1 "ÆÎOU\n" +#define AA1 "A\rB\nC" +#define EE1 "\124\125\126" +#define XX1 "\x57\x58\x59" +#define ZS1 "\0" +#define ES1 "" +%} +%constant SS2="ÆÎOU\n"; +%constant AA2="A\rB\nC"; +%constant EE2="\124\125\126"; +%constant XX2="\x57\x58\x59"; +%constant ZS2="\0"; +%constant ES2=""; + +%inline %{ +static const char *SS3 = "ÆÎOU\n"; +static const char *AA3 = "A\rB\nC"; +static const char *EE3 = "\124\125\126"; +static const char *XX3 = "\x57\x58\x59"; +static const char *ZS3 = "\0"; +static const char *ES3 = ""; +struct things { + const char * defarguments1(const char *SS4 = "ÆÎOU\n") { return SS4; } + const char * defarguments2(const char *AA4 = "A\rB\nC") { return AA4; } + const char * defarguments3(const char *EE4 = "\124\125\126") { return EE4; } + const char * defarguments4(const char *XX4 = "\x57\x58\x59") { return XX4; } + const char * defarguments5(const char *ZS4 = "\0") { return ZS4; } + const char * defarguments6(const char *ES4 = "") { return ES4; } +}; +%} diff --git a/Examples/test-suite/template_default_arg_overloaded_extend.i b/Examples/test-suite/template_default_arg_overloaded_extend.i new file mode 100644 index 000000000..67d66c2fa --- /dev/null +++ b/Examples/test-suite/template_default_arg_overloaded_extend.i @@ -0,0 +1,44 @@ +%module template_default_arg_overloaded_extend + +%inline %{ +namespace gaia2 { + +struct Filter {}; +struct SearchPoint {}; +struct DataSet {}; + +template <typename SearchPointType, typename DataSetType> +class BaseSearchSpace {}; + +template <typename SearchPointType, typename DataSetType> +class BaseResultSet { +public: + const char *over(int i = 0) { + return "over(int)"; + } +}; +} +%} + +// Specialized template extend +%extend gaia2::BaseResultSet<gaia2::SearchPoint, gaia2::DataSet> { + int go_get_method(int n, gaia2::SearchPoint, int offset = -1) { + return offset; + } + const char *over(gaia2::SearchPoint, int x = 0) { + return "over(giai2::SearchPoint, int)"; + } +} + +// Generic extend for all template instantiations +%extend gaia2::BaseResultSet { + int go_get_template(int n, SearchPointType sss, int offset = -2) { + return offset; + } + const char *over(bool b, SearchPointType, int x = 0) { + return "over(bool, SearchPointType, int)"; + } +} + +%template(ResultSet) gaia2::BaseResultSet<gaia2::SearchPoint, gaia2::DataSet>; + diff --git a/Examples/test-suite/typemap_manyargs.i b/Examples/test-suite/typemap_manyargs.i index d26e97714..426fcca1b 100644 --- a/Examples/test-suite/typemap_manyargs.i +++ b/Examples/test-suite/typemap_manyargs.i @@ -13,6 +13,7 @@ $9 = &temp9; $10 = &temp10; // the code generated for this was arg20 = &temp10; and arg20 does not exist. int $10_ptr = 0; // Was arg20_ptr + (void)$10_ptr; } %inline %{ diff --git a/Examples/test-suite/typemap_subst.i b/Examples/test-suite/typemap_subst.i index 91ac62020..946384840 100644 --- a/Examples/test-suite/typemap_subst.i +++ b/Examples/test-suite/typemap_subst.i @@ -27,12 +27,14 @@ (void)c; (void)d; (void)e; + (void)f; } { /* Test locals */ basetemp.member = 0; startemp = &basetemp; temp = &startemp; amptemp = &temp; + (void)amptemp; } { /* Test descriptors */ void *desc = $descriptor; |