Slicer  4.10
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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() != 1 ) \
101  { \
102  std::cerr << "Error in Set/Get"#variable << ", Get"#variable << " is " << object->Get##variable() << " instead of 1" << 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 << " is " << object->Get##variable() << " instead of 0" << std::endl; \
109  return EXIT_FAILURE; \
110  } \
111  object->variable##On(); \
112  if( object->Get##variable() != 1 ) \
113  { \
114  std::cerr << "Error in On/Get"#variable << ", Get"#variable << " is " << object->Get##variable() << " instead of 1" << 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 << " is " << object->Get##variable() << " instead of 0" << 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 == NULL || 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 != NULL ) \
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 != NULL ) \
355  { \
356  object->Set##variable( originalString.c_str() ); \
357  } \
358  else \
359  { \
360  object->Set##variable( NULL ); \
361  } \
362  }
363 
364 #define EXERCISE_BASIC_OBJECT_METHODS( node ) \
365  { \
366  int result = vtkMRMLCoreTestingUtilities::ExerciseBasicObjectMethods(node); \
367  if (result != EXIT_SUCCESS) \
368  { \
369  return result; \
370  } \
371  }
372 
374 #define EXERCISE_ALL_BASIC_MRML_METHODS( node ) \
375  CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseAllBasicMRMLMethods(node));
376 
377 //---------------------------------------------------------------------------
378 // Deprecated macros, for backward compatibility only
379 // (className is no longer needed; usually EXERCISE_ALL_BASIC_MRML_METHODS can
380 // be used instead of all the macros below)
381 
382 #define EXERCISE_BASIC_MRML_METHODS( className, node ) \
383  CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicMRMLMethods(node));
384 
385 #define EXERCISE_BASIC_STORABLE_MRML_METHODS( className, node ) \
386  CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicStorableMRMLMethods(node));
387 
388 #define EXERCISE_BASIC_TRANSFORMABLE_MRML_METHODS( className, node ) \
389  CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicTransformableMRMLMethods(node));
390 
391 #define EXERCISE_BASIC_DISPLAYABLE_MRML_METHODS( className, node ) \
392  CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicDisplayableMRMLMethods(node));
393 
394 #define EXERCISE_BASIC_DISPLAY_MRML_METHODS( className, node ) \
395  CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicDisplayMRMLMethods(node));
396 
397 #define EXERCISE_BASIC_STORAGE_MRML_METHODS( className, node ) \
398  CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicStorageMRMLMethods(node));
399 
400 #define EXERCISE_BASIC_TRANSFORM_MRML_METHODS( className, node ) \
401  CHECK_EXIT_SUCCESS(vtkMRMLCoreTestingUtilities::ExerciseBasicTransformMRMLMethods(node));
402 
403 // Need to include vtkMRMLCoreTestingUtilities.h here because
404 // vtkMRMLCoreTestingUtilities use some of the macros above, too.
406 #include "vtkMRMLNode.h"
407 
408 // Commonly used headers in tests
409 #include <vtkAddonTestingMacros.h>
410 
411 #endif