Slicer
5.9
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
Libs
MRML
Core
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.
427
#include "
vtkMRMLCoreTestingUtilities.h
"
428
#include "
vtkMRMLNode.h
"
429
430
// Commonly used headers in tests
431
#include <vtkAddonTestingMacros.h>
432
433
#endif
vtkMRMLCoreTestingUtilities.h
vtkMRMLNode.h
Generated on Wed Sep 3 2025 23:51:41 for Slicer by
1.13.0