Skip to content

Commit

Permalink
Merge branch 'python-overloading-and-conversion-REL' into release
Browse files Browse the repository at this point in the history
Change-Id: I5714e954dcc7bafadc4c8b295107b556abbe1271
  • Loading branch information
Dave DeMarle committed Feb 16, 2015
2 parents d442a75 + a051d50 commit b57ab42
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 1 deletion.
1 change: 1 addition & 0 deletions Common/Core/Testing/Python/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ vtk_add_test_python(
TestNumpySupport.py
TestNumpyInterface.py
TestOperators.py
TestOverloads.py
TestPointers.py
TestStrings.py
TestSubClass.py
Expand Down
68 changes: 68 additions & 0 deletions Common/Core/Testing/Python/TestOverloads.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
"""Test overloaded method resolution in VTK-Python
The wrappers should call overloaded C++ methods using similar
overload resolution rules as C++. Python itself does not have
method overloading.
Created on Feb 15, 2015 by David Gobbi
"""

import sys
import exceptions
import vtk
from vtk.test import Testing

class TestOverloads(Testing.vtkTest):

def testMethods(self):
"""Test overloaded methods"""
# single-argument method vtkTransform::SetMatrix()
t = vtk.vtkTransform()
m = vtk.vtkMatrix4x4()
m.SetElement(0, 0, 2)
t.SetMatrix(m)
self.assertEqual(t.GetMatrix().GetElement(0, 0), 2)
t.SetMatrix([0,1,0,0, 1,0,0,0, 0,0,-1,0, 0,0,0,1])
self.assertEqual(t.GetMatrix().GetElement(0, 0), 0)
# mixed number of arguments
w = vtk.vtkRenderWindow()
w.SetTileScale(2)
self.assertEqual(w.GetTileScale(), (2,2))
w.SetTileScale(3,4)
self.assertEqual(w.GetTileScale(), (3,4))

def testConstructors(self):
"""Test overloaded constructors"""
# resolve by number of arguments
v = vtk.vtkVector3d(3, 4, 5)
self.assertEqual((v[0], v[1], v[2]), (3, 4, 5))
v = vtk.vtkVector3d(6)
self.assertEqual((v[0], v[1], v[2]), (6, 6, 6))
# resolve by argument type
v = vtk.vtkVariant(3.0)
self.assertEqual(v.GetType(), vtk.VTK_DOUBLE)
v = vtk.vtkVariant(1)
self.assertEqual(v.GetType(), vtk.VTK_INT)
v = vtk.vtkVariant("hello")
self.assertEqual(v.GetType(), vtk.VTK_STRING)
v = vtk.vtkVariant(vtk.vtkObject())
self.assertEqual(v.GetType(), vtk.VTK_OBJECT)

def testArgumentConversion(self):
"""Test argument conversion via implicit constructors"""
# automatic conversion to vtkVariant
a = vtk.vtkVariantArray()
a.InsertNextValue(2.5)
a.InsertNextValue(vtk.vtkObject())
self.assertEqual(a.GetValue(0), vtk.vtkVariant(2.5))
self.assertEqual(a.GetValue(1).GetType(), vtk.VTK_OBJECT)
# same, but this one is via "const vtkVariant&" argument
a = vtk.vtkDenseArray[float]()
a.Resize(1)
a.SetVariantValue(0, 2.5)
self.assertEqual(a.GetVariantValue(0).ToDouble(), 2.5)


if __name__ == "__main__":
Testing.main([(TestOverloads, 'test')])
2 changes: 1 addition & 1 deletion Wrapping/Tools/vtkWrapPythonOverload.c
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ static char *vtkWrapPython_ArgCheckString(
result[currPos++] = ' ';
if ((argtype == VTK_PARSE_OBJECT_REF ||
argtype == VTK_PARSE_UNKNOWN_REF) &&
(argtype & VTK_PARSE_CONST) == 0)
(arg->Type & VTK_PARSE_CONST) == 0)
{
result[currPos++] = '&';
}
Expand Down

0 comments on commit b57ab42

Please sign in to comment.