Slicer 5.11
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
19// STD includes
20#include <iostream>
21
27
29#define CHECK_NODE_IN_SCENE_BY_ID(scene, nodeID, expected) \
30 { \
31 if (!vtkMRMLCoreTestingUtilities::CheckNodeInSceneByID(__LINE__, (scene), (nodeID), (expected))) \
32 { \
33 return EXIT_FAILURE; \
34 } \
35 }
36
38#define CHECK_NODE_ID_AND_NAME(node, expectedID, expectedName) \
39 { \
40 if (!vtkMRMLCoreTestingUtilities::CheckNodeIdAndName(__LINE__, (node), (expectedID), (expectedName))) \
41 { \
42 return EXIT_FAILURE; \
43 } \
44 }
45
46// ----------------------------------------------------------------------------
48#define TRY_EXPECT_ITK_EXCEPTION(command) \
49 try \
50 { \
51 std::cout << "Trying " << #command << std::endl; \
52 command; \
53 std::cerr << "Failed to catch expected exception" << std::endl; \
54 return EXIT_FAILURE; \
55 } \
56 catch (itk::ExceptionObject & excp) \
57 { \
58 std::cout << "Caught expected exception" << std::endl; \
59 std::cout << excp << std::endl; \
60 }
61
62// ----------------------------------------------------------------------------
64#define TRY_EXPECT_NO_ITK_EXCEPTION(command) \
65 try \
66 { \
67 std::cout << "Trying " << #command << std::endl; \
68 command; \
69 } \
70 catch (itk::ExceptionObject & excp) \
71 { \
72 std::cerr << excp << std::endl; \
73 return EXIT_FAILURE; \
74 }
75
76// ----------------------------------------------------------------------------
78#define TEST_ITK_SET_GET(variable, command) \
79 if (variable.GetPointer() != command) \
80 { \
81 std::cerr << "Error in " << #command << std::endl; \
82 std::cerr << "Expected " << variable.GetPointer() << std::endl; \
83 std::cerr << "but got " << command << std::endl; \
84 return EXIT_FAILURE; \
85 }
86
87// ----------------------------------------------------------------------------
89#define TEST_ITK_SET_GET_VALUE(variable, command) \
90 if (variable != command) \
91 { \
92 std::cerr << "Error in " << #command << std::endl; \
93 std::cerr << "Expected " << variable << std::endl; \
94 std::cerr << "but got " << command << std::endl; \
95 return EXIT_FAILURE; \
96 }
97
98// ----------------------------------------------------------------------------
100#define TEST_SET_GET_BOOLEAN(object, variable) \
101 object->Set##variable(false); \
102 object->Set##variable(true); \
103 if (object->Get##variable() == 0) \
104 { \
105 std::cerr << "Error in Set/Get" #variable << ", Get" #variable << " returned zero while it is expected to return non-zero" << std::endl; \
106 return EXIT_FAILURE; \
107 } \
108 object->Set##variable(false); \
109 if (object->Get##variable() != 0) \
110 { \
111 std::cerr << "Error in Set/Get" #variable << ", Get" #variable << " returned " << object->Get##variable() << " instead of 0" << std::endl; \
112 return EXIT_FAILURE; \
113 } \
114 object->variable##On(); \
115 if (object->Get##variable() == 0) \
116 { \
117 std::cerr << "Error in On/Get" #variable << ", Get" #variable << " returned zero while it is expected to return non-zero" << std::endl; \
118 return EXIT_FAILURE; \
119 } \
120 object->variable##Off(); \
121 if (object->Get##variable() != 0) \
122 { \
123 std::cerr << "Error in Off/Get" #variable << ", Get" #variable << " returned " << object->Get##variable() << " while 0 is expected" << std::endl; \
124 return EXIT_FAILURE; \
125 }
126
127// ----------------------------------------------------------------------------
130#define TEST_SET_GET_INT(object, variable, value) \
131 { \
132 object->Set##variable(value); \
133 if (object->Get##variable() != value) \
134 { \
135 std::cerr << "Error in Set/Get" #variable << " using value " << value << std::endl; \
136 return EXIT_FAILURE; \
137 } \
138 }
139
140// ----------------------------------------------------------------------------
145#define TEST_SET_GET_INT_RANGE(object, variable, min, max) \
146 { \
147 int epsilon = 1; \
148 int val = min - epsilon; \
149 TEST_SET_GET_INT(object, variable, val); \
150 val = min; \
151 TEST_SET_GET_INT(object, variable, val); \
152 val = min + epsilon; \
153 TEST_SET_GET_INT(object, variable, val); \
154 val = (min + max) / 2; \
155 TEST_SET_GET_INT(object, variable, val); \
156 val = max - epsilon; \
157 TEST_SET_GET_INT(object, variable, val); \
158 val = max; \
159 TEST_SET_GET_INT(object, variable, val); \
160 val = max + epsilon; \
161 TEST_SET_GET_INT(object, variable, val); \
162 }
163
164// ----------------------------------------------------------------------------
167#define TEST_SET_GET_INT_RANDOM(object, variable, max) \
168 { \
169 int val = (int)(vtkMath::Random() * max); \
170 object->Set##variable(val); \
171 if (object->Get##variable() != val) \
172 { \
173 std::cerr << "Error in Set/Get" #variable << " using random value " << val << std::endl; \
174 return EXIT_FAILURE; \
175 } \
176 }
177
178// ----------------------------------------------------------------------------
183#define TEST_SET_GET_UNSIGNED_INT_RANGE(object, variable, min, max) \
184 { \
185 unsigned int epsilon = 1; \
186 unsigned int val = min - epsilon; \
187 TEST_SET_GET_INT(object, variable, val); \
188 val = min; \
189 TEST_SET_GET_INT(object, variable, val); \
190 val = min + epsilon; \
191 TEST_SET_GET_INT(object, variable, val); \
192 val = (min + max) / 2; \
193 TEST_SET_GET_INT(object, variable, val); \
194 val = max - epsilon; \
195 TEST_SET_GET_INT(object, variable, val); \
196 val = max; \
197 TEST_SET_GET_INT(object, variable, val); \
198 val = max + epsilon; \
199 TEST_SET_GET_INT(object, variable, val); \
200 }
201
202// ----------------------------------------------------------------------------
205#define TEST_SET_GET_DOUBLE(object, variable, value) \
206 { \
207 object->Set##variable(value); \
208 if (object->Get##variable() != value) \
209 { \
210 std::cerr << "Error in Set/Get" #variable << " using value " << value << std::endl; \
211 return EXIT_FAILURE; \
212 } \
213 }
214
215// ----------------------------------------------------------------------------
220#define TEST_SET_GET_DOUBLE_RANGE(object, variable, min, max) \
221 { \
222 double epsilon = 1.0; \
223 double val = min - epsilon; \
224 TEST_SET_GET_DOUBLE(object, variable, val); \
225 val = min; \
226 TEST_SET_GET_DOUBLE(object, variable, val); \
227 val = min + epsilon; \
228 TEST_SET_GET_DOUBLE(object, variable, val); \
229 val = (min + max) / 2.0; \
230 TEST_SET_GET_DOUBLE(object, variable, val); \
231 val = max - epsilon; \
232 TEST_SET_GET_DOUBLE(object, variable, val); \
233 val = max; \
234 TEST_SET_GET_DOUBLE(object, variable, val); \
235 val = max + epsilon; \
236 TEST_SET_GET_DOUBLE(object, variable, val); \
237 }
238
239// ----------------------------------------------------------------------------
242#define TEST_SET_GET_DOUBLE_RANDOM(object, variable, max) \
243 { \
244 double val = vtkMath::Random() * max; \
245 object->Set##variable(val); \
246 if (object->Get##variable() != val) \
247 { \
248 std::cerr << "Error in Set/Get" #variable << ", using random value " << val << std::endl; \
249 return EXIT_FAILURE; \
250 } \
251 }
252
253// ----------------------------------------------------------------------------
255#define TEST_GET_OBJECT(object, variable) \
256 if (!object->Get##variable()) \
257 { \
258 std::cerr << "Error in Get" #variable << ", non null value is expected " << std::endl; \
259 return EXIT_FAILURE; \
260 } \
261 object->Get##variable()->Print(std::cout);
262
263// ----------------------------------------------------------------------------
266#define TEST_SET_GET_VALUE(object, variable, value) \
267 object->Set##variable(value); \
268 if (object->Get##variable() != value) \
269 { \
270 std::cerr << "Error getting " << #variable << std::endl; \
271 std::cerr << "Expected " << value << std::endl; \
272 std::cerr << "but got " << object->Get##variable() << std::endl; \
273 return EXIT_FAILURE; \
274 }
275
276// ----------------------------------------------------------------------------
279#define TEST_SET_GET_VECTOR3_DOUBLE(object, variable, x, y, z) \
280 { \
281 object->Set##variable(x, y, z); \
282 double* val = object->Get##variable(); \
283 if (val == nullptr || val[0] != x || val[1] != y || val[2] != z) \
284 { \
285 std::cerr << "Error in Set/Get" #variable << std::endl; \
286 return EXIT_FAILURE; \
287 } \
288 }
289
290// ----------------------------------------------------------------------------
296#define TEST_SET_GET_VECTOR3_DOUBLE_RANGE(object, variable, min, max) \
297 { \
298 double epsilon = 1.0; \
299 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, min - epsilon, min - epsilon, min - epsilon); \
300 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, min, min, min); \
301 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, min + epsilon, min + epsilon, min + epsilon); \
302 double half = (min + max / 2.0); \
303 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, half, half, half); \
304 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, max - epsilon, max - epsilon, max - epsilon); \
305 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, max, max, max); \
306 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, max + epsilon, max + epsilon, max + epsilon); \
307 }
308
309// ----------------------------------------------------------------------------
312#define TEST_SET_GET_VECTOR3_DOUBLE_RANDOM(object, variable, max) \
313 { \
314 double x = vtkMath::Random() * max; \
315 double y = vtkMath::Random() * max; \
316 double z = vtkMath::Random() * max; \
317 object->Set##variable(x, y, z); \
318 double val[3] = { 0.0, 0.0, 0.0 }; \
319 object->Get##variable(val); \
320 if (val[0] != x || val[1] != y || val[2] != z) \
321 { \
322 std::cerr << "Error in Set/Get" #variable << " with " << x << ", " << y << ", " << z << std::endl; \
323 return EXIT_FAILURE; \
324 } \
325 }
326
327// ----------------------------------------------------------------------------
329#define TEST_SET_GET_STRING(object, variable) \
330 { \
331 const char* originalStringPointer = object->Get##variable(); \
332 std::string originalString; \
333 if (originalStringPointer != nullptr) \
334 { \
335 originalString = originalStringPointer; \
336 } \
337 object->Set##variable("testing with a const char"); \
338 if (strcmp(object->Get##variable(), "testing with a const char") != 0) \
339 { \
340 std::cerr << "Error in Set/Get" #variable << " with a string literal" << std::endl; \
341 return EXIT_FAILURE; \
342 } \
343 std::string string1 = "testingIsGood"; \
344 object->Set##variable(string1.c_str()); \
345 if (object->Get##variable() != string1) \
346 { \
347 std::cerr << "Error in Set/Get" #variable << ", tried to set to " << string1.c_str() << " but got " << (object->Get##variable() ? object->Get##variable() : "null") \
348 << std::endl; \
349 return EXIT_FAILURE; \
350 } \
351 std::string string2 = "moreTestingIsBetter"; \
352 object->Set##variable(string2.c_str()); \
353 if (object->Get##variable() != string2) \
354 { \
355 std::cerr << "Error in Set/Get" #variable << ", tried to set to " << string2.c_str() << " but got " << (object->Get##variable() ? object->Get##variable() : "null") \
356 << std::endl; \
357 return EXIT_FAILURE; \
358 } \
359 if (originalStringPointer != nullptr) \
360 { \
361 object->Set##variable(originalString.c_str()); \
362 } \
363 else \
364 { \
365 object->Set##variable(nullptr); \
366 } \
367 }
368
369// ----------------------------------------------------------------------------
371#define TEST_SET_GET_STD_STRING(object, variable) \
372 { \
373 std::string originalString = object->Get##variable(); \
374 object->Set##variable("testing with a const char"); \
375 if (object->Get##variable() != "testing with a const char") \
376 { \
377 std::cerr << "Error in Set/Get" #variable << " with a string literal" << std::endl; \
378 return EXIT_FAILURE; \
379 } \
380 std::string string1 = "testingIsGood"; \
381 object->Set##variable(string1); \
382 if (object->Get##variable() != string1) \
383 { \
384 std::cerr << "Error in Set/Get" #variable << ", tried to set to " << string1 << " but got " << object->Get##variable() << std::endl; \
385 return EXIT_FAILURE; \
386 } \
387 std::string string2 = "moreTestingIsBetter"; \
388 object->Set##variable(string2); \
389 if (object->Get##variable() != string2) \
390 { \
391 std::cerr << "Error in Set/Get" #variable << ", tried to set to " << string2 << " but got " << object->Get##variable() << std::endl; \
392 return EXIT_FAILURE; \
393 } \
394 object->Set##variable(originalString); \
395 }
396
397#define EXERCISE_BASIC_OBJECT_METHODS(node) \
398 { \
399 int result = vtkMRMLCoreTestingUtilities::ExerciseBasicObjectMethods(node); \
400 if (result != EXIT_SUCCESS) \
401 { \
402 return result; \
403 } \
404 }
405
407#define EXERCISE_ALL_BASIC_MRML_METHODS(node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseAllBasicMRMLMethods(node));
408
409//---------------------------------------------------------------------------
410// Deprecated macros, for backward compatibility only
411// (className is no longer needed; usually EXERCISE_ALL_BASIC_MRML_METHODS can
412// be used instead of all the macros below)
413
414#define EXERCISE_BASIC_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicMRMLMethods(node));
415
416#define EXERCISE_BASIC_STORABLE_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicStorableMRMLMethods(node));
417
418#define EXERCISE_BASIC_TRANSFORMABLE_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicTransformableMRMLMethods(node));
419
420#define EXERCISE_BASIC_DISPLAYABLE_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicDisplayableMRMLMethods(node));
421
422#define EXERCISE_BASIC_DISPLAY_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicDisplayMRMLMethods(node));
423
424#define EXERCISE_BASIC_STORAGE_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicStorageMRMLMethods(node));
425
426#define EXERCISE_BASIC_TRANSFORM_MRML_METHODS(className, node) CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicTransformMRMLMethods(node));
427
428// Need to include vtkMRMLCoreTestingUtilities.h here because
429// vtkMRMLCoreTestingUtilities use some of the macros above, too.
431#include "vtkMRMLNode.h"
432
433// Commonly used headers in tests
434#include <vtkAddonTestingMacros.h>
435
436#endif