aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2009-10-30 17:11:00 -0300
committerMarcelo Lira <marcelo.lira@openbossa.org>2009-10-30 17:11:00 -0300
commit684aa0235c757a614963deaa4337202b1bc6c997 (patch)
tree36c88e67d0ec1471a764aeebfc3a085140752914 /tests
parent5c190b426be32749bb802c15ef2c980b057af658 (diff)
added new test cases to check if a value-type object passed as reference to
regular, virtual and reimplemented virtual methods are being altered in place
Diffstat (limited to 'tests')
-rw-r--r--tests/libsample/reference.cpp14
-rw-r--r--tests/libsample/reference.h9
-rwxr-xr-xtests/samplebinding/reference_test.py27
3 files changed, 48 insertions, 2 deletions
diff --git a/tests/libsample/reference.cpp b/tests/libsample/reference.cpp
index c61672849..08805dc5b 100644
--- a/tests/libsample/reference.cpp
+++ b/tests/libsample/reference.cpp
@@ -40,7 +40,7 @@ using namespace std;
void
Reference::show() const
{
- cout << "Reference.objId: " << m_objId;
+ cout << "Reference.objId: " << m_objId << ", address: " << this;
}
int
@@ -67,3 +67,15 @@ Reference::callUsesConstReferenceVirtual(const Reference& r, int inc)
return usesConstReferenceVirtual(r, inc);
}
+void
+Reference::alterReferenceIdVirtual(Reference& r)
+{
+ r.setObjId(r.objId() * Reference::multiplier());
+}
+
+void
+Reference::callAlterReferenceIdVirtual(Reference& r)
+{
+ alterReferenceIdVirtual(r);
+}
+
diff --git a/tests/libsample/reference.h b/tests/libsample/reference.h
index 6b20ef262..c8c3f46ce 100644
--- a/tests/libsample/reference.h
+++ b/tests/libsample/reference.h
@@ -35,6 +35,8 @@
#ifndef REFERENCE_H
#define REFERENCE_H
+#include "str.h"
+
class Reference
{
public:
@@ -42,7 +44,7 @@ public:
: m_objId(objId) {}
~Reference() {}
- double objId() { return m_objId; }
+ int objId() { return m_objId; }
void setObjId(int objId) { m_objId = objId; }
static int usesReference(Reference& r) { return r.m_objId; }
@@ -54,8 +56,13 @@ public:
int callUsesReferenceVirtual(Reference& r, int inc);
int callUsesConstReferenceVirtual(const Reference& r, int inc);
+ virtual void alterReferenceIdVirtual(Reference& r);
+ void callAlterReferenceIdVirtual(Reference& r);
+
void show() const;
+ static int multiplier() { return 10; }
+
private:
int m_objId;
};
diff --git a/tests/samplebinding/reference_test.py b/tests/samplebinding/reference_test.py
index af1adee89..4157b3425 100755
--- a/tests/samplebinding/reference_test.py
+++ b/tests/samplebinding/reference_test.py
@@ -38,6 +38,7 @@ class ExtendedReference(Reference):
self.uses_const_reference_virtual_called = False
self.reference_inc = 1
self.const_reference_inc = 2
+ self.multiplier = 333
def usesReferenceVirtual(self, ref, inc):
self.uses_reference_virtual_called = True
@@ -47,6 +48,10 @@ class ExtendedReference(Reference):
self.uses_const_reference_virtual_called = True
return ref.objId() + inc + self.const_reference_inc
+ def alterReferenceIdVirtual(self, ref):
+ ref.setObjId(ref.objId() * self.multiplier)
+
+
class ReferenceTest(unittest.TestCase):
'''Test case for methods that receive references to objects.'''
@@ -62,6 +67,28 @@ class ReferenceTest(unittest.TestCase):
r = Reference(objId)
self.assertEqual(Reference.usesConstReference(r), objId)
+ def testModificationOfReference(self):
+ '''Tests if the identity of a reference argument is preserved when passing it to be altered in C++.'''
+ objId = 123
+ r1 = Reference(objId)
+ r1.alterReferenceIdVirtual(r1)
+ self.assertEqual(r1.objId(), objId * Reference.multiplier())
+
+ def testModificationOfReferenceCallingAVirtualIndirectly(self):
+ '''Tests if the identity of a reference argument is preserved when passing it to be altered in C++ through a method that calls a virtual method.'''
+ objId = 123
+ r1 = Reference(objId)
+ r1.callAlterReferenceIdVirtual(r1)
+ self.assertEqual(r1.objId(), objId * Reference.multiplier())
+
+ def testModificationOfReferenceCallingAReimplementedVirtualIndirectly(self):
+ '''Test if a Python override of a virtual method with a reference parameter called from C++ alters the argument properly.'''
+ objId = 123
+ r = Reference(objId)
+ er = ExtendedReference()
+ result = er.callAlterReferenceIdVirtual(r)
+ self.assertEqual(r.objId(), objId * er.multiplier)
+
def testReimplementedVirtualMethodCallWithReferenceParameter(self):
'''Test if a Python override of a virtual method with a reference parameter is correctly called from C++.'''
inc = 9