Statistiques
| Révision :

root / ase / test / vtk_pipeline.py @ 1

Historique | Voir | Annoter | Télécharger (16,39 ko)

1
#!/usr/bin/env python
2

    
3
from ase.visualize.vtk import requirevtk
4

    
5
requirevtk()
6

    
7
import sys, unittest
8
from ase.test import CustomTestCase, CustomTextTestRunner
9

    
10
from vtk import vtkContourFilter, vtkPolyDataNormals, \
11
                vtkLinearSubdivisionFilter, vtkPolyDataMapper
12
from ase.visualize.vtk.pipeline import vtkPolyDataPipeline
13

    
14
# -------------------------------------------------------------------
15

    
16
class UTPipeline(CustomTestCase):
17
    """
18
    Abstract test case class - TODO."""
19

    
20
    def assertConnected(self, vtk_one, vtk_two, port=0):
21
        self.assertEqual(vtk_two.GetNumberOfInputConnections(port), 1)
22
        self.assertEqual(vtk_one.GetOutputPort(),
23
                         vtk_two.GetInputConnection(port, 0))
24

    
25
    def assertNotConnected(self, vtk_one, vtk_two, port=0):
26
        self.assertEqual(vtk_two.GetNumberOfInputConnections(port), 0)
27

    
28

    
29
# -------------------------------------------------------------------
30

    
31
class UTPolyDataPipeline(UTPipeline):
32
    """
33
    TODO"""
34

    
35
    def setUp(self):
36
        self.vtk_iso = vtkContourFilter()
37
        #self.vtk_iso.SetInput(...)
38

    
39
        self.vtk_dnorm = vtkPolyDataNormals()
40
        self.vtk_subdiv = vtkLinearSubdivisionFilter()
41
        self.vtk_dmap = vtkPolyDataMapper()
42

    
43
    def tearDown(self):
44
        del self.vtk_dmap
45
        del self.vtk_subdiv
46
        del self.vtk_dnorm
47
        del self.vtk_iso
48

    
49
# -------------------------------------------------------------------
50

    
51
class UTPolyDataPipeline_PureVTK(UTPolyDataPipeline):
52
    """
53
    Consistency tests for pure-VTK objects with the purpose
54
    of ultimately mapping the polygonal data within the pipeline."""
55

    
56
    # =================================
57

    
58
    def test_consistent_data_oninit(self):
59
        pipeline = vtkPolyDataPipeline(self.vtk_iso)
60
        self.assertTrue(pipeline.hasdata())
61
        self.assertEqual(pipeline.vtkish_data, self.vtk_iso)
62
        self.assertFalse(pipeline.hasfilters())
63
        self.assertFalse(pipeline.isclosed())
64

    
65
        pipeline.append(self.vtk_dnorm)
66
        self.assertConnected(self.vtk_iso, self.vtk_dnorm)
67

    
68
        pipeline.append(self.vtk_subdiv)
69
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
70

    
71
        pipeline.append(self.vtk_dmap)
72
        self.assertConnected(self.vtk_subdiv, self.vtk_dmap)
73

    
74
        self.assertTrue(pipeline.hasfilters())
75
        self.assertTrue(pipeline.isclosed())
76

    
77
    def test_consistent_data_direct(self):
78
        pipeline = vtkPolyDataPipeline()
79
        self.assertFalse(pipeline.hasdata())
80
        self.assertFalse(pipeline.hasfilters())
81
        self.assertFalse(pipeline.isclosed())
82

    
83
        pipeline.set_data(self.vtk_iso)
84
        self.assertTrue(pipeline.hasdata())
85
        self.assertEqual(pipeline.vtkish_data, self.vtk_iso)
86

    
87
        pipeline.append(self.vtk_dnorm)
88
        self.assertConnected(self.vtk_iso, self.vtk_dnorm)
89

    
90
        pipeline.append(self.vtk_subdiv)
91
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
92

    
93
        pipeline.append(self.vtk_dmap)
94
        self.assertConnected(self.vtk_subdiv, self.vtk_dmap)
95

    
96
        self.assertTrue(pipeline.hasfilters())
97
        self.assertTrue(pipeline.isclosed())
98

    
99
    def test_consistent_data_postponed(self):
