1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
"""Test string and unicode support in VTK-Python
The following string features have to be tested for string and unicode
- Pass a string arg by value
- Pass a string arg by reference
- Return a string arg by value
- Return a string arg by reference
The following features are not supported
- Pointers to strings, arrays of strings
- Passing a string arg by reference and returning a value in it
Created on May 12, 2010 by David Gobbi
"""
import sys
import vtk
from vtk.test import Testing
if sys.hexversion >= 0x03000000:
cedilla = 'Fran\xe7ois'
nocedilla = 'Francois'
eightbit = 'Francois'.encode('ascii')
else:
cedilla = unicode('Fran\xe7ois', 'latin1')
nocedilla = unicode('Francois')
eightbit = 'Francois'
class TestString(Testing.vtkTest):
def testPassByValue(self):
"""Pass string by value... hard to find examples of this,
because "const char *" methods shadow "vtkStdString" methods.
"""
self.assertEqual('y', 'y')
def testReturnByValue(self):
"""Return a string by value."""
a = vtk.vtkArray.CreateArray(1, vtk.VTK_INT)
a.Resize(1,1)
a.SetDimensionLabel(0, 'x')
s = a.GetDimensionLabel(0)
self.assertEqual(s, 'x')
def testPassByReference(self):
"""Pass a string by reference."""
a = vtk.vtkArray.CreateArray(0, vtk.VTK_STRING)
a.SetName("myarray")
s = a.GetName()
self.assertEqual(s, "myarray")
def testReturnByReference(self):
"""Return a string by reference."""
a = vtk.vtkStringArray()
s = "hello"
a.InsertNextValue(s)
t = a.GetValue(0)
self.assertEqual(t, s)
def testPassAndReturnUnicodeByReference(self):
"""Pass a unicode string by const reference"""
a = vtk.vtkUnicodeStringArray()
a.InsertNextValue(cedilla)
u = a.GetValue(0)
self.assertEqual(u, cedilla)
def testPassBytesAsUnicode(self):
"""Pass 8-bit string when unicode is expected. Should fail."""
a = vtk.vtkUnicodeStringArray()
self.assertRaises(TypeError,
a.InsertNextValue, eightbit)
def testPassUnicodeAsString(self):
"""Pass unicode where string is expected. Should succeed."""
a = vtk.vtkStringArray()
a.InsertNextValue(nocedilla)
s = a.GetValue(0)
self.assertEqual(s, 'Francois')
def testPassBytesAsString(self):
"""Pass 8-bit string where string is expected. Should succeed."""
a = vtk.vtkStringArray()
a.InsertNextValue(eightbit)
s = a.GetValue(0)
self.assertEqual(s, 'Francois')
def testPassEncodedString(self):
"""Pass encoded 8-bit strings."""
a = vtk.vtkStringArray()
# latin1 encoded string will be returned as "bytes", which is
# just a normal str object in Python 2
encoded = cedilla.encode('latin1')
a.InsertNextValue(encoded)
result = a.GetValue(0)
self.assertEqual(type(result), bytes)
self.assertEqual(result, encoded)
# utf-8 encoded string will be returned as "str", which is
# actually unicode in Python 3
a = vtk.vtkStringArray()
encoded = cedilla.encode('utf-8')
a.InsertNextValue(encoded)
result = a.GetValue(0)
self.assertEqual(type(result), str)
if sys.hexversion >= 0x03000000:
self.assertEqual(result.encode('utf-8'), encoded)
else:
self.assertEqual(result, encoded)
if __name__ == "__main__":
Testing.main([(TestString, 'test')])
|