C# directors override/virtual - additional testing

Add runtime test for scenario described in #1323.
Expand testing to cover a mix of override/virtual method overloading.
Remove testSwigDerivedClassHasMethod() test - not fixed yet.
This commit is contained in:
William S Fulton 2018-09-25 07:46:29 +01:00
commit b90e3ae35d
2 changed files with 59 additions and 3 deletions

View file

@ -49,7 +49,35 @@ public class runme
throw new Exception("non-null pointer marshalling problem"); throw new Exception("non-null pointer marshalling problem");
myNewBar.x = 10; myNewBar.x = 10;
my.testSwigDerivedClassHasMethod(); // Low level implementation check
// my.testSwigDerivedClassHasMethod();
// These should not call the C# implementations as they are not overridden
int v;
v = MyClass.call_nonVirtual(my);
if (v != 100) throw new Exception("call_nonVirtual broken() " + v);
v = MyClass.call_nonOverride(my);
if (v != 101) throw new Exception("call_nonOverride broken() " + v);
// A mix of overridden and non-overridden
MyClassEnd myend = new MyClassEnd();
MyClass mc = myend;
v = mc.nonVirtual();
if (v != 202) throw new Exception("mc.nonVirtual() broken " + v);
v = MyClass.call_nonVirtual(mc);
if (v != 202) throw new Exception("call_nonVirtual(mc) broken " + v);
v = MyClass.call_nonVirtual(myend);
if (v != 202) throw new Exception("call_nonVirtual(myend) broken" + v);
v = MyClass.call_nonOverride(mc);
if (v != 101) throw new Exception("call_nonOverride(mc) broken" + v);
v = MyClass.call_nonOverride(myend);
if (v != 101) throw new Exception("call_nonOverride(myend) broken" + v);
} }
} }
} }
@ -81,4 +109,20 @@ class MyOverriddenClass : MyClass {
} }
} }
class MyClassMiddle : MyClass {
public override int nonVirtual() {
return 202;
}
}
class MyClassEnd : MyClassMiddle {
public new bool nonVirtual() {
throw new Exception("non-virtual overrides virtual method");
}
public new virtual bool nonOverride() {
throw new Exception("non-override overrides virtual method");
}
}
} }

View file

@ -130,12 +130,24 @@ public:
return myclass->pmethod(b); return myclass->pmethod(b);
} }
virtual void nonVirtual() virtual int nonVirtual()
{ {
return 100;
} }
virtual void nonOverride() virtual int nonOverride()
{ {
return 101;
}
static int call_nonVirtual(MyClass *myclass)
{
return myclass->nonVirtual();
}
static int call_nonOverride(MyClass *myclass)
{
return myclass->nonOverride();
} }
// Collisions with generated method names // Collisions with generated method names