100
        pipeline = vtkPolyDataPipeline()
101
        self.assertFalse(pipeline.hasdata())
102
        self.assertFalse(pipeline.hasfilters())
103
        self.assertFalse(pipeline.isclosed())
104

    
105
        pipeline.append(self.vtk_dnorm)
106
        self.assertTrue(pipeline.hasfilters())
107
        self.assertNotConnected(self.vtk_iso, self.vtk_dnorm)
108

    
109
        pipeline.append(self.vtk_subdiv)
110
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
111

    
112
        pipeline.set_data(self.vtk_iso)
113
        self.assertTrue(pipeline.hasdata())
114
        self.assertEqual(pipeline.vtkish_data, self.vtk_iso)
115
        self.assertConnected(self.vtk_iso, self.vtk_dnorm)
116

    
117
        pipeline.append(self.vtk_dmap)
118
        self.assertConnected(self.vtk_subdiv, self.vtk_dmap)
119
        self.assertTrue(pipeline.hasdata())
120
        self.assertTrue(pipeline.isclosed())
121

    
122
    def test_consistent_data_onclose(self):
123
        pipeline = vtkPolyDataPipeline()
124
        self.assertFalse(pipeline.hasdata())
125
        self.assertFalse(pipeline.hasfilters())
126
        self.assertFalse(pipeline.isclosed())
127

    
128
        pipeline.append(self.vtk_dnorm)
129
        self.assertTrue(pipeline.hasfilters())
130
        self.assertNotConnected(self.vtk_iso, self.vtk_dnorm)
131

    
132
        pipeline.append(self.vtk_subdiv)
133
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
134

    
135
        pipeline.append(self.vtk_dmap)
136
        self.assertConnected(self.vtk_subdiv, self.vtk_dmap)
137
        self.assertTrue(pipeline.isclosed())
138

    
139
        pipeline.set_data(self.vtk_iso)
140
        self.assertTrue(pipeline.hasdata())
141
        self.assertEqual(pipeline.vtkish_data, self.vtk_iso)
142
        self.assertConnected(self.vtk_iso, self.vtk_dnorm)
143

    
144
    # =================================
145

    
146
    def test_failure_duplicate_data(self):
147
        pipeline = vtkPolyDataPipeline(self.vtk_iso)
148
        self.assertRaises(ValueError, pipeline.append, self.vtk_iso)
149

    
150
    def test_failure_duplicate_mixed(self):
151
        pipeline = vtkPolyDataPipeline(self.vtk_iso)
152
        pipeline.append(self.vtk_dnorm)
153
        self.assertRaises(ValueError, pipeline.append, self.vtk_iso)
154

    
155
    def test_failure_duplicate_cyclic(self):
156
        pipeline = vtkPolyDataPipeline(self.vtk_iso)
157
        pipeline.append(self.vtk_dnorm)
158
        pipeline.append(self.vtk_subdiv)
159
        self.assertRaises(ValueError, pipeline.append, self.vtk_dnorm)
160

    
161
    def test_failure_duplicate_filter(self):
162
        pipeline = vtkPolyDataPipeline(self.vtk_iso)
163
        pipeline.append(self.vtk_dnorm)
164
        self.assertRaises(ValueError, pipeline.append, self.vtk_dnorm)
165

    
166
    # =================================
167

    
168
    def test_failure_output_missing(self):
169
        pipeline = vtkPolyDataPipeline()
170
        self.assertRaises(RuntimeError, pipeline.get_output_port)
171

    
172
    def test_failure_output_closed(self):
173
        pipeline = vtkPolyDataPipeline(self.vtk_iso)
174
        pipeline.append(self.vtk_dmap)
175
        self.assertRaises(RuntimeError, pipeline.append, self.vtk_dnorm)
176

    
177
# -------------------------------------------------------------------
178

    
179
class UTPolyDataPipeline_PipelineVTK(UTPolyDataPipeline):
180
    """
181
    Consistency tests for mixed VTK objects and pipelines with the purpose
182
    of ultimately mapping the polygonal data through embedded pipelines."""
183

    
184
    # =================================
185

    
186
    def get_consistent_datapipe(self):
187
        datapipe = vtkPolyDataPipeline(self.vtk_iso)
188
        self.assertTrue(datapipe.hasdata())
