Slicer 5.9
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
vtkMRMLCoreTestingMacros.h
Go to the documentation of this file.
1/*=auto=========================================================================
2
3 Portions (c) Copyright 2005 Brigham and Women's Hospital (BWH)
4 All Rights Reserved.
5
6 See COPYRIGHT.txt
7 or http://www.slicer.org/copyright/copyright.txt for details.
8
9 Program: 3D Slicer
10
11=========================================================================auto=*/
12
13#ifndef __vtkMRMLCoreTestingMacros_h
14#define __vtkMRMLCoreTestingMacros_h
15
16// VTK includes
17#include <vtkMath.h>
18
24
26#define CHECK_NODE_IN_SCENE_BY_ID(scene, nodeID, expected) \
27 { \
28 if (!vtkMRMLCoreTestingUtilities::CheckNodeInSceneByID(__LINE__, (scene), (nodeID), (expected))) \
29 { \
30 return EXIT_FAILURE; \
31 } \
32 }
33
35#define CHECK_NODE_ID_AND_NAME(node, expectedID, expectedName) \
36 { \
37 if (!vtkMRMLCoreTestingUtilities::CheckNodeIdAndName(__LINE__, (node), (expectedID), (expectedName))) \
38 { \
39 return EXIT_FAILURE; \
40 } \
41 }
42
43// ----------------------------------------------------------------------------
45#define TRY_EXPECT_ITK_EXCEPTION( command ) \
46 try \
47 { \
48 std::cout << "Trying " << #command << std::endl; \
49 command; \
50 std::cerr << "Failed to catch expected exception" << std::endl; \
51 return EXIT_FAILURE; \
52 } \
53 catch( itk::ExceptionObject & excp ) \
54 { \
55 std::cout << "Caught expected exception" << std::endl; \
56 std::cout << excp << std::endl; \
57 }
58
59// ----------------------------------------------------------------------------
61#define TRY_EXPECT_NO_ITK_EXCEPTION( command ) \
62 try \
63 { \
64 std::cout << "Trying " << #command << std::endl; \
65 command; \
66 } \
67 catch( itk::ExceptionObject & excp ) \
68 { \
69 std::cerr << excp << std::endl; \
70 return EXIT_FAILURE; \
71 }
72
73// ----------------------------------------------------------------------------
75#define TEST_ITK_SET_GET( variable, command ) \
76 if( variable.GetPointer() != command ) \
77 { \
78 std::cerr << "Error in " << #command << std::endl; \
79 std::cerr << "Expected " << variable.GetPointer() << std::endl; \
80 std::cerr << "but got " << command << std::endl; \
81 return EXIT_FAILURE; \
82 }
83
84// ----------------------------------------------------------------------------
86#define TEST_ITK_SET_GET_VALUE( variable, command ) \
87 if( variable != command ) \
88 { \
89 std::cerr << "Error in " << #command << std::endl; \
90 std::cerr << "Expected " << variable << std::endl; \
91 std::cerr << "but got " << command << std::endl; \
92 return EXIT_FAILURE; \
93 }
94
95// ----------------------------------------------------------------------------
97#define TEST_SET_GET_BOOLEAN( object, variable ) \
98 object->Set##variable( false ); \
99 object->Set##variable( true ); \
100 if( object->Get##variable() == 0 ) \
101 { \
102 std::cerr << "Error in Set/Get"#variable << ", Get"#variable << " returned zero while it is expected to return non-zero" << std::endl; \
103 return EXIT_FAILURE; \
104 } \
105 object->Set##variable( false ); \
106 if( object->Get##variable() != 0 ) \
107 { \
108 std::cerr << "Error in Set/Get"#variable << ", Get"#variable << " returned " << object->Get##variable() << " instead of 0" << std::endl; \
109 return EXIT_FAILURE; \
110 } \
111 object->variable##On(); \
112 if( object->Get##variable() == 0 ) \
113 { \
114 std::cerr << "Error in On/Get"#variable << ", Get"#variable << " returned zero while it is expected to return non-zero" << std::endl; \
115 return EXIT_FAILURE; \
116 } \
117 object->variable##Off(); \
118 if( object->Get##variable() != 0 ) \
119 { \
120 std::cerr << "Error in Off/Get"#variable << ", Get"#variable << " returned " << object->Get##variable() << " while 0 is expected" << std::endl; \
121 return EXIT_FAILURE; \
122 }
123
124// ----------------------------------------------------------------------------
127#define TEST_SET_GET_INT( object, variable, value ) \
128 { \
129 object->Set##variable( value ); \
130 if( object->Get##variable() != value ) \
131 { \
132 std::cerr << "Error in Set/Get"#variable << " using value " << value << std::endl; \
133 return EXIT_FAILURE; \
134 } \
135 }
136
137// ----------------------------------------------------------------------------
142#define TEST_SET_GET_INT_RANGE( object, variable, min, max ) \
143 { \
144 int epsilon = 1; \
145 int val = min - epsilon; \
146 TEST_SET_GET_INT( object, variable, val); \
147 val = min; \
148 TEST_SET_GET_INT( object, variable, val); \
149 val = min + epsilon; \
150 TEST_SET_GET_INT( object, variable, val); \
151 val = (min + max) / 2; \
152 TEST_SET_GET_INT( object, variable, val); \
153 val = max - epsilon; \
154 TEST_SET_GET_INT( object, variable, val); \
155 val = max; \
156 TEST_SET_GET_INT( object, variable, val); \
157 val = max + epsilon; \
158 TEST_SET_GET_INT( object, variable, val); \
159 }
160
161// ----------------------------------------------------------------------------
164#define TEST_SET_GET_INT_RANDOM( object, variable, max ) \
165 { \
166 int val = (int)(vtkMath::Random() * max); \
167 object->Set##variable( val ); \
168 if( object->Get##variable() != val ) \
169 { \
170 std::cerr << "Error in Set/Get"#variable << " using random value " << val << std::endl; \
171 return EXIT_FAILURE; \
172 } \
173 }
174
175// ----------------------------------------------------------------------------
180#define TEST_SET_GET_UNSIGNED_INT_RANGE( object, variable, min, max ) \
181 { \
182 unsigned int epsilon = 1; \
183 unsigned int val = min - epsilon; \
184 TEST_SET_GET_INT( object, variable, val); \
185 val = min; \
186 TEST_SET_GET_INT( object, variable, val); \
187 val = min + epsilon; \
188 TEST_SET_GET_INT( object, variable, val); \
189 val = (min + max) / 2; \
190 TEST_SET_GET_INT( object, variable, val); \
191 val = max - epsilon; \
192 TEST_SET_GET_INT( object, variable, val); \
193 val = max; \
194 TEST_SET_GET_INT( object, variable, val); \
195 val = max + epsilon; \
196 TEST_SET_GET_INT( object, variable, val); \
197 }
198
199// ----------------------------------------------------------------------------
202#define TEST_SET_GET_DOUBLE( object, variable, value ) \
203 { \
204 object->Set##variable( value ); \
205 if( object->Get##variable() != value ) \
206 { \
207 std::cerr << "Error in Set/Get"#variable << " using value " << value << std::endl; \
208 return EXIT_FAILURE; \
209 } \
210 }
211
212// ----------------------------------------------------------------------------
217#define TEST_SET_GET_DOUBLE_RANGE( object, variable, min, max ) \
218 { \
219 double epsilon = 1.0; \
220 double val = min - epsilon; \
221 TEST_SET_GET_DOUBLE( object, variable, val); \
222 val = min; \
223 TEST_SET_GET_DOUBLE( object, variable, val); \
224 val = min + epsilon; \
225 TEST_SET_GET_DOUBLE( object, variable, val); \
226 val = (min + max) / 2.0; \
227 TEST_SET_GET_DOUBLE( object, variable, val); \
228 val = max - epsilon; \
229 TEST_SET_GET_DOUBLE( object, variable, val); \
230 val = max; \
231 TEST_SET_GET_DOUBLE( object, variable, val); \
232 val = max + epsilon; \
233 TEST_SET_GET_DOUBLE( object, variable, val); \
234 }
235
236// ----------------------------------------------------------------------------
239#define TEST_SET_GET_DOUBLE_RANDOM( object, variable, max ) \
240 { \
241 double val = vtkMath::Random() * max; \
242 object->Set##variable( val ); \
243 if( object->Get##variable() != val ) \
244 { \
245 std::cerr << "Error in Set/Get"#variable << ", using random value " << val << std::endl; \
246 return EXIT_FAILURE; \
247 } \
248 }
249
250// ----------------------------------------------------------------------------
252#define TEST_GET_OBJECT(object,variable) \
253 if ( !object->Get##variable() ) \
254 { \
255 std::cerr << "Error in Get"#variable << ", non null value is expected " << std::endl; \
256 return EXIT_FAILURE; \
257 } \
258 object->Get##variable()->Print(std::cout);
259
260// ----------------------------------------------------------------------------
263#define TEST_SET_GET_VALUE(object,variable,value) \
264 object->Set##variable(value); \
265 if (object->Get##variable() != value) \
266 { \
267 std::cerr << "Error getting " << #variable << std::endl; \
268 std::cerr << "Expected " << value << std::endl; \
269 std::cerr << "but got " << object->Get##variable()<< std::endl; \
270 return EXIT_FAILURE; \
271 }
272
273// ----------------------------------------------------------------------------
276#define TEST_SET_GET_VECTOR3_DOUBLE( object, variable, x, y, z ) \
277 { \
278 object->Set##variable( x, y, z ); \
279 double *val = object->Get##variable(); \
280 if( val == nullptr || val[0] != x || val[1] != y || val[2] != z ) \
281 { \
282 std::cerr << "Error in Set/Get"#variable << std::endl; \
283 return EXIT_FAILURE; \
284 } \
285 }
286
287// ----------------------------------------------------------------------------
293#define TEST_SET_GET_VECTOR3_DOUBLE_RANGE( object, variable, min, max ) \
294 { \
295 double epsilon = 1.0; \
296 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, min - epsilon, min - epsilon, min - epsilon); \
297 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, min, min, min); \
298 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, min + epsilon, min + epsilon, min + epsilon); \
299 double half = (min+max/2.0); \
300 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, half, half, half); \
301 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, max - epsilon, max - epsilon, max - epsilon); \
302 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, max, max, max); \
303 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, max + epsilon, max + epsilon, max + epsilon); \
304 }
305
306// ----------------------------------------------------------------------------
309#define TEST_SET_GET_VECTOR3_DOUBLE_RANDOM( object, variable, max ) \
310 { \
311 double x = vtkMath::Random() * max; \
312 double y = vtkMath::Random() * max; \
313 double z = vtkMath::Random() * max; \
314 object->Set##variable( x, y, z ); \
315 double val[3] = {0.0, 0.0, 0.0}; \
316 object->Get##variable(val); \
317 if( val[0] != x || val[1] != y || val[2] != z ) \
318 { \
319 std::cerr << "Error in Set/Get"#variable << " with " << x << ", " << y << ", " << z << std::endl; \
320 return EXIT_FAILURE; \
321 } \
322 }
323
324// ----------------------------------------------------------------------------
326#define TEST_SET_GET_STRING( object, variable ) \
327 { \
328 const char * originalStringPointer = object->Get##variable(); \
329 std::string originalString; \
330 if( originalStringPointer != nullptr ) \
331 { \
332 originalString = originalStringPointer; \
333 } \
334 object->Set##variable( "testing with a const char"); \
335 if( strcmp(object->Get##variable(), "testing with a const char") != 0) \
336 { \
337 std::cerr << "Error in Set/Get"#variable << " with a string literal" << std::endl; \
338 return EXIT_FAILURE; \
339 } \
340 std::string string1 = "testingIsGood"; \
341 object->Set##variable( string1.c_str() ); \
342 if( object->Get##variable() != string1 ) \
343 { \
344 std::cerr << "Error in Set/Get"#variable << ", tried to set to " << string1.c_str() << " but got " << (object->Get##variable() ? object->Get##variable() : "null") << std::endl; \
345 return EXIT_FAILURE; \
346 } \
347 std::string string2 = "moreTestingIsBetter"; \
348 object->Set##variable( string2.c_str() ); \
349 if( object->Get##variable() != string2 ) \
350 { \
351 std::cerr << "Error in Set/Get"#variable << ", tried to set to " << string2.c_str() << " but got " << (object->Get##variable() ? object->Get##variable() : "null") << std::endl; \
352 return EXIT_FAILURE; \
353 } \
354 if( originalStringPointer != nullptr ) \
355 { \
356 object->Set##variable( originalString.c_str() ); \
357 } \
358 else \
359 { \
360 object->Set##variable( nullptr ); \
361 } \
362 }
363
364// ----------------------------------------------------------------------------
366#define TEST_SET_GET_STD_STRING( object, variable ) \
367 { \
368 std::string originalString = object->Get##variable(); \
369 object->Set##variable( "testing with a const char"); \
370 if( object->Get##variable() != "testing with a const char" ) \
371 { \
372 std::cerr << "Error in Set/Get"#variable << " with a string literal" << std::endl; \
373 return EXIT_FAILURE; \
374 } \
375 std::string string1 = "testingIsGood"; \
376 object->Set##variable( string1 ); \
377 if( object->Get##variable() != string1 ) \
378 { \
379 std::cerr << "Error in Set/Get"#variable << ", tried to set to " << string1 << " but got " << object->Get##variable() << std::endl; \
380 return EXIT_FAILURE; \
381 } \
382 std::string string2 = "moreTestingIsBetter"; \
383 object->Set##variable( string2 ); \
384 if( object->Get##variable() != string2 ) \
385 { \
386 std::cerr << "Error in Set/Get"#variable << ", tried to set to " << string2 << " but got " << object->Get##variable() << std::endl; \
387 return EXIT_FAILURE; \
388 } \
389 object->Set##variable( originalString ); \
390 }
391
392#define EXERCISE_BASIC_OBJECT_METHODS( node ) \
393 { \
394 int result = vtkMRMLCoreTestingUtilities::ExerciseBasicObjectMethods(node); \
395 if (result != EXIT_SUCCESS) \
396 { \
397 return result; \
398 } \
399 }
400
402#define EXERCISE_ALL_BASIC_MRML_METHODS( node ) \
403 CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseAllBasicMRMLMethods(node));
404
405//---------------------------------------------------------------------------
406// Deprecated macros, for backward compatibility only
407// (className is no longer needed; usually EXERCISE_ALL_BASIC_MRML_METHODS can
408// be used instead of all the macros below)
409
410#define EXERCISE_BASIC_MRML_METHODS( className, node ) \
411 CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicMRMLMethods(node));
412
413#define EXERCISE_BASIC_STORABLE_MRML_METHODS( className, node ) \
414 CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicStorableMRMLMethods(node));
415
416#define EXERCISE_BASIC_TRANSFORMABLE_MRML_METHODS( className, node ) \
417 CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicTransformableMRMLMethods(node));
418
419#define EXERCISE_BASIC_DISPLAYABLE_MRML_METHODS( className, node ) \
420 CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicDisplayableMRMLMethods(node));
421
422#define EXERCISE_BASIC_DISPLAY_MRML_METHODS( className, node ) \
423 CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicDisplayMRMLMethods(node));
424
425#define EXERCISE_BASIC_STORAGE_MRML_METHODS( className, node ) \
426 CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicStorageMRMLMethods(node));
427
428#define EXERCISE_BASIC_TRANSFORM_MRML_METHODS( className, node ) \
429 CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicTransformMRMLMethods(node));
430
431// Need to include vtkMRMLCoreTestingUtilities.h here because
432// vtkMRMLCoreTestingUtilities use some of the macros above, too.
434#include "vtkMRMLNode.h"
435
436// Commonly used headers in tests
437#include <vtkAddonTestingMacros.h>
438
439#endif