Add testcase for nested inner class deriving from a templated base class and defined outside of the outer class.

For languages that don't support nested class support, use flatnested.
See issue #270
This commit is contained in:
William S Fulton 2014-12-19 19:35:38 +00:00
parent 70a04c9ffe
commit 68a936a638
4 changed files with 79 additions and 0 deletions

View File

@ -299,6 +299,7 @@ CPP_TEST_CASES += \
nested_directors \
nested_comment \
nested_scope \
nested_template_base \
nested_workaround \
newobject1 \
null_pointer \

View File

@ -0,0 +1,27 @@
import nested_template_base.*;
public class nested_template_base_runme {
static {
try {
System.loadLibrary("nested_template_base");
} 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[]) {
OuterC.InnerS ois = new OuterC.InnerS(123);
OuterC.InnerC oic = new OuterC.InnerC();
// Check base method is available
if (oic.outer(ois).getVal() != 123)
throw new RuntimeException("Wrong value calling outer");
// Check non-derived class using base class
if (oic.innerc().outer(ois).getVal() != 123)
throw new RuntimeException("Wrong value calling innerc");
}
}

View File

@ -0,0 +1,38 @@
%module nested_template_base
%inline %{
template <class T> class OuterT {
public:
T outer(T t) { return t; }
};
%}
// The %template goes after OuterT and before OuterC as OuterC::InnerC's base is handled inside OuterC
%template(OuterTInnerS) OuterT<OuterC::InnerS>;
#if !defined(SWIGCSHARP) && !defined(SWIGJAVA)
%feature("flatnested") OuterC::InnerS;
%feature("flatnested") OuterC::InnerC;
#endif
%inline %{
class OuterC {
public:
class InnerS;
class InnerC;
};
struct OuterC::InnerS {
int val;
InnerS(int val = 0) : val(val) {}
};
class OuterC::InnerC : public OuterT<InnerS> {
public:
OuterT<InnerS>& innerc() {
return *this;
}
};
%}

View File

@ -0,0 +1,13 @@
from nested_template_base import *
ois = InnerS(123);
oic = InnerC();
# Check base method is available
if (oic.outer(ois).val != 123):
raise RuntimeError("Wrong value calling outer");
# Check non-derived class using base class
if (oic.innerc().outer(ois).val != 123):
raise RuntimeError("Wrong value calling innerc");