189
        self.assertTrue(self.vtk_iso in datapipe)
190
        self.assertEqual(datapipe.vtkish_data, self.vtk_iso)
191
        self.assertFalse(datapipe.hasfilters())
192
        self.assertFalse(datapipe.isclosed())
193

    
194
        return datapipe
195

    
196
    def test_consistent_datapipe_oninit(self):
197
        datapipe = self.get_consistent_datapipe()
198

    
199
        pipeline = vtkPolyDataPipeline(datapipe)
200
        self.assertTrue(pipeline.hasdata())
201
        self.assertTrue(datapipe in pipeline)
202
        self.assertTrue(self.vtk_iso in pipeline)
203
        self.assertEqual(pipeline.vtkish_data, datapipe)
204
        self.assertRaises(RuntimeError, datapipe.isclosed)
205
        self.assertFalse(pipeline.hasfilters())
206
        self.assertFalse(pipeline.isclosed())
207

    
208
        pipeline.append(self.vtk_dnorm)
209
        self.assertConnected(self.vtk_iso, self.vtk_dnorm)
210

    
211
        pipeline.append(self.vtk_subdiv)
212
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
213

    
214
        pipeline.append(self.vtk_dmap)
215
        self.assertConnected(self.vtk_subdiv, self.vtk_dmap)
216

    
217
        self.assertTrue(pipeline.hasfilters())
218
        self.assertTrue(pipeline.isclosed())
219

    
220
    def test_consistent_datapipe_direct(self):
221
        datapipe = self.get_consistent_datapipe()
222

    
223
        pipeline = vtkPolyDataPipeline()
224
        self.assertFalse(pipeline.hasdata())
225
        self.assertFalse(datapipe in pipeline)
226
        self.assertFalse(self.vtk_iso in pipeline)
227
        self.assertFalse(pipeline.hasfilters())
228
        self.assertFalse(pipeline.isclosed())
229

    
230
        pipeline.set_data(datapipe)
231
        self.assertTrue(pipeline.hasdata())
232
        self.assertTrue(datapipe in pipeline)
233
        self.assertTrue(self.vtk_iso in pipeline)
234
        self.assertEqual(pipeline.vtkish_data, datapipe)
235
        self.assertRaises(RuntimeError, datapipe.isclosed)
236

    
237
        pipeline.append(self.vtk_dnorm)
238
        self.assertConnected(self.vtk_iso, self.vtk_dnorm)
239

    
240
        pipeline.append(self.vtk_subdiv)
241
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
242

    
243
        pipeline.append(self.vtk_dmap)
244
        self.assertConnected(self.vtk_subdiv, self.vtk_dmap)
245

    
246
        self.assertTrue(pipeline.hasfilters())
247
        self.assertTrue(pipeline.isclosed())
248

    
249
    def test_consistent_datapipe_postponed(self):
250
        datapipe = self.get_consistent_datapipe()
251

    
252
        pipeline = vtkPolyDataPipeline()
253
        self.assertFalse(pipeline.hasdata())
254
        self.assertFalse(datapipe in pipeline)
255
        self.assertFalse(self.vtk_iso in pipeline)
256
        self.assertFalse(pipeline.hasfilters())
257
        self.assertFalse(pipeline.isclosed())
258

    
259
        pipeline.append(self.vtk_dnorm)
260
        self.assertTrue(pipeline.hasfilters())
261
        self.assertNotConnected(self.vtk_iso, self.vtk_dnorm)
262

    
263
        pipeline.append(self.vtk_subdiv)
264
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
265

    
266
        pipeline.set_data(datapipe)
267
        self.assertTrue(pipeline.hasdata())
268
        self.assertTrue(datapipe in pipeline)
269
        self.assertTrue(self.vtk_iso in pipeline)
270
        self.assertEqual(pipeline.vtkish_data, datapipe)
271
        self.assertConnected(self.vtk_iso, self.vtk_dnorm)
272
        self.assertTrue(datapipe.isclosed())
273

    
274
        pipeline.append(self.vtk_dmap)
275
        self.assertConnected(self.vtk_subdiv, self.vtk_dmap)
276
        self.assertTrue(pipeline.hasdata())
277
        self.assertTrue(pipeline.isclosed())
