diff --git a/tests/ByValTests.cs b/tests/ByValTests.cs index 28790e4f..fe66ee93 100644 --- a/tests/ByValTests.cs +++ b/tests/ByValTests.cs @@ -6,10 +6,10 @@ using Tests.Support; namespace Tests { [TestFixture] - public class AbiTests { + public class ByValTests { [Test] - public void test_0_class_return () + public void TestClassReturn () { // Section 3.1.4: // Classes with non-default copy ctors/destructors are returned using a hidden @@ -27,7 +27,7 @@ namespace Tests { // An object as ref argument [Test] - public void test_0_class_arg () + public void TestClassArg () { var c1 = new Class (4); var c2 = new Class (5); @@ -38,7 +38,7 @@ namespace Tests { // A null object as ref argument [Test] - public void test_0_class_arg_null () + public void TestClassArgNull () { var c1 = new Class (4); Assert.That (c1.IsNull (null), "#1"); @@ -46,7 +46,7 @@ namespace Tests { // An object as byval argument [Test] - public void test_0_class_arg_byval () + public void TestClassArgByval () { var c1 = new Class (4); var c2 = new Class (5); @@ -58,7 +58,7 @@ namespace Tests { // A null object as byval argument [Test] [ExpectedException (typeof (ArgumentException))] - public void test_0_class_arg_byval_null () + public void TestClassArgByvalNull () { var c1 = new Class (4); c1.CopyFromValue (null); diff --git a/tests/Makefile.am b/tests/Makefile.am index dc92e0b7..f2971a65 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -6,41 +6,47 @@ INTEROP_DLL = \ TEST_DLL = $(BUILD_DIR)/Test.dll -HDR = \ - Native/ByValTests.h - NATIVE = \ - Native/NUnit.cpp \ - Native/ByValTests.cpp + ByValTests \ + VirtualTests MANAGED = \ ByValTests.cs \ Support/CppMockObject.cs \ - Support/CppNUnitAsserts.cs + Support/CppNUnitAsserts.cs \ + VirtualTests.cs REFERENCES = \ -pkg:mono-nunit +NATIVE_SRC = \ + $(addprefix Native/,$(NATIVE)) + all: $(TEST_DLL) -test.xml: $(HDR) - gccxml -fxml=$@ --gccxml-cxxflags -c $(HDR) +%.cpp: %.h + +%.xml: $(addsuffix .h,$(NATIVE_SRC)) + gccxml -fxml=$@ --gccxml-cxxflags -c Native/$*.h -$(BUILD_DIR)/libTest.so: $(HEADERS) $(NATIVE) - g++ -fPIC --shared -m32 -o $@ $(NATIVE) +$(BUILD_DIR)/libTest.so: $(addsuffix .cpp,$(NATIVE_SRC)) + $(CXX) -fPIC --shared -m32 -o $@ $^ -$(BUILD_DIR)/libTest-inline.so: $(HEADERS) $(NATIVE) - g++ -fPIC --shared -m32 -fkeep-inline-functions -o $@ $(NATIVE) +$(BUILD_DIR)/libTest-inline.so: $(addsuffix .cpp,$(NATIVE_SRC)) + $(CXX) -fPIC --shared -m32 -fkeep-inline-functions -o $@ $^ -generated: test.xml +generated: $(addsuffix .xml,$(NATIVE)) $(RM) -r generated - mono --debug $(BUILD_DIR)/generator.exe -o=$@ -ns=Tests -lib=Test -inline=surrogatelib test.xml + $(foreach X,$?, \ + mono --debug $(BUILD_DIR)/generator.exe -o=$@ -ns=Tests -lib=Test -inline=surrogatelib $(X) && \ + ) \ + echo Bindings generated successfully. $(TEST_DLL): generated $(MANAGED) $(BUILD_DIR)/libTest.so $(BUILD_DIR)/libTest-inline.so mcs -debug -out:$@ -target:library -unsafe $(REFERENCES) -r:$(INTEROP_DLL) generated/*.cs $(MANAGED) clean: - $(RM) -rf $(TEST_DLL) generated $(BUILD_DIR)/libTest.so $(BUILD_DIR)/libTest-inline.so test.xml + $(RM) -rf $(TEST_DLL) generated $(BUILD_DIR)/libTest.so $(BUILD_DIR)/libTest-inline.so $(addsuffix .xml,$(NATIVE)) run: $(TEST_DLL) nunit-console -nologo $(TEST_DLL) diff --git a/tests/Native/VirtualTests.cpp b/tests/Native/VirtualTests.cpp new file mode 100644 index 00000000..085cf351 --- /dev/null +++ b/tests/Native/VirtualTests.cpp @@ -0,0 +1,63 @@ + +#include "VirtualTests.h" + +NumberClass::NumberClass (int n) + : num (n) +{ +} +int NumberClass::Number () const +{ + return this->num; +} +int NumberClass::NegativeNumber () const +{ + return -(this->num); +} + + +AdderClass::AdderClass (int n) + : NumberClass (n) +{ +} +void AdderClass::Add (int n) +{ + this->num += n; +} + +AdderClassWithVirtualBase::AdderClassWithVirtualBase (int n) + : NumberClass (n) +{ +} +void AdderClassWithVirtualBase::Add (int n) +{ + this->num += n; +} + + +MultiplierClass::MultiplierClass (int n) + : NumberClass (n) +{ +} +void MultiplierClass::Multiply (int n) +{ + this->num *= n; +} + +MultiplierClassWithVirtualBase::MultiplierClassWithVirtualBase (int n) + : NumberClass (n) +{ +} +void MultiplierClassWithVirtualBase::Multiply (int n) +{ + this->num *= n; +} + + +ClassThatOverridesStuff::ClassThatOverridesStuff (int num, int my) + : NumberClass (num), myNum (my) +{ +} +int ClassThatOverridesStuff::Number () const +{ + return this->myNum; +} \ No newline at end of file diff --git a/tests/Native/VirtualTests.h b/tests/Native/VirtualTests.h new file mode 100644 index 00000000..85a75cd9 --- /dev/null +++ b/tests/Native/VirtualTests.h @@ -0,0 +1,51 @@ + +class NumberClass { +protected: + int num; +public: + NumberClass (int n); + virtual int Number () const; + virtual int NegativeNumber () const; +}; + +class AdderClass : public NumberClass { +public: + AdderClass (int n); + virtual void Add (int n); +}; +class AdderClassWithVirtualBase : public virtual NumberClass { +public: + AdderClassWithVirtualBase (int n); + virtual void Add (int n); +}; + +class MultiplierClass : public NumberClass { +public: + MultiplierClass (int n); + virtual void Multiply (int n); +}; +class MultiplierClassWithVirtualBase : public virtual NumberClass { +public: + MultiplierClassWithVirtualBase (int n); + virtual void Multiply (int n); +}; + +class ClassWithNonVirtualBases : public AdderClass, public MultiplierClass { +public: + // num is not shared between AdderClass and MultiplierClass; Add and Multiply should operate on different numbers + ClassWithNonVirtualBases (int addN, int multN) : AdderClass (addN), MultiplierClass (multN) {} +}; +class ClassWithVirtualBases : public AdderClassWithVirtualBase, public MultiplierClassWithVirtualBase { +public: + // num is shared between AdderClass and MultiplierClass; Add and Multiply should both operate on n + ClassWithVirtualBases (int n) : NumberClass (n-2), AdderClassWithVirtualBase (n-1), MultiplierClassWithVirtualBase (n) {} +}; + + +class ClassThatOverridesStuff : public NumberClass { +protected: + int myNum; +public: + ClassThatOverridesStuff (int num, int my); + virtual int Number () const; +}; \ No newline at end of file diff --git a/tests/Tests.csproj b/tests/Tests.csproj index 4e6def5a..23fe9189 100644 --- a/tests/Tests.csproj +++ b/tests/Tests.csproj @@ -53,6 +53,7 @@ + @@ -71,6 +72,8 @@ + + diff --git a/tests/VirtualTests.cs b/tests/VirtualTests.cs new file mode 100644 index 00000000..e8c6b358 --- /dev/null +++ b/tests/VirtualTests.cs @@ -0,0 +1,83 @@ +using System; +using NUnit.Framework; + +namespace Tests { + + [TestFixture] + public class VirtualTests { + + [Test] + public void TestVirtualCall () + { + var cls = new NumberClass (5); + Assert.AreEqual (5, cls.Number, "#1"); + Assert.AreEqual (-5, cls.NegativeNumber, "#2"); + } + + [Test] + public void TestVirtualCallOnBaseClass () + { + var cls = new AdderClass (8); + Assert.AreEqual (8, cls.Number, "#1"); + + cls.Add (2); + Assert.AreEqual (10, ((NumberClass)cls).Number, "#2"); + } + + [Test] + [Ignore ("virtual inheritance not implemented yet")] + public void TestVirtualCallOnVirtualBaseClass () + { + var cls = new AdderClassWithVirtualBase (8); + Assert.AreEqual (8, cls.Number, "#1"); + + cls.Add (2); + Assert.AreEqual (10, ((NumberClass)cls).Number, "#2"); + } + + [Test] + public void TestMultipleBases () + { + var cls = new ClassWithNonVirtualBases (5, 3); + Assert.AreEqual (5, cls.Number, "#1"); + Assert.AreEqual (3, ((MultiplierClass)cls).Number, "#2"); + + cls.Add (4); + Assert.AreEqual (9, cls.Number, "#3"); + Assert.AreEqual (3, ((MultiplierClass)cls).Number, "#4"); + + cls.Multiply (10); + Assert.AreEqual (9, cls.Number, "#5"); + Assert.AreEqual (30, ((MultiplierClass)cls).Number, "#6"); + } + + [Test] + [Ignore ("virtual inheritance not implemented yet")] + public void TestMultipleVirtualBases () + { + var cls = new ClassWithVirtualBases (4); + Assert.AreEqual (4, cls.Number, "#1"); + Assert.AreEqual (4, ((MultiplierClassWithVirtualBase)cls).Number, "#2"); + + cls.Add (5); + Assert.AreEqual (9, cls.Number, "#3"); + Assert.AreEqual (9, ((MultiplierClassWithVirtualBase)cls).Number, "#4"); + + cls.Multiply (6); + Assert.AreEqual (30, cls.Number, "#5"); + Assert.AreEqual (30, ((MultiplierClassWithVirtualBase)cls).Number, "#6"); + } + + [Test] + public void TestClassThatOverridesStuff () + { + var cls = new ClassThatOverridesStuff (5, 3); + Assert.AreEqual (3, cls.Number, "#1"); + Assert.AreEqual (3, ((NumberClass)cls).Number, "#2"); + Assert.AreEqual (-5, cls.NegativeNumber, "#3"); + } + + + } +} +