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") \
345 << std::endl; \
346 return EXIT_FAILURE; \
347 } \
348 std::string string2 = "moreTestingIsBetter"; \
349 object->Set##variable(string2.c_str()); \
350 if (object->Get##variable() != string2) \
351 { \
352 std::cerr << "Error in Set/Get" #variable << ", tried to set to " << string2.c_str() << " but got " << (object->Get##variable() ? object->Get##variable() : "null") \
353 << std::endl; \
354 return EXIT_FAILURE; \
355 } \
356 if (originalStringPointer != nullptr) \
357 { \
358 object->Set##variable(originalString.c_str()); \
359 } \
360 else \
361 { \
362 object->Set##variable(nullptr); \
363 } \
364 }
365
366// ----------------------------------------------------------------------------
368#define TEST_SET_GET_STD_STRING(object, variable) \
369 { \
370 std::string originalString = object->Get##variable(); \
371 object->Set##variable("testing with a const char"); \
372 if (object->Get##variable() != "testing with a const char") \
373 { \
374 std::cerr << "Error in Set/Get" #variable << " with a string literal" << std::endl; \
375 return EXIT_FAILURE; \
376 } \
377 std::string string1 = "testingIsGood"; \
378 object->Set##variable(string1); \
379 if (object->Get##variable() != string1) \
380 { \
381 std::cerr << "Error in Set/Get" #variable << ", tried to set to " << string1 << " but got " << object->Get##variable() << std::endl; \
382 return EXIT_FAILURE; \
383 } \
384 std::string string2 = "moreTestingIsBetter"; \
385 object->Set##variable(string2); \
386 if (object->Get##variable() != string2) \
387 { \
388 std::cerr << "Error in Set/Get" #variable << ", tried to set to " << string2 << " but got " << object->Get##variable() << std::endl; \
389 return EXIT_FAILURE; \
390 } \
391 object->Set##variable(originalString); \
392 }
393
394#define EXERCISE_BASIC_OBJECT_METHODS(node) \
395 { \
396 int result = vtkMRMLCoreTestingUtilities::ExerciseBasicObjectMethods(node); \
397 if (result != EXIT_SUCCESS) \
398 { \
399 return result; \
400 } \
401 }
402
404#define EXERCISE_ALL_BASIC_MRML_METHODS(node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseAllBasicMRMLMethods(node));
405
406//---------------------------------------------------------------------------
407// Deprecated macros, for backward compatibility only
408// (className is no longer needed; usually EXERCISE_ALL_BASIC_MRML_METHODS can
409// be used instead of all the macros below)
410
411#define EXERCISE_BASIC_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicMRMLMethods(node));
412
413#define EXERCISE_BASIC_STORABLE_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicStorableMRMLMethods(node));
414
415#define EXERCISE_BASIC_TRANSFORMABLE_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicTransformableMRMLMethods(node));
416
417#define EXERCISE_BASIC_DISPLAYABLE_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicDisplayableMRMLMethods(node));
418
419#define EXERCISE_BASIC_DISPLAY_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicDisplayMRMLMethods(node));
420
421#define EXERCISE_BASIC_STORAGE_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicStorageMRMLMethods(node));
422
423#define EXERCISE_BASIC_TRANSFORM_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicTransformMRMLMethods(node));
424
425// Need to include vtkMRMLCoreTestingUtilities.h here because
426// vtkMRMLCoreTestingUtilities use some of the macros above, too.
428#include "vtkMRMLNode.h"
429
430// Commonly used headers in tests
431#include <vtkAddonTestingMacros.h>
432
433#endif