278

    
279
    def test_consistent_datapipe_onclose(self):
280
        datapipe = self.get_consistent_datapipe()
281

    
282
        pipeline = vtkPolyDataPipeline()
283
        self.assertFalse(pipeline.hasdata())
284
        self.assertFalse(datapipe in pipeline)
285
        self.assertFalse(self.vtk_iso in pipeline)
286
        self.assertFalse(pipeline.hasfilters())
287
        self.assertFalse(pipeline.isclosed())
288

    
289
        pipeline.append(self.vtk_dnorm)
290
        self.assertTrue(pipeline.hasfilters())
291
        self.assertNotConnected(self.vtk_iso, self.vtk_dnorm)
292

    
293
        pipeline.append(self.vtk_subdiv)
294
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
295

    
296
        pipeline.append(self.vtk_dmap)
297
        self.assertConnected(self.vtk_subdiv, self.vtk_dmap)
298
        self.assertTrue(pipeline.isclosed())
299

    
300
        pipeline.set_data(datapipe)
301
        self.assertTrue(pipeline.hasdata())
302
        self.assertEqual(pipeline.vtkish_data, datapipe)
303
        self.assertConnected(self.vtk_iso, self.vtk_dnorm)
304
        self.assertTrue(datapipe.isclosed())
305

    
306
    # =================================
307

    
308
    def get_consistent_filterpipe(self):
309
        filterpipe = vtkPolyDataPipeline()
310
        self.assertFalse(filterpipe.hasdata())
311
        self.assertFalse(self.vtk_iso in filterpipe)
312
        self.assertFalse(filterpipe.hasfilters())
313
        self.assertFalse(filterpipe.isclosed())
314

    
315
        filterpipe.append(self.vtk_dnorm)
316
        self.assertTrue(filterpipe.hasfilters())
317
        self.assertNotConnected(self.vtk_iso, self.vtk_dnorm)
318

    
319
        filterpipe.append(self.vtk_subdiv)
320
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
321

    
322
        return filterpipe
323

    
324
    def test_consistent_filterpipe_oninit(self):
325
        filterpipe = self.get_consistent_filterpipe()
326

    
327
        pipeline = vtkPolyDataPipeline(self.vtk_iso)
328
        self.assertTrue(pipeline.hasdata())
329
        self.assertEqual(pipeline.vtkish_data, self.vtk_iso)
330
        self.assertFalse(pipeline.hasfilters())
331
        self.assertFalse(pipeline.isclosed())
332

    
333
        pipeline.append(filterpipe)
334
        self.assertRaises(RuntimeError, filterpipe.isclosed)
335
        self.assertConnected(self.vtk_iso, self.vtk_dnorm)
336
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
337
        self.assertFalse(pipeline.isclosed())
338

    
339
        pipeline.append(self.vtk_dmap)
340
        self.assertTrue(filterpipe.isclosed())
341
        self.assertConnected(self.vtk_subdiv, self.vtk_dmap)
342
        self.assertTrue(pipeline.hasfilters())
343
        self.assertTrue(pipeline.isclosed())
344

    
345
    def test_consistent_filterpipe_direct(self):
346
        filterpipe = self.get_consistent_filterpipe()
347

    
348
        pipeline = vtkPolyDataPipeline()
349
        self.assertFalse(pipeline.hasdata())
350
        self.assertFalse(pipeline.hasfilters())
351
        self.assertFalse(pipeline.isclosed())
352

    
353
        pipeline.set_data(self.vtk_iso)
354
        self.assertTrue(pipeline.hasdata())
355
        self.assertEqual(pipeline.vtkish_data, self.vtk_iso)
356

    
357
        pipeline.append(filterpipe)
358
        self.assertRaises(RuntimeError, filterpipe.isclosed)
359
        self.assertConnected(self.vtk_iso, self.vtk_dnorm)
360
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
361
        self.assertFalse(pipeline.isclosed())
362

    
363
        pipeline.append(self.vtk_dmap)
364
        self.assertTrue(filterpipe.isclosed())
365
        self.assertConnected(self.vtk_subdiv, self.vtk_dmap)
366
        self.assertTrue(pipeline.hasfilters())
367
        self.assertTrue(pipeline.isclosed())
