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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
"""Test the wrapping of vtkCommand
The following vtkCommmand functionality must be tested
- Event enum constants
- Event names
Created on Mar 22, 2012 by David Gobbi
Updated on Feb 12, 2014 by Jean-Christophe Fillion-Robin
"""
import sys
import gc
import vtk
from vtk.test import Testing
class callback:
def __init__(self):
self.reset()
def __call__(self, o, e, d = None):
self.caller = o
self.event = e
self.calldata = d
def reset(self):
self.caller = None
self.event = None
self.calldata = None
class TestCommand(Testing.vtkTest):
def testEnumConstants(self):
"""Make sure the event id constants are wrapped
"""
self.assertEqual(vtk.vtkCommand.ErrorEvent, 39)
def testCommandWithArgs(self):
"""Test binding a command that has arguments.
"""
cb = callback()
o = vtk.vtkObject()
o.AddObserver(vtk.vtkCommand.ModifiedEvent, cb)
o.Modified()
self.assertEqual(cb.caller, o)
self.assertEqual(cb.event, "ModifiedEvent")
def testUseEventNameString(self):
"""Test binding with a string event name.
"""
cb = callback()
o = vtk.vtkObject()
o.AddObserver("ModifiedEvent", cb)
o.Modified()
self.assertEqual(cb.caller, o)
self.assertEqual(cb.event, "ModifiedEvent")
def testPriorityArg(self):
"""Test the optional priority argument
"""
cb = callback()
o = vtk.vtkObject()
o.AddObserver(vtk.vtkCommand.ModifiedEvent, cb, 0.5)
o.Modified()
self.assertEqual(cb.caller, o)
def testRemoveCommand(self):
"""Test the removal of an observer.
"""
cb = callback()
o = vtk.vtkObject()
o.AddObserver(vtk.vtkCommand.ModifiedEvent, cb)
o.Modified()
self.assertEqual(cb.caller, o)
o.RemoveObservers(vtk.vtkCommand.ModifiedEvent)
cb.caller = None
cb.event = None
o.Modified()
self.assertEqual(cb.caller, None)
def testGetCommand(self):
"""Test getting the vtkCommand object
"""
cb = callback()
o = vtk.vtkObject()
n = o.AddObserver(vtk.vtkCommand.ModifiedEvent, cb)
o.Modified()
self.assertEqual(cb.caller, o)
c = o.GetCommand(n)
self.assertEqual((c.IsA("vtkCommand") != 0), True)
# in the future, o.RemoveObserver(c) should also be made to work
o.RemoveObserver(n)
cb.caller = None
cb.event = None
o.Modified()
self.assertEqual(cb.caller, None)
def testCommandCircularRef(self):
"""Test correct reference loop reporting for commands
"""
cb = callback()
o = vtk.vtkObject()
o.AddObserver(vtk.vtkCommand.ModifiedEvent, cb)
cb.circular_ref = o
# referent to check if "o" is deleted
referent = vtk.vtkObject()
o.referent = referent
# make sure gc removes referer "o" from referent
s1 = repr(gc.get_referrers(referent))
del o
del cb
gc.collect()
s2 = repr(gc.get_referrers(referent))
self.assertNotEqual(s1, s2)
self.assertNotEqual(s1.count("vtkObject"),0)
self.assertEqual(s2.count("vtkObject"),0)
def testAddRemoveObservers(self):
"""Test adding and removing observers
"""
cb = callback()
cb2 = callback()
o = vtk.vtkObject()
n = o.AddObserver(vtk.vtkCommand.ModifiedEvent, cb)
n2 = o.AddObserver(vtk.vtkCommand.ModifiedEvent, cb2)
o.Modified()
self.assertEqual(cb.caller, o)
self.assertEqual(cb2.caller, o)
o.RemoveObserver(n)
cb.reset()
cb2.reset()
o.Modified()
self.assertEqual(cb.caller, None)
self.assertEqual(cb2.caller, o)
o.RemoveObserver(n2)
cb.reset()
cb2.reset()
o.Modified()
self.assertEqual(cb.caller, None)
self.assertEqual(cb2.caller, None)
def testUseCallDataType(self):
"""Test adding an observer associated with a callback expecting a CallData
"""
cb = callback()
cb.CallDataType = vtk.VTK_STRING
lt = vtk.vtkLookupTable()
lt.AddObserver(vtk.vtkCommand.ErrorEvent, cb)
lt.SetTableRange(2, 1)
self.assertEqual(cb.caller, lt)
self.assertEqual(cb.event, "ErrorEvent")
self.assertTrue(cb.calldata.startswith("ERROR: In"))
def testUseCallDataTypeWithDecoratorAsString0(self):
"""Test adding an observer associated with a callback expecting a CallData.
This test ensures backward compatibility checking the CallDataType can
be set to the string 'string0'.
"""
self.onErrorCalldata = ''
@vtk.calldata_type('string0')
def onError(caller, event, calldata):
self.onErrorCalldata = calldata
lt = vtk.vtkLookupTable()
lt.AddObserver(vtk.vtkCommand.ErrorEvent, onError)
lt.SetTableRange(2, 1)
self.assertTrue(self.onErrorCalldata.startswith("ERROR: In"))
def testUseCallDataTypeWithDecorator(self):
"""Test adding an observer associated with a callback expecting a CallData
"""
self.onErrorCalldata = ''
@vtk.calldata_type(vtk.VTK_STRING)
def onError(caller, event, calldata):
self.onErrorCalldata = calldata
lt = vtk.vtkLookupTable()
lt.AddObserver(vtk.vtkCommand.ErrorEvent, onError)
lt.SetTableRange(2, 1)
self.assertTrue(self.onErrorCalldata.startswith("ERROR: In"))
if __name__ == "__main__":
Testing.main([(TestCommand, 'test')])
|