Slicer
5.11
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
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.
430
#include "
vtkMRMLCoreTestingUtilities.h
"
431
#include "
vtkMRMLNode.h
"
432
433
// Commonly used headers in tests
434
#include <vtkAddonTestingMacros.h>
435
436
#endif
vtkMRMLCoreTestingUtilities.h
vtkMRMLNode.h
Generated on Tue Jan 27 2026 01:35:23 for Slicer by
1.13.0