368

    
369
    def test_consistent_filterpipe_postponed(self):
370
        filterpipe = self.get_consistent_filterpipe()
371

    
372
        pipeline = vtkPolyDataPipeline()
373
        self.assertFalse(pipeline.hasdata())
374
        self.assertFalse(pipeline.hasfilters())
375
        self.assertFalse(pipeline.isclosed())
376

    
377
        pipeline.append(filterpipe)
378
        self.assertRaises(RuntimeError, filterpipe.isclosed)
379
        self.assertNotConnected(self.vtk_iso, self.vtk_dnorm)
380
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
381

    
382
        pipeline.set_data(self.vtk_iso)
383
        self.assertTrue(pipeline.hasdata())
384
        self.assertEqual(pipeline.vtkish_data, self.vtk_iso)
385
        self.assertConnected(self.vtk_iso, self.vtk_dnorm)
386

    
387
        pipeline.append(self.vtk_dmap)
388
        self.assertTrue(filterpipe.isclosed())
389
        self.assertConnected(self.vtk_subdiv, self.vtk_dmap)
390
        self.assertTrue(pipeline.hasdata())
391
        self.assertTrue(pipeline.isclosed())
392

    
393
    def test_consistent_filterdata_onclose(self):
394
        filterpipe = self.get_consistent_filterpipe()
395

    
396
        pipeline = vtkPolyDataPipeline()
397
        self.assertFalse(pipeline.hasdata())
398
        self.assertFalse(pipeline.hasfilters())
399
        self.assertFalse(pipeline.isclosed())
400

    
401
        pipeline.append(filterpipe)
402
        self.assertRaises(RuntimeError, filterpipe.isclosed)
403
        self.assertNotConnected(self.vtk_iso, self.vtk_dnorm)
404
        self.assertConnected(self.vtk_dnorm, self.vtk_subdiv)
405

    
406
        pipeline.append(self.vtk_dmap)
407
        self.assertTrue(filterpipe.isclosed())
408
        self.assertConnected(self.vtk_subdiv, self.vtk_dmap)
409
        self.assertFalse(pipeline.hasdata())
410
        self.assertTrue(pipeline.isclosed())
411

    
412
        pipeline.set_data(self.vtk_iso)
413
        self.assertTrue(pipeline.hasdata())
414
        self.assertEqual(pipeline.vtkish_data, self.vtk_iso)
415
        self.assertConnected(self.vtk_iso, self.vtk_dnorm)
416

    
417
    # =================================
418

    
419
    def test_failure_recursive_data(self):
420
        pipeline = vtkPolyDataPipeline()
421
        self.assertRaises(ValueError, pipeline.set_data, pipeline)
422

    
423
    def test_failure_recursive_mixed(self):
424
        pipeline = vtkPolyDataPipeline(self.vtk_iso)
425
        pipeline.append(self.vtk_dnorm)
426
        self.assertRaises(ValueError, pipeline.append, pipeline)
427

    
428
    def test_failure_recursive_filter(self):
429
        pipeline = vtkPolyDataPipeline()
430
        self.assertRaises(ValueError, pipeline.append, pipeline)
431

    
432

    
433
# -------------------------------------------------------------------
434

    
435
if __name__ in ['__main__', '__builtin__']:
436
    # We may have been imported by test.py, if so we should redirect to logfile
437
    if __name__ == '__builtin__':
438
        testrunner = CustomTextTestRunner('vtk_pipeline.log', verbosity=2)
439
    else:
440
        testrunner = unittest.TextTestRunner(stream=sys.stdout, verbosity=2)
441

    
442
    testcases = [UTPolyDataPipeline_PureVTK, UTPolyDataPipeline_PipelineVTK]
443

    
444
    for test in testcases:
445
        info = '\n' + test.__name__ + '\n' + test.__doc__.strip('\n') + '\n'
446
        testsuite = unittest.defaultTestLoader.loadTestsFromTestCase(test)
447
        testrunner.stream.writeln(info)
448
        testresult = testrunner.run(testsuite)
449
        # Provide feedback on failed tests if imported by test.py
450
        if __name__ == '__builtin__' and not testresult.wasSuccessful():
451
            raise SystemExit('Test failed. Check vtk_pipeline.log for details.')
452